aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server.Implementations/Item
diff options
context:
space:
mode:
authorJPVenson <github@jpb.email>2025-10-03 02:33:01 +0300
committerGitHub <noreply@github.com>2025-10-02 17:33:01 -0600
commitc8b97bf5336cb90395033a8d8443946a8f932203 (patch)
treed0facda69e5d07006d9fa00eac0e9597174ad446 /Jellyfin.Server.Implementations/Item
parentcfa4e357ea183fcd85004de58ad596552a0e0991 (diff)
Readd wildcard search (#14934)
Diffstat (limited to 'Jellyfin.Server.Implementations/Item')
-rw-r--r--Jellyfin.Server.Implementations/Item/BaseItemRepository.cs25
1 files changed, 21 insertions, 4 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 4d17e3769..aaff9e5d7 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/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))