Merge pull request #2950 from Bond-009/videoresolver

Fix VideoResolver and tests
pull/2937/head
Anthony Lavado 5 years ago committed by GitHub
commit 0e11646107
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -89,14 +89,14 @@ namespace Emby.Naming.Video
if (parseName) if (parseName)
{ {
var cleanDateTimeResult = CleanDateTime(name); var cleanDateTimeResult = CleanDateTime(name);
name = cleanDateTimeResult.Name;
year = cleanDateTimeResult.Year;
if (extraResult.ExtraType == null if (extraResult.ExtraType == null
&& TryCleanString(cleanDateTimeResult.Name, out ReadOnlySpan<char> newName)) && TryCleanString(name, out ReadOnlySpan<char> newName))
{ {
name = newName.ToString(); name = newName.ToString();
} }
year = cleanDateTimeResult.Year;
} }
return new VideoFileInfo return new VideoFileInfo

@ -1,7 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using Emby.Server.Implementations.HttpServer; using Emby.Server.Implementations.HttpServer;
using Emby.Server.Implementations.Updates; using Emby.Server.Implementations.Updates;
using MediaBrowser.Providers.Music;
using static MediaBrowser.Controller.Extensions.ConfigurationExtensions; using static MediaBrowser.Controller.Extensions.ConfigurationExtensions;
namespace Emby.Server.Implementations namespace Emby.Server.Implementations

@ -1,13 +0,0 @@
using Emby.Naming.Common;
using Emby.Naming.Video;
namespace Jellyfin.Naming.Tests.Video
{
public abstract class BaseVideoTest
{
private readonly NamingOptions _namingOptions = new NamingOptions();
protected VideoResolver GetParser()
=> new VideoResolver(_namingOptions);
}
}

