Stream custom live channels using your own media
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

114 lines
4.4 KiB

using System.Globalization;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Scanner.Core.Metadata;
using ErsatzTV.Scanner.Tests.Core.Fakes;
using Shouldly;
using Microsoft.Extensions.Logging;
using NSubstitute;
using NUnit.Framework;
namespace ErsatzTV.Scanner.Tests.Core.Metadata;
[TestFixture]
public class LocalSubtitlesProviderTests
{
// test cases are from plex's example folder layout here
// https://support.plex.tv/articles/200471133-adding-local-subtitles-to-your-media/
// /Movies
// /Avatar (2009)
// Avatar (2009).mkv
// Avatar (2009).eng.srt
// Avatar (2009).en.forced.ass
// Avatar (2009).en.sdh.srt
// Avatar (2009).de.srt
// Avatar (2009).de.sdh.forced.srt
[Test]
public void Should_Find_All_Languages_Codecs_And_Flags_With_Full_Paths()
{
// normally this will have a full list from the database, but we just need these two for testing
var cultures = new List<CultureInfo>
{
CultureInfo.GetCultureInfo("en-US"),
CultureInfo.GetCultureInfo("de-DE")
};
var fakeFiles = new List<FakeFileEntry>
{
new(@"/Movies/Avatar (2009)/Avatar (2009).mkv"),
new(@"/Movies/Avatar (2009)/Avatar (2009).eng.srt"),
new(@"/Movies/Avatar (2009)/Avatar (2009).en.forced.ass"),
new(@"/Movies/Avatar (2009)/Avatar (2009).en.sdh.srt"),
new(@"/Movies/Avatar (2009)/Avatar (2009).de.srt"),
// non-uniform (lower-case) extensions should also work
new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT")
};
var provider = new LocalSubtitlesProvider(
Substitute.For<IMediaItemRepository>(),
Substitute.For<IMetadataRepository>(),
new FakeLocalFileSystem(fakeFiles),
Substitute.For<ILogger<LocalSubtitlesProvider>>());
List<Subtitle> result = provider.LocateExternalSubtitles(
cultures,
@"/Movies/Avatar (2009)/Avatar (2009).mkv",
true);
result.Count.ShouldBe(5);
result.Count(s => s.Language == "eng").ShouldBe(3);
result.Count(s => s.Language == "deu").ShouldBe(2);
result.Count(s => s.Forced).ShouldBe(2);
result.Count(s => s.SDH).ShouldBe(2);
result.Count(s => s.Codec == "subrip").ShouldBe(4);
result.Count(s => s.Codec == "ass").ShouldBe(1);
result.All(s => s.Path.Contains(@"/Movies/Avatar (2009)/")).ShouldBeTrue();
}
[Test]
public void Should_Find_All_Languages_Codecs_And_Flags_With_File_Names()
{
// normally this will have a full list from the database, but we just need these two for testing
var cultures = new List<CultureInfo>
{
CultureInfo.GetCultureInfo("en-US"),
CultureInfo.GetCultureInfo("de-DE")
};
var fakeFiles = new List<FakeFileEntry>
{
new(@"/Movies/Avatar (2009)/Avatar (2009).mkv"),
new(@"/Movies/Avatar (2009)/Avatar (2009).eng.srt"),
new(@"/Movies/Avatar (2009)/Avatar (2009).en.forced.ass"),
new(@"/Movies/Avatar (2009)/Avatar (2009).forced.en.ass"),
new(@"/Movies/Avatar (2009)/Avatar (2009).en.sdh.srt"),
new(@"/Movies/Avatar (2009)/Avatar (2009).sdh.en.srt"),
new(@"/Movies/Avatar (2009)/Avatar (2009).de.srt"),
// non-uniform (lower-case) extensions should also work
new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT")
};
var provider = new LocalSubtitlesProvider(
Substitute.For<IMediaItemRepository>(),
Substitute.For<IMetadataRepository>(),
new FakeLocalFileSystem(fakeFiles),
Substitute.For<ILogger<LocalSubtitlesProvider>>());
List<Subtitle> result = provider.LocateExternalSubtitles(
cultures,
@"/Movies/Avatar (2009)/Avatar (2009).mkv",
false);
result.Count.ShouldBe(7);
result.Count(s => s.Language == "eng").ShouldBe(5);
result.Count(s => s.Language == "deu").ShouldBe(2);
result.Count(s => s.Forced).ShouldBe(3);
result.Count(s => s.SDH).ShouldBe(3);
result.Count(s => s.Codec == "subrip").ShouldBe(5);
result.Count(s => s.Codec == "ass").ShouldBe(2);
result.Count(s => s.Path.Contains(@"/Movies/Avatar (2009)/")).ShouldBe(0);
}
}