From 5114c75cbbe0269a0bbc0a72af592778b18c200c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 10 Apr 2021 14:59:28 -0700 Subject: [PATCH] Fixed: Incorrectly grabbing revision downgrades Closes #4431 --- .../UpgradeDiskSpecificationFixture.cs | 15 +++++++++++++++ .../Specifications/UpgradableSpecification.cs | 17 ++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/UpgradeDiskSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/UpgradeDiskSpecificationFixture.cs index fd47ce3d8..fdb18989e 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/UpgradeDiskSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/UpgradeDiskSpecificationFixture.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; +using Moq; using NUnit.Framework; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.MediaFiles; @@ -138,5 +139,19 @@ namespace NzbDrone.Core.Test.DecisionEngineTests _parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.WEBDL1080p); _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); } + + [Test] + public void should_not_be_upgradable_if_revision_downgrade_and_preferred_word_upgrade_if_propers_are_preferred() + { + Mocker.GetMock() + .Setup(s => s.Calculate(It.IsAny(), It.IsAny())) + .Returns(5); + + _parseResultSingle.PreferredWordScore = 10; + + _firstFile.Quality = new QualityModel(Quality.WEBDL1080p, new Revision(2)); + _parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.WEBDL1080p); + _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs index ce55aea2b..f34c5962b 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs @@ -39,6 +39,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { var qualityComparer = new QualityModelComparer(qualityProfile); var qualityCompare = qualityComparer.Compare(newQuality?.Quality, currentQuality.Quality); + var downloadPropersAndRepacks = _configService.DownloadPropersAndRepacks; if (qualityCompare > 0) { @@ -52,15 +53,25 @@ namespace NzbDrone.Core.DecisionEngine.Specifications return false; } + var qualityRevisionComapre = newQuality?.Revision.CompareTo(currentQuality.Revision); + // Accept unless the user doesn't want to prefer propers, optionally they can // use preferred words to prefer propers/repacks over non-propers/repacks. - if (_configService.DownloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer && - newQuality?.Revision.CompareTo(currentQuality.Revision) > 0) + if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer && + qualityRevisionComapre > 0) { _logger.Debug("New item has a better quality revision"); return true; } + // Reject unless the user does not prefer propers/repacks and it's a revision downgrade. + if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer && + qualityRevisionComapre < 0) + { + _logger.Debug("Existing item has a better quality revision, skipping"); + return false; + } + var languageCompare = new LanguageComparer(languageProfile).Compare(newLanguage, currentLanguage); if (languageCompare > 0) @@ -77,7 +88,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications if (!IsPreferredWordUpgradable(currentScore, newScore)) { - _logger.Debug("Existing item has a better preferred word score, skipping"); + _logger.Debug("Existing item has an equal or better preferred word score, skipping"); return false; }