ExtraTests.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using Emby.Naming.Common;
  2. using Emby.Naming.Video;
  3. using MediaBrowser.Model.Entities;
  4. using Xunit;
  5. using MediaType = Emby.Naming.Common.MediaType;
  6. namespace Jellyfin.Naming.Tests.Video
  7. {
  8. public class ExtraTests
  9. {
  10. private readonly NamingOptions _videoOptions = new NamingOptions();
  11. // Requirements
  12. // movie-deleted = ExtraType deletedscene
  13. // All of the above rules should be configurable through the options objects (ideally, even the ExtraTypes)
  14. [Fact]
  15. public void TestKodiExtras()
  16. {
  17. Test("trailer.mp4", ExtraType.Trailer);
  18. Test("300-trailer.mp4", ExtraType.Trailer);
  19. Test("300.trailer.mp4", ExtraType.Trailer);
  20. Test("300_trailer.mp4", ExtraType.Trailer);
  21. Test("300 - trailer.mp4", ExtraType.Trailer);
  22. Test("theme.mp3", ExtraType.ThemeSong);
  23. }
  24. [Fact]
  25. public void TestExpandedExtras()
  26. {
  27. Test("trailer.mp4", ExtraType.Trailer);
  28. Test("trailer.mp3", null);
  29. Test("300-trailer.mp4", ExtraType.Trailer);
  30. Test("stuff trailerthings.mkv", null);
  31. Test("theme.mp3", ExtraType.ThemeSong);
  32. Test("theme.mkv", null);
  33. Test("300-scene.mp4", ExtraType.Scene);
  34. Test("300-scene2.mp4", ExtraType.Scene);
  35. Test("300-clip.mp4", ExtraType.Clip);
  36. Test("300-deleted.mp4", ExtraType.DeletedScene);
  37. Test("300-deletedscene.mp4", ExtraType.DeletedScene);
  38. Test("300-interview.mp4", ExtraType.Interview);
  39. Test("300-behindthescenes.mp4", ExtraType.BehindTheScenes);
  40. Test("300-featurette.mp4", ExtraType.Featurette);
  41. Test("300-short.mp4", ExtraType.Short);
  42. Test("300-extra.mp4", ExtraType.Unknown);
  43. Test("300-other.mp4", ExtraType.Unknown);
  44. }
  45. [Theory]
  46. [InlineData(ExtraType.ThemeSong, "theme-music")]
  47. public void TestDirectoriesAudioExtras(ExtraType type, string dirName)
  48. {
  49. Test(dirName + "/300.mp3", type);
  50. Test("300/" + dirName + "/something.mp3", type);
  51. Test("/data/something/Movies/300/" + dirName + "/whoknows.mp3", type);
  52. }
  53. [Theory]
  54. [InlineData(ExtraType.BehindTheScenes, "behind the scenes")]
  55. [InlineData(ExtraType.DeletedScene, "deleted scenes")]
  56. [InlineData(ExtraType.Interview, "interviews")]
  57. [InlineData(ExtraType.Scene, "scenes")]
  58. [InlineData(ExtraType.Sample, "samples")]
  59. [InlineData(ExtraType.Short, "shorts")]
  60. [InlineData(ExtraType.Trailer, "trailers")]
  61. [InlineData(ExtraType.Featurette, "featurettes")]
  62. [InlineData(ExtraType.Clip, "clips")]
  63. [InlineData(ExtraType.ThemeVideo, "backdrops")]
  64. [InlineData(ExtraType.Unknown, "extra")]
  65. [InlineData(ExtraType.Unknown, "extras")]
  66. [InlineData(ExtraType.Unknown, "other")]
  67. public void TestDirectoriesVideoExtras(ExtraType type, string dirName)
  68. {
  69. Test(dirName + "/300.mp4", type);
  70. Test("300/" + dirName + "/something.mkv", type);
  71. Test("/data/something/Movies/300/" + dirName + "/whoknows.mp4", type);
  72. }
  73. [Theory]
  74. [InlineData("gibberish")]
  75. [InlineData("not a scene")]
  76. [InlineData("The Big Short")]
  77. public void TestNonExtraDirectories(string dirName)
  78. {
  79. Test(dirName + "/300.mp4", null);
  80. Test("300/" + dirName + "/something.mkv", null);
  81. Test("/data/something/Movies/300/" + dirName + "/whoknows.mp4", null);
  82. Test("/data/something/Movies/" + dirName + "/" + dirName + ".mp4", null);
  83. }
  84. [Theory]
  85. [InlineData(ExtraType.ThemeSong, "theme-music")]
  86. public void TestTopLevelDirectoriesWithAudioExtraNames(ExtraType typicalType, string dirName)
  87. {
  88. string libraryRoot = "/data/something/" + dirName;
  89. TestWithLibraryRoot(libraryRoot + "/300.mp3", libraryRoot, null);
  90. TestWithLibraryRoot(libraryRoot + "/300/" + dirName + "/something.mp3", libraryRoot, typicalType);
  91. }
  92. [Theory]
  93. [InlineData(ExtraType.Trailer, "trailers")]
  94. [InlineData(ExtraType.ThemeVideo, "backdrops")]
  95. [InlineData(ExtraType.BehindTheScenes, "behind the scenes")]
  96. [InlineData(ExtraType.DeletedScene, "deleted scenes")]
  97. [InlineData(ExtraType.Interview, "interviews")]
  98. [InlineData(ExtraType.Scene, "scenes")]
  99. [InlineData(ExtraType.Sample, "samples")]
  100. [InlineData(ExtraType.Short, "shorts")]
  101. [InlineData(ExtraType.Featurette, "featurettes")]
  102. [InlineData(ExtraType.Unknown, "extras")]
  103. [InlineData(ExtraType.Unknown, "extra")]
  104. [InlineData(ExtraType.Unknown, "other")]
  105. [InlineData(ExtraType.Clip, "clips")]
  106. public void TestTopLevelDirectoriesWithVideoExtraNames(ExtraType typicalType, string dirName)
  107. {
  108. string libraryRoot = "/data/something/" + dirName;
  109. TestWithLibraryRoot(libraryRoot + "/300.mp4", libraryRoot, null);
  110. TestWithLibraryRoot(libraryRoot + "/300/" + dirName + "/something.mkv", libraryRoot, typicalType);
  111. }
  112. [Fact]
  113. public void TestSample()
  114. {
  115. Test("sample.mp4", ExtraType.Sample);
  116. Test("300-sample.mp4", ExtraType.Sample);
  117. Test("300.sample.mp4", ExtraType.Sample);
  118. Test("300_sample.mp4", ExtraType.Sample);
  119. Test("300 - sample.mp4", ExtraType.Sample);
  120. }
  121. [Fact]
  122. public void TestSuffixPartOfTitle()
  123. {
  124. Test("I Live In A Trailer.mp4", null);
  125. Test("The DNA Sample.mp4", null);
  126. }
  127. private void Test(string input, ExtraType? expectedType)
  128. {
  129. var extraType = ExtraRuleResolver.GetExtraInfo(input, _videoOptions).ExtraType;
  130. Assert.Equal(expectedType, extraType);
  131. }
  132. private void TestWithLibraryRoot(string input, string libraryRoot, ExtraType? expectedType)
  133. {
  134. var extraType = ExtraRuleResolver.GetExtraInfo(input, _videoOptions, libraryRoot).ExtraType;
  135. Assert.Equal(expectedType, extraType);
  136. }
  137. [Fact]
  138. public void TestExtraInfo_InvalidRuleType()
  139. {
  140. var rule = new ExtraRule(ExtraType.Unknown, ExtraRuleType.Regex, @"([eE]x(tra)?\.\w+)", MediaType.Video);
  141. var options = new NamingOptions { VideoExtraRules = new[] { rule } };
  142. var res = ExtraRuleResolver.GetExtraInfo("extra.mp4", options);
  143. Assert.Equal(rule, res.Rule);
  144. }
  145. }
  146. }