From 1e99856ffcbc678e28114240416fecec6deb2e1c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 28 Mar 2021 12:41:01 -0700 Subject: [PATCH] Fixed: Exception when searching some anime Closes #4414 --- .../ParsingServiceTests/GetEpisodesFixture.cs | 47 +++++++++++++++++++ src/NzbDrone.Core/Parser/ParsingService.cs | 6 +-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs index dee242030..952d54521 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs @@ -274,6 +274,7 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests { GivenAbsoluteNumberingSeries(); _parsedEpisodeInfo.SeasonNumber = seasonNumber; + _parsedEpisodeInfo.EpisodeNumbers = new int[] { }; Mocker.GetMock() .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny())) @@ -288,6 +289,52 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests .Verify(v => v.FindEpisode(It.IsAny(), seasonNumber, It.IsAny()), Times.Never()); } + [TestCase(2)] + [TestCase(20)] + public void should_find_episode_by_parsed_season_and_absolute_episode_number_when_season_number_is_2_or_higher_and_scene_season_number_lookup_failed(int seasonNumber) + { + GivenAbsoluteNumberingSeries(); + _parsedEpisodeInfo.SeasonNumber = seasonNumber; + _parsedEpisodeInfo.EpisodeNumbers = new int[] { }; + + Mocker.GetMock() + .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), seasonNumber, It.IsAny())) + .Returns(new List()); + + Mocker.GetMock() + .Setup(s => s.FindEpisode(It.IsAny(), seasonNumber, It.IsAny())) + .Returns(_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.Once()); + } + + [TestCase(2)] + [TestCase(20)] + public void should_not_find_episode_by_parsed_season_and_absolute_episode_number_when_season_number_is_2_or_higher_and_a_episode_number_was_parsed(int seasonNumber) + { + GivenAbsoluteNumberingSeries(); + _parsedEpisodeInfo.SeasonNumber = seasonNumber; + _parsedEpisodeInfo.EpisodeNumbers = new []{ 1 }; + + Mocker.GetMock() + .Setup(s => s.FindEpisodesBySceneNumbering(It.IsAny(), 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.Never()); + + Mocker.GetMock() + .Verify(v => v.FindEpisode(It.IsAny(), seasonNumber, It.IsAny()), Times.Never()); + } + [TestCase(0)] [TestCase(1)] [TestCase(2)] diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index b63ecf02c..2d12a04c7 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -465,13 +465,13 @@ namespace NzbDrone.Core.Parser episodes.AddIfNotNull(episode); } } - else if (parsedEpisodeInfo.SeasonNumber > 1) + else if (parsedEpisodeInfo.SeasonNumber > 1 && parsedEpisodeInfo.EpisodeNumbers.Empty()) { episodes = _episodeService.FindEpisodesBySceneNumbering(series.Id, parsedEpisodeInfo.SeasonNumber, absoluteEpisodeNumber); if (episodes.Empty()) - { - var episode = _episodeService.FindEpisode(series.Id, sceneSeasonNumber.Value, absoluteEpisodeNumber); + { + var episode = _episodeService.FindEpisode(series.Id, parsedEpisodeInfo.SeasonNumber, absoluteEpisodeNumber); episodes.AddIfNotNull(episode); } }