From 4d83dc019c509ce67c965cfa3badd58f8f01c1c8 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:25:07 -0500 Subject: [PATCH] don't return stream selection when subtitles don't match (#2080) --- .../FFmpeg/CustomStreamSelectorTests.cs | 23 +++++++++++++++++++ ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs | 10 +++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ErsatzTV.Core.Tests/FFmpeg/CustomStreamSelectorTests.cs b/ErsatzTV.Core.Tests/FFmpeg/CustomStreamSelectorTests.cs index 0e1564a39..d9a34cbf1 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/CustomStreamSelectorTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/CustomStreamSelectorTests.cs @@ -636,6 +636,29 @@ items: } } + [Test] + public async Task Should_Select_No_Streams_When_Languages_Do_Not_Match() + { + const string YAML = +""" +--- +items: + - audio_language: ["en"] + subtitle_language: ["es*","de*"] + - audio_language: ["ja"] + subtitle_language: ["es*","de*"] +"""; + + var streamSelector = new CustomStreamSelector( + new FakeLocalFileSystem([new FakeFileEntry(TestFileName) { Contents = YAML }]), + new NullLogger()); + + StreamSelectorResult result = await streamSelector.SelectStreams(_channel, _audioVersion, _subtitles); + + result.AudioStream.IsSome.ShouldBeFalse(); + result.Subtitle.IsSome.ShouldBeFalse(); + } + private static MediaItemAudioVersion GetTestAudioVersion(string englishLanguage) { var mediaItem = new OtherVideo(); diff --git a/ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs b/ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs index f9f60cd8a..597fd2dda 100644 --- a/ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs +++ b/ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs @@ -36,6 +36,9 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger a, _ => int.MaxValue); var candidateSubtitles = allSubtitles.ToDictionary(s => s, _ => int.MaxValue); + var passesAudio = false; + var passesSubtitles = false; + // try to find matching audio stream foreach (MediaStream audioStream in audioStreams.ToList()) { @@ -107,6 +110,8 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger s.Key) .HeadOrNone(); - if (maybeAudioStream.IsSome) + if (passesAudio && passesSubtitles) { return new StreamSelectorResult(maybeAudioStream, maybeSubtitle); }