MultiVersionTests.cs 13 KB

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