aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
diff options
context:
space:
mode:
authoraudrey-inglish <112636119+audrey-inglish@users.noreply.github.com>2025-12-08 10:43:37 -0700
committerGitHub <noreply@github.com>2025-12-08 18:43:37 +0100
commit8fd59d6f336a95782a13b0440a6cf5108e58a1f8 (patch)
tree9ba96c8c829d1585a976e130f4410abb47a1b155 /Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
parentda3bff3edf6418bfa12b1237a8ed3ec2e258b561 (diff)
Merge pull request #14879 from audrey-inglish/master
Fix: normalize punctuation when computing CleanName so searches without punctuation match (closes #1674)
Diffstat (limited to 'Jellyfin.Server.Implementations/Item/BaseItemRepository.cs')
-rw-r--r--Jellyfin.Server.Implementations/Item/BaseItemRepository.cs44
1 files changed, 42 insertions, 2 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 84168291a..57d874e59 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -1373,14 +1373,54 @@ public sealed class BaseItemRepository
}
}
- private string GetCleanValue(string value)
+ /// <summary>
+ /// Gets the clean value for search and sorting purposes.
+ /// </summary>
+ /// <param name="value">The value to clean.</param>
+ /// <returns>The cleaned value.</returns>
+ public static string GetCleanValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return value;
}
- return value.RemoveDiacritics().ToLowerInvariant();
+ var noDiacritics = value.RemoveDiacritics();
+
+ // Build a string where any punctuation or symbol is treated as a separator (space).
+ var sb = new StringBuilder(noDiacritics.Length);
+ var previousWasSpace = false;
+ foreach (var ch in noDiacritics)
+ {
+ char outCh;
+ if (char.IsLetterOrDigit(ch) || char.IsWhiteSpace(ch))
+ {
+ outCh = ch;
+ }
+ else
+ {
+ outCh = ' ';
+ }
+
+ // normalize any whitespace character to a single ASCII space.
+ if (char.IsWhiteSpace(outCh))
+ {
+ if (!previousWasSpace)
+ {
+ sb.Append(' ');
+ previousWasSpace = true;
+ }
+ }
+ else
+ {
+ sb.Append(outCh);
+ previousWasSpace = false;
+ }
+ }
+
+ // trim leading/trailing spaces that may have been added.
+ var collapsed = sb.ToString().Trim();
+ return collapsed.ToLowerInvariant();
}
private List<(ItemValueType MagicNumber, string Value)> GetItemValuesToSave(BaseItemDto item, List<string> inheritedTags)