using ErsatzTV.Core.Domain; using ErsatzTV.Core.FFmpeg; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Infrastructure.Scripting; using FluentAssertions; using Microsoft.Extensions.Logging; using NSubstitute; using NUnit.Framework; namespace ErsatzTV.Core.Tests.FFmpeg; [TestFixture] public class FFmpegStreamSelectorTests { [TestFixture] public class SelectAudioStream { [Test] public async Task Should_Select_Audio_Stream_With_Preferred_Language() { // skip movie/episode script paths by using other video var mediaItem = new OtherVideo(); var mediaVersion = new MediaVersion { Streams = [ new MediaStream { Index = 0, MediaStreamKind = MediaStreamKind.Audio, Channels = 2, Language = "ja", Title = "Some Title", }, new MediaStream { Index = 1, MediaStreamKind = MediaStreamKind.Audio, Channels = 6, Language = "eng", Title = "Another Title", Default = true } ] }; var audioVersion = new MediaItemAudioVersion(mediaItem, mediaVersion); var channel = new Channel(Guid.NewGuid()) { PreferredAudioLanguageCode = "eng" }; ISearchRepository searchRepository = Substitute.For(); searchRepository.GetAllThreeLetterLanguageCodes(Arg.Any>()) .Returns(Task.FromResult(new List { "jpn" })); var selector = new FFmpegStreamSelector( new ScriptEngine(Substitute.For>()), Substitute.For(), searchRepository, Substitute.For(), Substitute.For(), Substitute.For>()); Option selectedStream = await selector.SelectAudioStream(audioVersion, StreamingMode.TransportStream, channel, "jpn", "Whatever"); selectedStream.IsSome.Should().BeTrue(); foreach (MediaStream stream in selectedStream) { stream.Language.Should().Be("ja"); } } [Test] public async Task Should_Select_Subtitle_Stream_With_Preferred_Language() { // skip movie/episode script paths by using other video var subtitles = new List { new() { StreamIndex = 0, SubtitleKind = SubtitleKind.Sidecar, Language = "eng", Default = true }, new() { StreamIndex = 1, SubtitleKind = SubtitleKind.Sidecar, Language = "he", }, }; var channel = new Channel(Guid.NewGuid()); ISearchRepository searchRepository = Substitute.For(); searchRepository.GetAllThreeLetterLanguageCodes(Arg.Any>()) .Returns(Task.FromResult(new List { "heb" })); var selector = new FFmpegStreamSelector( new ScriptEngine(Substitute.For>()), Substitute.For(), searchRepository, Substitute.For(), Substitute.For(), Substitute.For>()); Option selectedStream = await selector.SelectSubtitleStream( subtitles, channel, "heb", ChannelSubtitleMode.Any); selectedStream.IsSome.Should().BeTrue(); foreach (Subtitle stream in selectedStream) { stream.Language.Should().Be("he"); } } } }