From 33fa468f91adbb155fca963d8fdcb143f5df817e Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 10 Sep 2013 19:07:22 -0700 Subject: [PATCH] Cutoff moved to its own spec --- ...xture.cs => CutoffSpecificationFixture.cs} | 8 ++-- .../QualityUpgradeSpecificationFixture.cs | 6 +-- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 2 +- .../QualityUpgradableSpecification.cs | 11 ++++- .../Specifications/CutoffSpecification.cs | 44 +++++++++++++++++++ .../{ => Specifications}/DownloadDecision.cs | 0 .../RssSync/UpgradeHistorySpecification.cs | 4 +- .../UpgradeDiskSpecification.cs | 4 +- NzbDrone.Core/NzbDrone.Core.csproj | 3 +- 9 files changed, 66 insertions(+), 16 deletions(-) rename NzbDrone.Core.Test/DecisionEngineTests/{QualityUpgradableSpecificationFixture.cs => CutoffSpecificationFixture.cs} (77%) create mode 100644 NzbDrone.Core/DecisionEngine/Specifications/CutoffSpecification.cs rename NzbDrone.Core/DecisionEngine/{ => Specifications}/DownloadDecision.cs (100%) diff --git a/NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradableSpecificationFixture.cs b/NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs similarity index 77% rename from NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradableSpecificationFixture.cs rename to NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs index c7eb4bf4b..ebb433bb7 100644 --- a/NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradableSpecificationFixture.cs +++ b/NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs @@ -8,26 +8,26 @@ using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.DecisionEngineTests { [TestFixture] - public class QualityUpgradableSpecificationFixture : CoreTest + public class CutoffSpecificationFixture : CoreTest { [Test] public void IsUpgradePossible_should_return_true_if_current_episode_is_less_than_cutoff() { - Subject.IsUpgradable(new QualityProfile { Cutoff = Quality.Bluray1080p }, + Subject.CutoffNotMet(new QualityProfile { Cutoff = Quality.Bluray1080p }, new QualityModel(Quality.DVD, true)).Should().BeTrue(); } [Test] public void IsUpgradePossible_should_return_false_if_current_episode_is_equal_to_cutoff() { - Subject.IsUpgradable(new QualityProfile { Cutoff = Quality.HDTV720p }, + Subject.CutoffNotMet(new QualityProfile { Cutoff = Quality.HDTV720p }, new QualityModel(Quality.HDTV720p, true)).Should().BeFalse(); } [Test] public void IsUpgradePossible_should_return_false_if_current_episode_is_greater_than_cutoff() { - Subject.IsUpgradable(new QualityProfile { Cutoff = Quality.HDTV720p }, + Subject.CutoffNotMet(new QualityProfile { Cutoff = Quality.HDTV720p }, new QualityModel(Quality.Bluray1080p, true)).Should().BeFalse(); } } diff --git a/NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradeSpecificationFixture.cs b/NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradeSpecificationFixture.cs index 2a489ee8a..cc631b871 100644 --- a/NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradeSpecificationFixture.cs +++ b/NzbDrone.Core.Test/DecisionEngineTests/QualityUpgradeSpecificationFixture.cs @@ -17,7 +17,6 @@ namespace NzbDrone.Core.Test.DecisionEngineTests new object[] { Quality.SDTV, false, Quality.SDTV, true, Quality.SDTV, true }, new object[] { Quality.WEBDL720p, false, Quality.WEBDL720p, true, Quality.WEBDL720p, true }, new object[] { Quality.SDTV, false, Quality.SDTV, false, Quality.SDTV, false }, - new object[] { Quality.SDTV, false, Quality.DVD, true, Quality.SDTV, false }, new object[] { Quality.WEBDL720p, false, Quality.HDTV720p, true, Quality.Bluray720p, false }, new object[] { Quality.WEBDL720p, false, Quality.HDTV720p, true, Quality.WEBDL720p, false }, new object[] { Quality.WEBDL720p, false, Quality.WEBDL720p, false, Quality.WEBDL720p, false }, @@ -37,7 +36,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests { GivenAutoDownloadPropers(true); - Subject.IsUpgradable(new QualityProfile() { Cutoff = cutoff }, new QualityModel(current, currentProper), new QualityModel(newQuality, newProper)) + Subject.IsUpgradable(new QualityModel(current, currentProper), new QualityModel(newQuality, newProper)) .Should().Be(expected); } @@ -46,8 +45,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests { GivenAutoDownloadPropers(false); - Subject.IsUpgradable(new QualityProfile { Cutoff = Quality.Bluray1080p }, - new QualityModel(Quality.DVD, true), + Subject.IsUpgradable(new QualityModel(Quality.DVD, true), new QualityModel(Quality.DVD, false)).Should().BeFalse(); } } diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index fef7f3295..1170aa661 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -110,6 +110,7 @@ + @@ -181,7 +182,6 @@ - diff --git a/NzbDrone.Core/DecisionEngine/QualityUpgradableSpecification.cs b/NzbDrone.Core/DecisionEngine/QualityUpgradableSpecification.cs index 8fbd65d1a..2f35a1db6 100644 --- a/NzbDrone.Core/DecisionEngine/QualityUpgradableSpecification.cs +++ b/NzbDrone.Core/DecisionEngine/QualityUpgradableSpecification.cs @@ -1,3 +1,4 @@ +using System; using NLog; using NzbDrone.Core.Configuration; using NzbDrone.Core.Qualities; @@ -7,7 +8,8 @@ namespace NzbDrone.Core.DecisionEngine { public interface IQualityUpgradableSpecification { - bool IsUpgradable(QualityProfile profile, QualityModel currentQuality, QualityModel newQuality = null); + bool IsUpgradable(QualityModel currentQuality, QualityModel newQuality = null); + bool CutoffNotMet(QualityProfile profile, QualityModel currentQuality, QualityModel newQuality = null); } public class QualityUpgradableSpecification : IQualityUpgradableSpecification @@ -21,7 +23,7 @@ namespace NzbDrone.Core.DecisionEngine _logger = logger; } - public bool IsUpgradable(QualityProfile profile, QualityModel currentQuality, QualityModel newQuality = null) + public bool IsUpgradable(QualityModel currentQuality, QualityModel newQuality = null) { if (newQuality != null) { @@ -38,6 +40,11 @@ namespace NzbDrone.Core.DecisionEngine } } + return true; + } + + public bool CutoffNotMet(QualityProfile profile, QualityModel currentQuality, QualityModel newQuality = null) + { if (currentQuality.Quality >= profile.Cutoff) { _logger.Trace("Existing item meets cut-off. skipping."); diff --git a/NzbDrone.Core/DecisionEngine/Specifications/CutoffSpecification.cs b/NzbDrone.Core/DecisionEngine/Specifications/CutoffSpecification.cs new file mode 100644 index 000000000..2d62c42b3 --- /dev/null +++ b/NzbDrone.Core/DecisionEngine/Specifications/CutoffSpecification.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using NLog; +using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.Parser.Model; + +namespace NzbDrone.Core.DecisionEngine.Specifications +{ + public class CutoffSpecification : IDecisionEngineSpecification + { + private readonly QualityUpgradableSpecification _qualityUpgradableSpecification; + private readonly Logger _logger; + + public CutoffSpecification(QualityUpgradableSpecification qualityUpgradableSpecification, Logger logger) + { + _qualityUpgradableSpecification = qualityUpgradableSpecification; + _logger = logger; + } + + public string RejectionReason + { + get + { + return "Cutoff has already been met"; + } + } + + public virtual bool IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria) + { + foreach (var file in subject.Episodes.Where(c => c.EpisodeFileId != 0).Select(c => c.EpisodeFile.Value)) + { + _logger.Trace("Comparing file quality with report. Existing file is {0}", file.Quality); + + + if (!_qualityUpgradableSpecification.CutoffNotMet(subject.Series.QualityProfile, file.Quality, subject.ParsedEpisodeInfo.Quality)) + { + return false; + } + } + + return true; + } + } +} diff --git a/NzbDrone.Core/DecisionEngine/DownloadDecision.cs b/NzbDrone.Core/DecisionEngine/Specifications/DownloadDecision.cs similarity index 100% rename from NzbDrone.Core/DecisionEngine/DownloadDecision.cs rename to NzbDrone.Core/DecisionEngine/Specifications/DownloadDecision.cs diff --git a/NzbDrone.Core/DecisionEngine/Specifications/RssSync/UpgradeHistorySpecification.cs b/NzbDrone.Core/DecisionEngine/Specifications/RssSync/UpgradeHistorySpecification.cs index 21611c161..e844cb91d 100644 --- a/NzbDrone.Core/DecisionEngine/Specifications/RssSync/UpgradeHistorySpecification.cs +++ b/NzbDrone.Core/DecisionEngine/Specifications/RssSync/UpgradeHistorySpecification.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync { get { - return "Higher quality report exists in history"; + return "Existing file in history is of equal or higher quality"; } } @@ -40,7 +40,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync if (bestQualityInHistory != null) { _logger.Trace("Comparing history quality with report. History is {0}", bestQualityInHistory); - if (!_qualityUpgradableSpecification.IsUpgradable(subject.Series.QualityProfile, bestQualityInHistory, subject.ParsedEpisodeInfo.Quality)) + if (!_qualityUpgradableSpecification.IsUpgradable(bestQualityInHistory, subject.ParsedEpisodeInfo.Quality)) return false; } } diff --git a/NzbDrone.Core/DecisionEngine/Specifications/UpgradeDiskSpecification.cs b/NzbDrone.Core/DecisionEngine/Specifications/UpgradeDiskSpecification.cs index 8c0f07450..85aaf220b 100644 --- a/NzbDrone.Core/DecisionEngine/Specifications/UpgradeDiskSpecification.cs +++ b/NzbDrone.Core/DecisionEngine/Specifications/UpgradeDiskSpecification.cs @@ -21,7 +21,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { get { - return "Higher quality exists on disk"; + return "Existing file on disk is of equal or higher quality"; } } @@ -31,7 +31,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { _logger.Trace("Comparing file quality with report. Existing file is {0}", file.Quality); - if (!_qualityUpgradableSpecification.IsUpgradable(subject.Series.QualityProfile, file.Quality, subject.ParsedEpisodeInfo.Quality)) + if (!_qualityUpgradableSpecification.IsUpgradable(file.Quality, subject.ParsedEpisodeInfo.Quality)) { return false; } diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 409494e92..dd2fb5d5d 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -182,9 +182,10 @@ - + +