From ca38a9b5774243c2e1c3cd1abfc8d218bca4409e Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 21 Sep 2024 08:55:05 -0700 Subject: [PATCH] Fixed: Aggregating media files with 576p resolution --- .../Aggregators/AggregateQualityFixture.cs | 36 +++++++++++++++++++ .../AugmentQualityFromMediaInfoFixture.cs | 22 ++++++++++++ .../Quality/AugmentQualityFromMediaInfo.cs | 6 ++++ src/NzbDrone.Core/Qualities/QualityFinder.cs | 14 ++++++++ 4 files changed, 78 insertions(+) diff --git a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/AggregateQualityFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/AggregateQualityFixture.cs index b88b66ffb..d25181345 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/AggregateQualityFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Aggregation/Aggregators/AggregateQualityFixture.cs @@ -170,5 +170,41 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators result.Quality.Revision.Version.Should().Be(2); result.Quality.RevisionDetectionSource.Should().Be(QualityDetectionSource.Name); } + + [Test] + public void should_return_Bluray576p_when_Bluray_came_from_name_and_mediainfo_indicates_576p() + { + _nameAugmenter.Setup(s => s.AugmentQuality(It.IsAny(), It.IsAny())) + .Returns(new AugmentQualityResult(QualitySource.Bluray, Confidence.Default, 480, Confidence.Default, new Revision(0), Confidence.Tag)); + + _mediaInfoAugmenter.Setup(s => s.AugmentQuality(It.IsAny(), It.IsAny())) + .Returns(AugmentQualityResult.ResolutionOnly(576, Confidence.MediaInfo)); + + GivenAugmenters(_nameAugmenter, _mediaInfoAugmenter); + + var result = Subject.Aggregate(new LocalEpisode(), null); + + result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Name); + result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.MediaInfo); + result.Quality.Quality.Should().Be(Quality.Bluray576p); + } + + [Test] + public void should_return_SDTV_when_HDTV_came_from_name_and_mediainfo_indicates_576p() + { + _nameAugmenter.Setup(s => s.AugmentQuality(It.IsAny(), It.IsAny())) + .Returns(new AugmentQualityResult(QualitySource.Television, Confidence.Default, 480, Confidence.Default, new Revision(0), Confidence.Tag)); + + _mediaInfoAugmenter.Setup(s => s.AugmentQuality(It.IsAny(), It.IsAny())) + .Returns(AugmentQualityResult.ResolutionOnly(576, Confidence.MediaInfo)); + + GivenAugmenters(_nameAugmenter, _mediaInfoAugmenter); + + var result = Subject.Aggregate(new LocalEpisode(), null); + + result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Name); + result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.MediaInfo); + result.Quality.Quality.Should().Be(Quality.SDTV); + } } } 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 af72aa538..783364899 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 @@ -47,6 +47,8 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators.Au [TestCase(1490, 1, 720)] [TestCase(1280, 1, 720)] // HD [TestCase(1200, 1, 720)] + [TestCase(1000, 1, 576)] + [TestCase(720, 576, 576)] [TestCase(800, 1, 480)] [TestCase(720, 1, 480)] // SDTV [TestCase(600, 1, 480)] @@ -108,5 +110,25 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators.Au result.Resolution.Should().Be(1080); result.Source.Should().Be(QualitySource.Unknown); } + + [Test] + public void should_include_source_for_576_if_extracted_from_title() + { + var mediaInfo = Builder.CreateNew() + .With(m => m.Width = 1024) + .With(m => m.Height = 576) + .With(m => m.Title = "Series.Title.S01E05.Bluray.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(576); + result.Source.Should().Be(QualitySource.Bluray); + } } } 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 d854bbfaa..e03748e98 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 @@ -63,6 +63,12 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment return AugmentQualityResult.SourceAndResolutionOnly(source, sourceConfidence, 720, Confidence.MediaInfo); } + if (width >= 1000 || height >= 560) + { + _logger.Trace("Resolution {0}x{1} considered 576p", width, height); + return AugmentQualityResult.SourceAndResolutionOnly(source, sourceConfidence, 576, Confidence.MediaInfo); + } + if (width > 0 && height > 0) { _logger.Trace("Resolution {0}x{1} considered 480p", width, height); diff --git a/src/NzbDrone.Core/Qualities/QualityFinder.cs b/src/NzbDrone.Core/Qualities/QualityFinder.cs index 8c75468ee..969d19128 100644 --- a/src/NzbDrone.Core/Qualities/QualityFinder.cs +++ b/src/NzbDrone.Core/Qualities/QualityFinder.cs @@ -17,6 +17,20 @@ namespace NzbDrone.Core.Qualities return matchingQuality; } + // Handle 576p releases that have a Television or Web source, so they don't get rolled up to Bluray 576p + if (resolution < 720) + { + switch (source) + { + case QualitySource.Television: + return Quality.SDTV; + case QualitySource.Web: + return Quality.WEBDL480p; + case QualitySource.WebRip: + return Quality.WEBRip480p; + } + } + var matchingResolution = Quality.All.Where(q => q.Resolution == resolution) .OrderBy(q => q.Source) .ToList();