diff --git a/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs b/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs index 638ea84019..355e1396b8 100644 --- a/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs +++ b/src/NzbDrone.Core.Test/Download/Aggregation/Aggregators/AggregateLanguagesFixture.cs @@ -167,6 +167,50 @@ 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() + { + var releaseTitle = "Some.Movie.2024.MULTi.VFF.VFQ.1080p.BluRay.DTS.HDMA.x264-RlsGroup"; + var indexerDefinition = new IndexerDefinition + { + Id = 1, + Settings = new TorrentRssIndexerSettings { MultiLanguages = new List { Language.Original.Id, Language.French.Id } } + }; + Mocker.GetMock() + .Setup(v => v.Find(1)) + .Returns(indexerDefinition); + + _remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List { Language.French }, releaseTitle); + _remoteMovie.Release.IndexerId = 1; + _remoteMovie.Release.Title = releaseTitle; + + Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List { _movie.MovieMetadata.Value.OriginalLanguage, Language.French }); + Mocker.GetMock().Verify(c => c.Find(1), Times.Once()); + Mocker.GetMock().VerifyNoOtherCalls(); + } + + [Test] + public void should_return_multi_languages_when_release_as_other_language_and_indexer_has_multi_languages_configuration() + { + var releaseTitle = "Some.Movie.2024.MULTi.GERMAN.1080p.BluRay.DTS.HDMA.x264-RlsGroup"; + var indexerDefinition = new IndexerDefinition + { + Id = 1, + Settings = new TorrentRssIndexerSettings { MultiLanguages = new List { Language.Original.Id, Language.French.Id } } + }; + Mocker.GetMock() + .Setup(v => v.Find(1)) + .Returns(indexerDefinition); + + _remoteMovie.ParsedMovieInfo = GetParsedMovieInfo(new List { Language.German }, releaseTitle); + _remoteMovie.Release.IndexerId = 1; + _remoteMovie.Release.Title = releaseTitle; + + Subject.Aggregate(_remoteMovie).Languages.Should().BeEquivalentTo(new List { _movie.MovieMetadata.Value.OriginalLanguage, Language.French, Language.German }); + Mocker.GetMock().Verify(c => c.Find(1), Times.Once()); + Mocker.GetMock().VerifyNoOtherCalls(); + } + [Test] public void should_return_original_when_indexer_has_no_multi_languages_configuration() { diff --git a/src/NzbDrone.Core/Download/Aggregation/Aggregators/AggregateLanguages.cs b/src/NzbDrone.Core/Download/Aggregation/Aggregators/AggregateLanguages.cs index 5b89aa82e2..d4d906d0e7 100644 --- a/src/NzbDrone.Core/Download/Aggregation/Aggregators/AggregateLanguages.cs +++ b/src/NzbDrone.Core/Download/Aggregation/Aggregators/AggregateLanguages.cs @@ -71,7 +71,7 @@ public RemoteMovie Aggregate(RemoteMovie remoteMovie) languages = languages.Except(languagesToRemove).ToList(); } - if ((languages.Count == 0 || (languages.Count == 1 && languages.First() == Language.Unknown)) && releaseInfo?.Title?.IsNotNullOrWhiteSpace() == true) + if (releaseInfo?.Title?.IsNotNullOrWhiteSpace() == true) { IndexerDefinition indexer = null; @@ -88,7 +88,14 @@ public RemoteMovie Aggregate(RemoteMovie remoteMovie) if (indexer?.Settings is IIndexerSettings settings && settings.MultiLanguages.Any() && Parser.Parser.HasMultipleLanguages(releaseInfo.Title)) { // Use indexer setting for Multi-languages - languages = settings.MultiLanguages.Select(i => (Language)i).ToList(); + if (languages.Count == 0 || (languages.Count == 1 && languages.First() == Language.Unknown)) + { + languages = settings.MultiLanguages.Select(i => (Language)i).ToList(); + } + else + { + languages.AddRange(settings.MultiLanguages.Select(i => (Language)i).Except(languages).ToList()); + } } }