diff options
| author | cvium <clausvium@gmail.com> | 2021-12-28 00:37:40 +0100 |
|---|---|---|
| committer | cvium <clausvium@gmail.com> | 2021-12-28 00:37:40 +0100 |
| commit | 2749509f001505d35863db4b53bb4bc6c3af6fa4 (patch) | |
| tree | 3da58eea3f1132eb52d7861748663721b3892927 /Emby.Naming/Video/ExtraResolver.cs | |
| parent | 4441513ca4a64fdf61541e56cbb1091e7aa0395b (diff) | |
Use dedicated resolvers for extras
Diffstat (limited to 'Emby.Naming/Video/ExtraResolver.cs')
| -rw-r--r-- | Emby.Naming/Video/ExtraResolver.cs | 151 |
1 files changed, 0 insertions, 151 deletions
diff --git a/Emby.Naming/Video/ExtraResolver.cs b/Emby.Naming/Video/ExtraResolver.cs deleted file mode 100644 index fbdca859f7..0000000000 --- a/Emby.Naming/Video/ExtraResolver.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -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 ExtraResolver - { - 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; - } - - /// <summary> - /// Finds extras matching the video info. - /// </summary> - /// <param name="files">The list of file video infos.</param> - /// <param name="videoInfo">The video to compare against.</param> - /// <param name="videoFlagDelimiters">The video flag delimiters.</param> - /// <returns>A list of video extras for [videoInfo].</returns> - public static IReadOnlyList<VideoFileInfo> GetExtras(IReadOnlyList<VideoInfo> files, VideoFileInfo videoInfo, ReadOnlySpan<char> videoFlagDelimiters) - { - var parentDir = videoInfo.IsDirectory ? videoInfo.Path : Path.GetDirectoryName(videoInfo.Path.AsSpan()); - - var trimmedFileNameWithoutExtension = TrimFilenameDelimiters(videoInfo.FileNameWithoutExtension, videoFlagDelimiters); - var trimmedVideoInfoName = TrimFilenameDelimiters(videoInfo.Name, videoFlagDelimiters); - - var result = new List<VideoFileInfo>(); - for (var pos = files.Count - 1; pos >= 0; pos--) - { - var current = files[pos]; - // ignore non-extras and multi-file (can this happen?) - if (current.ExtraType == null || current.Files.Count > 1) - { - continue; - } - - var currentFile = current.Files[0]; - var trimmedCurrentFileName = TrimFilenameDelimiters(currentFile.Name, videoFlagDelimiters); - - // first check filenames - bool isValid = StartsWith(trimmedCurrentFileName, trimmedFileNameWithoutExtension) - || (StartsWith(trimmedCurrentFileName, trimmedVideoInfoName) && currentFile.Year == videoInfo.Year); - - // then by directory - if (!isValid) - { - // When the extra rule type is DirectoryName we must go one level higher to get the "real" dir name - var currentParentDir = currentFile.ExtraRule?.RuleType == ExtraRuleType.DirectoryName - ? Path.GetDirectoryName(Path.GetDirectoryName(currentFile.Path.AsSpan())) - : Path.GetDirectoryName(currentFile.Path.AsSpan()); - - isValid = !currentParentDir.IsEmpty && !parentDir.IsEmpty && currentParentDir.Equals(parentDir, StringComparison.OrdinalIgnoreCase); - } - - if (isValid) - { - result.Add(currentFile); - } - } - - return result.OrderBy(r => r.Path).ToArray(); - } - - private static ReadOnlySpan<char> TrimFilenameDelimiters(ReadOnlySpan<char> name, ReadOnlySpan<char> videoFlagDelimiters) - { - return name.IsEmpty ? name : name.TrimEnd().TrimEnd(videoFlagDelimiters).TrimEnd(); - } - - private static bool StartsWith(ReadOnlySpan<char> fileName, ReadOnlySpan<char> baseName) - { - return !baseName.IsEmpty && fileName.StartsWith(baseName, StringComparison.OrdinalIgnoreCase); - } - } -} |
