aboutsummaryrefslogtreecommitdiff
path: root/Emby.Naming/Video/CleanStringParser.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Naming/Video/CleanStringParser.cs')
-rw-r--r--Emby.Naming/Video/CleanStringParser.cs44
1 files changed, 36 insertions, 8 deletions
diff --git a/Emby.Naming/Video/CleanStringParser.cs b/Emby.Naming/Video/CleanStringParser.cs
index 4eef3ebc5..051809570 100644
--- a/Emby.Naming/Video/CleanStringParser.cs
+++ b/Emby.Naming/Video/CleanStringParser.cs
@@ -25,26 +25,54 @@ namespace Emby.Naming.Video
return false;
}
- var len = expressions.Count;
- for (int i = 0; i < len; i++)
+ // Iteratively remove extra cruft until we're left with the string
+ // we want.
+ newName = ReadOnlySpan<char>.Empty;
+ const int maxTries = 100; // This is just a precautionary
+ // measure. Should not be neccesary.
+ var loopCounter = 0;
+ for (; loopCounter < maxTries; loopCounter++)
{
- if (TryClean(name, expressions[i], out newName))
+ bool cleaned = false;
+ var len = expressions.Count;
+ for (int i = 0; i < len; i++)
+ {
+ if (TryClean(name, expressions[i], out newName))
+ {
+ cleaned = true;
+ name = newName.ToString();
+ break;
+ }
+ }
+
+ if (!cleaned)
{
- return true;
+ break;
}
}
- newName = ReadOnlySpan<char>.Empty;
- return false;
+ if (loopCounter > 0)
+ {
+ newName = name.AsSpan();
+ }
+
+ return newName != ReadOnlySpan<char>.Empty;
}
private static bool TryClean(string name, Regex expression, out ReadOnlySpan<char> newName)
{
var match = expression.Match(name);
int index = match.Index;
- if (match.Success && index != 0)
+ if (match.Success)
{
- newName = name.AsSpan().Slice(0, match.Index);
+ var found = match.Groups.TryGetValue("cleaned", out var cleaned);
+ if (!found || cleaned == null)
+ {
+ newName = ReadOnlySpan<char>.Empty;
+ return false;
+ }
+
+ newName = name.AsSpan().Slice(cleaned.Index, cleaned.Length);
return true;
}