From 485fa6a13d382b769fe63f1f1bb61ce2e671b5e9 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 4 Oct 2014 23:04:19 -0700 Subject: [PATCH] Fixed: Only upgrade anime version when release group is the same --- ...AnimeVersionUpgradeSpecificationFixture.cs | 111 ++++++++++++++++++ .../NotInQueueSpecificationFixture.cs | 1 - .../NzbDrone.Core.Test.csproj | 1 + .../AnimeVersionUpgradeSpecification.cs | 67 +++++++++++ .../Specifications/NotInQueueSpecification.cs | 1 - src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 6 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 src/NzbDrone.Core.Test/DecisionEngineTests/AnimeVersionUpgradeSpecificationFixture.cs create mode 100644 src/NzbDrone.Core/DecisionEngine/Specifications/AnimeVersionUpgradeSpecification.cs diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/AnimeVersionUpgradeSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/AnimeVersionUpgradeSpecificationFixture.cs new file mode 100644 index 000000000..f785ee6c9 --- /dev/null +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/AnimeVersionUpgradeSpecificationFixture.cs @@ -0,0 +1,111 @@ +using System; +using System.Linq; +using FizzWare.NBuilder; +using FluentAssertions; +using Marr.Data; +using NUnit.Framework; +using NzbDrone.Core.DecisionEngine; +using NzbDrone.Core.DecisionEngine.Specifications; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Qualities; +using NzbDrone.Core.Tv; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.DecisionEngineTests +{ + [TestFixture] + public class AnimeVersionUpgradeSpecificationFixture : CoreTest + { + private AnimeVersionUpgradeSpecification _subject; + private RemoteEpisode _remoteEpisode; + private EpisodeFile _episodeFile; + + [SetUp] + public void Setup() + { + Mocker.Resolve(); + _subject = Mocker.Resolve(); + + _episodeFile = new EpisodeFile + { + Quality = new QualityModel(Quality.HDTV720p, new Revision()), + ReleaseGroup = "DRONE2" + }; + + _remoteEpisode = new RemoteEpisode(); + _remoteEpisode.Series = new Series { SeriesType = SeriesTypes.Anime }; + _remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo + { + Quality = new QualityModel(Quality.HDTV720p, new Revision(2)), + ReleaseGroup = "DRONE" + }; + + _remoteEpisode.Episodes = Builder.CreateListOfSize(1) + .All() + .With(e => e.EpisodeFile = new LazyLoaded(_episodeFile)) + .Build() + .ToList(); + } + + private void GivenStandardSeries() + { + _remoteEpisode.Series.SeriesType = SeriesTypes.Standard; + } + + private void GivenNoVersionUpgrade() + { + _remoteEpisode.ParsedEpisodeInfo.Quality.Revision = new Revision(); + } + + [Test] + public void should_be_true_when_no_existing_file() + { + _remoteEpisode.Episodes.First().EpisodeFileId = 0; + + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeTrue(); + } + + [Test] + public void should_be_true_if_series_is_not_anime() + { + GivenStandardSeries(); + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeTrue(); + } + + [Test] + public void should_be_true_if_is_not_a_version_upgrade_for_existing_file() + { + GivenNoVersionUpgrade(); + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeTrue(); + } + + [Test] + public void should_be_true_when_release_group_matches() + { + _episodeFile.ReleaseGroup = _remoteEpisode.ParsedEpisodeInfo.ReleaseGroup; + + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeTrue(); + } + + [Test] + public void should_be_false_when_existing_file_doesnt_have_a_release_group() + { + _episodeFile.ReleaseGroup = String.Empty; + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeFalse(); + } + + [Test] + public void should_should_be_false_when_release_doesnt_have_a_release_group() + { + _remoteEpisode.ParsedEpisodeInfo.ReleaseGroup = String.Empty; + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeFalse(); + } + + [Test] + public void should_be_false_when_release_group_does_not_match() + { + _subject.IsSatisfiedBy(_remoteEpisode, null).Should().BeFalse(); + } + } +} \ No newline at end of file diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/NotInQueueSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/NotInQueueSpecificationFixture.cs index 36ace6346..6702cc669 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/NotInQueueSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/NotInQueueSpecificationFixture.cs @@ -10,7 +10,6 @@ using NzbDrone.Core.Profiles; using NzbDrone.Core.Qualities; using NzbDrone.Core.Tv; using NzbDrone.Core.Test.Framework; -using NzbDrone.Core.Queue; namespace NzbDrone.Core.Test.DecisionEngineTests { diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 5b6ba1781..32bbf520f 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -122,6 +122,7 @@ + diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/AnimeVersionUpgradeSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/AnimeVersionUpgradeSpecification.cs new file mode 100644 index 000000000..57c7c44bf --- /dev/null +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/AnimeVersionUpgradeSpecification.cs @@ -0,0 +1,67 @@ +using System.Linq; +using NLog; +using NzbDrone.Common; +using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.DecisionEngine.Specifications +{ + public class AnimeVersionUpgradeSpecification : IDecisionEngineSpecification + { + private readonly QualityUpgradableSpecification _qualityUpgradableSpecification; + private readonly Logger _logger; + + public AnimeVersionUpgradeSpecification(QualityUpgradableSpecification qualityUpgradableSpecification, Logger logger) + { + _qualityUpgradableSpecification = qualityUpgradableSpecification; + _logger = logger; + } + + public string RejectionReason + { + get + { + return "Version upgrade for a different release group"; + } + } + + public RejectionType Type { get { return RejectionType.Permanent; } } + + public virtual bool IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria) + { + var releaseGroup = subject.ParsedEpisodeInfo.ReleaseGroup; + + if (subject.Series.SeriesType != SeriesTypes.Anime) + { + return true; + } + + foreach (var file in subject.Episodes.Where(c => c.EpisodeFileId != 0).Select(c => c.EpisodeFile.Value)) + { + if (_qualityUpgradableSpecification.IsRevisionUpgrade(file.Quality, subject.ParsedEpisodeInfo.Quality)) + { + if (file.ReleaseGroup.IsNullOrWhiteSpace()) + { + _logger.Debug("Unable to compare release group, existing file's release group is unknown"); + return false; + } + + if (releaseGroup.IsNullOrWhiteSpace()) + { + _logger.Debug("Unable to compare release group, release's release group is unknown"); + return false; + } + + if (file.ReleaseGroup != releaseGroup) + { + _logger.Debug("Existing Release group is: {0} - release's release group is: {1}", file.ReleaseGroup, releaseGroup); + return false; + } + } + } + + return true; + } + } +} diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/NotInQueueSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/NotInQueueSpecification.cs index 3e53f7c91..40940d3eb 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/NotInQueueSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/NotInQueueSpecification.cs @@ -5,7 +5,6 @@ using NzbDrone.Core.Download; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Qualities; -using NzbDrone.Core.Queue; namespace NzbDrone.Core.DecisionEngine.Specifications { diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 9a1db5edd..3e406929a 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -254,6 +254,7 @@ +