aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities/Folder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities/Folder.cs')
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs65
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>