using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Emby.Naming.Audio; using Emby.Naming.Common; namespace Emby.Naming.Video { /// /// Resolve if file is extra for video. /// public class ExtraResolver { private readonly NamingOptions _options; /// /// Initializes a new instance of the class. /// /// object containing VideoExtraRules and passed to and . public ExtraResolver(NamingOptions options) { _options = options; } /// /// Attempts to resolve if file is extra. /// /// Path to file. /// Returns object. public ExtraResult GetExtraInfo(string path) { var result = new ExtraResult(); for (var i = 0; i < _options.VideoExtraRules.Length; i++) { var rule = _options.VideoExtraRules[i]; if (rule.MediaType == MediaType.Audio) { if (!AudioFileParser.IsAudioFile(path, _options)) { continue; } } else if (rule.MediaType == MediaType.Video) { if (!new VideoResolver(_options).IsVideoFile(path)) { 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) { var filename = Path.GetFileNameWithoutExtension(pathSpan); if (filename.Contains(rule.Token, StringComparison.OrdinalIgnoreCase)) { result.ExtraType = rule.ExtraType; result.Rule = rule; } } else if (rule.RuleType == ExtraRuleType.Regex) { var filename = Path.GetFileName(path); var regex = new Regex(rule.Token, RegexOptions.IgnoreCase); if (regex.IsMatch(filename)) { 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; } } }