Fixed: Custom Formats upgrading even when profile doesn't allow upgrades

Closes #5330
This commit is contained in:
Mark McDowall 2023-01-04 13:41:12 -08:00 committed by GitHub
parent 3316665e93
commit fe5c52602a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 145 additions and 108 deletions

View File

@ -1,179 +1,211 @@
using System.Collections.Generic;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.CustomFormats;
using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.DecisionEngine.Specifications;
using NzbDrone.Core.Languages; using NzbDrone.Core.Profiles;
using NzbDrone.Core.Profiles.Qualities; using NzbDrone.Core.Profiles.Qualities;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Test.Languages;
namespace NzbDrone.Core.Test.DecisionEngineTests namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
[TestFixture] [TestFixture]
public class UpgradeAllowedSpecificationFixture : CoreTest<UpgradableSpecification> public class UpgradeAllowedSpecificationFixture : CoreTest<UpgradableSpecification>
{ {
[Test] private CustomFormat _customFormatOne;
public void should_return_false_when_quality_is_better_languages_are_the_same_and_upgrade_allowed_is_false_for_quality_profile() private CustomFormat _customFormatTwo;
private QualityProfile _qualityProfile;
[SetUp]
public void Setup()
{ {
Subject.IsUpgradeAllowed( _customFormatOne = new CustomFormat
new QualityProfile {
Id = 1,
Name = "One"
};
_customFormatTwo = new CustomFormat
{
Id = 2,
Name = "Two"
};
_qualityProfile = new QualityProfile
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = false,
CutoffFormatScore = 100,
FormatItems = new List<ProfileFormatItem>
{ {
Cutoff = Quality.Bluray1080p.Id, new ProfileFormatItem
Items = Qualities.QualityFixture.GetDefaultQualities(), {
UpgradeAllowed = false Id = 1,
}, Format = _customFormatOne,
Score = 50
},
new ProfileFormatItem
{
Id = 1,
Format = _customFormatTwo,
Score = 100
}
}
};
}
[Test]
public void should_return_false_when_quality_is_better_custom_formats_are_the_same_and_upgrading_is_not_allowed()
{
_qualityProfile.UpgradeAllowed = false;
Subject.IsUpgradeAllowed(
_qualityProfile,
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.Bluray1080p)) new List<CustomFormat>(),
new QualityModel(Quality.Bluray1080p),
new List<CustomFormat>())
.Should().BeFalse(); .Should().BeFalse();
} }
[Test] [Test]
public void should_return_true_for_language_upgrade_when_upgrading_is_allowed() public void should_return_false_when_quality_is_same_and_custom_format_is_upgrade_and_upgrading_is_not_allowed()
{ {
_qualityProfile.UpgradeAllowed = false;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{ new QualityModel(Quality.DVD),
Cutoff = Quality.Bluray1080p.Id, new List<CustomFormat> { _customFormatOne },
Items = Qualities.QualityFixture.GetDefaultQualities(), new QualityModel(Quality.DVD),
UpgradeAllowed = true new List<CustomFormat> { _customFormatTwo })
}, .Should().BeFalse();
}
[Test]
public void should_return_true_for_custom_format_upgrade_when_upgrading_is_allowed()
{
_qualityProfile.UpgradeAllowed = true;
Subject.IsUpgradeAllowed(
_qualityProfile,
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD)) new List<CustomFormat> { _customFormatOne },
new QualityModel(Quality.DVD),
new List<CustomFormat> { _customFormatTwo })
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_same_language_when_upgrading_is_allowed() public void should_return_true_for_same_custom_format_score_when_upgrading_is_not_allowed()
{ {
_qualityProfile.UpgradeAllowed = false;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD)) new List<CustomFormat> { _customFormatOne },
new QualityModel(Quality.DVD),
new List<CustomFormat> { _customFormatOne })
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_same_language_when_upgrading_is_not_allowed() public void should_return_true_for_lower_custom_format_score_when_upgrading_is_allowed()
{ {
Subject.IsUpgradeAllowed( _qualityProfile.UpgradeAllowed = true;
new QualityProfile
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD))
.Should().BeTrue();
}
[Test]
public void should_return_true_for_lower_language_when_upgrading_is_allowed()
{
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD)) new List<CustomFormat> { _customFormatTwo },
new QualityModel(Quality.DVD),
new List<CustomFormat> { _customFormatOne })
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_lower_language_when_upgrading_is_not_allowed() public void should_return_true_for_lower_language_when_upgrading_is_not_allowed()
{ {
_qualityProfile.UpgradeAllowed = false;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD)) new List<CustomFormat> { _customFormatTwo },
new QualityModel(Quality.DVD),
new List<CustomFormat> { _customFormatOne })
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_quality_upgrade_when_upgrading_is_allowed() public void should_return_true_for_quality_upgrade_when_upgrading_is_allowed()
{ {
_qualityProfile.UpgradeAllowed = true;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.Bluray1080p)) new List<CustomFormat>(),
new QualityModel(Quality.Bluray1080p),
new List<CustomFormat>())
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_same_quality_when_upgrading_is_allowed() public void should_return_true_for_same_quality_when_upgrading_is_allowed()
{ {
_qualityProfile.UpgradeAllowed = true;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD)) new List<CustomFormat>(),
new QualityModel(Quality.DVD),
new List<CustomFormat>())
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_same_quality_when_upgrading_is_not_allowed() public void should_return_true_for_same_quality_when_upgrading_is_not_allowed()
{ {
_qualityProfile.UpgradeAllowed = false;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = false
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.DVD)) new List<CustomFormat>(),
new QualityModel(Quality.DVD),
new List<CustomFormat>())
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_lower_quality_when_upgrading_is_allowed() public void should_return_true_for_lower_quality_when_upgrading_is_allowed()
{ {
_qualityProfile.UpgradeAllowed = true;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.SDTV)) new List<CustomFormat>(),
new QualityModel(Quality.SDTV),
new List<CustomFormat>())
.Should().BeTrue(); .Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_for_lower_quality_when_upgrading_is_not_allowed() public void should_return_true_for_lower_quality_when_upgrading_is_not_allowed()
{ {
_qualityProfile.UpgradeAllowed = false;
Subject.IsUpgradeAllowed( Subject.IsUpgradeAllowed(
new QualityProfile _qualityProfile,
{
Cutoff = Quality.Bluray1080p.Id,
Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = false
},
new QualityModel(Quality.DVD), new QualityModel(Quality.DVD),
new QualityModel(Quality.SDTV)) new List<CustomFormat>(),
new QualityModel(Quality.SDTV),
new List<CustomFormat>())
.Should().BeTrue(); .Should().BeTrue();
} }
} }

