From 4fb89252b527b1a34cc0e1133a2acb765360fa13 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Wed, 22 Oct 2025 06:06:26 +0200 Subject: [PATCH] New: Parse multilang and multilanguage as multi Closes #8119 --- .../Aggregators/AggregateLanguagesFixture.cs | 65 ++++++++++++------- src/NzbDrone.Core/Parser/Parser.cs | 2 +- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs b/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs index 0f2759bd2..f58d44b59 100644 --- a/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs +++ b/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs @@ -65,10 +65,12 @@ public void should_return_parsed_language() Subject.Aggregate(_remoteEpisode).Languages.Should().Equal(_remoteEpisode.ParsedEpisodeInfo.Languages); } - [Test] - public void should_return_multi_languages_when_indexer_id_has_multi_languages_configuration() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_multi_languages_when_indexer_id_has_multi_languages_configuration(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup"; var indexerDefinition = new IndexerDefinition { Id = 1, @@ -87,10 +89,12 @@ public void should_return_multi_languages_when_indexer_id_has_multi_languages_co Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_multi_languages_from_indexer_with_id_when_indexer_id_and_name_are_set() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_multi_languages_from_indexer_with_id_when_indexer_id_and_name_are_set(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup"; var indexerDefinition1 = new IndexerDefinition { Id = 1, @@ -122,10 +126,12 @@ public void should_return_multi_languages_from_indexer_with_id_when_indexer_id_a Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_multi_languages_when_indexer_name_has_multi_languages_configuration() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_multi_languages_when_indexer_name_has_multi_languages_configuration(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup"; var indexerDefinition = new IndexerDefinition { Id = 1, @@ -146,10 +152,12 @@ public void should_return_multi_languages_when_indexer_name_has_multi_languages_ Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_multi_languages_when_release_as_unknown_as_default_language_and_indexer_has_multi_languages_configuration() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_multi_languages_when_release_as_unknown_as_default_language_and_indexer_has_multi_languages_configuration(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup"; var indexerDefinition = new IndexerDefinition { Id = 1, @@ -168,10 +176,12 @@ public void should_return_multi_languages_when_release_as_unknown_as_default_lan Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_multi_languages_when_release_as_specified_language_and_indexer_has_multi_languages_configuration() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_multi_languages_when_release_as_specified_language_and_indexer_has_multi_languages_configuration(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.VFF.VFQ.1080p.BluRay.DTS.HDMA.x264-RlsGroup"; var indexerDefinition = new IndexerDefinition { Id = 1, @@ -190,10 +200,12 @@ public void should_return_multi_languages_when_release_as_specified_language_and Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_multi_languages_when_release_as_other_language_and_indexer_has_multi_languages_configuration() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_multi_languages_when_release_as_other_language_and_indexer_has_multi_languages_configuration(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.GERMAN.1080p.BluRay.DTS.HDMA.x264-RlsGroup"; var indexerDefinition = new IndexerDefinition { Id = 1, @@ -212,10 +224,12 @@ public void should_return_multi_languages_when_release_as_other_language_and_ind Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_original_when_indexer_has_no_multi_languages_configuration() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_original_when_indexer_has_no_multi_languages_configuration(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup"; var indexerDefinition = new IndexerDefinition { Id = 1, @@ -234,11 +248,12 @@ public void should_return_original_when_indexer_has_no_multi_languages_configura Mocker.GetMock().VerifyNoOtherCalls(); } - [Test] - public void should_return_original_when_no_indexer_value() + [TestCase("Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup")] + [TestCase("Series Title (2025) [COMPLETA] [1080p H265 EAC3 MultiLang MultiSub][RlsGroup]")] + [TestCase("Series Title - Stagione 1 (2025) [COMPLETA] 720p H264 MULTILANG AAC 2.0 MULTISUB-RlsGroup")] + [TestCase("Series Title (2007) S01E01 [Multilang AC3 Sub Spa Eng Rus]")] + public void should_return_original_when_no_indexer_value(string releaseTitle) { - var releaseTitle = "Series.Title.S01E01.MULTi.1080p.WEB.H265-RlsGroup"; - _remoteEpisode.ParsedEpisodeInfo = GetParsedEpisodeInfo(new List { }, releaseTitle); _remoteEpisode.Release.Title = releaseTitle; diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index 1aaab6762..17c4b9de3 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -544,7 +544,7 @@ public static class Parser private static readonly string[] Numbers = new[] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; - private static readonly Regex MultiRegex = new(@"[_. ](?multi)[_. ]", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex MultiRegex = new(@"[-_. \[](?multi|multilang|multilanguage)[-_. \]]", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Dictionary ShortMonths = new() {