From 599ad86657bbb8125c4354000cfc94331041f984 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 13 Jan 2023 17:39:29 -0800 Subject: [PATCH] New: Use file's format title for quality if parsed Closes #3930 --- .../Files/Media/H264_sample.mp4 | Bin 866964 -> 429076 bytes .../AugmentQualityFromMediaInfoFixture.cs | 42 ++++++++++++++++++ .../MediaInfo/VideoFileInfoReaderFixture.cs | 10 +++-- .../Quality/AugmentQualityFromMediaInfo.cs | 27 +++++++++-- .../Quality/AugmentQualityResult.cs | 5 +++ .../MediaFiles/MediaInfo/MediaInfoModel.cs | 4 ++ .../MediaInfo/VideoFileInfoReader.cs | 5 +++ 7 files changed, 85 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core.Test/Files/Media/H264_sample.mp4 b/src/NzbDrone.Core.Test/Files/Media/H264_sample.mp4 index 35bc6b3531b5d786feac2ad21fb6f7a0b0425362..509640fda9ac0b61c8573911b7bbc4f58ca82d13 100644 GIT binary patch delta 8346 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 diff --git a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfoFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfoFixture.cs index 367a4cfe3..af72aa538 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfoFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfoFixture.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augmenters.Quality; using NzbDrone.Core.MediaFiles.MediaInfo; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augmenters.Quality @@ -65,6 +66,47 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators.Au result.Should().NotBe(null); result.Resolution.Should().Be(expectedResolution); + result.Source.Should().Be(QualitySource.Unknown); + } + + [Test] + public void should_include_source_if_extracted_from_title() + { + var mediaInfo = Builder.CreateNew() + .With(m => m.Width = 1920) + .With(m => m.Height = 1080) + .With(m => m.Title = "Series.Title.S01E05.WEB.x264-Sonarr") + .Build(); + + var localEpisode = Builder.CreateNew() + .With(l => l.MediaInfo = mediaInfo) + .Build(); + + var result = Subject.AugmentQuality(localEpisode, null); + + result.Should().NotBe(null); + result.Resolution.Should().Be(1080); + result.Source.Should().Be(QualitySource.Web); + } + + [Test] + public void should_have_unknown_source_if_no_source_extracted_from_title() + { + var mediaInfo = Builder.CreateNew() + .With(m => m.Width = 1920) + .With(m => m.Height = 1080) + .With(m => m.Title = "Series.Title.S01E05.x264-Sonarr") + .Build(); + + var localEpisode = Builder.CreateNew() + .With(l => l.MediaInfo = mediaInfo) + .Build(); + + var result = Subject.AugmentQuality(localEpisode, null); + + result.Should().NotBe(null); + result.Resolution.Should().Be(1080); + result.Source.Should().Be(QualitySource.Unknown); } } } diff --git a/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/VideoFileInfoReaderFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/VideoFileInfoReaderFixture.cs index f0826d64b..949a23512 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/VideoFileInfoReaderFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/VideoFileInfoReaderFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo info.AudioFormat.Should().Be("aac"); info.AudioCodecID.Should().Be("mp4a"); info.AudioProfile.Should().Be("LC"); - info.AudioBitrate.Should().Be(125488); + info.AudioBitrate.Should().Be(125509); info.AudioChannels.Should().Be(2); info.AudioChannelPositions.Should().Be("stereo"); info.AudioLanguages.Should().BeEquivalentTo("eng"); @@ -59,12 +59,13 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo info.RunTime.Seconds.Should().Be(10); info.ScanType.Should().Be("Progressive"); info.Subtitles.Should().BeEmpty(); - info.VideoBitrate.Should().Be(193328); + info.VideoBitrate.Should().Be(193694); info.VideoFps.Should().Be(24); info.Width.Should().Be(480); info.VideoBitDepth.Should().Be(8); info.VideoColourPrimaries.Should().Be("smpte170m"); info.VideoTransferCharacteristics.Should().Be("bt709"); + info.Title.Should().Be("Sample Title"); } [Test] @@ -87,7 +88,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo info.AudioFormat.Should().Be("aac"); info.AudioCodecID.Should().Be("mp4a"); info.AudioProfile.Should().Be("LC"); - info.AudioBitrate.Should().Be(125488); + info.AudioBitrate.Should().Be(125509); info.AudioChannels.Should().Be(2); info.AudioChannelPositions.Should().Be("stereo"); info.AudioLanguages.Should().BeEquivalentTo("eng"); @@ -95,11 +96,12 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo info.RunTime.Seconds.Should().Be(10); info.ScanType.Should().Be("Progressive"); info.Subtitles.Should().BeEmpty(); - info.VideoBitrate.Should().Be(193328); + info.VideoBitrate.Should().Be(193694); info.VideoFps.Should().Be(24); info.Width.Should().Be(480); info.VideoColourPrimaries.Should().Be("smpte170m"); info.VideoTransferCharacteristics.Should().Be("bt709"); + info.Title.Should().Be("Sample Title"); } [TestCase(8, "", "", "", null, HdrFormat.None)] diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfo.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfo.cs index ce90c9ff8..d854bbfaa 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfo.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityFromMediaInfo.cs @@ -1,6 +1,9 @@ using NLog; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Download; +using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Qualities; namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augmenters.Quality { @@ -25,29 +28,45 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment var width = localEpisode.MediaInfo.Width; var height = localEpisode.MediaInfo.Height; + var source = QualitySource.Unknown; + var sourceConfidence = Confidence.Default; + var title = localEpisode.MediaInfo.Title; + + if (title.IsNotNullOrWhiteSpace()) + { + var parsedQuality = QualityParser.ParseQualityName(title.Trim()); + + // Only use the quality if it's not unknown and the source is from the name (which is MediaInfo's title in this case) + if (parsedQuality.Quality.Source != QualitySource.Unknown && + parsedQuality.SourceDetectionSource == QualityDetectionSource.Name) + { + source = parsedQuality.Quality.Source; + sourceConfidence = Confidence.MediaInfo; + } + } if (width >= 3200 || height >= 2100) { _logger.Trace("Resolution {0}x{1} considered 2160p", width, height); - return AugmentQualityResult.ResolutionOnly(2160, Confidence.MediaInfo); + return AugmentQualityResult.SourceAndResolutionOnly(source, sourceConfidence, 2160, Confidence.MediaInfo); } if (width >= 1800 || height >= 1000) { _logger.Trace("Resolution {0}x{1} considered 1080p", width, height); - return AugmentQualityResult.ResolutionOnly(1080, Confidence.MediaInfo); + return AugmentQualityResult.SourceAndResolutionOnly(source, sourceConfidence, 1080, Confidence.MediaInfo); } if (width >= 1200 || height >= 700) { _logger.Trace("Resolution {0}x{1} considered 720p", width, height); - return AugmentQualityResult.ResolutionOnly(720, Confidence.MediaInfo); + return AugmentQualityResult.SourceAndResolutionOnly(source, sourceConfidence, 720, Confidence.MediaInfo); } if (width > 0 && height > 0) { _logger.Trace("Resolution {0}x{1} considered 480p", width, height); - return AugmentQualityResult.ResolutionOnly(480, Confidence.MediaInfo); + return AugmentQualityResult.SourceAndResolutionOnly(source, sourceConfidence, 480, Confidence.MediaInfo); } _logger.Trace("Resolution {0}x{1}", width, height); diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityResult.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityResult.cs index 4fb22ffa5..d0686df1b 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityResult.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Aggregation/Aggregators/Augmenters/Quality/AugmentQualityResult.cs @@ -36,5 +36,10 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment { return new AugmentQualityResult(QualitySource.Unknown, Confidence.Default, resolution, resolutionConfidence, null, Confidence.Default); } + + public static AugmentQualityResult SourceAndResolutionOnly(QualitySource source, Confidence sourceConfidence, int resolution, Confidence resolutionConfidence) + { + return new AugmentQualityResult(source, sourceConfidence, resolution, resolutionConfidence, null, Confidence.Default); + } } } diff --git a/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoModel.cs b/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoModel.cs index 65880f797..41b40596d 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoModel.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text.Json.Serialization; using FFMpegCore; using NzbDrone.Core.Datastore; @@ -57,5 +58,8 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo public List Subtitles { get; set; } public string ScanType { get; set; } + + [JsonIgnore] + public string Title { get; set; } } } diff --git a/src/NzbDrone.Core/MediaFiles/MediaInfo/VideoFileInfoReader.cs b/src/NzbDrone.Core/MediaFiles/MediaInfo/VideoFileInfoReader.cs index 6f9b4c39b..98d2d9b87 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaInfo/VideoFileInfoReader.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaInfo/VideoFileInfoReader.cs @@ -101,6 +101,11 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo mediaInfoModel.RawStreamData = ffprobeOutput; mediaInfoModel.SchemaRevision = CURRENT_MEDIA_INFO_SCHEMA_REVISION; + if (analysis.Format.Tags?.TryGetValue("title", out var title) ?? false) + { + mediaInfoModel.Title = title; + } + FFProbeFrames frames = null; // if it looks like PQ10 or similar HDR, do a frame analysis to figure out which type it is