Browse Source

Add option to use replaygain tags for audio (#10566)

* Add option to use replaygain tags for audio

* Change regex to be specific

* Use ffprobe for faster metadata grabs

* Change regex to .Match
TelepathicWalrus 1 year ago
parent
commit
7b5c41c2a5

+ 2 - 0
MediaBrowser.Model/Configuration/LibraryOptions.cs

@@ -31,6 +31,8 @@ namespace MediaBrowser.Model.Configuration
 
         public bool EnableLUFSScan { get; set; }
 
+        public bool UseReplayGainTags { get; set; }
+
         public bool EnableChapterImageExtraction { get; set; }
 
         public bool ExtractChapterImagesDuringLibraryScan { get; set; }

+ 48 - 2
MediaBrowser.Providers/MediaInfo/AudioFileProber.cs

@@ -61,6 +61,9 @@ namespace MediaBrowser.Providers.MediaInfo
         [GeneratedRegex(@"I:\s+(.*?)\s+LUFS")]
         private static partial Regex LUFSRegex();
 
+        [GeneratedRegex(@"REPLAYGAIN_TRACK_GAIN:\s+-?([0-9.]+)\s+dB")]
+        private static partial Regex ReplayGainTagRegex();
+
         /// <summary>
         /// Probes the specified item for metadata.
         /// </summary>
@@ -104,8 +107,50 @@ namespace MediaBrowser.Providers.MediaInfo
             }
 
             var libraryOptions = _libraryManager.GetLibraryOptions(item);
+            bool foundLUFSValue = false;
+
+            if (libraryOptions.UseReplayGainTags)
+            {
+                using (var process = new Process()
+                {
+                    StartInfo = new ProcessStartInfo
+                    {
+                        FileName = _mediaEncoder.ProbePath,
+                        Arguments = $"-hide_banner -i \"{path}\"",
+                        RedirectStandardOutput = false,
+                        RedirectStandardError = true
+                    },
+                })
+                {
+                    try
+                    {
+                        process.Start();
+                    }
+                    catch (Exception ex)
+                    {
+                        _logger.LogError(ex, "Error starting ffmpeg");
+
+                        throw;
+                    }
+
+                    using var reader = process.StandardError;
+                    var output = await reader.ReadToEndAsync(cancellationToken).ConfigureAwait(false);
+                    cancellationToken.ThrowIfCancellationRequested();
+                    Match split = ReplayGainTagRegex().Match(output);
+
+                    if (split.Success)
+                    {
+                        item.LUFS = DefaultLUFSValue - float.Parse(split.Groups[1].ValueSpan, CultureInfo.InvariantCulture.NumberFormat);
+                        foundLUFSValue = true;
+                    }
+                    else
+                    {
+                        item.LUFS = DefaultLUFSValue;
+                    }
+                }
+            }
 
-            if (libraryOptions.EnableLUFSScan)
+            if (libraryOptions.EnableLUFSScan && !foundLUFSValue)
             {
                 using (var process = new Process()
                 {
@@ -144,7 +189,8 @@ namespace MediaBrowser.Providers.MediaInfo
                     }
                 }
             }
-            else
+
+            if (!libraryOptions.EnableLUFSScan && !libraryOptions.UseReplayGainTags)
             {
                 item.LUFS = DefaultLUFSValue;
             }