diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 6d619ce048..bc50ce6182 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 _linkedChildren; + /// /// Our children are actually just references to the ones in the physical root... /// /// The linked children. public override List LinkedChildren { - get + get { return _linkedChildren ?? (_linkedChildren = GetLinkedChildrenInternal()); } + set { - Dictionary 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(); - } - - return LibraryManager.RootFolder.Children - .OfType() - .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path)) - .SelectMany(c => c.LinkedChildren).ToList(); + base.LinkedChildren = value; + } + } + private List GetLinkedChildrenInternal() + { + Dictionary 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(); } + + return LibraryManager.RootFolder.Children + .OfType() + .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path)) + .SelectMany(c => c.LinkedChildren).ToList(); } + private IEnumerable _actualChildren; + /// /// Our children are actually just references to the ones in the physical root... /// /// The actual children. protected override IEnumerable ActualChildren { - get - { - Dictionary 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 GetActualChildren() + { + Dictionary locationsDicionary; - return - LibraryManager.RootFolder.Children - .OfType() - .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() + .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 27d6953d79..a5b7927265 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 /// The item. 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().ToList()) + { + folder.ResetDynamicChildren(); + } + } + /// /// Retrieves the item. ///