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