diff --git a/MediaBrowser.Model/Configuration/LibraryOptions.cs b/MediaBrowser.Model/Configuration/LibraryOptions.cs index fbad29143b..1c071067df 100644 --- a/MediaBrowser.Model/Configuration/LibraryOptions.cs +++ b/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; } diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs index d817042274..f718325df5 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs +++ b/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(); + /// /// Probes the specified item for metadata. /// @@ -104,8 +107,50 @@ namespace MediaBrowser.Providers.MediaInfo } var libraryOptions = _libraryManager.GetLibraryOptions(item); + bool foundLUFSValue = false; - if (libraryOptions.EnableLUFSScan) + 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 && !foundLUFSValue) { using (var process = new Process() { @@ -144,7 +189,8 @@ namespace MediaBrowser.Providers.MediaInfo } } } - else + + if (!libraryOptions.EnableLUFSScan && !libraryOptions.UseReplayGainTags) { item.LUFS = DefaultLUFSValue; }