From 965b6144e303bc5e6d492187025897bc68ad2e72 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 21 Feb 2026 12:34:12 -0800 Subject: [PATCH] New: Improve parsing of releases with contain multiple titles --- .../ParsingServiceTests/MapFixture.cs | 44 +++++++++++++++++++ src/NzbDrone.Core/Parser/ParsingService.cs | 20 ++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/MapFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/MapFixture.cs index 0f0da6768..8fd47c8b0 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/MapFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParsingServiceTests/MapFixture.cs @@ -343,5 +343,49 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests Mocker.GetMock() .Verify(v => v.FindByTvdbId(It.IsAny()), Times.Once()); } + + [Test] + public void should_use_year_when_looking_up_by_all_titles_in_release_title() + { + var alias = "Series Alias"; + var title = "Series Title"; + + _parsedEpisodeInfo.SeriesTitle = $"Series Title AKA Series Alias {_series.Year}"; + _parsedEpisodeInfo.SeriesTitleInfo.AllTitles = [ + title, + alias + ]; + _parsedEpisodeInfo.SeriesTitleInfo.Year = _series.Year; + + Mocker.GetMock() + .Setup(s => s.FindByTitle(title, _series.Year)) + .Returns(_series); + + var result = Subject.Map(_parsedEpisodeInfo, 0, 0, "", null); + + result.Series.Should().Be(_series); + } + + [Test] + public void should_use_title_with_year_when_looking_up_by_all_titles_in_release_title() + { + var alias = "Series Alias"; + var title = "Series Title"; + + _parsedEpisodeInfo.SeriesTitle = $"Series Title AKA Series Alias {_series.Year}"; + _parsedEpisodeInfo.SeriesTitleInfo.AllTitles = [ + title, + alias + ]; + _parsedEpisodeInfo.SeriesTitleInfo.Year = _series.Year; + + Mocker.GetMock() + .Setup(s => s.FindByTitle($"{title} {_series.Year}")) + .Returns(_series); + + var result = Subject.Map(_parsedEpisodeInfo, 0, 0, "", null); + + result.Series.Should().Be(_series); + } } } diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index 5b857c002..ac4b3add6 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -74,13 +74,31 @@ namespace NzbDrone.Core.Parser private Series GetSeriesByAllTitles(ParsedEpisodeInfo parsedEpisodeInfo) { + var year = parsedEpisodeInfo.SeriesTitleInfo.Year; Series foundSeries = null; int? foundTvdbId = null; // Match each title individually, they must all resolve to the same tvdbid foreach (var title in parsedEpisodeInfo.SeriesTitleInfo.AllTitles) { - var series = _seriesService.FindByTitle(title); + Series series = null; + + if (year > 0) + { + series = _seriesService.FindByTitle(title, year); + + // Fall back to title + year being part of the title, this will allow + // matching series with the same name that include the year in the title. + if (series == null) + { + series = _seriesService.FindByTitle($"{title} {year}"); + } + } + else + { + series = _seriesService.FindByTitle(title); + } + var tvdbId = series?.TvdbId; if (series == null)