diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/Folder.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 65 |
1 files changed, 34 insertions, 31 deletions
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 4d5dc5ddb..1015a3021 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -977,31 +977,52 @@ namespace MediaBrowser.Controller.Entities return result; } - return GetChildrenList(user, includeLinkedChildren); + var initialCount = _children.Count; + var list = new List<BaseItem>(initialCount); + + AddChildrenToList(user, includeLinkedChildren, list, false); + + return list; } /// <summary> - /// Gets the children list. + /// Adds the children to list. /// </summary> /// <param name="user">The user.</param> /// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param> - /// <returns>List{BaseItem}.</returns> - private List<BaseItem> GetChildrenList(User user, bool includeLinkedChildren) + /// <param name="list">The list.</param> + /// <param name="recursive">if set to <c>true</c> [recursive].</param> + private bool AddChildrenToList(User user, bool includeLinkedChildren, List<BaseItem> list, bool recursive) { - var list = new List<BaseItem>(); - + var hasLinkedChildren = false; + foreach (var child in Children) { if (child.IsVisible(user)) { list.Add(child); } + + if (recursive) + { + var folder = child as Folder; + + if (folder != null) + { + if (folder.AddChildrenToList(user, includeLinkedChildren, list, true)) + { + hasLinkedChildren = true; + } + } + } } if (includeLinkedChildren) { foreach (var child in GetLinkedChildren()) { + hasLinkedChildren = true; + if (child.IsVisible(user)) { list.Add(child); @@ -1009,9 +1030,10 @@ namespace MediaBrowser.Controller.Entities } } - return list; + return hasLinkedChildren; } + private int _lastRecursiveCount; /// <summary> /// Gets allowed recursive children of an item /// </summary> @@ -1026,12 +1048,14 @@ namespace MediaBrowser.Controller.Entities throw new ArgumentNullException(); } - var initialCount = _children.Count; + var initialCount = _lastRecursiveCount == 0 ? _children.Count : _lastRecursiveCount; var list = new List<BaseItem>(initialCount); - AddRecursiveChildrenInternal(user, includeLinkedChildren, list); + var hasLinkedChildren = AddChildrenToList(user, includeLinkedChildren, list, true); - if (includeLinkedChildren) + _lastRecursiveCount = list.Count; + + if (includeLinkedChildren && hasLinkedChildren) { list = list.Distinct().ToList(); } @@ -1040,27 +1064,6 @@ namespace MediaBrowser.Controller.Entities } /// <summary> - /// Adds the recursive children internal. - /// </summary> - /// <param name="user">The user.</param> - /// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param> - /// <param name="list">The list.</param> - private void AddRecursiveChildrenInternal(User user, bool includeLinkedChildren, List<BaseItem> list) - { - foreach (var item in GetChildrenList(user, includeLinkedChildren)) - { - list.Add(item); - - var subFolder = item as Folder; - - if (subFolder != null) - { - subFolder.AddRecursiveChildrenInternal(user, includeLinkedChildren, list); - } - } - } - - /// <summary> /// Gets the linked children. /// </summary> /// <returns>IEnumerable{BaseItem}.</returns> |
