aboutsummaryrefslogtreecommitdiff
path: root/Emby.Naming/Video/ExtraRuleResolver.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Naming/Video/ExtraRuleResolver.cs')
-rw-r--r--Emby.Naming/Video/ExtraRuleResolver.cs88
1 files changed, 88 insertions, 0 deletions
diff --git a/Emby.Naming/Video/ExtraRuleResolver.cs b/Emby.Naming/Video/ExtraRuleResolver.cs
new file mode 100644
index 000000000..0970e509a
--- /dev/null
+++ b/Emby.Naming/Video/ExtraRuleResolver.cs
@@ -0,0 +1,88 @@
+using System;
+using System.IO;
+using System.Text.RegularExpressions;
+using Emby.Naming.Audio;
+using Emby.Naming.Common;
+
+namespace Emby.Naming.Video
+{
+ /// <summary>
+ /// Resolve if file is extra for video.
+ /// </summary>
+ public static class ExtraRuleResolver
+ {
+ private static readonly char[] _digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
+
+ /// <summary>
+ /// Attempts to resolve if file is extra.
+ /// </summary>
+ /// <param name="path">Path to file.</param>
+ /// <param name="namingOptions">The naming options.</param>
+ /// <returns>Returns <see cref="ExtraResult"/> object.</returns>
+ public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions)
+ {
+ var result = new ExtraResult();
+
+ for (var i = 0; i < namingOptions.VideoExtraRules.Length; i++)
+ {
+ var rule = namingOptions.VideoExtraRules[i];
+ if ((rule.MediaType == MediaType.Audio && !AudioFileParser.IsAudioFile(path, namingOptions))
+ || (rule.MediaType == MediaType.Video && !VideoResolver.IsVideoFile(path, namingOptions)))
+ {
+ continue;
+ }
+
+ var pathSpan = path.AsSpan();
+ if (rule.RuleType == ExtraRuleType.Filename)
+ {
+ var filename = Path.GetFileNameWithoutExtension(pathSpan);
+
+ if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
+ {
+ result.ExtraType = rule.ExtraType;
+ result.Rule = rule;
+ }
+ }
+ else if (rule.RuleType == ExtraRuleType.Suffix)
+ {
+ // Trim the digits from the end of the filename so we can recognize things like -trailer2
+ var filename = Path.GetFileNameWithoutExtension(pathSpan).TrimEnd(_digits);
+
+ if (filename.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase))
+ {
+ result.ExtraType = rule.ExtraType;
+ result.Rule = rule;
+ }
+ }
+ else if (rule.RuleType == ExtraRuleType.Regex)
+ {
+ var filename = Path.GetFileName(path);
+
+ var isMatch = Regex.IsMatch(filename, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled);
+
+ if (isMatch)
+ {
+ result.ExtraType = rule.ExtraType;
+ result.Rule = rule;
+ }
+ }
+ else if (rule.RuleType == ExtraRuleType.DirectoryName)
+ {
+ var directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
+ if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
+ {
+ result.ExtraType = rule.ExtraType;
+ result.Rule = rule;
+ }
+ }
+
+ if (result.ExtraType != null)
+ {
+ return result;
+ }
+ }
+
+ return result;
+ }
+ }
+}