aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Library/ItemController.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Library/ItemController.cs')
-rw-r--r--MediaBrowser.Controller/Library/ItemController.cs126
1 files changed, 20 insertions, 106 deletions
diff --git a/MediaBrowser.Controller/Library/ItemController.cs b/MediaBrowser.Controller/Library/ItemController.cs
index 8d269679f..4b0d9a983 100644
--- a/MediaBrowser.Controller/Library/ItemController.cs
+++ b/MediaBrowser.Controller/Library/ItemController.cs
@@ -3,8 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Events;
using MediaBrowser.Controller.Events;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Resolvers;
@@ -58,67 +56,12 @@ namespace MediaBrowser.Controller.Library
}
#endregion
- #region BaseItem Events
- /// <summary>
- /// Called when an item is being created.
- /// This should be used to fill item values, such as metadata
- /// </summary>
- public event EventHandler<GenericItemEventArgs<BaseItem>> BaseItemCreating;
-
- /// <summary>
- /// Called when an item has been created.
- /// This should be used to process or modify item values.
- /// </summary>
- public event EventHandler<GenericItemEventArgs<BaseItem>> BaseItemCreated;
- #endregion
-
- /// <summary>
- /// Called when an item has been created
- /// </summary>
- private void OnBaseItemCreated(BaseItem item, Folder parent)
- {
- GenericItemEventArgs<BaseItem> args = new GenericItemEventArgs<BaseItem> { Item = item };
-
- if (BaseItemCreating != null)
- {
- BaseItemCreating(this, args);
- }
-
- if (BaseItemCreated != null)
- {
- BaseItemCreated(this, args);
- }
- }
-
- private void FireCreateEventsRecursive(Folder folder, Folder parent)
- {
- OnBaseItemCreated(folder, parent);
-
- int count = folder.Children.Length;
-
- Parallel.For(0, count, i =>
- {
- BaseItem item = folder.Children[i];
-
- Folder childFolder = item as Folder;
-
- if (childFolder != null)
- {
- FireCreateEventsRecursive(childFolder, folder);
- }
- else
- {
- OnBaseItemCreated(item, folder);
- }
- });
- }
-
- private BaseItem ResolveItem(ItemResolveEventArgs args)
+ private async Task<BaseItem> ResolveItem(ItemResolveEventArgs args)
{
// If that didn't pan out, try the slow ones
foreach (IBaseItemResolver resolver in Kernel.Instance.EntityResolvers)
{
- var item = resolver.ResolvePath(args);
+ var item = await resolver.ResolvePath(args);
if (item != null)
{
@@ -132,39 +75,15 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// Resolves a path into a BaseItem
/// </summary>
- public BaseItem GetItem(string path)
- {
- return GetItem(null, path);
- }
-
- /// <summary>
- /// Resolves a path into a BaseItem
- /// </summary>
- public BaseItem GetItem(Folder parent, string path)
+ public async Task<BaseItem> GetItem(Folder parent, string path)
{
- BaseItem item = GetItemInternal(parent, path, File.GetAttributes(path));
-
- if (item != null)
- {
- var folder = item as Folder;
-
- if (folder != null)
- {
- FireCreateEventsRecursive(folder, parent);
- }
- else
- {
- OnBaseItemCreated(item, parent);
- }
- }
-
- return item;
+ return await GetItemInternal(parent, path, File.GetAttributes(path));
}
/// <summary>
/// Resolves a path into a BaseItem
/// </summary>
- private BaseItem GetItemInternal(Folder parent, string path, FileAttributes attributes)
+ private async Task<BaseItem> GetItemInternal(Folder parent, string path, FileAttributes attributes)
{
if (!OnPreBeginResolvePath(parent, path, attributes))
{
@@ -201,14 +120,14 @@ namespace MediaBrowser.Controller.Library
return null;
}
- BaseItem item = ResolveItem(args);
+ BaseItem item = await ResolveItem(args);
var folder = item as Folder;
if (folder != null)
{
// If it's a folder look for child entities
- AttachChildren(folder, fileSystemChildren);
+ await AttachChildren(folder, fileSystemChildren);
}
return item;
@@ -217,30 +136,25 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// Finds child BaseItems for a given Folder
/// </summary>
- private void AttachChildren(Folder folder, IEnumerable<KeyValuePair<string, FileAttributes>> fileSystemChildren)
+ private async Task AttachChildren(Folder folder, IEnumerable<KeyValuePair<string, FileAttributes>> fileSystemChildren)
{
- List<BaseItem> baseItemChildren = new List<BaseItem>();
+ KeyValuePair<string, FileAttributes>[] fileSystemChildrenArray = fileSystemChildren.ToArray();
- int count = fileSystemChildren.Count();
+ int count = fileSystemChildrenArray.Length;
- // Resolve the child folder paths into entities
- Parallel.For(0, count, i =>
- {
- KeyValuePair<string, FileAttributes> child = fileSystemChildren.ElementAt(i);
+ Task<BaseItem>[] tasks = new Task<BaseItem>[count];
- BaseItem item = GetItemInternal(folder, child.Key, child.Value);
+ for (int i = 0; i < count; i++)
+ {
+ var child = fileSystemChildrenArray[i];
- if (item != null)
- {
- lock (baseItemChildren)
- {
- baseItemChildren.Add(item);
- }
- }
- });
+ tasks[i] = GetItemInternal(folder, child.Key, child.Value);
+ }
+ BaseItem[] baseItemChildren = await Task<BaseItem>.WhenAll(tasks);
+
// Sort them
- folder.Children = baseItemChildren.OrderBy(f =>
+ folder.Children = baseItemChildren.Where(i => i != null).OrderBy(f =>
{
return string.IsNullOrEmpty(f.SortName) ? f.Name : f.SortName;
@@ -363,7 +277,7 @@ namespace MediaBrowser.Controller.Library
/// Creates an IBN item based on a given path
/// </summary>
private T CreateImagesByNameItem<T>(string path, string name)
- where T : BaseEntity, new ()
+ where T : BaseEntity, new()
{
T item = new T();