@ -46,6 +46,7 @@ namespace Jellyfin.Naming.Tests.Video
[InlineData("Maximum Ride - 2016 - WEBDL-1080p - x264 AC3.mkv", "Maximum Ride", 2016)] [InlineData("Maximum Ride - 2016 - WEBDL-1080p - x264 AC3.mkv", "Maximum Ride", 2016)]
// FIXME: [InlineData("Robin Hood [Multi-Subs] [2018].mkv", "Robin Hood", 2018)] // FIXME: [InlineData("Robin Hood [Multi-Subs] [2018].mkv", "Robin Hood", 2018)]
[InlineData(@"3.Days.to.Kill.2014.720p.BluRay.x264.YIFY.mkv", "3.Days.to.Kill", 2014)] // In this test case, running CleanDateTime first produces no date, so it will attempt to run CleanString first and then CleanDateTime again [InlineData(@"3.Days.to.Kill.2014.720p.BluRay.x264.YIFY.mkv", "3.Days.to.Kill", 2014)] // In this test case, running CleanDateTime first produces no date, so it will attempt to run CleanString first and then CleanDateTime again
[InlineData("3 days to kill (2005).mkv", "3 days to kill", 2005)]
public void CleanDateTimeTest(string input, string expectedName, int? expectedYear) public void CleanDateTimeTest(string input, string expectedName, int? expectedYear)
{ {
input = Path.GetFileName(input); input = Path.GetFileName(input);

@ -5,7 +5,7 @@ using Xunit;
namespace Jellyfin.Naming.Tests.Video namespace Jellyfin.Naming.Tests.Video
{ {
public class ExtraTests : BaseVideoTest public class ExtraTests
{ {
private readonly NamingOptions _videoOptions = new NamingOptions(); private readonly NamingOptions _videoOptions = new NamingOptions();

@ -4,26 +4,26 @@ using Xunit;
namespace Jellyfin.Naming.Tests.Video namespace Jellyfin.Naming.Tests.Video
{ {
public class Format3DTests : BaseVideoTest public class Format3DTests
{ {
private readonly NamingOptions _namingOptions = new NamingOptions();
[Fact] [Fact]
public void TestKodiFormat3D() public void TestKodiFormat3D()
{ {
var options = new NamingOptions(); Test("Super movie.3d.mp4", false, null);
Test("Super movie.3d.hsbs.mp4", true, "hsbs");
Test("Super movie.3d.mp4", false, null, options); Test("Super movie.3d.sbs.mp4", true, "sbs");
Test("Super movie.3d.hsbs.mp4", true, "hsbs", options); Test("Super movie.3d.htab.mp4", true, "htab");
Test("Super movie.3d.sbs.mp4", true, "sbs", options); Test("Super movie.3d.tab.mp4", true, "tab");
Test("Super movie.3d.htab.mp4", true, "htab", options); Test("Super movie 3d hsbs.mp4", true, "hsbs");
Test("Super movie.3d.tab.mp4", true, "tab", options);
Test("Super movie 3d hsbs.mp4", true, "hsbs", options);
} }
[Fact] [Fact]
public void Test3DName() public void Test3DName()
{ {
var result = var result =
GetParser().ResolveFile(@"C:/Users/media/Desktop/Video Test/Movies/Oblivion/Oblivion.3d.hsbs.mkv"); new VideoResolver(_namingOptions).ResolveFile(@"C:/Users/media/Desktop/Video Test/Movies/Oblivion/Oblivion.3d.hsbs.mkv");
Assert.Equal("hsbs", result.Format3D); Assert.Equal("hsbs", result.Format3D);
Assert.Equal("Oblivion", result.Name); Assert.Equal("Oblivion", result.Name);
@ -34,32 +34,31 @@ namespace Jellyfin.Naming.Tests.Video
{ {
// These were introduced for Media Browser 3 // These were introduced for Media Browser 3
// Kodi conventions are preferred but these still need to be supported // Kodi conventions are preferred but these still need to be supported
var options = new NamingOptions();
Test("Super movie.3d.mp4", false, null, options); Test("Super movie.3d.mp4", false, null);
Test("Super movie.3d.hsbs.mp4", true, "hsbs", options); Test("Super movie.3d.hsbs.mp4", true, "hsbs");
Test("Super movie.3d.sbs.mp4", true, "sbs", options); Test("Super movie.3d.sbs.mp4", true, "sbs");
Test("Super movie.3d.htab.mp4", true, "htab", options); Test("Super movie.3d.htab.mp4", true, "htab");
Test("Super movie.3d.tab.mp4", true, "tab", options); Test("Super movie.3d.tab.mp4", true, "tab");
Test("Super movie.hsbs.mp4", true, "hsbs", options); Test("Super movie.hsbs.mp4", true, "hsbs");
Test("Super movie.sbs.mp4", true, "sbs", options); Test("Super movie.sbs.mp4", true, "sbs");
Test("Super movie.htab.mp4", true, "htab", options); Test("Super movie.htab.mp4", true, "htab");
Test("Super movie.tab.mp4", true, "tab", options); Test("Super movie.tab.mp4", true, "tab");
Test("Super movie.sbs3d.mp4", true, "sbs3d", options); Test("Super movie.sbs3d.mp4", true, "sbs3d");
Test("Super movie.3d.mvc.mp4", true, "mvc", options); Test("Super movie.3d.mvc.mp4", true, "mvc");
Test("Super movie [3d].mp4", false, null, options); Test("Super movie [3d].mp4", false, null);
Test("Super movie [hsbs].mp4", true, "hsbs", options); Test("Super movie [hsbs].mp4", true, "hsbs");
Test("Super movie [fsbs].mp4", true, "fsbs", options); Test("Super movie [fsbs].mp4", true, "fsbs");
Test("Super movie [ftab].mp4", true, "ftab", options); Test("Super movie [ftab].mp4", true, "ftab");
Test("Super movie [htab].mp4", true, "htab", options); Test("Super movie [htab].mp4", true, "htab");
Test("Super movie [sbs3d].mp4", true, "sbs3d", options); Test("Super movie [sbs3d].mp4", true, "sbs3d");
} }
private void Test(string input, bool is3D, string format3D, NamingOptions options) private void Test(string input, bool is3D, string? format3D)
{ {
var parser = new Format3DParser(options); var parser = new Format3DParser(_namingOptions);
var result = parser.Parse(input); var result = parser.Parse(input);

@ -8,6 +8,8 @@ namespace Jellyfin.Naming.Tests.Video
{ {
public class MultiVersionTests public class MultiVersionTests
{ {
private readonly NamingOptions _namingOptions = new NamingOptions();
// FIXME // FIXME
// [Fact] // [Fact]
public void TestMultiEdition1() public void TestMultiEdition1()
@ -430,8 +432,7 @@ namespace Jellyfin.Naming.Tests.Video
private VideoListResolver GetResolver() private VideoListResolver GetResolver()
{ {
var options = new NamingOptions(); return new VideoListResolver(_namingOptions);
return new VideoListResolver(options);
} }
} }
} }

@ -6,8 +6,10 @@ using Xunit;
namespace Jellyfin.Naming.Tests.Video namespace Jellyfin.Naming.Tests.Video
{ {
public class StackTests : BaseVideoTest public class StackTests
{ {
private readonly NamingOptions _namingOptions = new NamingOptions();
[Fact] [Fact]
public void TestSimpleStack() public void TestSimpleStack()
{ {
@ -446,7 +448,7 @@ namespace Jellyfin.Naming.Tests.Video
private StackResolver GetResolver() private StackResolver GetResolver()
{ {
return new StackResolver(new NamingOptions()); return new StackResolver(_namingOptions);
} }
} }
} }

@ -4,8 +4,10 @@ using Xunit;
namespace Jellyfin.Naming.Tests.Video namespace Jellyfin.Naming.Tests.Video
{ {
public class StubTests : BaseVideoTest public class StubTests
{ {
private readonly NamingOptions _namingOptions = new NamingOptions();
[Fact] [Fact]
public void TestStubs() public void TestStubs()
{ {
@ -27,16 +29,14 @@ namespace Jellyfin.Naming.Tests.Video
public void TestStubName() public void TestStubName()
{ {
var result = var result =
GetParser().ResolveFile(@"C:/Users/media/Desktop/Video Test/Movies/Oblivion/Oblivion.dvd.disc"); new VideoResolver(_namingOptions).ResolveFile(@"C:/Users/media/Desktop/Video Test/Movies/Oblivion/Oblivion.dvd.disc");
Assert.Equal("Oblivion", result.Name); Assert.Equal("Oblivion", result.Name);
} }
private void Test(string path, bool isStub, string stubType) private void Test(string path, bool isStub, string stubType)
{ {
var options = new NamingOptions(); var isStubResult = StubResolver.TryResolveFile(path, _namingOptions, out var stubTypeResult);
var isStubResult = StubResolver.TryResolveFile(path, options, out var stubTypeResult);
Assert.Equal(isStub, isStubResult); Assert.Equal(isStub, isStubResult);

@ -8,6 +8,7 @@ namespace Jellyfin.Naming.Tests.Video
{ {
public class VideoListResolverTests public class VideoListResolverTests
{ {
private readonly NamingOptions _namingOptions = new NamingOptions();
// FIXME // FIXME
// [Fact] // [Fact]
public void TestStackAndExtras() public void TestStackAndExtras()
@ -450,8 +451,7 @@ namespace Jellyfin.Naming.Tests.Video
private VideoListResolver GetResolver() private VideoListResolver GetResolver()
{ {
var options = new NamingOptions(); return new VideoListResolver(_namingOptions);
return new VideoListResolver(options);
} }
} }
} }

@ -1,275 +1,200 @@
using MediaBrowser.Model.Entities; using System.Collections.Generic;
using Emby.Naming.Common;
using Emby.Naming.Video;
using MediaBrowser.Model.Entities;
using Xunit; using Xunit;
namespace Jellyfin.Naming.Tests.Video namespace Jellyfin.Naming.Tests.Video
{ {
public class VideoResolverTests : BaseVideoTest public class VideoResolverTests
{ {
// FIXME private readonly NamingOptions _namingOptions = new NamingOptions();
// [Fact]
public void TestSimpleFile() public static IEnumerable<object[]> GetResolveFileTestData()
{ {
var parser = GetParser(); yield return new object[]
{
var result = new VideoFileInfo()
parser.ResolveFile(@"/server/Movies/Brave (2007)/Brave (2006).mkv"); {
Path = @"/server/Movies/7 Psychos.mkv/7 Psychos.mkv",
Assert.Equal(2006, result.Year); Container = "mkv",
Assert.False(result.IsStub); Name = "7 Psychos"
Assert.False(result.Is3D); }
Assert.Equal("Brave", result.Name); };
Assert.Null(result.ExtraType); yield return new object[]
} {
new VideoFileInfo()
// FIXME {
// [Fact] Path = @"/server/Movies/3 days to kill (2005)/3 days to kill (2005).mkv",
public void TestSimpleFile2() Container = "mkv",
{ Name = "3 days to kill",
var parser = GetParser(); Year = 2005
}
var result = };
parser.ResolveFile(@"/server/Movies/Bad Boys (1995)/Bad Boys (1995).mkv"); yield return new object[]
{
Assert.Equal(1995, result.Year); new VideoFileInfo()
Assert.False(result.IsStub); {
Assert.False(result.Is3D); Path = @"/server/Movies/American Psycho/American.Psycho.mkv",
Assert.Equal("Bad Boys", result.Name); Container = "mkv",
Assert.Null(result.ExtraType); Name = "American.Psycho",
} }
};
// FIXME yield return new object[]
// [Fact] {
public void TestSimpleFileWithNumericName() new VideoFileInfo()
{ {
var parser = GetParser(); Path = @"/server/Movies/brave (2007)/brave (2006).3d.sbs.mkv",
Container = "mkv",
var result = Name = "brave",
parser.ResolveFile(@"/server/Movies/300 (2007)/300 (2006).mkv"); Year = 2006,
Is3D = true,
Assert.Equal(2006, result.Year); Format3D = "sbs",
Assert.False(result.IsStub); }
Assert.False(result.Is3D); };
Assert.Equal("300", result.Name); yield return new object[]
Assert.Null(result.ExtraType); {
} new VideoFileInfo()
{
// FIXME Path = @"/server/Movies/300 (2007)/300 (2006).3d1.sbas.mkv",
// [Fact] Container = "mkv",
public void TestExtra() Name = "300",
{ Year = 2006
var parser = GetParser(); }
};
var result = yield return new object[]
parser.ResolveFile(@"/server/Movies/Brave (2007)/Brave (2006)-trailer.mkv"); {
new VideoFileInfo()
Assert.Equal(2006, result.Year); {
Assert.False(result.IsStub); Path = @"/server/Movies/300 (2007)/300 (2006).3d.sbs.mkv",
Assert.False(result.Is3D); Container = "mkv",
Assert.Equal(ExtraType.Trailer, result.ExtraType); Name = "300",
Assert.Equal("Brave (2006)-trailer", result.Name); Year = 2006,
} Is3D = true,
Format3D = "sbs",
// FIXME }
// [Fact] };
public void TestExtraWithNumericName() yield return new object[]
{ {
var parser = GetParser(); new VideoFileInfo()
{
var result = Path = @"/server/Movies/brave (2007)/brave (2006)-trailer.bluray.disc",
parser.ResolveFile(@"/server/Movies/300 (2007)/300 (2006)-trailer.mkv"); Container = "disc",
Name = "brave",
Assert.Equal(2006, result.Year); Year = 2006,
Assert.False(result.IsStub); IsStub = true,
Assert.False(result.Is3D); StubType = "bluray",
Assert.Equal("300 (2006)-trailer", result.Name); }
Assert.Equal(ExtraType.Trailer, result.ExtraType); };
} yield return new object[]
{
// FIXME new VideoFileInfo()
// [Fact] {
public void TestStubFileWithNumericName() Path = @"/server/Movies/300 (2007)/300 (2006)-trailer.bluray.disc",
{ Container = "disc",
var parser = GetParser(); Name = "300",
Year = 2006,
var result = IsStub = true,
parser.ResolveFile(@"/server/Movies/300 (2007)/300 (2006).bluray.disc"); StubType = "bluray",
}
Assert.Equal(2006, result.Year); };
Assert.True(result.IsStub); yield return new object[]
Assert.Equal("bluray", result.StubType); {
Assert.False(result.Is3D); new VideoFileInfo()
Assert.Equal("300", result.Name); {
Assert.Null(result.ExtraType); Path = @"/server/Movies/Brave (2007)/Brave (2006).bluray.disc",
} Container = "disc",
Name = "Brave",
// FIXME Year = 2006,
// [Fact] IsStub = true,
public void TestStubFile() StubType = "bluray",
{ }
var parser = GetParser(); };
yield return new object[]
var result = {
parser.ResolveFile(@"/server/Movies/Brave (2007)/Brave (2006).bluray.disc"); new VideoFileInfo()
{
Assert.Equal(2006, result.Year); Path = @"/server/Movies/300 (2007)/300 (2006).bluray.disc",
Assert.True(result.IsStub); Container = "disc",
Assert.Equal("bluray", result.StubType); Name = "300",
Assert.False(result.Is3D); Year = 2006,
Assert.Equal("Brave", result.Name); IsStub = true,
Assert.Null(result.ExtraType); StubType = "bluray",
} }
};
// FIXME yield return new object[]
// [Fact] {
public void TestExtraStubWithNumericNameNotSupported() new VideoFileInfo()
{ {
var parser = GetParser(); Path = @"/server/Movies/300 (2007)/300 (2006)-trailer.mkv",
Container = "mkv",
var result = Name = "300",
parser.ResolveFile(@"/server/Movies/300 (2007)/300 (2006)-trailer.bluray.disc"); Year = 2006,
ExtraType = ExtraType.Trailer,
Assert.Equal(2006, result.Year); }
Assert.True(result.IsStub); };
Assert.Equal("bluray", result.StubType); yield return new object[]
Assert.False(result.Is3D); {
Assert.Equal("300", result.Name); new VideoFileInfo()
Assert.Null(result.ExtraType); {
} Path = @"/server/Movies/Brave (2007)/Brave (2006)-trailer.mkv",
Container = "mkv",
// FIXME Name = "Brave",
// [Fact] Year = 2006,
public void TestExtraStubNotSupported() ExtraType = ExtraType.Trailer,
{ }
// Using a stub for an extra is currently not supported };
var parser = GetParser(); yield return new object[]
{
var result = new VideoFileInfo()
parser.ResolveFile(@"/server/Movies/brave (2007)/brave (2006)-trailer.bluray.disc"); {
Path = @"/server/Movies/300 (2007)/300 (2006).mkv",
Assert.Equal(2006, result.Year); Container = "mkv",
Assert.True(result.IsStub); Name = "300",
Assert.Equal("bluray", result.StubType); Year = 2006
Assert.False(result.Is3D); }
Assert.Equal("brave", result.Name); };
Assert.Null(result.ExtraType); yield return new object[]
} {
new VideoFileInfo()
// FIXME {
// [Fact] Path = @"/server/Movies/Bad Boys (1995)/Bad Boys (1995).mkv",
public void Test3DFileWithNumericName() Container = "mkv",
{ Name = "Bad Boys",
var parser = GetParser(); Year = 1995,
}
var result = };
parser.ResolveFile(@"/server/Movies/300 (2007)/300 (2006).3d.sbs.mkv"); yield return new object[]
{
Assert.Equal(2006, result.Year); new VideoFileInfo()
Assert.False(result.IsStub); {
Assert.True(result.Is3D); Path = @"/server/Movies/Brave (2007)/Brave (2006).mkv",
Assert.Equal("sbs", result.Format3D); Container = "mkv",
Assert.Equal("300", result.Name); Name = "Brave",
Assert.Null(result.ExtraType); Year = 2006,
} }
};
// FIXME }
// [Fact]
public void TestBad3DFileWithNumericName()
{ [Theory]
var parser = GetParser(); [MemberData(nameof(GetResolveFileTestData))]
public void ResolveFile_ValidFileName_Success(VideoFileInfo expectedResult)
var result = {
parser.ResolveFile(@"/server/Movies/300 (2007)/300 (2006).3d1.sbas.mkv"); var result = new VideoResolver(_namingOptions).ResolveFile(expectedResult.Path);
Assert.Equal(2006, result.Year); Assert.NotNull(result);
Assert.False(result.IsStub); Assert.Equal(result.Path, expectedResult.Path);
Assert.False(result.Is3D); Assert.Equal(result.Container, expectedResult.Container);
Assert.Equal("300", result.Name); Assert.Equal(result.Name, expectedResult.Name);
Assert.Null(result.ExtraType); Assert.Equal(result.Year, expectedResult.Year);
Assert.Null(result.Format3D); Assert.Equal(result.ExtraType, expectedResult.ExtraType);
} Assert.Equal(result.Format3D, expectedResult.Format3D);
Assert.Equal(result.Is3D, expectedResult.Is3D);
// FIXME Assert.Equal(result.IsStub, expectedResult.IsStub);
// [Fact] Assert.Equal(result.StubType, expectedResult.StubType);
public void Test3DFile() Assert.Equal(result.IsDirectory, expectedResult.IsDirectory);
{ Assert.Equal(result.FileNameWithoutExtension, expectedResult.FileNameWithoutExtension);
var parser = GetParser();
var result =
parser.ResolveFile(@"/server/Movies/brave (2007)/brave (2006).3d.sbs.mkv");
Assert.Equal(2006, result.Year);
Assert.False(result.IsStub);
Assert.True(result.Is3D);
Assert.Equal("sbs", result.Format3D);
Assert.Equal("brave", result.Name);
Assert.Null(result.ExtraType);
}
[Fact]
public void TestNameWithoutDate()
{
var parser = GetParser();
var result =
parser.ResolveFile(@"/server/Movies/American Psycho/American.Psycho.mkv");
Assert.Null(result.Year);
Assert.False(result.IsStub);
Assert.False(result.Is3D);
Assert.Null(result.Format3D);
Assert.Equal("American.Psycho", result.Name);
Assert.Null(result.ExtraType);
}
// FIXME
// [Fact]
public void TestCleanDateAndStringsSequence()
{
var parser = GetParser();
// In this test case, running CleanDateTime first produces no date, so it will attempt to run CleanString first and then CleanDateTime again
var result =
parser.ResolveFile(@"/server/Movies/3.Days.to.Kill/3.Days.to.Kill.2014.720p.BluRay.x264.YIFY.mkv");
Assert.Equal(2014, result.Year);
Assert.False(result.IsStub);
Assert.False(result.Is3D);
Assert.Null(result.Format3D);
Assert.Equal("3.Days.to.Kill", result.Name);
Assert.Null(result.ExtraType);
}
// FIXME
// [Fact]
public void TestCleanDateAndStringsSequence1()
{
var parser = GetParser();
// In this test case, running CleanDateTime first produces no date, so it will attempt to run CleanString first and then CleanDateTime again
var result =
parser.ResolveFile(@"/server/Movies/3 days to kill (2005)/3 days to kill (2005).mkv");
Assert.Equal(2005, result.Year);
Assert.False(result.IsStub);
Assert.False(result.Is3D);
Assert.Null(result.Format3D);
Assert.Equal("3 days to kill", result.Name);
Assert.Null(result.ExtraType);
}
[Fact]
public void TestFolderNameWithExtension()
{
var parser = GetParser();
var result =
parser.ResolveFile(@"/server/Movies/7 Psychos.mkv/7 Psychos.mkv");
Assert.Null(result.Year);
Assert.False(result.IsStub);
Assert.False(result.Is3D);
Assert.Equal("7 Psychos", result.Name);
Assert.Null(result.ExtraType);
} }
} }
} }

Loading…
Cancel
Save