From 0c46004cd921aed337c5b995afe253d65c15eeb4 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Thu, 5 Feb 2026 19:57:03 +0100 Subject: [PATCH] Optimize accessibility checks --- MediaBrowser.Controller/Entities/BaseItem.cs | 23 ++++++++++++++++++-- MediaBrowser.Controller/Entities/Folder.cs | 5 ++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 3f04b1ffae..d366e0288a 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1350,8 +1350,27 @@ namespace MediaBrowser.Controller.Entities if (itemCollectionFolders.Count > 0) { - var userCollectionFolders = LibraryManager.GetUserRootFolder().GetChildren(user, true).Select(i => i.Id).ToList(); - if (!itemCollectionFolders.Any(userCollectionFolders.Contains)) + var blockedMediaFolders = user.GetPreferenceValues(PreferenceKind.BlockedMediaFolders); + IEnumerable userCollectionFolderIds; + if (blockedMediaFolders.Length > 0) + { + // User has blocked folders - get all library folders and exclude blocked ones + userCollectionFolderIds = LibraryManager.GetUserRootFolder().Children + .Select(i => i.Id) + .Where(id => !blockedMediaFolders.Contains(id)); + } + else if (user.HasPermission(PermissionKind.EnableAllFolders)) + { + // User can access all folders - no need to filter + return true; + } + else + { + // User has specific enabled folders + userCollectionFolderIds = user.GetPreferenceValues(PreferenceKind.EnabledFolders); + } + + if (!itemCollectionFolders.Any(userCollectionFolderIds.Contains)) { return false; } diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index b88572a67f..e1f7d095c3 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -1699,8 +1699,11 @@ namespace MediaBrowser.Controller.Entities if (SupportsPlayedStatus || (itemDto is not null && fields.ContainsField(ItemFields.RecursiveItemCount))) { + // Create a minimal query with just the user - skip ConfigureUserAccess to avoid + // expensive GetUserViews calls. Since we're counting descendants of a specific + // item (this folder) that the user already has access to, TopParentIds filtering + // is redundant. The parental rating filter is applied via query.User. var query = new InternalItemsQuery(user); - LibraryManager.ConfigureUserAccess(query, user); int playedCount; int totalCount;