aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2026-02-07 21:17:01 +0100
committerShadowghost <Ghost_of_Stone@web.de>2026-02-07 21:17:01 +0100
commitbb6c3b4eecee46a0a6222ffe17657cabc7da97f4 (patch)
tree2cb88aa14642d203c7a98e6beabc30b3686be6c5 /MediaBrowser.Controller
parent2420ece5fe47c3d990641add1648b9c220215a62 (diff)
Fix BoxSet collapse handling and deletion
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs17
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs28
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs6
3 files changed, 49 insertions, 2 deletions
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index cf615788ee..ffdc8421da 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -79,14 +79,27 @@ namespace MediaBrowser.Controller.Entities
public CollectionType? CollectionType { get; set; }
/// <summary>
- /// Gets the item's children.
+ /// Gets or sets the item's children.
/// </summary>
/// <remarks>
/// Our children are actually just references to the ones in the physical root...
+ /// Setting to null propagates invalidation to physical folders since the getter
+ /// always delegates to <see cref="GetActualChildren"/> and never reads the backing field.
/// </remarks>
/// <value>The actual children.</value>
[JsonIgnore]
- public override IEnumerable<BaseItem> Children => GetActualChildren();
+ public override IEnumerable<BaseItem> Children
+ {
+ get => GetActualChildren();
+ set
+ {
+ // The getter delegates to physical folders, so invalidate their caches.
+ foreach (var folder in GetPhysicalFolders(true))
+ {
+ folder.Children = null;
+ }
+ }
+ }
[JsonIgnore]
public override bool SupportsPeople => false;
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 44903fd4c1..0c0558b4c1 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -733,6 +733,7 @@ namespace MediaBrowser.Controller.Entities
if (!query.ForceDirect && RequiresPostFiltering(query))
{
query.CollapseBoxSetItems = true;
+ SetCollapseBoxSetItemTypes(query);
}
if (this is not UserRootFolder
@@ -1039,6 +1040,33 @@ namespace MediaBrowser.Controller.Entities
return (queryHasMovies || queryHasSeries) && AllowBoxSetCollapsing(query);
}
+ private void SetCollapseBoxSetItemTypes(InternalItemsQuery query)
+ {
+ var config = ConfigurationManager.Configuration;
+ bool collapseMovies = config.EnableGroupingMoviesIntoCollections;
+ bool collapseSeries = config.EnableGroupingShowsIntoCollections;
+
+ if (collapseMovies && collapseSeries)
+ {
+ // Empty means collapse all types
+ query.CollapseBoxSetItemTypes = [];
+ return;
+ }
+
+ var types = new List<BaseItemKind>();
+ if (collapseMovies)
+ {
+ types.Add(BaseItemKind.Movie);
+ }
+
+ if (collapseSeries)
+ {
+ types.Add(BaseItemKind.Series);
+ }
+
+ query.CollapseBoxSetItemTypes = types.ToArray();
+ }
+
private static bool AllowBoxSetCollapsing(InternalItemsQuery request)
{
if (request.IsFavorite.HasValue)
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index b36ea627d8..2824fb6954 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -113,6 +113,12 @@ namespace MediaBrowser.Controller.Entities
public bool? CollapseBoxSetItems { get; set; }
+ /// <summary>
+ /// Gets or sets the item types that should be collapsed into box sets.
+ /// When empty, all types are collapsed. When set, only items of these types are replaced by their parent box set.
+ /// </summary>
+ public BaseItemKind[] CollapseBoxSetItemTypes { get; set; } = [];
+
public string? NameStartsWithOrGreater { get; set; }
public string? NameStartsWith { get; set; }