From 17106ea5c72511f5871178c7f1def629c20191ac Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Mon, 17 Sep 2012 11:12:43 -0400 Subject: Initial commit changing to on-demand child loading and validations --- MediaBrowser.Controller/Library/ItemController.cs | 250 +++++++++------------- 1 file changed, 96 insertions(+), 154 deletions(-) (limited to 'MediaBrowser.Controller/Library/ItemController.cs') diff --git a/MediaBrowser.Controller/Library/ItemController.cs b/MediaBrowser.Controller/Library/ItemController.cs index 9e0c94b79..7ef1c17a1 100644 --- a/MediaBrowser.Controller/Library/ItemController.cs +++ b/MediaBrowser.Controller/Library/ItemController.cs @@ -1,5 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; +using MediaBrowser.Controller.Resolvers; +using MediaBrowser.Common.Extensions; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -11,57 +13,21 @@ namespace MediaBrowser.Controller.Library { public class ItemController { - #region PreBeginResolvePath Event - /// - /// Fires when a path is about to be resolved, but before child folders and files - /// have been collected from the file system. - /// This gives listeners a chance to cancel the operation and cause the path to be ignored. - /// - public event EventHandler PreBeginResolvePath; - private bool OnPreBeginResolvePath(PreBeginResolveEventArgs args) - { - if (PreBeginResolvePath != null) - { - PreBeginResolvePath(this, args); - } - - return !args.Cancel; - } - #endregion - - #region BeginResolvePath Event - /// - /// Fires when a path is about to be resolved, but after child folders and files - /// have been collected from the file system. - /// This gives listeners a chance to cancel the operation and cause the path to be ignored. - /// - public event EventHandler BeginResolvePath; - private bool OnBeginResolvePath(ItemResolveEventArgs args) - { - if (BeginResolvePath != null) - { - BeginResolvePath(this, args); - } - - return !args.Cancel; - } - #endregion - - private BaseItem ResolveItem(ItemResolveEventArgs args) - { - // Try first priority resolvers - for (int i = 0; i < Kernel.Instance.EntityResolvers.Length; i++) - { - var item = Kernel.Instance.EntityResolvers[i].ResolvePath(args); - - if (item != null) - { - return item; - } - } - - return null; - } + //private BaseItem ResolveItem(ItemResolveEventArgs args) + //{ + // // Try first priority resolvers + // for (int i = 0; i < Kernel.Instance.EntityResolvers.Length; i++) + // { + // var item = Kernel.Instance.EntityResolvers[i].ResolvePath(args); + + // if (item != null) + // { + // return item; + // } + // } + + // return null; + //} /// /// Resolves a path into a BaseItem @@ -76,128 +42,104 @@ namespace MediaBrowser.Controller.Library Path = path }; - if (!OnPreBeginResolvePath(args)) - { - return null; - } - - WIN32_FIND_DATA[] fileSystemChildren; - // Gather child folder and files if (args.IsDirectory) { - fileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray(); + args.FileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray(); bool isVirtualFolder = parent != null && parent.IsRoot; - fileSystemChildren = FilterChildFileSystemEntries(fileSystemChildren, isVirtualFolder); + args = FileSystemHelper.FilterChildFileSystemEntries(args, isVirtualFolder); } else { - fileSystemChildren = new WIN32_FIND_DATA[] { }; + args.FileSystemChildren = new WIN32_FIND_DATA[] { }; } - args.FileSystemChildren = fileSystemChildren; // Fire BeginResolvePath to see if anyone wants to cancel this operation - if (!OnBeginResolvePath(args)) + if (!EntityResolutionHelper.ShouldResolvePathContents(args)) { return null; } - BaseItem item = ResolveItem(args); - - if (item != null) - { - await Kernel.Instance.ExecuteMetadataProviders(item, args, allowInternetProviders: allowInternetProviders).ConfigureAwait(false); - - if (item.IsFolder) - { - // If it's a folder look for child entities - (item as Folder).Children = (await Task.WhenAll(GetChildren(item as Folder, fileSystemChildren, allowInternetProviders)).ConfigureAwait(false)) - .Where(i => i != null).OrderBy(f => - { - return string.IsNullOrEmpty(f.SortName) ? f.Name : f.SortName; - - }); - } - } + BaseItem item = Kernel.Instance.ResolveItem(args); return item; } - /// - /// Finds child BaseItems for a given Folder - /// - private Task[] GetChildren(Folder folder, WIN32_FIND_DATA[] fileSystemChildren, bool allowInternetProviders) - { - Task[] tasks = new Task[fileSystemChildren.Length]; - - for (int i = 0; i < fileSystemChildren.Length; i++) - { - var child = fileSystemChildren[i]; - - tasks[i] = GetItem(child.Path, folder, child, allowInternetProviders: allowInternetProviders); - } - - return tasks; - } - - /// - /// Transforms shortcuts into their actual paths - /// - private WIN32_FIND_DATA[] FilterChildFileSystemEntries(WIN32_FIND_DATA[] fileSystemChildren, bool flattenShortcuts) - { - WIN32_FIND_DATA[] returnArray = new WIN32_FIND_DATA[fileSystemChildren.Length]; - List resolvedShortcuts = new List(); - - for (int i = 0; i < fileSystemChildren.Length; i++) - { - WIN32_FIND_DATA file = fileSystemChildren[i]; - - // If it's a shortcut, resolve it - if (Shortcut.IsShortcut(file.Path)) - { - string newPath = Shortcut.ResolveShortcut(file.Path); - WIN32_FIND_DATA newPathData = FileData.GetFileData(newPath); - - // Find out if the shortcut is pointing to a directory or file - if (newPathData.IsDirectory) - { - // If we're flattening then get the shortcut's children - - if (flattenShortcuts) - { - returnArray[i] = file; - WIN32_FIND_DATA[] newChildren = FileData.GetFileSystemEntries(newPath, "*").ToArray(); - - resolvedShortcuts.AddRange(FilterChildFileSystemEntries(newChildren, false)); - } - else - { - returnArray[i] = newPathData; - } - } - else - { - returnArray[i] = newPathData; - } - } - else - { - returnArray[i] = file; - } - } - - if (resolvedShortcuts.Count > 0) - { - resolvedShortcuts.InsertRange(0, returnArray); - return resolvedShortcuts.ToArray(); - } - else - { - return returnArray; - } - } + ///// + ///// Finds child BaseItems for a given Folder + ///// + //private Task[] GetChildren(Folder folder, WIN32_FIND_DATA[] fileSystemChildren, bool allowInternetProviders) + //{ + // Task[] tasks = new Task[fileSystemChildren.Length]; + + // for (int i = 0; i < fileSystemChildren.Length; i++) + // { + // var child = fileSystemChildren[i]; + + // tasks[i] = GetItem(child.Path, folder, child, allowInternetProviders: allowInternetProviders); + // } + + // return tasks; + //} + + ///// + ///// Transforms shortcuts into their actual paths + ///// + //private WIN32_FIND_DATA[] FilterChildFileSystemEntries(WIN32_FIND_DATA[] fileSystemChildren, bool flattenShortcuts) + //{ + // WIN32_FIND_DATA[] returnArray = new WIN32_FIND_DATA[fileSystemChildren.Length]; + // List resolvedShortcuts = new List(); + + // for (int i = 0; i < fileSystemChildren.Length; i++) + // { + // WIN32_FIND_DATA file = fileSystemChildren[i]; + + // // If it's a shortcut, resolve it + // if (Shortcut.IsShortcut(file.Path)) + // { + // string newPath = Shortcut.ResolveShortcut(file.Path); + // WIN32_FIND_DATA newPathData = FileData.GetFileData(newPath); + + // // Find out if the shortcut is pointing to a directory or file + // if (newPathData.IsDirectory) + // { + // // If we're flattening then get the shortcut's children + + // if (flattenShortcuts) + // { + // returnArray[i] = file; + // WIN32_FIND_DATA[] newChildren = FileData.GetFileSystemEntries(newPath, "*").ToArray(); + + // resolvedShortcuts.AddRange(FilterChildFileSystemEntries(newChildren, false)); + // } + // else + // { + // returnArray[i] = newPathData; + // } + // } + // else + // { + // returnArray[i] = newPathData; + // } + // } + // else + // { + // returnArray[i] = file; + // } + // } + + // if (resolvedShortcuts.Count > 0) + // { + // resolvedShortcuts.InsertRange(0, returnArray); + // return resolvedShortcuts.ToArray(); + // } + // else + // { + // return returnArray; + // } + //} /// /// Gets a Person @@ -261,7 +203,7 @@ namespace MediaBrowser.Controller.Library T item = new T(); item.Name = name; - item.Id = Kernel.GetMD5(path); + item.Id = path.GetMD5(); if (!Directory.Exists(path)) { -- cgit v1.2.3 From 946c0e8256d61d5084efdd2196eef455fa13b89b Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Mon, 17 Sep 2012 16:08:32 -0400 Subject: Initial metadata provider hook in. No refresh intelligence yet. --- MediaBrowser.Controller/Entities/BaseEntity.cs | 48 +++++++++++++++++++++++ MediaBrowser.Controller/Entities/BaseItem.cs | 42 -------------------- MediaBrowser.Controller/Kernel.cs | 9 ++--- MediaBrowser.Controller/Library/ItemController.cs | 2 +- 4 files changed, 53 insertions(+), 48 deletions(-) (limited to 'MediaBrowser.Controller/Library/ItemController.cs') diff --git a/MediaBrowser.Controller/Entities/BaseEntity.cs b/MediaBrowser.Controller/Entities/BaseEntity.cs index 53b42da01..7f0ea12b8 100644 --- a/MediaBrowser.Controller/Entities/BaseEntity.cs +++ b/MediaBrowser.Controller/Entities/BaseEntity.cs @@ -1,4 +1,8 @@ using System; +using System.Collections.Generic; +using System.Linq; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.IO; namespace MediaBrowser.Controller.Entities { @@ -11,6 +15,10 @@ namespace MediaBrowser.Controller.Entities public Guid Id { get; set; } + public string Path { get; set; } + + public Folder Parent { get; set; } + public string PrimaryImagePath { get; set; } public DateTime DateCreated { get; set; } @@ -21,5 +29,45 @@ namespace MediaBrowser.Controller.Entities { return Name; } + + protected ItemResolveEventArgs _resolveArgs; + /// + /// We attach these to the item so that we only ever have to hit the file system once + /// (this includes the children of the containing folder) + /// Use ResolveArgs.FileSystemChildren to check for the existence of files instead of File.Exists + /// + public ItemResolveEventArgs ResolveArgs + { + get + { + if (_resolveArgs == null) + { + _resolveArgs = new ItemResolveEventArgs() + { + FileInfo = FileData.GetFileData(this.Path), + Parent = this.Parent, + Cancel = false, + Path = this.Path + }; + _resolveArgs = FileSystemHelper.FilterChildFileSystemEntries(_resolveArgs, (this.Parent != null && this.Parent.IsRoot)); + } + return _resolveArgs; + } + set + { + _resolveArgs = value; + } + } + + /// + /// Refresh metadata on us by execution our provider chain + /// + /// true if a provider reports we changed + public bool RefreshMetadata() + { + Kernel.Instance.ExecuteMetadataProviders(this).ConfigureAwait(false); + return true; + } + } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index dc148da36..984584e9a 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -9,35 +9,6 @@ namespace MediaBrowser.Controller.Entities { public abstract class BaseItem : BaseEntity, IHasProviderIds { - protected ItemResolveEventArgs _resolveArgs; - /// - /// We attach these to the item so that we only ever have to hit the file system once - /// (this includes the children of the containing folder) - /// Use ResolveArgs.FileSystemChildren to check for the existence of files instead of File.Exists - /// - public ItemResolveEventArgs ResolveArgs - { - get - { - if (_resolveArgs == null) - { - _resolveArgs = new ItemResolveEventArgs() - { - FileInfo = FileData.GetFileData(this.Path), - Parent = this.Parent, - Cancel = false, - Path = this.Path - }; - _resolveArgs = FileSystemHelper.FilterChildFileSystemEntries(_resolveArgs, (this.Parent != null && this.Parent.IsRoot)); - } - return _resolveArgs; - } - set - { - _resolveArgs = value; - } - } - public string SortName { get; set; } /// @@ -45,10 +16,6 @@ namespace MediaBrowser.Controller.Entities /// public DateTime? PremiereDate { get; set; } - public string Path { get; set; } - - public Folder Parent { get; set; } - public string LogoImagePath { get; set; } public string ArtImagePath { get; set; } @@ -177,15 +144,6 @@ namespace MediaBrowser.Controller.Entities return changed; } - /// - /// Refresh metadata on us by execution our provider chain - /// - /// true if a provider reports we changed - public bool RefreshMetadata() - { - return false; - } - /// /// Determines if the item is considered new based on user settings /// diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index b8243d65f..cf4450aec 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -118,9 +118,6 @@ namespace MediaBrowser.Controller //watch the root folder children for changes RootFolder.ChildrenChanged += RootFolder_ChildrenChanged; - System.Threading.Thread.Sleep(25000); - var allChildren = RootFolder.RecursiveChildren; - Logger.LogInfo(string.Format("Loading complete. Movies: {0} Episodes: {1}", allChildren.OfType().Count(), allChildren.OfType().Count())); } protected override void OnComposablePartsLoaded() @@ -180,6 +177,8 @@ namespace MediaBrowser.Controller //re-start the directory watchers DirectoryWatchers.Stop(); DirectoryWatchers.Start(); + var allChildren = RootFolder.RecursiveChildren; + Logger.LogInfo(string.Format("Loading complete. Movies: {0} Episodes: {1}", allChildren.OfType().Count(), allChildren.OfType().Count())); } /// @@ -328,7 +327,7 @@ namespace MediaBrowser.Controller /// /// Runs all metadata providers for an entity /// - internal async Task ExecuteMetadataProviders(BaseEntity item, ItemResolveEventArgs args, bool allowInternetProviders = true) + internal async Task ExecuteMetadataProviders(BaseEntity item, bool allowInternetProviders = true) { // Run them sequentially in order of priority for (int i = 0; i < MetadataProviders.Length; i++) @@ -349,7 +348,7 @@ namespace MediaBrowser.Controller try { - await provider.FetchAsync(item, args).ConfigureAwait(false); + await provider.FetchAsync(item, item.ResolveArgs).ConfigureAwait(false); } catch (Exception ex) { diff --git a/MediaBrowser.Controller/Library/ItemController.cs b/MediaBrowser.Controller/Library/ItemController.cs index 7ef1c17a1..dd08c193e 100644 --- a/MediaBrowser.Controller/Library/ItemController.cs +++ b/MediaBrowser.Controller/Library/ItemController.cs @@ -217,7 +217,7 @@ namespace MediaBrowser.Controller.Library args.FileInfo = FileData.GetFileData(path); args.FileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray(); - await Kernel.Instance.ExecuteMetadataProviders(item, args).ConfigureAwait(false); + await Kernel.Instance.ExecuteMetadataProviders(item).ConfigureAwait(false); return item; } -- cgit v1.2.3