Browse Source

Readd wildcard search (#14934)

JPVenson 1 week ago
parent
commit
c8b97bf533
1 changed files with 21 additions and 4 deletions
  1. 21 4
      Jellyfin.Server.Implementations/Item/BaseItemRepository.cs

+ 21 - 4
Jellyfin.Server.Implementations/Item/BaseItemRepository.cs

@@ -75,6 +75,7 @@ public sealed class BaseItemRepository
     private static readonly IReadOnlyList<ItemValueType> _getAlbumArtistValueTypes = [ItemValueType.AlbumArtist];
     private static readonly IReadOnlyList<ItemValueType> _getStudiosValueTypes = [ItemValueType.Studios];
     private static readonly IReadOnlyList<ItemValueType> _getGenreValueTypes = [ItemValueType.Genre];
+    private static readonly IReadOnlyList<char> SearchWildcardTerms = ['%', '_', '[', ']', '^'];
 
     /// <summary>
     /// Initializes a new instance of the <see cref="BaseItemRepository"/> class.
@@ -1693,7 +1694,15 @@ public sealed class BaseItemRepository
         if (!string.IsNullOrEmpty(filter.SearchTerm))
         {
             var searchTerm = filter.SearchTerm.ToLower();
-            baseQuery = baseQuery.Where(e => e.CleanName!.ToLower().Contains(searchTerm) || (e.OriginalTitle != null && e.OriginalTitle.ToLower().Contains(searchTerm)));
+            if (SearchWildcardTerms.Any(f => searchTerm.Contains(f)))
+            {
+                searchTerm = $"%{searchTerm.Trim('%')}%";
+                baseQuery = baseQuery.Where(e => EF.Functions.Like(e.CleanName!.ToLower(), searchTerm) || (e.OriginalTitle != null && EF.Functions.Like(e.OriginalTitle.ToLower(), searchTerm)));
+            }
+            else
+            {
+                baseQuery = baseQuery.Where(e => e.CleanName!.ToLower().Contains(searchTerm) || (e.OriginalTitle != null && e.OriginalTitle.ToLower().Contains(searchTerm)));
+            }
         }
 
         if (filter.IsFolder.HasValue)
@@ -1904,9 +1913,17 @@ public sealed class BaseItemRepository
         var nameContains = filter.NameContains;
         if (!string.IsNullOrWhiteSpace(nameContains))
         {
-            baseQuery = baseQuery.Where(e =>
-                e.CleanName!.Contains(nameContains)
-                || e.OriginalTitle!.ToLower().Contains(nameContains!));
+            if (SearchWildcardTerms.Any(f => nameContains.Contains(f)))
+            {
+                nameContains = $"%{nameContains.Trim('%')}%";
+                baseQuery = baseQuery.Where(e => EF.Functions.Like(e.CleanName, nameContains) || EF.Functions.Like(e.OriginalTitle, nameContains));
+            }
+            else
+            {
+                baseQuery = baseQuery.Where(e =>
+                                    e.CleanName!.Contains(nameContains)
+                                    || e.OriginalTitle!.ToLower().Contains(nameContains!));
+            }
         }
 
         if (!string.IsNullOrWhiteSpace(filter.NameStartsWith))