diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 180bac8bad..6543275a54 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -336,7 +336,7 @@ namespace MediaBrowser.Controller.Entities return _resolveArgs; } - set + private set { _resolveArgs = value; _resolveArgsInitialized = value != null; @@ -349,7 +349,17 @@ namespace MediaBrowser.Controller.Entities /// The path info. public void ResetResolveArgs(FileSystemInfo pathInfo) { - ResolveArgs = CreateResolveArgs(pathInfo); + ResetResolveArgs(CreateResolveArgs(pathInfo)); + } + + public void ResetResolveArgs() + { + ResolveArgs = null; + } + + public void ResetResolveArgs(ItemResolveArgs args) + { + ResolveArgs = args; } /// @@ -887,10 +897,10 @@ namespace MediaBrowser.Controller.Entities /// true if a provider reports we changed public virtual async Task RefreshMetadata(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true, bool resetResolveArgs = true) { - if (resetResolveArgs) + if (resetResolveArgs || ResolveArgs == null) { // Reload this - ResolveArgs = null; + ResetResolveArgs(); } // Refresh for the item diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 0f090f587b..8ef9d19c9f 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -107,31 +107,36 @@ namespace MediaBrowser.Controller.Entities protected void AddChildrenInternal(IEnumerable children) { - foreach (var child in children) + lock (ChildrenSyncLock) { - AddChildInternal(child); + var newChildren = _children.ToList(); + newChildren.AddRange(children); + _children = newChildren; } } protected void AddChildInternal(BaseItem child) { - _children.Add(child); + lock (ChildrenSyncLock) + { + var newChildren = _children.ToList(); + newChildren.Add(child); + _children = newChildren; + } } protected void RemoveChildrenInternal(IEnumerable children) { lock (ChildrenSyncLock) { - _children = new ConcurrentBag(_children.Except(children)); + _children = _children.Except(children).ToList(); } } protected void ClearChildrenInternal() { - BaseItem removed; - - while (_children.TryTake(out removed)) + lock (ChildrenSyncLock) { - + _children = new List(); } } @@ -508,11 +513,7 @@ namespace MediaBrowser.Controller.Entities /// /// The children /// - private ConcurrentBag _children; - /// - /// The _children initialized - /// - private bool _childrenInitialized; + private List _children; /// /// The _children sync lock /// @@ -525,11 +526,15 @@ namespace MediaBrowser.Controller.Entities { get { - LazyInitializer.EnsureInitialized(ref _children, ref _childrenInitialized, ref ChildrenSyncLock, LoadChildrenInternal); return _children; } } + public void LoadSavedChildren() + { + _children = LoadChildrenInternal(); + } + /// /// thread-safe access to the actual children of this folder - without regard to user /// @@ -566,16 +571,15 @@ namespace MediaBrowser.Controller.Entities } } - private ConcurrentBag LoadChildrenInternal() + private List LoadChildrenInternal() { - return new ConcurrentBag(LoadChildren()); + return LoadChildren().ToList(); } /// /// Loads our children. Validation will occur externally. /// We want this sychronous. /// - /// ConcurrentBag{BaseItem}. protected virtual IEnumerable LoadChildren() { //just load our children from the repo - the library will be validated and maintained in other processes @@ -698,7 +702,7 @@ namespace MediaBrowser.Controller.Entities if (currentChildren.TryGetValue(child.Id, out currentChild)) { - currentChild.ResolveArgs = child.ResolveArgs; + currentChild.ResetResolveArgs(child.ResolveArgs); //existing item - check if it has changed if (currentChild.HasChanged(child)) @@ -760,12 +764,7 @@ namespace MediaBrowser.Controller.Entities await LibraryManager.CreateItems(newItems, cancellationToken).ConfigureAwait(false); - foreach (var item in newItems) - { - _children.Add(item); - - Logger.Debug("** " + item.Name + " Added to library."); - } + AddChildrenInternal(newItems); await ItemRepository.SaveChildren(Id, _children.Select(i => i.Id).ToList(), cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 152767860d..13ac913f27 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -114,7 +114,7 @@ namespace MediaBrowser.Controller.Entities.Movies if (dbItem != null) { - dbItem.ResolveArgs = video.ResolveArgs; + dbItem.ResetResolveArgs(video.ResolveArgs); video = dbItem; } diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 79a813bb5e..82d81e5176 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -312,7 +312,7 @@ namespace MediaBrowser.Controller.Entities if (resetResolveArgs) { // Reload this - ResolveArgs = null; + ResetResolveArgs(); } var updateReason = await ProviderManager.ExecuteMetadataProviders(this, cancellationToken, forceRefresh, allowSlowProviders).ConfigureAwait(false); diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index ed07e3175c..0d1e221283 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -246,7 +246,7 @@ namespace MediaBrowser.Controller.Entities if (dbItem != null) { - dbItem.ResolveArgs = video.ResolveArgs; + dbItem.ResetResolveArgs(video.ResolveArgs); video = dbItem; } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 1bc3f10943..15eb182a37 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -1346,7 +1346,16 @@ namespace MediaBrowser.Server.Implementations.Library /// BaseItem. public BaseItem RetrieveItem(Guid id) { - return ItemRepository.RetrieveItem(id); + var item = ItemRepository.RetrieveItem(id); + + var folder = item as Folder; + + if (folder != null) + { + folder.LoadSavedChildren(); + } + + return item; } private readonly ConcurrentDictionary _fileLocks = new ConcurrentDictionary(); diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs index 8b98a69447..a6b13f8dd6 100644 --- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs +++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.Server.Implementations.Library /// The args. public static void SetInitialItemValues(BaseItem item, ItemResolveArgs args) { - item.ResolveArgs = args; + item.ResetResolveArgs(args); // If the resolver didn't specify this if (string.IsNullOrEmpty(item.Path)) diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs index 706206d3a5..ad4727023f 100644 --- a/MediaBrowser.ServerApplication/App.xaml.cs +++ b/MediaBrowser.ServerApplication/App.xaml.cs @@ -95,7 +95,7 @@ namespace MediaBrowser.ServerApplication EventHelper.FireEventIfNotNull(AppStarted, this, EventArgs.Empty, _logger); - await task.ConfigureAwait(false); + await task; } catch (Exception ex) {