MultiVersionTests.cs 16 KB

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