diff options
| -rw-r--r-- | MediaBrowser.Controller/Entities/CollectionFolder.cs | 85 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/Library/LibraryManager.cs | 12 |
2 files changed, 60 insertions, 37 deletions
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 6d619ce04..bc50ce618 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -69,64 +68,76 @@ namespace MediaBrowser.Controller.Entities return NullTaskResult; } + private List<LinkedChild> _linkedChildren; + /// <summary> /// Our children are actually just references to the ones in the physical root... /// </summary> /// <value>The linked children.</value> public override List<LinkedChild> LinkedChildren { - get + get { return _linkedChildren ?? (_linkedChildren = GetLinkedChildrenInternal()); } + set { - Dictionary<string, string> locationsDicionary; - - try - { - locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - } - catch (IOException ex) - { - Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path); - return new List<LinkedChild>(); - } - - return LibraryManager.RootFolder.Children - .OfType<Folder>() - .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path)) - .SelectMany(c => c.LinkedChildren).ToList(); + base.LinkedChildren = value; + } + } + private List<LinkedChild> GetLinkedChildrenInternal() + { + Dictionary<string, string> locationsDicionary; + try + { + locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); } - set + catch (IOException ex) { - base.LinkedChildren = value; + Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path); + return new List<LinkedChild>(); } + + return LibraryManager.RootFolder.Children + .OfType<Folder>() + .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path)) + .SelectMany(c => c.LinkedChildren).ToList(); } + private IEnumerable<BaseItem> _actualChildren; + /// <summary> /// Our children are actually just references to the ones in the physical root... /// </summary> /// <value>The actual children.</value> protected override IEnumerable<BaseItem> ActualChildren { - get - { - Dictionary<string, string> locationsDicionary; + get { return _actualChildren ?? (_actualChildren = GetActualChildren()); } + } - try - { - locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - } - catch (IOException ex) - { - Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path); - return new BaseItem[] { }; - } + private IEnumerable<BaseItem> GetActualChildren() + { + Dictionary<string, string> locationsDicionary; - return - LibraryManager.RootFolder.Children - .OfType<Folder>() - .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path)) - .SelectMany(c => c.Children); + try + { + locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); } + catch (IOException ex) + { + Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path); + return new BaseItem[] { }; + } + + return + LibraryManager.RootFolder.Children + .OfType<Folder>() + .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path)) + .SelectMany(c => c.Children); + } + + public void ResetDynamicChildren() + { + _actualChildren = null; + _linkedChildren = null; } } } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 27d6953d7..a5b792726 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -1283,6 +1283,8 @@ namespace MediaBrowser.Server.Implementations.Library UpdateItemInLibraryCache(item); } + UpdateCollectionFolders(); + if (ItemAdded != null) { foreach (var item in list) @@ -1336,6 +1338,8 @@ namespace MediaBrowser.Server.Implementations.Library /// <param name="item">The item.</param> public void ReportItemRemoved(BaseItem item) { + UpdateCollectionFolders(); + if (ItemRemoved != null) { try @@ -1349,6 +1353,14 @@ namespace MediaBrowser.Server.Implementations.Library } } + private void UpdateCollectionFolders() + { + foreach (var folder in _userManager.Users.SelectMany(i => i.RootFolder.Children).OfType<CollectionFolder>().ToList()) + { + folder.ResetDynamicChildren(); + } + } + /// <summary> /// Retrieves the item. /// </summary> |
