|
@@ -552,23 +552,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
[IgnoreDataMember]
|
|
|
public IEnumerable<BaseItem> RecursiveChildren
|
|
|
{
|
|
|
- get
|
|
|
- {
|
|
|
- foreach (var item in Children)
|
|
|
- {
|
|
|
- yield return item;
|
|
|
-
|
|
|
- if (item.IsFolder)
|
|
|
- {
|
|
|
- var subFolder = (Folder)item;
|
|
|
-
|
|
|
- foreach (var subitem in subFolder.RecursiveChildren)
|
|
|
- {
|
|
|
- yield return subitem;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ get { return GetRecursiveChildren(); }
|
|
|
}
|
|
|
|
|
|
private List<BaseItem> LoadChildrenInternal()
|
|
@@ -686,17 +670,12 @@ namespace MediaBrowser.Controller.Entities
|
|
|
var currentChildren = ActualChildren.ToDictionary(i => i.Id);
|
|
|
|
|
|
//create a list for our validated children
|
|
|
- var validChildren = new ConcurrentBag<Tuple<BaseItem, bool>>();
|
|
|
- var newItems = new ConcurrentBag<BaseItem>();
|
|
|
+ var validChildren = new List<Tuple<BaseItem, bool>>();
|
|
|
+ var newItems = new List<BaseItem>();
|
|
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
- var options = new ParallelOptions
|
|
|
- {
|
|
|
- MaxDegreeOfParallelism = 10
|
|
|
- };
|
|
|
-
|
|
|
- Parallel.ForEach(nonCachedChildren, options, child =>
|
|
|
+ foreach (var child in nonCachedChildren)
|
|
|
{
|
|
|
BaseItem currentChild;
|
|
|
|
|
@@ -725,10 +704,10 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
|
validChildren.Add(new Tuple<BaseItem, bool>(child, true));
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
|
|
|
// If any items were added or removed....
|
|
|
- if (!newItems.IsEmpty || currentChildren.Count != validChildren.Count)
|
|
|
+ if (newItems.Count > 0 || currentChildren.Count != validChildren.Count)
|
|
|
{
|
|
|
var newChildren = validChildren.Select(c => c.Item1).ToList();
|
|
|
|
|
@@ -793,9 +772,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
/// <param name="recursive">if set to <c>true</c> [recursive].</param>
|
|
|
/// <param name="forceRefreshMetadata">if set to <c>true</c> [force refresh metadata].</param>
|
|
|
/// <returns>Task.</returns>
|
|
|
- private async Task RefreshChildren(IEnumerable<Tuple<BaseItem, bool>> children, IProgress<double> progress, CancellationToken cancellationToken, bool? recursive, bool forceRefreshMetadata = false)
|
|
|
+ private async Task RefreshChildren(IList<Tuple<BaseItem, bool>> children, IProgress<double> progress, CancellationToken cancellationToken, bool? recursive, bool forceRefreshMetadata = false)
|
|
|
{
|
|
|
- var list = children.ToList();
|
|
|
+ var list = children;
|
|
|
|
|
|
var percentages = new Dictionary<Guid, double>(list.Count);
|
|
|
|
|
@@ -994,7 +973,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
/// <param name="recursive">if set to <c>true</c> [recursive].</param>
|
|
|
/// <param name="filter">The filter.</param>
|
|
|
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
|
|
- private bool AddChildrenToList(User user, bool includeLinkedChildren, List<BaseItem> list, bool recursive, Func<BaseItem,bool> filter)
|
|
|
+ private bool AddChildrenToList(User user, bool includeLinkedChildren, List<BaseItem> list, bool recursive, Func<BaseItem, bool> filter)
|
|
|
{
|
|
|
var hasLinkedChildren = false;
|
|
|
|
|
@@ -1030,7 +1009,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
hasLinkedChildren = true;
|
|
|
|
|
|
if (child.IsVisible(user))
|
|
@@ -1056,7 +1035,15 @@ namespace MediaBrowser.Controller.Entities
|
|
|
return GetRecursiveChildren(user, null, true);
|
|
|
}
|
|
|
|
|
|
- public IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem,bool> filter, bool includeLinkedChildren = true)
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the recursive children.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="user">The user.</param>
|
|
|
+ /// <param name="filter">The filter.</param>
|
|
|
+ /// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
|
|
|
+ /// <returns>IList{BaseItem}.</returns>
|
|
|
+ /// <exception cref="System.ArgumentNullException"></exception>
|
|
|
+ public IList<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter, bool includeLinkedChildren = true)
|
|
|
{
|
|
|
if (user == null)
|
|
|
{
|
|
@@ -1066,7 +1053,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
var initialCount = _lastRecursiveCount == 0 ? _children.Count : _lastRecursiveCount;
|
|
|
var list = new List<BaseItem>(initialCount);
|
|
|
|
|
|
- var hasLinkedChildren = AddChildrenToList(user, includeLinkedChildren, list, true, null);
|
|
|
+ var hasLinkedChildren = AddChildrenToList(user, includeLinkedChildren, list, true, filter);
|
|
|
|
|
|
_lastRecursiveCount = list.Count;
|
|
|
|
|
@@ -1077,7 +1064,59 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
|
return list;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the recursive children.
|
|
|
+ /// </summary>
|
|
|
+ /// <returns>IList{BaseItem}.</returns>
|
|
|
+ public IList<BaseItem> GetRecursiveChildren()
|
|
|
+ {
|
|
|
+ return GetRecursiveChildren(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Gets the recursive children.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="filter">The filter.</param>
|
|
|
+ /// <returns>IEnumerable{BaseItem}.</returns>
|
|
|
+ public IList<BaseItem> GetRecursiveChildren(Func<BaseItem, bool> filter)
|
|
|
+ {
|
|
|
+ var initialCount = _lastRecursiveCount == 0 ? _children.Count : _lastRecursiveCount;
|
|
|
+ var list = new List<BaseItem>(initialCount);
|
|
|
+
|
|
|
+ AddChildrenToList(list, true, filter);
|
|
|
+
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Adds the children to list.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="list">The list.</param>
|
|
|
+ /// <param name="recursive">if set to <c>true</c> [recursive].</param>
|
|
|
+ /// <param name="filter">The filter.</param>
|
|
|
+ private void AddChildrenToList(List<BaseItem> list, bool recursive, Func<BaseItem, bool> filter)
|
|
|
+ {
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (filter == null || filter(child))
|
|
|
+ {
|
|
|
+ list.Add(child);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (recursive)
|
|
|
+ {
|
|
|
+ var folder = child as Folder;
|
|
|
+
|
|
|
+ if (folder != null)
|
|
|
+ {
|
|
|
+ folder.AddChildrenToList(list, true, filter);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Gets the linked children.
|
|
|
/// </summary>
|