aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2026-02-22 12:34:58 +0100
committerShadowghost <Ghost_of_Stone@web.de>2026-02-22 12:34:58 +0100
commit6ce5f9dfd5d9a27cf70366f35948b2f02e941389 (patch)
tree9ed4aab7f33f3002e5f3f832491d729b6051be23 /MediaBrowser.Controller/Entities
parent5541653f73c5ac7d6ff0de79b08ba332d346ee62 (diff)
Cleanup folder duplicates of series
Diffstat (limited to 'MediaBrowser.Controller/Entities')
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs30
1 files changed, 29 insertions, 1 deletions
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 7c66dc6e36..ecf99accb6 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -420,6 +420,17 @@ namespace MediaBrowser.Controller.Entities
// Create a list for our validated children
var newItems = new List<BaseItem>();
+ var actuallyRemoved = new List<BaseItem>();
+
+ // Build a reverse path→item lookup for detecting type changes
+ var currentChildrenByPath = new Dictionary<string, BaseItem>(StringComparer.OrdinalIgnoreCase);
+ foreach (var kvp in currentChildren)
+ {
+ if (!string.IsNullOrEmpty(kvp.Value.Path))
+ {
+ currentChildrenByPath.TryAdd(kvp.Value.Path, kvp.Value);
+ }
+ }
cancellationToken.ThrowIfCancellationRequested();
@@ -447,6 +458,24 @@ namespace MediaBrowser.Controller.Entities
continue;
}
+ // Check if an existing item occupies the same path with different type/ID
+ if (!string.IsNullOrEmpty(child.Path)
+ && currentChildrenByPath.TryGetValue(child.Path, out var staleItem)
+ && !staleItem.Id.Equals(child.Id))
+ {
+ Logger.LogInformation(
+ "Item type changed at {Path}: {OldType} -> {NewType}, removing stale entry",
+ child.Path,
+ staleItem.GetType().Name,
+ child.GetType().Name);
+
+ currentChildren.Remove(staleItem.Id);
+ currentChildrenByPath.Remove(child.Path);
+ staleItem.SetParent(null);
+ LibraryManager.DeleteItem(staleItem, new DeleteOptions { DeleteFileLocation = false }, this, false);
+ actuallyRemoved.Add(staleItem);
+ }
+
// Brand new item - needs to be added
child.SetParent(this);
newItems.Add(child);
@@ -456,7 +485,6 @@ namespace MediaBrowser.Controller.Entities
// That's all the new and changed ones - now see if any have been removed and need cleanup
var itemsRemoved = currentChildren.Values.Except(validChildren).ToList();
var shouldRemove = !IsRoot || allowRemoveRoot;
- var actuallyRemoved = new List<BaseItem>();
// If it's an AggregateFolder, don't remove
if (shouldRemove && itemsRemoved.Count > 0)
{