浏览代码

Add more speed and more tests

Cody Robibero 3 年之前
父节点
当前提交
593b2fd359

+ 14 - 9
Emby.Server.Implementations/Library/PathExtensions.cs

@@ -28,21 +28,26 @@ namespace Emby.Server.Implementations.Library
                 throw new ArgumentException("String can't be empty.", nameof(attribute));
             }
 
-            var openBracketIndex = str.IndexOf('[');
             var attributeIndex = str.IndexOf(attribute);
-            var closingBracketIndex = str.IndexOf(']');
-            while (openBracketIndex < attributeIndex && attributeIndex < closingBracketIndex)
+
+            // Must be at least 3 characters after the attribute =, ], any character.
+            var maxIndex = str.Length - attribute.Length - 3;
+            while (attributeIndex > -1 && attributeIndex < maxIndex)
             {
-                if (openBracketIndex + 1 == attributeIndex
-                    && str[attributeIndex + attribute.Length] == '=')
+                var attributeEnd = attributeIndex + attribute.Length;
+                if (attributeIndex > 0
+                    && str[attributeIndex - 1] == '['
+                    && str[attributeEnd] == '=')
                 {
-                    return str[(attributeIndex + attribute.Length + 1)..closingBracketIndex].Trim().ToString();
+                    var closingIndex = str[attributeEnd..].IndexOf(']');
+                    if (closingIndex != -1)
+                    {
+                        return str[(attributeEnd + 1)..(attributeEnd + closingIndex)].Trim().ToString();
+                    }
                 }
 
-                str = str[(closingBracketIndex + 1)..];
-                openBracketIndex = str.IndexOf('[');
+                str = str[attributeEnd..];
                 attributeIndex = str.IndexOf(attribute);
-                closingBracketIndex = str.IndexOf(']');
             }
 
             // for imdbid we also accept pattern matching

+ 8 - 0
tests/Jellyfin.Server.Implementations.Tests/Library/PathExtensionsTests.cs

@@ -14,6 +14,14 @@ namespace Jellyfin.Server.Implementations.Tests.Library
         [InlineData("Superman: Red Son [imdbid1=tt11111111][imdbid=tt10985510]", "imdbid", "tt10985510")]
         [InlineData("Superman: Red Son [tmdbid=618355][imdbid=tt10985510]", "imdbid", "tt10985510")]
         [InlineData("Superman: Red Son [tmdbid=618355][imdbid=tt10985510]", "tmdbid", "618355")]
+        [InlineData("[tmdbid=618355]", "tmdbid", "618355")]
+        [InlineData("tmdbid=618355][tmdbid=618355]", "tmdbid", "618355")]
+        [InlineData("[tmdbid=618355]tmdbid=618355]", "tmdbid", "618355")]
+        [InlineData("tmdbid=618355]", "tmdbid", null)]
+        [InlineData("[tmdbid=618355", "tmdbid", null)]
+        [InlineData("tmdbid=618355", "tmdbid", null)]
+        [InlineData("tmdbid=", "tmdbid", null)]
+        [InlineData("tmdbid", "tmdbid", null)]
         public void GetAttributeValue_ValidArgs_Correct(string input, string attribute, string? expectedResult)
         {
             Assert.Equal(expectedResult, PathExtensions.GetAttributeValue(input, attribute));