From a36397452dbc90dd44f878d59276198b22c8e403 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 5 Feb 2022 19:12:56 -0800 Subject: [PATCH] Fixed: Parsing episodes when full series does not have XEM mappings Fixed #4849 --- .../ParsingServiceTests/GetEpisodesFixture.cs | 66 +++++++++++++++++++ src/NzbDrone.Core/Parser/ParsingService.cs | 14 ++-- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs index 952d54521..a60e4ebb8 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs @@ -77,6 +77,12 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests _parsedEpisodeInfo.AbsoluteEpisodeNumbers = new[] { 1 }; } + private void GivenFullSeason() + { + _parsedEpisodeInfo.FullSeason = true; + _parsedEpisodeInfo.EpisodeNumbers = Array.Empty(); + } + [Test] public void should_get_daily_episode_episode_when_search_criteria_is_null() { @@ -452,5 +458,65 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests Mocker.GetMock() .Verify(v => v.FindEpisode(_series.Id, _parsedEpisodeInfo.SeasonNumber, _parsedEpisodeInfo.EpisodeNumbers.First()), Times.Once()); } + + [Test] + public void should_lookup_full_season_by_season_number_if_series_does_not_use_scene_numbering() + { + GivenFullSeason(); + + Mocker.GetMock() + .Setup(s => s.GetEpisodesBySeason(_series.Id, _parsedEpisodeInfo.SeasonNumber)) + .Returns(_episodes); + + Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); + + Mocker.GetMock() + .Verify(v => v.GetEpisodesBySeason(It.IsAny(), It.IsAny()), Times.Once); + + Mocker.GetMock() + .Verify(v => v.GetEpisodesBySceneSeason(It.IsAny(), It.IsAny()), Times.Never); + } + + [Test] + public void should_lookup_full_season_by_scene_season_number_if_series_uses_scene_numbering() + { + GivenSceneNumberingSeries(); + GivenFullSeason(); + + Mocker.GetMock() + .Setup(s => s.GetEpisodesBySceneSeason(_series.Id, _parsedEpisodeInfo.SeasonNumber)) + .Returns(_episodes); + + Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); + + Mocker.GetMock() + .Verify(v => v.GetEpisodesBySeason(It.IsAny(), It.IsAny()), Times.Never); + + Mocker.GetMock() + .Verify(v => v.GetEpisodesBySceneSeason(It.IsAny(), It.IsAny()), Times.Once); + } + + [Test] + public void should_fallback_to_lookup_full_season_by_season_number_if_series_uses_scene_numbering_and_no_epsiodes_are_found_by_scene_season_number() + { + GivenSceneNumberingSeries(); + GivenFullSeason(); + + Mocker.GetMock() + .Setup(s => s.GetEpisodesBySceneSeason(_series.Id, _parsedEpisodeInfo.SeasonNumber)) + .Returns(new List()); + + Mocker.GetMock() + .Setup(s => s.GetEpisodesBySeason(_series.Id, _parsedEpisodeInfo.SeasonNumber)) + .Returns(_episodes); + + Subject.GetEpisodes(_parsedEpisodeInfo, _series, true, null); + + Mocker.GetMock() + .Verify(v => v.GetEpisodesBySeason(It.IsAny(), It.IsAny()), Times.Once); + + Mocker.GetMock() + .Verify(v => v.GetEpisodesBySceneSeason(It.IsAny(), It.IsAny()), Times.Once); + } } } diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index afdf2879e..b6ae87f26 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -209,12 +209,16 @@ namespace NzbDrone.Core.Parser { if (series.UseSceneNumbering && sceneSource) { - return _episodeService.GetEpisodesBySceneSeason(series.Id, mappedSeasonNumber); - } - else - { - return _episodeService.GetEpisodesBySeason(series.Id, mappedSeasonNumber); + var episodes = _episodeService.GetEpisodesBySceneSeason(series.Id, mappedSeasonNumber); + + // If episodes were found by the scene season number return them, otherwise fallback to look-up by season number + if (episodes.Any()) + { + return episodes; + } } + + return _episodeService.GetEpisodesBySeason(series.Id, mappedSeasonNumber); } if (parsedEpisodeInfo.IsDaily)