123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- using System;
- using System.Linq;
- using Emby.Naming.AudioBook;
- using Emby.Naming.Common;
- using MediaBrowser.Model.IO;
- using Xunit;
- namespace Jellyfin.Naming.Tests.AudioBook
- {
- public class AudioBookListResolverTests
- {
- private readonly NamingOptions _namingOptions = new NamingOptions();
- [Fact]
- public void TestStackAndExtras()
- {
- // No stacking here because there is no part/disc/etc
- var files = new[]
- {
- "Harry Potter and the Deathly Hallows/Part 1.mp3",
- "Harry Potter and the Deathly Hallows/Part 2.mp3",
- "Harry Potter and the Deathly Hallows/Extra.mp3",
- "Batman/Chapter 1.mp3",
- "Batman/Chapter 2.mp3",
- "Batman/Chapter 3.mp3",
- "Badman/audiobook.mp3",
- "Badman/extra.mp3",
- "Superman (2020)/Part 1.mp3",
- "Superman (2020)/extra.mp3",
- "Ready Player One (2020)/audiobook.mp3",
- "Ready Player One (2020)/extra.mp3",
- ".mp3"
- };
- var resolver = GetResolver();
- var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i
- })).ToList();
- Assert.Equal(5, result.Count);
- Assert.Equal(2, result[0].Files.Count);
- Assert.Single(result[0].Extras);
- Assert.Equal("Harry Potter and the Deathly Hallows", result[0].Name);
- Assert.Equal(3, result[1].Files.Count);
- Assert.Empty(result[1].Extras);
- Assert.Equal("Batman", result[1].Name);
- Assert.Single(result[2].Files);
- Assert.Single(result[2].Extras);
- Assert.Equal("Badman", result[2].Name);
- Assert.Single(result[3].Files);
- Assert.Single(result[3].Extras);
- Assert.Equal("Superman", result[3].Name);
- Assert.Single(result[4].Files);
- Assert.Single(result[4].Extras);
- Assert.Equal("Ready Player One", result[4].Name);
- }
- [Fact]
- public void TestAlternativeVersions()
- {
- var files = new[]
- {
- "Harry Potter and the Deathly Hallows/Chapter 1.ogg",
- "Harry Potter and the Deathly Hallows/Chapter 1.mp3",
- "Deadpool.mp3",
- "Deadpool [HQ].mp3",
- "Superman/audiobook.mp3",
- "Superman/Superman.mp3",
- "Superman/Superman [HQ].mp3",
- "Superman/extra.mp3",
- "Batman/ Chapter 1 .mp3",
- "Batman/Chapter 1[loss-less].mp3"
- };
- var resolver = GetResolver();
- var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i
- })).ToList();
- Assert.Equal(5, result.Count);
- // HP - Same name so we don't care which file is alternative
- Assert.Single(result[0].AlternateVersions);
- // DP
- Assert.Empty(result[1].AlternateVersions);
- // DP HQ (directory missing so we do not group deadpools together)
- Assert.Empty(result[2].AlternateVersions);
- // Superman
- // Priority:
- // 1. Name
- // 2. audiobook
- // 3. Names with modifiers
- Assert.Equal(2, result[3].AlternateVersions.Count);
- var paths = result[3].AlternateVersions.Select(x => x.Path).ToList();
- Assert.Contains("Superman/audiobook.mp3", paths);
- Assert.Contains("Superman/Superman [HQ].mp3", paths);
- // Batman
- Assert.Single(result[4].AlternateVersions);
- }
- [Fact]
- public void TestNameYearExtraction()
- {
- var data = new[]
- {
- new NameYearPath
- {
- Name = "Harry Potter and the Deathly Hallows",
- Path = "Harry Potter and the Deathly Hallows (2007)/Chapter 1.ogg",
- Year = 2007
- },
- new NameYearPath
- {
- Name = "Batman",
- Path = "Batman (2020).ogg",
- Year = 2020
- },
- new NameYearPath
- {
- Name = "Batman",
- Path = "Batman( 2021 ).mp3",
- Year = 2021
- },
- new NameYearPath
- {
- Name = "Batman(*2021*)",
- Path = "Batman(*2021*).mp3",
- Year = null
- },
- new NameYearPath
- {
- Name = "Batman",
- Path = "Batman.mp3",
- Year = null
- },
- new NameYearPath
- {
- Name = "+ Batman .",
- Path = " + Batman . .mp3",
- Year = null
- },
- new NameYearPath
- {
- Name = " ",
- Path = " .mp3",
- Year = null
- }
- };
- var resolver = GetResolver();
- var result = resolver.Resolve(data.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i.Path
- })).ToList();
- Assert.Equal(data.Length, result.Count);
- for (int i = 0; i < data.Length; i++)
- {
- Assert.Equal(data[i].Name, result[i].Name);
- Assert.Equal(data[i].Year, result[i].Year);
- }
- }
- [Fact]
- public void TestWithMetadata()
- {
- var files = new[]
- {
- "Harry Potter and the Deathly Hallows/Chapter 1.ogg",
- "Harry Potter and the Deathly Hallows/Harry Potter and the Deathly Hallows.nfo"
- };
- var resolver = GetResolver();
- var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i
- }));
- Assert.Single(result);
- }
- [Fact]
- public void TestWithExtra()
- {
- var files = new[]
- {
- "Harry Potter and the Deathly Hallows/Chapter 1.mp3",
- "Harry Potter and the Deathly Hallows/Harry Potter and the Deathly Hallows trailer.mp3"
- };
- var resolver = GetResolver();
- var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i
- })).ToList();
- Assert.Single(result);
- }
- [Fact]
- public void TestWithoutFolder()
- {
- var files = new[]
- {
- "Harry Potter and the Deathly Hallows trailer.mp3"
- };
- var resolver = GetResolver();
- var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i
- })).ToList();
- Assert.Single(result);
- }
- [Fact]
- public void TestEmpty()
- {
- var files = Array.Empty<string>();
- var resolver = GetResolver();
- var result = resolver.Resolve(files.Select(i => new FileSystemMetadata
- {
- IsDirectory = false,
- FullName = i
- })).ToList();
- Assert.Empty(result);
- }
- private AudioBookListResolver GetResolver()
- {
- return new AudioBookListResolver(_namingOptions);
- }
- internal struct NameYearPath
- {
- public string Name;
- public string Path;
- public int? Year;
- }
- }
- }
|