From 72e56a18458310b72d7f3be4c35d56a668838ecb Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 28 Dec 2013 01:22:03 -0800 Subject: [PATCH] Fixed: Some specials will no longer be treated as containing the full season on import --- .../FullSeasonSpecificationFixture.cs | 48 +++++++++++++++++++ .../NzbDrone.Core.Test.csproj | 1 + .../Specifications/FullSeasonSpecification.cs | 31 ++++++++++++ src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 4 files changed, 81 insertions(+) create mode 100644 src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecificationFixture.cs create mode 100644 src/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecification.cs diff --git a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecificationFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecificationFixture.cs new file mode 100644 index 000000000..a62e8ba9e --- /dev/null +++ b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecificationFixture.cs @@ -0,0 +1,48 @@ +using FizzWare.NBuilder; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Common; +using NzbDrone.Core.MediaFiles.EpisodeImport.Specifications; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Core.Tv; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Specifications +{ + [TestFixture] + public class FullSeasonSpecificationFixture : CoreTest + { + private LocalEpisode _localEpisode; + + [SetUp] + public void Setup() + { + _localEpisode = new LocalEpisode + { + Path = @"C:\Test\30 Rock\30.rock.s01e01.avi".AsOsAgnostic(), + Size = 100, + Series = Builder.CreateNew().Build(), + ParsedEpisodeInfo = new ParsedEpisodeInfo + { + FullSeason = false + } + }; + } + + [Test] + public void should_return_false_when_file_contains_the_full_season() + { + _localEpisode.ParsedEpisodeInfo.FullSeason = true; + + Subject.IsSatisfiedBy(_localEpisode).Should().BeFalse(); + } + + [Test] + public void should_return_true_when_file_does_not_contain_the_full_season() + { + Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 42a514e8c..8e4f7cf7c 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -146,6 +146,7 @@ + diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecification.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecification.cs new file mode 100644 index 000000000..0bd8418f4 --- /dev/null +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FullSeasonSpecification.cs @@ -0,0 +1,31 @@ +using System; +using System.IO; +using NLog; +using NzbDrone.Common; +using NzbDrone.Core.Parser.Model; + +namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications +{ + public class FullSeasonSpecification : IImportDecisionEngineSpecification + { + private readonly Logger _logger; + + public FullSeasonSpecification(Logger logger) + { + _logger = logger; + } + + public string RejectionReason { get { return "Full season file"; } } + + public bool IsSatisfiedBy(LocalEpisode localEpisode) + { + if (localEpisode.ParsedEpisodeInfo.FullSeason) + { + _logger.Trace("Single episode file detected as containing all episodes in the season"); + return false; + } + + return true; + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index a18250e84..af8e20cee 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -284,6 +284,7 @@ +