ExtraResolver.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using Emby.Naming.Audio;
  6. using Emby.Naming.Common;
  7. namespace Emby.Naming.Video
  8. {
  9. /// <summary>
  10. /// Resolve if file is extra for video.
  11. /// </summary>
  12. public class ExtraResolver
  13. {
  14. private readonly NamingOptions _options;
  15. /// <summary>
  16. /// Initializes a new instance of the <see cref="ExtraResolver"/> class.
  17. /// </summary>
  18. /// <param name="options"><see cref="NamingOptions"/> object containing VideoExtraRules and passed to <see cref="AudioFileParser"/> and <see cref="VideoResolver"/>.</param>
  19. public ExtraResolver(NamingOptions options)
  20. {
  21. _options = options;
  22. }
  23. /// <summary>
  24. /// Attempts to resolve if file is extra.
  25. /// </summary>
  26. /// <param name="path">Path to file.</param>
  27. /// <returns>Returns <see cref="ExtraResult"/> object.</returns>
  28. public ExtraResult GetExtraInfo(string path)
  29. {
  30. var result = new ExtraResult();
  31. for (var i = 0; i < _options.VideoExtraRules.Length; i++)
  32. {
  33. var rule = _options.VideoExtraRules[i];
  34. if (rule.MediaType == MediaType.Audio)
  35. {
  36. if (!AudioFileParser.IsAudioFile(path, _options))
  37. {
  38. continue;
  39. }
  40. }
  41. else if (rule.MediaType == MediaType.Video)
  42. {
  43. if (!VideoResolver.IsVideoFile(path, _options))
  44. {
  45. continue;
  46. }
  47. }
  48. var pathSpan = path.AsSpan();
  49. if (rule.RuleType == ExtraRuleType.Filename)
  50. {
  51. var filename = Path.GetFileNameWithoutExtension(pathSpan);
  52. if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
  53. {
  54. result.ExtraType = rule.ExtraType;
  55. result.Rule = rule;
  56. }
  57. }
  58. else if (rule.RuleType == ExtraRuleType.Suffix)
  59. {
  60. var filename = Path.GetFileNameWithoutExtension(pathSpan);
  61. if (filename.Contains(rule.Token, StringComparison.OrdinalIgnoreCase))
  62. {
  63. result.ExtraType = rule.ExtraType;
  64. result.Rule = rule;
  65. }
  66. }
  67. else if (rule.RuleType == ExtraRuleType.Regex)
  68. {
  69. var filename = Path.GetFileName(path);
  70. var regex = new Regex(rule.Token, RegexOptions.IgnoreCase);
  71. if (regex.IsMatch(filename))
  72. {
  73. result.ExtraType = rule.ExtraType;
  74. result.Rule = rule;
  75. }
  76. }
  77. else if (rule.RuleType == ExtraRuleType.DirectoryName)
  78. {
  79. var directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
  80. if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
  81. {
  82. result.ExtraType = rule.ExtraType;
  83. result.Rule = rule;
  84. }
  85. }
  86. if (result.ExtraType != null)
  87. {
  88. return result;
  89. }
  90. }
  91. return result;
  92. }
  93. }
  94. }