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/Kernel.cs | 66 ++++++++++++++------------------------- 1 file changed, 23 insertions(+), 43 deletions(-) (limited to 'MediaBrowser.Controller/Kernel.cs') diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 47a3773b3..13010ad8e 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -10,6 +10,7 @@ using MediaBrowser.Controller.Weather; using MediaBrowser.Model.Authentication; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Progress; +using MediaBrowser.Common.Extensions; using System; using System.Collections.Generic; using System.ComponentModel.Composition; @@ -83,8 +84,6 @@ namespace MediaBrowser.Controller DirectoryWatchers = new DirectoryWatchers(); WeatherClient = new WeatherClient(); - ItemController.PreBeginResolvePath += ItemController_PreBeginResolvePath; - ItemController.BeginResolvePath += ItemController_BeginResolvePath; } public async override Task Init(IProgress progress) @@ -100,6 +99,13 @@ namespace MediaBrowser.Controller await ReloadRoot(allowInternetProviders: false).ConfigureAwait(false); progress.Report(new TaskProgress() { Description = "Loading Complete", PercentComplete = 100 }); + + //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() @@ -114,46 +120,20 @@ namespace MediaBrowser.Controller MetadataProviders = MetadataProvidersEnumerable.OrderBy(e => e.Priority).ToArray(); } - /// - /// Fires when a path is about to be resolved, but before child folders and files - /// have been collected from the file system. - /// This gives us a chance to cancel it if needed, resulting in the path being ignored - /// - void ItemController_PreBeginResolvePath(object sender, PreBeginResolveEventArgs e) + public BaseItem ResolveItem(ItemResolveEventArgs args) { - // Ignore hidden files and folders - if (e.IsHidden || e.IsSystemFile) - { - e.Cancel = true; - } - - // Ignore any folders named "trailers" - else if (Path.GetFileName(e.Path).Equals("trailers", StringComparison.OrdinalIgnoreCase)) + // Try first priority resolvers + for (int i = 0; i < EntityResolvers.Length; i++) { - e.Cancel = true; - } + var item = EntityResolvers[i].ResolvePath(args); - // Don't try and resolve files within the season metadata folder - else if (Path.GetFileName(e.Path).Equals("metadata", StringComparison.OrdinalIgnoreCase) && e.IsDirectory) - { - if (e.Parent is Season || e.Parent is Series) + if (item != null) { - e.Cancel = true; + return item; } } - } - /// - /// Fires when a path is about to be resolved, but after child folders and files - /// This gives us a chance to cancel it if needed, resulting in the path being ignored - /// - void ItemController_BeginResolvePath(object sender, ItemResolveEventArgs e) - { - if (e.ContainsFile(".ignore")) - { - // Ignore any folders containing a file called .ignore - e.Cancel = true; - } + return null; } private void ReloadUsers() @@ -178,12 +158,11 @@ namespace MediaBrowser.Controller DirectoryWatchers.Start(); } - public static Guid GetMD5(string str) + void RootFolder_ChildrenChanged(object sender, ChildrenChangedEventArgs e) { - using (var provider = new MD5CryptoServiceProvider()) - { - return new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(str))); - } + //re-start the directory watchers + DirectoryWatchers.Stop(); + DirectoryWatchers.Start(); } /// @@ -222,7 +201,8 @@ namespace MediaBrowser.Controller } else { - result.Success = GetMD5((password ?? string.Empty)).ToString().Equals(user.Password); + password = password ?? string.Empty; + result.Success = password.GetMD5().ToString().Equals(user.Password); } // Update LastActivityDate and LastLoginDate, then save @@ -261,7 +241,7 @@ namespace MediaBrowser.Controller children.Insert(index, newItem); - item.Parent.Children = children.ToArray(); + //item.Parent.ActualChildren = children.ToArray(); } } @@ -297,7 +277,7 @@ namespace MediaBrowser.Controller user.Id = Guid.NewGuid(); user.LastLoginDate = DateTime.UtcNow.AddDays(-1); user.LastActivityDate = DateTime.UtcNow.AddHours(-3); - user.Password = GetMD5("1234").ToString(); + user.Password = ("1234").GetMD5().ToString(); list.Add(user); user = new User(); -- cgit v1.2.3 From 7cfa489c6ea7887982d4cb7643e23631448421e5 Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Mon, 17 Sep 2012 12:55:58 -0400 Subject: Attach ItemResolveEventArgs to BaseItem so providers can access them at any time --- MediaBrowser.Controller/Entities/BaseItem.cs | 8 ++++++++ MediaBrowser.Controller/Entities/Folder.cs | 4 ++++ MediaBrowser.Controller/Kernel.cs | 2 ++ 3 files changed, 14 insertions(+) (limited to 'MediaBrowser.Controller/Kernel.cs') diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index d135acf9c..17f32c0e6 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1,4 +1,5 @@ using MediaBrowser.Model.Entities; +using MediaBrowser.Controller.Library; using System; using System.Collections.Generic; using System.Linq; @@ -7,6 +8,13 @@ namespace MediaBrowser.Controller.Entities { public abstract class BaseItem : BaseEntity, IHasProviderIds { + /// + /// 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; set; } + public string SortName { get; set; } /// diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 0858500f0..1e099e14d 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -171,6 +171,10 @@ namespace MediaBrowser.Controller.Entities if (currentChild.IsChanged(child)) { changed = true; + //update resolve args and refresh meta + // Note - we are refreshing the existing child instead of the newly found one so the "Except" operation below + // will identify this item as the same one + currentChild.ResolveArgs = child.ResolveArgs; currentChild.RefreshMetadata(); //save it in repo... validChildren.Add(currentChild); diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 13010ad8e..e7b8435bb 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -129,6 +129,7 @@ namespace MediaBrowser.Controller if (item != null) { + item.ResolveArgs = args; return item; } } @@ -160,6 +161,7 @@ namespace MediaBrowser.Controller void RootFolder_ChildrenChanged(object sender, ChildrenChangedEventArgs e) { + Logger.LogDebugInfo("Root Folder Children Changed. Added: " + e.ItemsAdded.Count + " Removed: " + e.ItemsRemoved.Count()); //re-start the directory watchers DirectoryWatchers.Stop(); DirectoryWatchers.Start(); -- cgit v1.2.3 From 7186d661095ae935be3c74960d72a66548e41888 Mon Sep 17 00:00:00 2001 From: ebr11 Eric Reed spam Date: Mon, 17 Sep 2012 13:29:06 -0400 Subject: Add OnLibraryChanged event to server Kernel --- MediaBrowser.Controller/Entities/Folder.cs | 6 +++++- MediaBrowser.Controller/Kernel.cs | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) (limited to 'MediaBrowser.Controller/Kernel.cs') diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 1e099e14d..694ec1ca2 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -22,7 +22,11 @@ namespace MediaBrowser.Controller.Entities { if (ChildrenChanged != null) { - Task.Run( () => ChildrenChanged(this, args)); + Task.Run( () => + { + ChildrenChanged(this, args); + Kernel.Instance.OnLibraryChanged(args); + }); } } diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index e7b8435bb..b8243d65f 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -25,6 +25,21 @@ namespace MediaBrowser.Controller { public class Kernel : BaseKernel { + #region Events + /// + /// Fires whenever any validation routine adds or removes items. The added and removed items are properties of the args. + /// *** Will fire asynchronously. *** + /// + public event EventHandler LibraryChanged; + public void OnLibraryChanged(ChildrenChangedEventArgs args) + { + if (LibraryChanged != null) + { + Task.Run(() => LibraryChanged(this, args)); + } + } + + #endregion public static Kernel Instance { get; private set; } public ItemController ItemController { get; private set; } -- 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/Kernel.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