Browse Source

Backport pull request #15373 from jellyfin/release-10.11.z

Fix collection grouping in mixed libraries

Original-merge: 13c4517a66e3f857cc4acc9b2fa3505297d554eb

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
theguymadmax 3 days ago
parent
commit
c805c5e2b1
1 changed files with 56 additions and 17 deletions
  1. 56 17
      MediaBrowser.Controller/Entities/Folder.cs

+ 56 - 17
MediaBrowser.Controller/Entities/Folder.cs

@@ -1052,12 +1052,49 @@ namespace MediaBrowser.Controller.Entities
         {
         {
             ArgumentNullException.ThrowIfNull(items);
             ArgumentNullException.ThrowIfNull(items);
 
 
-            if (CollapseBoxSetItems(query, queryParent, user, configurationManager))
+            if (!CollapseBoxSetItems(query, queryParent, user, configurationManager))
             {
             {
-                items = collectionManager.CollapseItemsWithinBoxSets(items, user);
+                return items;
             }
             }
 
 
-            return items;
+            var config = configurationManager.Configuration;
+
+            bool collapseMovies = config.EnableGroupingMoviesIntoCollections;
+            bool collapseSeries = config.EnableGroupingShowsIntoCollections;
+
+            if (user is null || (collapseMovies && collapseSeries))
+            {
+                return collectionManager.CollapseItemsWithinBoxSets(items, user);
+            }
+
+            if (!collapseMovies && !collapseSeries)
+            {
+                return items;
+            }
+
+            var collapsibleItems = new List<BaseItem>();
+            var remainingItems = new List<BaseItem>();
+
+            foreach (var item in items)
+            {
+                if ((collapseMovies && item is Movie) || (collapseSeries && item is Series))
+                {
+                    collapsibleItems.Add(item);
+                }
+                else
+                {
+                    remainingItems.Add(item);
+                }
+            }
+
+            if (collapsibleItems.Count == 0)
+            {
+                return remainingItems;
+            }
+
+            var collapsedItems = collectionManager.CollapseItemsWithinBoxSets(collapsibleItems, user);
+
+            return collapsedItems.Concat(remainingItems);
         }
         }
 
 
         private static bool CollapseBoxSetItems(
         private static bool CollapseBoxSetItems(
@@ -1088,24 +1125,26 @@ namespace MediaBrowser.Controller.Entities
             }
             }
 
 
             var param = query.CollapseBoxSetItems;
             var param = query.CollapseBoxSetItems;
-
-            if (!param.HasValue)
+            if (param.HasValue)
             {
             {
-                if (user is not null && query.IncludeItemTypes.Any(type =>
-                    (type == BaseItemKind.Movie && !configurationManager.Configuration.EnableGroupingMoviesIntoCollections) ||
-                    (type == BaseItemKind.Series && !configurationManager.Configuration.EnableGroupingShowsIntoCollections)))
-                {
-                    return false;
-                }
+                return param.Value && AllowBoxSetCollapsing(query);
+            }
 
 
-                if (query.IncludeItemTypes.Length == 0
-                    || query.IncludeItemTypes.Any(type => type == BaseItemKind.Movie || type == BaseItemKind.Series))
-                {
-                    param = true;
-                }
+            var config = configurationManager.Configuration;
+
+            bool queryHasMovies = query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains(BaseItemKind.Movie);
+            bool queryHasSeries = query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains(BaseItemKind.Series);
+
+            bool collapseMovies = config.EnableGroupingMoviesIntoCollections;
+            bool collapseSeries = config.EnableGroupingShowsIntoCollections;
+
+            if (user is not null)
+            {
+                bool canCollapse = (queryHasMovies && collapseMovies) || (queryHasSeries && collapseSeries);
+                return canCollapse && AllowBoxSetCollapsing(query);
             }
             }
 
 
-            return param.HasValue && param.Value && AllowBoxSetCollapsing(query);
+            return (queryHasMovies || queryHasSeries) && AllowBoxSetCollapsing(query);
         }
         }
 
 
         private static bool AllowBoxSetCollapsing(InternalItemsQuery request)
         private static bool AllowBoxSetCollapsing(InternalItemsQuery request)