MultiVersionTests.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Emby.Naming.Common;
  4. using Emby.Naming.Video;
  5. using MediaBrowser.Model.IO;
  6. using Xunit;
  7. namespace Jellyfin.Naming.Tests.Video
  8. {
  9. public class MultiVersionTests
  10. {
  11. private readonly NamingOptions _namingOptions = new NamingOptions();
  12. [Fact]
  13. public void TestMultiEdition1()
  14. {
  15. var files = new[]
  16. {
  17. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past - 1080p.mkv",
  18. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past-trailer.mp4",
  19. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past - [hsbs].mkv",
  20. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past [hsbs].mkv"
  21. };
  22. var result = VideoListResolver.Resolve(
  23. files.Select(i => new FileSystemMetadata
  24. {
  25. IsDirectory = false,
  26. FullName = i
  27. }).ToList(),
  28. _namingOptions).ToList();
  29. Assert.Single(result);
  30. Assert.Single(result[0].Extras);
  31. }
  32. [Fact]
  33. public void TestMultiEdition2()
  34. {
  35. var files = new[]
  36. {
  37. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past - apple.mkv",
  38. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past-trailer.mp4",
  39. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past - banana.mkv",
  40. @"/movies/X-Men Days of Future Past/X-Men Days of Future Past [banana].mp4"
  41. };
  42. var result = VideoListResolver.Resolve(
  43. files.Select(i => new FileSystemMetadata
  44. {
  45. IsDirectory = false,
  46. FullName = i
  47. }).ToList(),
  48. _namingOptions).ToList();
  49. Assert.Single(result);
  50. Assert.Single(result[0].Extras);
  51. Assert.Equal(2, result[0].AlternateVersions.Count);
  52. }
  53. [Fact]
  54. public void TestMultiEdition3()
  55. {
  56. var files = new[]
  57. {
  58. @"/movies/The Phantom of the Opera (1925)/The Phantom of the Opera (1925) - 1925 version.mkv",
  59. @"/movies/The Phantom of the Opera (1925)/The Phantom of the Opera (1925) - 1929 version.mkv"
  60. };
  61. var result = VideoListResolver.Resolve(
  62. files.Select(i => new FileSystemMetadata
  63. {
  64. IsDirectory = false,
  65. FullName = i
  66. }).ToList(),
  67. _namingOptions).ToList();
  68. Assert.Single(result);
  69. Assert.Single(result[0].AlternateVersions);
  70. }
  71. [Fact]
  72. public void TestLetterFolders()
  73. {
  74. var files = new[]
  75. {
  76. @"/movies/M/Movie 1.mkv",
  77. @"/movies/M/Movie 2.mkv",
  78. @"/movies/M/Movie 3.mkv",
  79. @"/movies/M/Movie 4.mkv",
  80. @"/movies/M/Movie 5.mkv",
  81. @"/movies/M/Movie 6.mkv",
  82. @"/movies/M/Movie 7.mkv"
  83. };
  84. var result = VideoListResolver.Resolve(
  85. files.Select(i => new FileSystemMetadata
  86. {
  87. IsDirectory = false,
  88. FullName = i
  89. }).ToList(),
  90. _namingOptions).ToList();
  91. Assert.Equal(7, result.Count);
  92. Assert.Empty(result[0].Extras);
  93. Assert.Empty(result[0].AlternateVersions);
  94. }
  95. [Fact]
  96. public void TestMultiVersionLimit()
  97. {
  98. var files = new[]
  99. {
  100. @"/movies/Movie/Movie.mkv",
  101. @"/movies/Movie/Movie-2.mkv",
  102. @"/movies/Movie/Movie-3.mkv",
  103. @"/movies/Movie/Movie-4.mkv",
  104. @"/movies/Movie/Movie-5.mkv",
  105. @"/movies/Movie/Movie-6.mkv",
  106. @"/movies/Movie/Movie-7.mkv",
  107. @"/movies/Movie/Movie-8.mkv"
  108. };
  109. var result = VideoListResolver.Resolve(
  110. files.Select(i => new FileSystemMetadata
  111. {
  112. IsDirectory = false,
  113. FullName = i
  114. }).ToList(),
  115. _namingOptions).ToList();
  116. Assert.Single(result);
  117. Assert.Empty(result[0].Extras);
  118. Assert.Equal(7, result[0].AlternateVersions.Count);
  119. }
  120. [Fact]
  121. public void TestMultiVersionLimit2()
  122. {
  123. var files = new[]
  124. {
  125. @"/movies/Mo/Movie 1.mkv",
  126. @"/movies/Mo/Movie 2.mkv",
  127. @"/movies/Mo/Movie 3.mkv",
  128. @"/movies/Mo/Movie 4.mkv",
  129. @"/movies/Mo/Movie 5.mkv",
  130. @"/movies/Mo/Movie 6.mkv",
  131. @"/movies/Mo/Movie 7.mkv",
  132. @"/movies/Mo/Movie 8.mkv",
  133. @"/movies/Mo/Movie 9.mkv"
  134. };
  135. var result = VideoListResolver.Resolve(
  136. files.Select(i => new FileSystemMetadata
  137. {
  138. IsDirectory = false,
  139. FullName = i
  140. }).ToList(),
  141. _namingOptions).ToList();
  142. Assert.Equal(9, result.Count);
  143. Assert.Empty(result[0].Extras);
  144. Assert.Empty(result[0].AlternateVersions);
  145. }
  146. [Fact]
  147. public void TestMultiVersion3()
  148. {
  149. var files = new[]
  150. {
  151. @"/movies/Movie/Movie 1.mkv",
  152. @"/movies/Movie/Movie 2.mkv",
  153. @"/movies/Movie/Movie 3.mkv",
  154. @"/movies/Movie/Movie 4.mkv",
  155. @"/movies/Movie/Movie 5.mkv"
  156. };
  157. var result = VideoListResolver.Resolve(
  158. files.Select(i => new FileSystemMetadata
  159. {
  160. IsDirectory = false,
  161. FullName = i
  162. }).ToList(),
  163. _namingOptions).ToList();
  164. Assert.Equal(5, result.Count);
  165. Assert.Empty(result[0].Extras);
  166. Assert.Empty(result[0].AlternateVersions);
  167. }
  168. [Fact]
  169. public void TestMultiVersion4()
  170. {
  171. // Test for false positive
  172. var files = new[]
  173. {
  174. @"/movies/Iron Man/Iron Man.mkv",
  175. @"/movies/Iron Man/Iron Man (2008).mkv",
  176. @"/movies/Iron Man/Iron Man (2009).mkv",
  177. @"/movies/Iron Man/Iron Man (2010).mkv",
  178. @"/movies/Iron Man/Iron Man (2011).mkv"
  179. };
  180. var result = VideoListResolver.Resolve(
  181. files.Select(i => new FileSystemMetadata
  182. {
  183. IsDirectory = false,
  184. FullName = i
  185. }).ToList(),
  186. _namingOptions).ToList();
  187. Assert.Equal(5, result.Count);
  188. Assert.Empty(result[0].Extras);
  189. Assert.Empty(result[0].AlternateVersions);
  190. }
  191. [Fact]
  192. public void TestMultiVersion5()
  193. {
  194. var files = new[]
  195. {
  196. @"/movies/Iron Man/Iron Man.mkv",
  197. @"/movies/Iron Man/Iron Man-720p.mkv",
  198. @"/movies/Iron Man/Iron Man-test.mkv",
  199. @"/movies/Iron Man/Iron Man-bluray.mkv",
  200. @"/movies/Iron Man/Iron Man-3d.mkv",
  201. @"/movies/Iron Man/Iron Man-3d-hsbs.mkv",
  202. @"/movies/Iron Man/Iron Man-3d.hsbs.mkv",
  203. @"/movies/Iron Man/Iron Man[test].mkv",
  204. };
  205. var result = VideoListResolver.Resolve(
  206. files.Select(i => new FileSystemMetadata
  207. {
  208. IsDirectory = false,
  209. FullName = i
  210. }).ToList(),
  211. _namingOptions).ToList();
  212. Assert.Single(result);
  213. Assert.Empty(result[0].Extras);
  214. Assert.Equal(7, result[0].AlternateVersions.Count);
  215. Assert.False(result[0].AlternateVersions[2].Is3D);
  216. Assert.True(result[0].AlternateVersions[3].Is3D);
  217. Assert.True(result[0].AlternateVersions[4].Is3D);
  218. }
  219. [Fact]
  220. public void TestMultiVersion6()
  221. {
  222. var files = new[]
  223. {
  224. @"/movies/Iron Man/Iron Man.mkv",
  225. @"/movies/Iron Man/Iron Man - 720p.mkv",
  226. @"/movies/Iron Man/Iron Man - test.mkv",
  227. @"/movies/Iron Man/Iron Man - bluray.mkv",
  228. @"/movies/Iron Man/Iron Man - 3d.mkv",
  229. @"/movies/Iron Man/Iron Man - 3d-hsbs.mkv",
  230. @"/movies/Iron Man/Iron Man - 3d.hsbs.mkv",
  231. @"/movies/Iron Man/Iron Man [test].mkv"
  232. };
  233. var result = VideoListResolver.Resolve(
  234. files.Select(i => new FileSystemMetadata
  235. {
  236. IsDirectory = false,
  237. FullName = i
  238. }).ToList(),
  239. _namingOptions).ToList();
  240. Assert.Single(result);
  241. Assert.Empty(result[0].Extras);
  242. Assert.Equal(7, result[0].AlternateVersions.Count);
  243. Assert.False(result[0].AlternateVersions[3].Is3D);
  244. Assert.True(result[0].AlternateVersions[4].Is3D);
  245. Assert.True(result[0].AlternateVersions[5].Is3D);
  246. }
  247. [Fact]
  248. public void TestMultiVersion7()
  249. {
  250. var files = new[]
  251. {
  252. @"/movies/Iron Man/Iron Man - B (2006).mkv",
  253. @"/movies/Iron Man/Iron Man - C (2007).mkv"
  254. };
  255. var result = VideoListResolver.Resolve(
  256. files.Select(i => new FileSystemMetadata
  257. {
  258. IsDirectory = false,
  259. FullName = i
  260. }).ToList(),
  261. _namingOptions).ToList();
  262. Assert.Equal(2, result.Count);
  263. }
  264. [Fact]
  265. public void TestMultiVersion8()
  266. {
  267. var files = new[]
  268. {
  269. @"/movies/Iron Man/Iron Man.mkv",
  270. @"/movies/Iron Man/Iron Man_720p.mkv",
  271. @"/movies/Iron Man/Iron Man_test.mkv",
  272. @"/movies/Iron Man/Iron Man_bluray.mkv",
  273. @"/movies/Iron Man/Iron Man_3d.mkv",
  274. @"/movies/Iron Man/Iron Man_3d-hsbs.mkv",
  275. @"/movies/Iron Man/Iron Man_3d.hsbs.mkv"
  276. };
  277. var result = VideoListResolver.Resolve(
  278. files.Select(i => new FileSystemMetadata
  279. {
  280. IsDirectory = false,
  281. FullName = i
  282. }).ToList(),
  283. _namingOptions).ToList();
  284. Assert.Equal(7, result.Count);
  285. Assert.Empty(result[0].Extras);
  286. Assert.Empty(result[0].AlternateVersions);
  287. }
  288. [Fact]
  289. public void TestMultiVersion9()
  290. {
  291. // Test for false positive
  292. var files = new[]
  293. {
  294. @"/movies/Iron Man/Iron Man (2007).mkv",
  295. @"/movies/Iron Man/Iron Man (2008).mkv",
  296. @"/movies/Iron Man/Iron Man (2009).mkv",
  297. @"/movies/Iron Man/Iron Man (2010).mkv",
  298. @"/movies/Iron Man/Iron Man (2011).mkv"
  299. };
  300. var result = VideoListResolver.Resolve(
  301. files.Select(i => new FileSystemMetadata
  302. {
  303. IsDirectory = false,
  304. FullName = i
  305. }).ToList(),
  306. _namingOptions).ToList();
  307. Assert.Equal(5, result.Count);
  308. Assert.Empty(result[0].Extras);
  309. Assert.Empty(result[0].AlternateVersions);
  310. }
  311. [Fact]
  312. public void TestMultiVersion10()
  313. {
  314. var files = new[]
  315. {
  316. @"/movies/Blade Runner (1982)/Blade Runner (1982) [Final Cut] [1080p HEVC AAC].mkv",
  317. @"/movies/Blade Runner (1982)/Blade Runner (1982) [EE by ADM] [480p HEVC AAC,AAC,AAC].mkv"
  318. };
  319. var result = VideoListResolver.Resolve(
  320. files.Select(i => new FileSystemMetadata
  321. {
  322. IsDirectory = false,
  323. FullName = i
  324. }).ToList(),
  325. _namingOptions).ToList();
  326. Assert.Single(result);
  327. Assert.Empty(result[0].Extras);
  328. Assert.Single(result[0].AlternateVersions);
  329. }
  330. [Fact]
  331. public void TestMultiVersion11()
  332. {
  333. var files = new[]
  334. {
  335. @"/movies/X-Men Apocalypse (2016)/X-Men Apocalypse (2016) [1080p] Blu-ray.x264.DTS.mkv",
  336. @"/movies/X-Men Apocalypse (2016)/X-Men Apocalypse (2016) [2160p] Blu-ray.x265.AAC.mkv"
  337. };
  338. var result = VideoListResolver.Resolve(
  339. files.Select(i => new FileSystemMetadata
  340. {
  341. IsDirectory = false,
  342. FullName = i
  343. }).ToList(),
  344. _namingOptions).ToList();
  345. Assert.Single(result);
  346. Assert.Empty(result[0].Extras);
  347. Assert.Single(result[0].AlternateVersions);
  348. }
  349. [Fact]
  350. public void Resolve_GivenFolderNameWithBracketsAndHyphens_GroupsBasedOnFolderName()
  351. {
  352. var files = new[]
  353. {
  354. @"/movies/John Wick - Kapitel 3 (2019) [imdbid=tt6146586]/John Wick - Kapitel 3 (2019) [imdbid=tt6146586] - Version 1.mkv",
  355. @"/movies/John Wick - Kapitel 3 (2019) [imdbid=tt6146586]/John Wick - Kapitel 3 (2019) [imdbid=tt6146586] - Version 2.mkv"
  356. };
  357. var result = VideoListResolver.Resolve(
  358. files.Select(i => new FileSystemMetadata
  359. {
  360. IsDirectory = false,
  361. FullName = i
  362. }).ToList(),
  363. _namingOptions).ToList();
  364. Assert.Single(result);
  365. Assert.Empty(result[0].Extras);
  366. Assert.Single(result[0].AlternateVersions);
  367. }
  368. [Fact]
  369. public void Resolve_GivenUnclosedBrackets_DoesNotGroup()
  370. {
  371. var files = new[]
  372. {
  373. @"/movies/John Wick - Chapter 3 (2019)/John Wick - Chapter 3 (2019) [Version 1].mkv",
  374. @"/movies/John Wick - Chapter 3 (2019)/John Wick - Chapter 3 (2019) [Version 2.mkv"
  375. };
  376. var result = VideoListResolver.Resolve(
  377. files.Select(i => new FileSystemMetadata
  378. {
  379. IsDirectory = false,
  380. FullName = i
  381. }).ToList(),
  382. _namingOptions).ToList();
  383. Assert.Equal(2, result.Count);
  384. }
  385. [Fact]
  386. public void TestEmptyList()
  387. {
  388. var result = VideoListResolver.Resolve(new List<FileSystemMetadata>(), _namingOptions).ToList();
  389. Assert.Empty(result);
  390. }
  391. }
  392. }