From 62f4fc5e5889013fa5b2cd89d1ee06f5b2ea17c9 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 10 Apr 2015 07:32:34 -0700 Subject: [PATCH] Fixed: Some anime season 1 parsing --- .../AbsoluteEpisodeNumberParserFixture.cs | 2 + .../ParsingServiceTests/GetEpisodesFixture.cs | 94 ++++++++++++++----- src/NzbDrone.Core/Parser/ParsingService.cs | 5 +- 3 files changed, 78 insertions(+), 23 deletions(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/AbsoluteEpisodeNumberParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/AbsoluteEpisodeNumberParserFixture.cs index dad65f2d4..2ece936a9 100644 --- a/src/NzbDrone.Core.Test/ParserTests/AbsoluteEpisodeNumberParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/AbsoluteEpisodeNumberParserFixture.cs @@ -77,6 +77,8 @@ namespace NzbDrone.Core.Test.ParserTests [TestCase("[Jumonji-Giri]_[F-B]_Kagihime_Monogatari_Eikyuu_Alice_Rondo_Ep08_(8246e542).mkv", "Kagihime Monogatari Eikyuu Alice Rondo", 8, 0, 0)] [TestCase("Knights of Sidonia - 01 [1080p 10b DTSHD-MA eng sub].mkv", "Knights of Sidonia", 1, 0, 0)] [TestCase("Series Title (2010) {01} Episode Title (1).hdtv-720p", "Series Title (2010)", 1, 0, 0)] + [TestCase("[Hatsuyuki] Dragon Ball Kai (2014) - 017 (115) [1280x720][B2CFBC0F]", "Dragon Ball Kai 2014", 17, 0, 0)] + [TestCase("[Hatsuyuki] Dragon Ball Kai (2014) - 018 (116) [1280x720][C4A3B16E]", "Dragon Ball Kai 2014", 18, 0, 0)] //[TestCase("", "", 0, 0, 0)] public void should_parse_absolute_numbers(string postTitle, string title, int absoluteEpisodeNumber, int seasonNumber, int episodeNumber) { diff --git a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs index 4c621baa9..41474a8a6 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs @@ -186,28 +186,6 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); } - [Test] - public void should_use_scene_numbering_when_season_0_for_anime() - { - GivenAbsoluteNumberingSeries(); - - Mocker.GetMock() - .Setup(s => s.GetSeasonNumber(_parsedEpisodeInfo.SeriesTitle)) - .Returns(0); - - Mocker.GetMock() - .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), 0, It.IsAny())) - .Returns(new List()); - - Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); - - Mocker.GetMock() - .Verify(v => v.FindEpisodesBySceneNumbering(It.IsAny(), 0, It.IsAny()), Times.Once()); - - Mocker.GetMock() - .Verify(v => v.FindEpisode(It.IsAny(), 0, It.IsAny()), Times.Once()); - } - [Test] public void should_look_for_episode_in_season_zero_if_absolute_special() { @@ -223,5 +201,77 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), 0, It.IsAny()), Times.Once()); } + + [TestCase(0)] + [TestCase(1)] + [TestCase(2)] + public void should_use_scene_numbering_when_scene_season_number_has_value(int seasonNumber) + { + GivenAbsoluteNumberingSeries(); + + Mocker.GetMock() + .Setup(s => s.GetSeasonNumber(_parsedEpisodeInfo.SeriesTitle)) + .Returns(seasonNumber); + + Mocker.GetMock() + .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny())) + .Returns(new List()); + + Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); + + Mocker.GetMock() + .Verify(v => v.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny()), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.FindEpisode(It.IsAny(), seasonNumber, It.IsAny()), Times.Once()); + } + + [TestCase(0)] + [TestCase(1)] + [TestCase(2)] + public void should_find_episode_by_season_and_scene_absolute_episode_number(int seasonNumber) + { + GivenAbsoluteNumberingSeries(); + + Mocker.GetMock() + .Setup(s => s.GetSeasonNumber(_parsedEpisodeInfo.SeriesTitle)) + .Returns(seasonNumber); + + Mocker.GetMock() + .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny())) + .Returns(new List { _episodes.First() }); + + Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); + + Mocker.GetMock() + .Verify(v => v.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny()), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.FindEpisode(It.IsAny(), seasonNumber, It.IsAny()), Times.Never()); + } + + [TestCase(0)] + [TestCase(1)] + [TestCase(2)] + public void should_find_episode_by_season_and_absolute_episode_number_when_scene_absolute_episode_number_returns_multiple_results(int seasonNumber) + { + GivenAbsoluteNumberingSeries(); + + Mocker.GetMock() + .Setup(s => s.GetSeasonNumber(_parsedEpisodeInfo.SeriesTitle)) + .Returns(seasonNumber); + + Mocker.GetMock() + .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny())) + .Returns(Builder.CreateListOfSize(5).Build().ToList()); + + Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); + + Mocker.GetMock() + .Verify(v => v.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny()), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.FindEpisode(It.IsAny(), seasonNumber, It.IsAny()), Times.Once()); + } } } diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index 3eb9e3636..47c42032a 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -188,7 +188,10 @@ namespace NzbDrone.Core.Parser else if (sceneSource) { - if (sceneSeasonNumber.HasValue && (sceneSeasonNumber == 0 || sceneSeasonNumber > 1)) + // Is there a reason why we excluded season 1 from this handling before? + // Might have something to do with the scene name to season number check + // If this needs to be reverted tests will need to be added + if (sceneSeasonNumber.HasValue) { var episodes = _episodeService.FindEpisodesBySceneNumbering(series.Id, sceneSeasonNumber.Value, absoluteEpisodeNumber);