Fixed: Incorrectly grabbing revision downgrades

Closes #4431
This commit is contained in:
Mark McDowall 2021-04-10 14:59:28 -07:00
parent d7e9ccde8e
commit 5114c75cbb
2 changed files with 29 additions and 3 deletions

View File

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.DecisionEngine.Specifications;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
@ -138,5 +139,19 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.WEBDL1080p); _parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.WEBDL1080p);
_upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); _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<IEpisodeFilePreferredWordCalculator>()
.Setup(s => s.Calculate(It.IsAny<Series>(), It.IsAny<EpisodeFile>()))
.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();
}
} }
} }

View File

@ -39,6 +39,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
{ {
var qualityComparer = new QualityModelComparer(qualityProfile); var qualityComparer = new QualityModelComparer(qualityProfile);
var qualityCompare = qualityComparer.Compare(newQuality?.Quality, currentQuality.Quality); var qualityCompare = qualityComparer.Compare(newQuality?.Quality, currentQuality.Quality);
var downloadPropersAndRepacks = _configService.DownloadPropersAndRepacks;
if (qualityCompare > 0) if (qualityCompare > 0)
{ {
@ -52,15 +53,25 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return false; return false;
} }
var qualityRevisionComapre = newQuality?.Revision.CompareTo(currentQuality.Revision);
// Accept unless the user doesn't want to prefer propers, optionally they can // Accept unless the user doesn't want to prefer propers, optionally they can
// use preferred words to prefer propers/repacks over non-propers/repacks. // use preferred words to prefer propers/repacks over non-propers/repacks.
if (_configService.DownloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer && if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
newQuality?.Revision.CompareTo(currentQuality.Revision) > 0) qualityRevisionComapre > 0)
{ {
_logger.Debug("New item has a better quality revision"); _logger.Debug("New item has a better quality revision");
return true; 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); var languageCompare = new LanguageComparer(languageProfile).Compare(newLanguage, currentLanguage);
if (languageCompare > 0) if (languageCompare > 0)
@ -77,7 +88,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
if (!IsPreferredWordUpgradable(currentScore, newScore)) 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; return false;
} }