View File

@ -4,7 +4,6 @@ using NzbDrone.Core.CustomFormats;
using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Download.TrackedDownloads;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Profiles.Releases;
using NzbDrone.Core.Queue; using NzbDrone.Core.Queue;
namespace NzbDrone.Core.DecisionEngine.Specifications namespace NzbDrone.Core.DecisionEngine.Specifications
@ -68,7 +67,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
if (!_upgradableSpecification.IsUpgradable(qualityProfile, if (!_upgradableSpecification.IsUpgradable(qualityProfile,
remoteEpisode.ParsedEpisodeInfo.Quality, remoteEpisode.ParsedEpisodeInfo.Quality,
remoteEpisode.CustomFormats, queuedItemCustomFormats,
subject.ParsedEpisodeInfo.Quality, subject.ParsedEpisodeInfo.Quality,
subject.CustomFormats)) subject.CustomFormats))
{ {
@ -79,7 +78,9 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
if (!_upgradableSpecification.IsUpgradeAllowed(subject.Series.QualityProfile, if (!_upgradableSpecification.IsUpgradeAllowed(subject.Series.QualityProfile,
remoteEpisode.ParsedEpisodeInfo.Quality, remoteEpisode.ParsedEpisodeInfo.Quality,
subject.ParsedEpisodeInfo.Quality)) queuedItemCustomFormats,
subject.ParsedEpisodeInfo.Quality,
subject.CustomFormats))
{ {
return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades"); return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades");
} }

View File

@ -14,7 +14,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
bool QualityCutoffNotMet(QualityProfile profile, QualityModel currentQuality, QualityModel newQuality = null); bool QualityCutoffNotMet(QualityProfile profile, QualityModel currentQuality, QualityModel newQuality = null);
bool CutoffNotMet(QualityProfile profile, QualityModel currentQuality, List<CustomFormat> currentCustomFormats, QualityModel newQuality = null); bool CutoffNotMet(QualityProfile profile, QualityModel currentQuality, List<CustomFormat> currentCustomFormats, QualityModel newQuality = null);
bool IsRevisionUpgrade(QualityModel currentQuality, QualityModel newQuality); bool IsRevisionUpgrade(QualityModel currentQuality, QualityModel newQuality);
bool IsUpgradeAllowed(QualityProfile qualityProfile, QualityModel currentQuality, QualityModel newQuality); bool IsUpgradeAllowed(QualityProfile qualityProfile, QualityModel currentQuality, List<CustomFormat> currentCustomFormats, QualityModel newQuality, List<CustomFormat> newCustomFormats);
} }
public class UpgradableSpecification : IUpgradableSpecification public class UpgradableSpecification : IUpgradableSpecification
@ -28,13 +28,6 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
_logger = logger; _logger = logger;
} }
private bool IsPreferredWordUpgradable(int currentScore, int newScore)
{
_logger.Debug("Comparing preferred word score. Current: {0} New: {1}", currentScore, newScore);
return newScore > currentScore;
}
public bool IsUpgradable(QualityProfile qualityProfile, QualityModel currentQuality, List<CustomFormat> currentCustomFormats, QualityModel newQuality, List<CustomFormat> newCustomFormats) public bool IsUpgradable(QualityProfile qualityProfile, QualityModel currentQuality, List<CustomFormat> currentCustomFormats, QualityModel newQuality, List<CustomFormat> newCustomFormats)
{ {
var qualityComparer = new QualityModelComparer(qualityProfile); var qualityComparer = new QualityModelComparer(qualityProfile);
@ -108,6 +101,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
private bool CustomFormatCutoffNotMet(QualityProfile profile, List<CustomFormat> currentFormats) private bool CustomFormatCutoffNotMet(QualityProfile profile, List<CustomFormat> currentFormats)
{ {
var score = profile.CalculateCustomFormatScore(currentFormats); var score = profile.CalculateCustomFormatScore(currentFormats);
return score < profile.CutoffFormatScore; return score < profile.CutoffFormatScore;
} }
@ -142,17 +136,18 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return false; return false;
} }
public bool IsUpgradeAllowed(QualityProfile qualityProfile, QualityModel currentQuality, QualityModel newQuality) public bool IsUpgradeAllowed(QualityProfile qualityProfile, QualityModel currentQuality, List<CustomFormat> currentCustomFormats, QualityModel newQuality, List<CustomFormat> newCustomFormats)
{ {
var isQualityUpgrade = new QualityModelComparer(qualityProfile).Compare(newQuality, currentQuality) > 0; var isQualityUpgrade = new QualityModelComparer(qualityProfile).Compare(newQuality, currentQuality) > 0;
var isCustomFormatUpgrade = qualityProfile.CalculateCustomFormatScore(newCustomFormats) > qualityProfile.CalculateCustomFormatScore(currentCustomFormats);
if (isQualityUpgrade && qualityProfile.UpgradeAllowed) if ((isQualityUpgrade || isCustomFormatUpgrade) && qualityProfile.UpgradeAllowed)
{ {
_logger.Debug("At least one profile allows upgrading"); _logger.Debug("Quality profile allows upgrading");
return true; return true;
} }
if (isQualityUpgrade && !qualityProfile.UpgradeAllowed) if ((isQualityUpgrade || isCustomFormatUpgrade) && !qualityProfile.UpgradeAllowed)
{ {
_logger.Debug("Quality profile does not allow upgrades, skipping"); _logger.Debug("Quality profile does not allow upgrades, skipping");
return false; return false;

View File

@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.CustomFormats;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@ -8,11 +9,15 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
public class UpgradeAllowedSpecification : IDecisionEngineSpecification public class UpgradeAllowedSpecification : IDecisionEngineSpecification
{ {
private readonly UpgradableSpecification _upgradableSpecification; private readonly UpgradableSpecification _upgradableSpecification;
private readonly ICustomFormatCalculationService _formatService;
private readonly Logger _logger; private readonly Logger _logger;
public UpgradeAllowedSpecification(UpgradableSpecification upgradableSpecification, Logger logger) public UpgradeAllowedSpecification(UpgradableSpecification upgradableSpecification,
ICustomFormatCalculationService formatService,
Logger logger)
{ {
_upgradableSpecification = upgradableSpecification; _upgradableSpecification = upgradableSpecification;
_formatService = formatService;
_logger = logger; _logger = logger;
} }
@ -31,11 +36,15 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
continue; continue;
} }
var fileCustomFormats = _formatService.ParseCustomFormat(file, subject.Series);
_logger.Debug("Comparing file quality with report. Existing file is {0}", file.Quality); _logger.Debug("Comparing file quality with report. Existing file is {0}", file.Quality);
if (!_upgradableSpecification.IsUpgradeAllowed(qualityProfile, if (!_upgradableSpecification.IsUpgradeAllowed(qualityProfile,
file.Quality, file.Quality,
subject.ParsedEpisodeInfo.Quality)) fileCustomFormats,
subject.ParsedEpisodeInfo.Quality,
subject.CustomFormats))
{ {
_logger.Debug("Upgrading is not allowed by the quality profile"); _logger.Debug("Upgrading is not allowed by the quality profile");