Browse Source

Use Diacritics.NET

Last time we had to revert this due to regressions, now those regression
tests seem to succeed with a newer version of Diacritics.NET
Bond_009 2 years ago
parent
commit
6bf131b270

+ 2 - 2
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -444,8 +444,8 @@ namespace MediaBrowser.Providers.Manager
                 }
             }
 
-            if ((originalPremiereDate ?? DateTime.MinValue) != (item.PremiereDate ?? DateTime.MinValue) ||
-                (originalProductionYear ?? -1) != (item.ProductionYear ?? -1))
+            if ((originalPremiereDate ?? DateTime.MinValue) != (item.PremiereDate ?? DateTime.MinValue)
+                || (originalProductionYear ?? -1) != (item.ProductionYear ?? -1))
             {
                 updateType |= ItemUpdateType.MetadataEdit;
             }

+ 5 - 0
src/Jellyfin.Extensions/Jellyfin.Extensions.csproj

@@ -27,6 +27,11 @@
     <Compile Include="../../SharedVersion.cs" />
   </ItemGroup>
 
+
+  <ItemGroup>
+    <PackageReference Include="Diacritics" Version="3.3.14" />
+  </ItemGroup>
+
   <!-- Code Analyzers-->
   <ItemGroup>
     <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.3">

+ 4 - 20
src/Jellyfin.Extensions/StringExtensions.cs

@@ -20,23 +20,8 @@ namespace Jellyfin.Extensions
         /// <param name="text">The string to act on.</param>
         /// <returns>The string without diacritics character.</returns>
         public static string RemoveDiacritics(this string text)
-        {
-            string withDiactritics = _nonConformingUnicode
-                .Replace(text, string.Empty)
-                .Normalize(NormalizationForm.FormD);
-
-            var withoutDiactritics = new StringBuilder();
-            foreach (char c in withDiactritics)
-            {
-                UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(c);
-                if (uc != UnicodeCategory.NonSpacingMark)
-                {
-                    withoutDiactritics.Append(c);
-                }
-            }
-
-            return withoutDiactritics.ToString().Normalize(NormalizationForm.FormC);
-        }
+            => Diacritics.Extensions.StringExtensions.RemoveDiacritics(
+                _nonConformingUnicode.Replace(text, string.Empty));
 
         /// <summary>
         /// Checks whether or not the specified string has diacritics in it.
@@ -44,9 +29,8 @@ namespace Jellyfin.Extensions
         /// <param name="text">The string to check.</param>
         /// <returns>True if the string has diacritics, false otherwise.</returns>
         public static bool HasDiacritics(this string text)
-        {
-            return !string.Equals(text, text.RemoveDiacritics(), StringComparison.Ordinal);
-        }
+            => Diacritics.Extensions.StringExtensions.HasDiacritics(text)
+                || _nonConformingUnicode.IsMatch(text);
 
         /// <summary>
         /// Counts the number of occurrences of [needle] in the string.

+ 1 - 1
tests/Jellyfin.Extensions.Tests/AlphanumericComparatorTests.cs

@@ -23,7 +23,7 @@ namespace Jellyfin.Extensions.Tests
         {
             var copy = strings.Reverse().ToArray();
             Array.Sort(copy, new AlphanumericComparator());
-            Assert.True(strings.SequenceEqual(copy));
+            Assert.Equal(strings, copy);
         }
     }
 }

+ 2 - 0
tests/Jellyfin.Extensions.Tests/StringExtensionsTests.cs

@@ -9,6 +9,7 @@ namespace Jellyfin.Extensions.Tests
         [InlineData("", "")] // Identity edge-case (no diactritics)
         [InlineData("Indiana Jones", "Indiana Jones")] // Identity (no diactritics)
         [InlineData("a\ud800b", "ab")] // Invalid UTF-16 char stripping
+        [InlineData("åäö", "aao")] // Issue #7484
         [InlineData("Jön", "Jon")] // Issue #7484
         [InlineData("Jönssonligan", "Jonssonligan")] // Issue #7484
         [InlineData("Kieślowski", "Kieslowski")] // Issue #7450
@@ -25,6 +26,7 @@ namespace Jellyfin.Extensions.Tests
         [InlineData("", false)] // Identity edge-case (no diactritics)
         [InlineData("Indiana Jones", false)] // Identity (no diactritics)
         [InlineData("a\ud800b", true)] // Invalid UTF-16 char stripping
+        [InlineData("åäö", true)] // Issue #7484
         [InlineData("Jön", true)] // Issue #7484
         [InlineData("Jönssonligan", true)] // Issue #7484
         [InlineData("Kieślowski", true)] // Issue #7450