2
0
Эх сурвалжийг харах

Optimize the way items are grouped into collections

cvium 4 жил өмнө
parent
commit
723b6abcb3

+ 36 - 20
Emby.Server.Implementations/Collections/CollectionManager.cs

@@ -124,7 +124,7 @@ namespace Emby.Server.Implementations.Collections
 
 
         private IEnumerable<BoxSet> GetCollections(User user)
         private IEnumerable<BoxSet> GetCollections(User user)
         {
         {
-            var folder = GetCollectionsFolder(false).Result;
+            var folder = GetCollectionsFolder(false).GetAwaiter().GetResult();
 
 
             return folder == null
             return folder == null
                 ? Enumerable.Empty<BoxSet>()
                 ? Enumerable.Empty<BoxSet>()
@@ -319,11 +319,11 @@ namespace Emby.Server.Implementations.Collections
         {
         {
             var results = new Dictionary<Guid, BaseItem>();
             var results = new Dictionary<Guid, BaseItem>();
 
 
-            var allBoxsets = GetCollections(user).ToList();
+            var allBoxSets = GetCollections(user).ToList();
 
 
             foreach (var item in items)
             foreach (var item in items)
             {
             {
-                if (!(item is ISupportsBoxSetGrouping))
+                if (item is not ISupportsBoxSetGrouping)
                 {
                 {
                     results[item.Id] = item;
                     results[item.Id] = item;
                 }
                 }
@@ -331,34 +331,50 @@ namespace Emby.Server.Implementations.Collections
                 {
                 {
                     var itemId = item.Id;
                     var itemId = item.Id;
 
 
-                    var currentBoxSets = allBoxsets
-                        .Where(i => i.ContainsLinkedChildByItemId(itemId))
-                        .ToList();
-
-                    if (currentBoxSets.Count > 0)
+                    var itemIsInBoxSet = false;
+                    foreach (var boxSet in allBoxSets)
                     {
                     {
-                        foreach (var boxset in currentBoxSets)
+                        if (!boxSet.ContainsLinkedChildByItemId(itemId))
+                        {
+                            continue;
+                        }
+
+                        itemIsInBoxSet = true;
+
+                        if (results.ContainsKey(boxSet.Id))
                         {
                         {
-                            results[boxset.Id] = boxset;
+                            continue;
                         }
                         }
+
+                        results[boxSet.Id] = boxSet;
                     }
                     }
-                    else
+
+                    // skip any item that is in a box set
+                    if (itemIsInBoxSet)
                     {
                     {
-                        var alreadyInResults = false;
-                        foreach (var child in item.GetMediaSources(true))
+                        continue;
+                    }
+
+                    var alreadyInResults = false;
+                    // this is kind of a performance hack because only Video has alternate versions that should be in a box set?
+                    if (item is Video video)
+                    {
+                        foreach (var childId in video.GetLocalAlternateVersionIds())
                         {
                         {
-                            if (Guid.TryParse(child.Id, out var id) && results.ContainsKey(id))
+                            if (!results.ContainsKey(childId))
                             {
                             {
-                                alreadyInResults = true;
-                                break;
+                                continue;
                             }
                             }
-                        }
 
 
-                        if (!alreadyInResults)
-                        {
-                            results[item.Id] = item;
+                            alreadyInResults = true;
+                            break;
                         }
                         }
                     }
                     }
+
+                    if (!alreadyInResults)
+                    {
+                        results[item.Id] = item;
+                    }
                 }
                 }
             }
             }
 
 

+ 2 - 2
MediaBrowser.Controller/Entities/Folder.cs

@@ -1434,9 +1434,9 @@ namespace MediaBrowser.Controller.Entities
             var linkedChildren = LinkedChildren;
             var linkedChildren = LinkedChildren;
             foreach (var i in linkedChildren)
             foreach (var i in linkedChildren)
             {
             {
-                if (i.ItemId.HasValue && i.ItemId.Value == itemId)
+                if (i.ItemId.HasValue)
                 {
                 {
-                    return true;
+                    return i.ItemId.Value == itemId;
                 }
                 }
 
 
                 var child = GetLinkedChild(i);
                 var child = GetLinkedChild(i);