diff --git a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs index a60e4ebb8..2421b9304 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/GetEpisodesFixture.cs @@ -518,5 +518,46 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests Mocker.GetMock() .Verify(v => v.GetEpisodesBySceneSeason(It.IsAny(), It.IsAny()), Times.Once); } + + [Test] + public void should_use_season_zero_when_looking_up_is_partial_special_episode_found_by_title() + { + _series.UseSceneNumbering = false; + _parsedEpisodeInfo.SeasonNumber = 1; + _parsedEpisodeInfo.EpisodeNumbers = new int[] { 0 }; + _parsedEpisodeInfo.ReleaseTitle = "Series.Title.S01E00.My.Special.Episode.1080p.AMZN.WEB-DL.DDP5.1.H264-TEPES"; + + Mocker.GetMock() + .Setup(s => s.FindEpisodeByTitle(_series.TvdbId, 0, _parsedEpisodeInfo.ReleaseTitle)) + .Returns( + Builder.CreateNew() + .With(e => e.SeasonNumber = 0) + .With(e => e.EpisodeNumber = 1) + .Build() + ); + + Subject.Map(_parsedEpisodeInfo, _series.TvdbId, _series.TvRageId); + + Mocker.GetMock() + .Verify(v => v.FindEpisode(_series.TvdbId, 0, 1), Times.Once()); + } + + [Test] + public void should_use_original_parse_result_when_special_episode_lookup_by_title_fails() + { + _series.UseSceneNumbering = false; + _parsedEpisodeInfo.SeasonNumber = 1; + _parsedEpisodeInfo.EpisodeNumbers = new int[] { 0 }; + _parsedEpisodeInfo.ReleaseTitle = "Series.Title.S01E00.My.Special.Episode.1080p.AMZN.WEB-DL.DDP5.1.H264-TEPES"; + + Mocker.GetMock() + .Setup(s => s.FindEpisodeByTitle(_series.TvdbId, 0, _parsedEpisodeInfo.ReleaseTitle)) + .Returns((Episode)null); + + Subject.Map(_parsedEpisodeInfo, _series.TvdbId, _series.TvRageId); + + Mocker.GetMock() + .Verify(v => v.FindEpisode(_series.TvdbId, _parsedEpisodeInfo.SeasonNumber, _parsedEpisodeInfo.EpisodeNumbers.First()), Times.Once()); + } } } diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index 2d337990e..2b23b078c 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -246,7 +246,13 @@ namespace NzbDrone.Core.Parser if (parsedEpisodeInfo.IsPossibleSceneSeasonSpecial) { - parsedEpisodeInfo = ParseSpecialEpisodeTitle(parsedEpisodeInfo, parsedEpisodeInfo.ReleaseTitle, series) ?? parsedEpisodeInfo; + var parsedSpecialEpisodeInfo = ParseSpecialEpisodeTitle(parsedEpisodeInfo, parsedEpisodeInfo.ReleaseTitle, series); + + if (parsedSpecialEpisodeInfo != null) + { + // Use the season number and disable scene source since the season/episode numbers that were returned are not scene numbers + return GetStandardEpisodes(series, parsedSpecialEpisodeInfo, parsedSpecialEpisodeInfo.SeasonNumber, false, searchCriteria); + } } return GetStandardEpisodes(series, parsedEpisodeInfo, mappedSeasonNumber, sceneSource, searchCriteria);