aboutsummaryrefslogtreecommitdiff
path: root/Emby.Naming/Video
diff options
context:
space:
mode:
authorSven Cazier <sven.cazier@vdabcampus.be>2025-07-26 23:24:58 +0200
committerSven Cazier <sven.cazier@vdabcampus.be>2025-07-26 23:24:58 +0200
commit7785b51f572cf48a62dfc2ee60fc1db0ccedf1a2 (patch)
tree68cfb8ae8deb259a6901a749ca2de3df00ecf5fa /Emby.Naming/Video
parenta068f756233e1750a0dfc0b248ed4c1963860c67 (diff)
Enhance extra rules for video and audio file naming; update tests for new naming conventions
Diffstat (limited to 'Emby.Naming/Video')
-rw-r--r--Emby.Naming/Video/ExtraRuleResolver.cs78
1 files changed, 28 insertions, 50 deletions
diff --git a/Emby.Naming/Video/ExtraRuleResolver.cs b/Emby.Naming/Video/ExtraRuleResolver.cs
index 528906589..2e0caa612 100644
--- a/Emby.Naming/Video/ExtraRuleResolver.cs
+++ b/Emby.Naming/Video/ExtraRuleResolver.cs
@@ -22,67 +22,45 @@ namespace Emby.Naming.Video
/// <returns>Returns <see cref="ExtraResult"/> object.</returns>
public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions, string? libraryRoot = "")
{
- var result = new ExtraResult();
+ ExtraResult result = new ExtraResult();
- for (var i = 0; i < namingOptions.VideoExtraRules.Length; i++)
+ bool isAudioFile = AudioFileParser.IsAudioFile(path, namingOptions);
+ bool isVideoFile = VideoResolver.IsVideoFile(path, namingOptions);
+
+ ReadOnlySpan<char> pathSpan = path.AsSpan();
+ ReadOnlySpan<char> fileName = Path.GetFileName(pathSpan);
+ ReadOnlySpan<char> fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathSpan);
+ // Trim the digits from the end of the filename so we can recognize things like -trailer2
+ ReadOnlySpan<char> trimmedFileNameWithoutExtension = fileNameWithoutExtension.TrimEnd(_digits);
+ ReadOnlySpan<char> directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
+ string fullDirectory = Path.GetDirectoryName(pathSpan).ToString();
+
+ foreach (ExtraRule rule in namingOptions.VideoExtraRules)
{
- var rule = namingOptions.VideoExtraRules[i];
- if ((rule.MediaType == MediaType.Audio && !AudioFileParser.IsAudioFile(path, namingOptions))
- || (rule.MediaType == MediaType.Video && !VideoResolver.IsVideoFile(path, namingOptions)))
+ if ((rule.MediaType == MediaType.Audio && !isAudioFile)
+ || (rule.MediaType == MediaType.Video && !isVideoFile))
{
continue;
}
- var pathSpan = path.AsSpan();
- if (rule.RuleType == ExtraRuleType.Filename)
+ bool isMatch = rule.RuleType switch
{
- var filename = Path.GetFileNameWithoutExtension(pathSpan);
+ ExtraRuleType.Filename => fileNameWithoutExtension.Equals(rule.Token, StringComparison.OrdinalIgnoreCase),
+ ExtraRuleType.Suffix => trimmedFileNameWithoutExtension.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase),
+ ExtraRuleType.Regex => Regex.IsMatch(fileName, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled),
+ ExtraRuleType.DirectoryName => directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase)
+ && !string.Equals(fullDirectory, libraryRoot, StringComparison.OrdinalIgnoreCase),
+ _ => false,
+ };
- if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
- {
- result.ExtraType = rule.ExtraType;
- result.Rule = rule;
- }
- }
- else if (rule.RuleType == ExtraRuleType.Suffix)
+ if (!isMatch)
{
- // 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.AsSpan());
-
- 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));
- string fullDirectory = Path.GetDirectoryName(pathSpan).ToString();
- if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase)
- && !string.Equals(fullDirectory, libraryRoot, StringComparison.OrdinalIgnoreCase))
- {
- result.ExtraType = rule.ExtraType;
- result.Rule = rule;
- }
+ continue;
}
- if (result.ExtraType is not null)
- {
- return result;
- }
+ result.ExtraType = rule.ExtraType;
+ result.Rule = rule;
+ return result;
}
return result;