Merge pull request #5074 from jellyfin/cov
100% branch coverage for Jellyfin.Naming
This commit is contained in:
commit
3806cc5b3f
|
@ -15,13 +15,13 @@ namespace Emby.Naming.AudioBook
|
||||||
/// <param name="files">List of files composing the actual audiobook.</param>
|
/// <param name="files">List of files composing the actual audiobook.</param>
|
||||||
/// <param name="extras">List of extra files.</param>
|
/// <param name="extras">List of extra files.</param>
|
||||||
/// <param name="alternateVersions">Alternative version of files.</param>
|
/// <param name="alternateVersions">Alternative version of files.</param>
|
||||||
public AudioBookInfo(string name, int? year, List<AudioBookFileInfo>? files, List<AudioBookFileInfo>? extras, List<AudioBookFileInfo>? alternateVersions)
|
public AudioBookInfo(string name, int? year, List<AudioBookFileInfo> files, List<AudioBookFileInfo> extras, List<AudioBookFileInfo> alternateVersions)
|
||||||
{
|
{
|
||||||
Name = name;
|
Name = name;
|
||||||
Year = year;
|
Year = year;
|
||||||
Files = files ?? new List<AudioBookFileInfo>();
|
Files = files;
|
||||||
Extras = extras ?? new List<AudioBookFileInfo>();
|
Extras = extras;
|
||||||
AlternateVersions = alternateVersions ?? new List<AudioBookFileInfo>();
|
AlternateVersions = alternateVersions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -185,8 +185,8 @@ namespace Emby.Naming.Video
|
||||||
if (!string.IsNullOrEmpty(folderName)
|
if (!string.IsNullOrEmpty(folderName)
|
||||||
&& folderName.Length > 1
|
&& folderName.Length > 1
|
||||||
&& videos.All(i => i.Files.Count == 1
|
&& videos.All(i => i.Files.Count == 1
|
||||||
&& IsEligibleForMultiVersion(folderName, i.Files[0].Path))
|
&& IsEligibleForMultiVersion(folderName, i.Files[0].Path))
|
||||||
&& HaveSameYear(videos))
|
&& HaveSameYear(videos))
|
||||||
{
|
{
|
||||||
var ordered = videos.OrderBy(i => i.Name).ToList();
|
var ordered = videos.OrderBy(i => i.Name).ToList();
|
||||||
|
|
||||||
|
@ -216,10 +216,9 @@ namespace Emby.Naming.Video
|
||||||
return videos.Select(i => i.Year ?? -1).Distinct().Count() < 2;
|
return videos.Select(i => i.Year ?? -1).Distinct().Count() < 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsEligibleForMultiVersion(string folderName, string? testFilename)
|
private bool IsEligibleForMultiVersion(string folderName, string testFilePath)
|
||||||
{
|
{
|
||||||
testFilename = Path.GetFileNameWithoutExtension(testFilename) ?? string.Empty;
|
string testFilename = Path.GetFileNameWithoutExtension(testFilePath);
|
||||||
|
|
||||||
if (testFilename.StartsWith(folderName, StringComparison.OrdinalIgnoreCase))
|
if (testFilename.StartsWith(folderName, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (CleanStringParser.TryClean(testFilename, _options.CleanStringRegexes, out var cleanName))
|
if (CleanStringParser.TryClean(testFilename, _options.CleanStringRegexes, out var cleanName))
|
||||||
|
@ -233,8 +232,8 @@ namespace Emby.Naming.Video
|
||||||
}
|
}
|
||||||
|
|
||||||
return string.IsNullOrEmpty(testFilename)
|
return string.IsNullOrEmpty(testFilename)
|
||||||
|| testFilename[0].Equals('-')
|
|| testFilename[0] == '-'
|
||||||
|| testFilename[0].Equals('_')
|
|| testFilename[0] == '_'
|
||||||
|| string.IsNullOrWhiteSpace(Regex.Replace(testFilename, @"\[([^]]*)\]", string.Empty));
|
|| string.IsNullOrWhiteSpace(Regex.Replace(testFilename, @"\[([^]]*)\]", string.Empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ namespace Emby.Naming.Video
|
||||||
/// <returns>True if is video file.</returns>
|
/// <returns>True if is video file.</returns>
|
||||||
public bool IsVideoFile(string path)
|
public bool IsVideoFile(string path)
|
||||||
{
|
{
|
||||||
var extension = Path.GetExtension(path) ?? string.Empty;
|
var extension = Path.GetExtension(path);
|
||||||
return _options.VideoFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
|
return _options.VideoFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ namespace Emby.Naming.Video
|
||||||
/// <returns>True if is video file stub.</returns>
|
/// <returns>True if is video file stub.</returns>
|
||||||
public bool IsStubFile(string path)
|
public bool IsStubFile(string path)
|
||||||
{
|
{
|
||||||
var extension = Path.GetExtension(path) ?? string.Empty;
|
var extension = Path.GetExtension(path);
|
||||||
return _options.StubFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
|
return _options.StubFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,8 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
{
|
{
|
||||||
public class MultiVersionTests
|
public class MultiVersionTests
|
||||||
{
|
{
|
||||||
private readonly NamingOptions _namingOptions = new NamingOptions();
|
private readonly VideoListResolver _videoListResolver = new VideoListResolver(new NamingOptions());
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiEdition1()
|
public void TestMultiEdition1()
|
||||||
{
|
{
|
||||||
|
@ -23,9 +22,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/X-Men Days of Future Past/X-Men Days of Future Past [hsbs].mkv"
|
@"/movies/X-Men Days of Future Past/X-Men Days of Future Past [hsbs].mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -35,7 +32,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.Single(result[0].Extras);
|
Assert.Single(result[0].Extras);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiEdition2()
|
public void TestMultiEdition2()
|
||||||
{
|
{
|
||||||
|
@ -47,9 +43,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/X-Men Days of Future Past/X-Men Days of Future Past [banana].mp4"
|
@"/movies/X-Men Days of Future Past/X-Men Days of Future Past [banana].mp4"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -69,9 +63,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/The Phantom of the Opera (1925)/The Phantom of the Opera (1925) - 1929 version.mkv"
|
@"/movies/The Phantom of the Opera (1925)/The Phantom of the Opera (1925) - 1929 version.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -81,7 +73,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.Single(result[0].AlternateVersions);
|
Assert.Single(result[0].AlternateVersions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestLetterFolders()
|
public void TestLetterFolders()
|
||||||
{
|
{
|
||||||
|
@ -96,9 +87,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/M/Movie 7.mkv"
|
@"/movies/M/Movie 7.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -109,7 +98,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.Empty(result[0].AlternateVersions);
|
Assert.Empty(result[0].AlternateVersions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiVersionLimit()
|
public void TestMultiVersionLimit()
|
||||||
{
|
{
|
||||||
|
@ -125,9 +113,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Movie/Movie-8.mkv"
|
@"/movies/Movie/Movie-8.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -138,7 +124,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.Equal(7, result[0].AlternateVersions.Count);
|
Assert.Equal(7, result[0].AlternateVersions.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiVersionLimit2()
|
public void TestMultiVersionLimit2()
|
||||||
{
|
{
|
||||||
|
@ -155,9 +140,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Mo/Movie 9.mkv"
|
@"/movies/Mo/Movie 9.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -168,7 +151,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.Empty(result[0].AlternateVersions);
|
Assert.Empty(result[0].AlternateVersions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiVersion3()
|
public void TestMultiVersion3()
|
||||||
{
|
{
|
||||||
|
@ -181,9 +163,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Movie/Movie 5.mkv"
|
@"/movies/Movie/Movie 5.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -194,7 +174,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.Empty(result[0].AlternateVersions);
|
Assert.Empty(result[0].AlternateVersions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiVersion4()
|
public void TestMultiVersion4()
|
||||||
{
|
{
|
||||||
|
@ -209,9 +188,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Iron Man/Iron Man (2011).mkv"
|
@"/movies/Iron Man/Iron Man (2011).mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -237,9 +214,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Iron Man/Iron Man[test].mkv",
|
@"/movies/Iron Man/Iron Man[test].mkv",
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -253,7 +228,6 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
Assert.True(result[0].AlternateVersions[4].Is3D);
|
Assert.True(result[0].AlternateVersions[4].Is3D);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestMultiVersion6()
|
public void TestMultiVersion6()
|
||||||
{
|
{
|
||||||
|
@ -269,9 +243,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Iron Man/Iron Man [test].mkv"
|
@"/movies/Iron Man/Iron Man [test].mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -294,9 +266,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Iron Man/Iron Man - C (2007).mkv"
|
@"/movies/Iron Man/Iron Man - C (2007).mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -319,9 +289,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Iron Man/Iron Man_3d.hsbs.mkv"
|
@"/movies/Iron Man/Iron Man_3d.hsbs.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -349,9 +317,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Iron Man/Iron Man (2011).mkv"
|
@"/movies/Iron Man/Iron Man (2011).mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -371,9 +337,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/Blade Runner (1982)/Blade Runner (1982) [EE by ADM] [480p HEVC AAC,AAC,AAC].mkv"
|
@"/movies/Blade Runner (1982)/Blade Runner (1982) [EE by ADM] [480p HEVC AAC,AAC,AAC].mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -393,9 +357,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
@"/movies/X-Men Apocalypse (2016)/X-Men Apocalypse (2016) [2160p] Blu-ray.x265.AAC.mkv"
|
@"/movies/X-Men Apocalypse (2016)/X-Men Apocalypse (2016) [2160p] Blu-ray.x265.AAC.mkv"
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(files.Select(i => new FileSystemMetadata
|
||||||
|
|
||||||
var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
|
|
||||||
{
|
{
|
||||||
IsDirectory = false,
|
IsDirectory = false,
|
||||||
FullName = i
|
FullName = i
|
||||||
|
@ -409,16 +371,9 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TestEmptyList()
|
public void TestEmptyList()
|
||||||
{
|
{
|
||||||
var resolver = GetResolver();
|
var result = _videoListResolver.Resolve(new List<FileSystemMetadata>()).ToList();
|
||||||
|
|
||||||
var result = resolver.Resolve(new List<FileSystemMetadata>()).ToList();
|
|
||||||
|
|
||||||
Assert.Empty(result);
|
Assert.Empty(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
private VideoListResolver GetResolver()
|
|
||||||
{
|
|
||||||
return new VideoListResolver(_namingOptions);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
{
|
{
|
||||||
public class VideoResolverTests
|
public class VideoResolverTests
|
||||||
{
|
{
|
||||||
private readonly NamingOptions _namingOptions = new NamingOptions();
|
private readonly VideoResolver _videoResolver = new VideoResolver(new NamingOptions());
|
||||||
|
|
||||||
public static IEnumerable<object[]> GetResolveFileTestData()
|
public static IEnumerable<object[]> GetResolveFileTestData()
|
||||||
{
|
{
|
||||||
|
@ -159,7 +159,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
[MemberData(nameof(GetResolveFileTestData))]
|
[MemberData(nameof(GetResolveFileTestData))]
|
||||||
public void ResolveFile_ValidFileName_Success(VideoFileInfo expectedResult)
|
public void ResolveFile_ValidFileName_Success(VideoFileInfo expectedResult)
|
||||||
{
|
{
|
||||||
var result = new VideoResolver(_namingOptions).ResolveFile(expectedResult.Path);
|
var result = _videoResolver.ResolveFile(expectedResult.Path);
|
||||||
|
|
||||||
Assert.NotNull(result);
|
Assert.NotNull(result);
|
||||||
Assert.Equal(result?.Path, expectedResult.Path);
|
Assert.Equal(result?.Path, expectedResult.Path);
|
||||||
|
@ -179,7 +179,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ResolveFile_EmptyPath()
|
public void ResolveFile_EmptyPath()
|
||||||
{
|
{
|
||||||
var result = new VideoResolver(_namingOptions).ResolveFile(string.Empty);
|
var result = _videoResolver.ResolveFile(string.Empty);
|
||||||
|
|
||||||
Assert.Null(result);
|
Assert.Null(result);
|
||||||
}
|
}
|
||||||
|
@ -194,8 +194,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||||
string.Empty
|
string.Empty
|
||||||
};
|
};
|
||||||
|
|
||||||
var resolver = new VideoResolver(_namingOptions);
|
var results = paths.Select(path => _videoResolver.ResolveDirectory(path)).ToList();
|
||||||
var results = paths.Select(path => resolver.ResolveDirectory(path)).ToList();
|
|
||||||
|
|
||||||
Assert.Equal(3, results.Count);
|
Assert.Equal(3, results.Count);
|
||||||
Assert.NotNull(results[0]);
|
Assert.NotNull(results[0]);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user