Browse Source

don't return stream selection when subtitles don't match (#2080)

pull/2081/head
Jason Dove 11 months ago committed by GitHub
parent
commit
4d83dc019c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 23
      ErsatzTV.Core.Tests/FFmpeg/CustomStreamSelectorTests.cs
  2. 10
      ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs

23
ErsatzTV.Core.Tests/FFmpeg/CustomStreamSelectorTests.cs

@ -636,6 +636,29 @@ items: @@ -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<CustomStreamSelector>());
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();

10
ErsatzTV.Core/FFmpeg/CustomStreamSelector.cs

@ -36,6 +36,9 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust @@ -36,6 +36,9 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust
var candidateAudioStreams = audioStreams.ToDictionary(a => 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<Cust @@ -107,6 +110,8 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust
}
else
{
passesAudio = true;
logger.LogDebug(
"Audio stream {@Stream} matches selector item {@SelectorItem}",
new { audioStream.Language, audioStream.Title },
@ -118,6 +123,7 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust @@ -118,6 +123,7 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust
if (streamSelectorItem.DisableSubtitles)
{
candidateSubtitles.Clear();
passesSubtitles = true;
}
else
{
@ -191,6 +197,8 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust @@ -191,6 +197,8 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust
}
else
{
passesSubtitles = true;
logger.LogDebug(
"Subtitle {@Subtitle} matches selector item {@SelectorItem}",
new { subtitle.Language, subtitle.Title },
@ -209,7 +217,7 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust @@ -209,7 +217,7 @@ public class CustomStreamSelector(ILocalFileSystem localFileSystem, ILogger<Cust
.Select(s => s.Key)
.HeadOrNone();
if (maybeAudioStream.IsSome)
if (passesAudio && passesSubtitles)
{
return new StreamSelectorResult(maybeAudioStream, maybeSubtitle);
}

Loading…
Cancel
Save