ExtraRuleResolver.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.IO;
  3. using System.Text.RegularExpressions;
  4. using Emby.Naming.Audio;
  5. using Emby.Naming.Common;
  6. namespace Emby.Naming.Video
  7. {
  8. /// <summary>
  9. /// Resolve if file is extra for video.
  10. /// </summary>
  11. public static class ExtraRuleResolver
  12. {
  13. private static readonly char[] _digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
  14. /// <summary>
  15. /// Attempts to resolve if file is extra.
  16. /// </summary>
  17. /// <param name="path">Path to file.</param>
  18. /// <param name="namingOptions">The naming options.</param>
  19. /// <returns>Returns <see cref="ExtraResult"/> object.</returns>
  20. public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions)
  21. {
  22. var result = new ExtraResult();
  23. for (var i = 0; i < namingOptions.VideoExtraRules.Length; i++)
  24. {
  25. var rule = namingOptions.VideoExtraRules[i];
  26. if ((rule.MediaType == MediaType.Audio && !AudioFileParser.IsAudioFile(path, namingOptions))
  27. || (rule.MediaType == MediaType.Video && !VideoResolver.IsVideoFile(path, namingOptions)))
  28. {
  29. continue;
  30. }
  31. var pathSpan = path.AsSpan();
  32. if (rule.RuleType == ExtraRuleType.Filename)
  33. {
  34. var filename = Path.GetFileNameWithoutExtension(pathSpan);
  35. if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
  36. {
  37. result.ExtraType = rule.ExtraType;
  38. result.Rule = rule;
  39. }
  40. }
  41. else if (rule.RuleType == ExtraRuleType.Suffix)
  42. {
  43. // Trim the digits from the end of the filename so we can recognize things like -trailer2
  44. var filename = Path.GetFileNameWithoutExtension(pathSpan).TrimEnd(_digits);
  45. if (filename.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase))
  46. {
  47. result.ExtraType = rule.ExtraType;
  48. result.Rule = rule;
  49. }
  50. }
  51. else if (rule.RuleType == ExtraRuleType.Regex)
  52. {
  53. var filename = Path.GetFileName(path);
  54. var isMatch = Regex.IsMatch(filename, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled);
  55. if (isMatch)
  56. {
  57. result.ExtraType = rule.ExtraType;
  58. result.Rule = rule;
  59. }
  60. }
  61. else if (rule.RuleType == ExtraRuleType.DirectoryName)
  62. {
  63. var directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
  64. if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
  65. {
  66. result.ExtraType = rule.ExtraType;
  67. result.Rule = rule;
  68. }
  69. }
  70. if (result.ExtraType is not null)
  71. {
  72. return result;
  73. }
  74. }
  75. return result;
  76. }
  77. }
  78. }