diff options
| author | Techywarrior <techywarrior@gmail.com> | 2013-05-02 21:39:34 -0700 |
|---|---|---|
| committer | Techywarrior <techywarrior@gmail.com> | 2013-05-02 21:39:34 -0700 |
| commit | 8095f7200b1bd79bc30572a3ebde03f34a6b9e01 (patch) | |
| tree | 42d664de774dc7744fc133be3f3a646e3db056eb /MediaBrowser.Controller | |
| parent | f58c26afaa94b812c06004145999336bb77e4629 (diff) | |
| parent | 9fdf5d1c4b488fe53e557870cacdf02b1b7fd4a2 (diff) | |
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 34 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/IndexFolder.cs | 16 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs | 137 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ILibraryManager.cs | 49 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ItemChangeEventArgs.cs | 16 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaBrowser.Controller.csproj | 2 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaInfo/FFMpegManager.cs | 49 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs | 10 |
9 files changed, 98 insertions, 217 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 10fd3e79e..48bfd8075 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -968,7 +968,7 @@ namespace MediaBrowser.Controller.Entities { cancellationToken.ThrowIfCancellationRequested(); - await LibraryManager.SaveItem(this, cancellationToken).ConfigureAwait(false); + await LibraryManager.UpdateItem(this, cancellationToken).ConfigureAwait(false); } return changed; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index a22daab22..bd2fa742e 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -557,8 +557,6 @@ namespace MediaBrowser.Controller.Entities cancellationToken.ThrowIfCancellationRequested(); - var changedArgs = new ChildrenChangedEventArgs(this); - //get the current valid children from filesystem (or wherever) var nonCachedChildren = GetNonCachedChildren(); @@ -571,6 +569,7 @@ namespace MediaBrowser.Controller.Entities //create a list for our validated children var validChildren = new ConcurrentBag<Tuple<BaseItem, bool>>(); + var newItems = new ConcurrentBag<BaseItem>(); cancellationToken.ThrowIfCancellationRequested(); @@ -592,7 +591,6 @@ namespace MediaBrowser.Controller.Entities { EntityResolutionHelper.EnsureDates(currentChild, child.ResolveArgs); - changedArgs.AddUpdatedItem(currentChild); validChildren.Add(new Tuple<BaseItem, bool>(currentChild, true)); } else @@ -603,36 +601,36 @@ namespace MediaBrowser.Controller.Entities else { //brand new item - needs to be added - changedArgs.AddNewItem(child); + newItems.Add(child); validChildren.Add(new Tuple<BaseItem, bool>(child, true)); } }); // If any items were added or removed.... - if (!changedArgs.ItemsAdded.IsEmpty || currentChildren.Count != validChildren.Count) + if (!newItems.IsEmpty || currentChildren.Count != validChildren.Count) { var newChildren = validChildren.Select(c => c.Item1).ToList(); //that's all the new and changed ones - now see if there are any that are missing - changedArgs.ItemsRemoved = currentChildren.Values.Except(newChildren).ToList(); - - foreach (var item in changedArgs.ItemsRemoved) - { - Logger.Debug("** " + item.Name + " Removed from library."); - } + var itemsRemoved = currentChildren.Values.Except(newChildren).ToList(); var childrenReplaced = false; - if (changedArgs.ItemsRemoved.Count > 0) + if (itemsRemoved.Count > 0) { ActualChildren = new ConcurrentBag<BaseItem>(newChildren); childrenReplaced = true; + + foreach (var item in itemsRemoved) + { + LibraryManager.ReportItemRemoved(item); + } } var saveTasks = new List<Task>(); - foreach (var item in changedArgs.ItemsAdded) + foreach (var item in newItems) { Logger.Debug("** " + item.Name + " Added to library."); @@ -647,23 +645,15 @@ namespace MediaBrowser.Controller.Entities saveTasks.Clear(); } - saveTasks.Add(LibraryManager.SaveItem(item, CancellationToken.None)); + saveTasks.Add(LibraryManager.CreateItem(item, CancellationToken.None)); } await Task.WhenAll(saveTasks).ConfigureAwait(false); - //and save children in repo... - Logger.Debug("*** Saving " + newChildren.Count + " children for " + Name); await LibraryManager.SaveChildren(Id, newChildren, CancellationToken.None).ConfigureAwait(false); - } - if (changedArgs.HasChange) - { //force the indexes to rebuild next time IndexCache.Clear(); - - //and fire event - LibraryManager.ReportLibraryChanged(changedArgs); } progress.Report(10); diff --git a/MediaBrowser.Controller/Entities/IndexFolder.cs b/MediaBrowser.Controller/Entities/IndexFolder.cs index 13fcba489..bbfb01fc6 100644 --- a/MediaBrowser.Controller/Entities/IndexFolder.cs +++ b/MediaBrowser.Controller/Entities/IndexFolder.cs @@ -1,11 +1,11 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Model.Entities; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Entities { @@ -196,18 +196,10 @@ namespace MediaBrowser.Controller.Entities /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param> /// <param name="resetResolveArgs">if set to <c>true</c> [reset resolve args].</param> /// <returns>Task{System.Boolean}.</returns> - public override async Task<bool> RefreshMetadata(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true, bool resetResolveArgs = true) + public override Task<bool> RefreshMetadata(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true, bool resetResolveArgs = true) { - if (ShadowItem != null) - { - var changed = await ShadowItem.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders, resetResolveArgs).ConfigureAwait(false); - - cancellationToken.ThrowIfCancellationRequested(); - - SetShadowValues(); - return changed; - } - return false; + // We should never get in here since these are not part of the library + return Task.FromResult(false); } } } diff --git a/MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs b/MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs deleted file mode 100644 index 94f4c540f..000000000 --- a/MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System.Collections.Concurrent; -using MediaBrowser.Controller.Entities; -using System; -using System.Collections.Generic; - -namespace MediaBrowser.Controller.Library -{ - /// <summary> - /// Class ChildrenChangedEventArgs - /// </summary> - public class ChildrenChangedEventArgs : EventArgs - { - /// <summary> - /// Gets or sets the folder. - /// </summary> - /// <value>The folder.</value> - public Folder Folder { get; set; } - /// <summary> - /// Gets or sets the items added. - /// </summary> - /// <value>The items added.</value> - public ConcurrentBag<BaseItem> ItemsAdded { get; set; } - /// <summary> - /// Gets or sets the items removed. - /// </summary> - /// <value>The items removed.</value> - public List<BaseItem> ItemsRemoved { get; set; } - /// <summary> - /// Gets or sets the items updated. - /// </summary> - /// <value>The items updated.</value> - public ConcurrentBag<BaseItem> ItemsUpdated { get; set; } - - /// <summary> - /// Create the args and set the folder property - /// </summary> - /// <param name="folder">The folder.</param> - /// <exception cref="System.ArgumentNullException"></exception> - public ChildrenChangedEventArgs(Folder folder) - { - if (folder == null) - { - throw new ArgumentNullException(); - } - - //init the folder property - Folder = folder; - //init the list - ItemsAdded = new ConcurrentBag<BaseItem>(); - ItemsRemoved = new List<BaseItem>(); - ItemsUpdated = new ConcurrentBag<BaseItem>(); - } - - /// <summary> - /// Adds the new item. - /// </summary> - /// <param name="item">The item.</param> - /// <exception cref="System.ArgumentNullException"></exception> - public void AddNewItem(BaseItem item) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - ItemsAdded.Add(item); - } - - /// <summary> - /// Adds the updated item. - /// </summary> - /// <param name="item">The item.</param> - /// <exception cref="System.ArgumentNullException"></exception> - public void AddUpdatedItem(BaseItem item) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - ItemsUpdated.Add(item); - } - - /// <summary> - /// Adds the removed item. - /// </summary> - /// <param name="item">The item.</param> - /// <exception cref="System.ArgumentNullException"></exception> - public void AddRemovedItem(BaseItem item) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - ItemsRemoved.Add(item); - } - - /// <summary> - /// Lists the has change. - /// </summary> - /// <param name="list">The list.</param> - /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - private bool ListHasChange(List<BaseItem> list) - { - return list != null && list.Count > 0; - } - - /// <summary> - /// Lists the has change. - /// </summary> - /// <param name="list">The list.</param> - /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - private bool ListHasChange(ConcurrentBag<BaseItem> list) - { - return list != null && !list.IsEmpty; - } - - /// <summary> - /// Gets a value indicating whether this instance has change. - /// </summary> - /// <value><c>true</c> if this instance has change; otherwise, <c>false</c>.</value> - public bool HasChange - { - get { return HasAddOrRemoveChange || ListHasChange(ItemsUpdated); } - } - - /// <summary> - /// Gets a value indicating whether this instance has add or remove change. - /// </summary> - /// <value><c>true</c> if this instance has add or remove change; otherwise, <c>false</c>.</value> - public bool HasAddOrRemoveChange - { - get { return ListHasChange(ItemsAdded) || ListHasChange(ItemsRemoved); } - } - } -} diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index a456ee24c..89d17758e 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -1,12 +1,11 @@ -using System.IO; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Sorting; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; +using System.IO; using System.Threading; using System.Threading.Tasks; @@ -15,18 +14,6 @@ namespace MediaBrowser.Controller.Library public interface ILibraryManager { /// <summary> - /// Fires whenever any validation routine adds or removes items. The added and removed items are properties of the args. - /// *** Will fire asynchronously. *** - /// </summary> - event EventHandler<ChildrenChangedEventArgs> LibraryChanged; - - /// <summary> - /// Reports the library changed. - /// </summary> - /// <param name="args">The <see cref="ChildrenChangedEventArgs"/> instance containing the event data.</param> - void ReportLibraryChanged(ChildrenChangedEventArgs args); - - /// <summary> /// Resolves the item. /// </summary> /// <param name="args">The args.</param> @@ -185,14 +172,22 @@ namespace MediaBrowser.Controller.Library UserRootFolder GetUserRootFolder(string userRootPath); /// <summary> - /// Saves the item. + /// Creates the item. /// </summary> /// <param name="item">The item.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - Task SaveItem(BaseItem item, CancellationToken cancellationToken); + Task CreateItem(BaseItem item, CancellationToken cancellationToken); /// <summary> + /// Updates the item. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task UpdateItem(BaseItem item, CancellationToken cancellationToken); + + /// <summary> /// Retrieves the item. /// </summary> /// <param name="id">The id.</param> @@ -222,5 +217,25 @@ namespace MediaBrowser.Controller.Library /// <param name="progress">The progress.</param> /// <returns>Task.</returns> Task ValidateArtists(CancellationToken cancellationToken, IProgress<double> progress); + + /// <summary> + /// Occurs when [item added]. + /// </summary> + event EventHandler<ItemChangeEventArgs> ItemAdded; + + /// <summary> + /// Occurs when [item updated]. + /// </summary> + event EventHandler<ItemChangeEventArgs> ItemUpdated; + /// <summary> + /// Occurs when [item removed]. + /// </summary> + event EventHandler<ItemChangeEventArgs> ItemRemoved; + + /// <summary> + /// Reports the item removed. + /// </summary> + /// <param name="item">The item.</param> + void ReportItemRemoved(BaseItem item); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs b/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs new file mode 100644 index 000000000..c83ec54b7 --- /dev/null +++ b/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs @@ -0,0 +1,16 @@ +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Library +{ + /// <summary> + /// Class ItemChangeEventArgs + /// </summary> + public class ItemChangeEventArgs + { + /// <summary> + /// Gets or sets the item. + /// </summary> + /// <value>The item.</value> + public BaseItem Item { get; set; } + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 5c894c8b3..afed9fa0b 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -92,6 +92,7 @@ <Compile Include="Entities\Person.cs" /> <Compile Include="Library\IDisplayPreferencesManager.cs" /> <Compile Include="Library\ILibrarySearchEngine.cs" /> + <Compile Include="Library\ItemChangeEventArgs.cs" /> <Compile Include="Library\PlaybackProgressEventArgs.cs" /> <Compile Include="Entities\Studio.cs" /> <Compile Include="Entities\Trailer.cs" /> @@ -110,7 +111,6 @@ <Compile Include="IO\NativeMethods.cs" /> <Compile Include="IServerApplicationHost.cs" /> <Compile Include="IServerApplicationPaths.cs" /> - <Compile Include="Library\ChildrenChangedEventArgs.cs" /> <Compile Include="Dto\DtoBuilder.cs" /> <Compile Include="Library\SearchHintInfo.cs" /> <Compile Include="Providers\IProviderManager.cs" /> diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index b98b0213e..aee33ad2e 100644 --- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs +++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs @@ -1,16 +1,17 @@ -using System.Collections.Generic; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers.MediaInfo; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using MoreLinq; using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Logging; namespace MediaBrowser.Controller.MediaInfo { @@ -71,35 +72,35 @@ namespace MediaBrowser.Controller.MediaInfo VideoImageCache = new FileSystemRepository(VideoImagesDataPath); SubtitleCache = new FileSystemRepository(SubtitleCachePath); - libraryManager.LibraryChanged += libraryManager_LibraryChanged; + libraryManager.ItemAdded += libraryManager_ItemAdded; + libraryManager.ItemUpdated += libraryManager_ItemAdded; } /// <summary> - /// Handles the LibraryChanged event of the libraryManager control. + /// Handles the ItemAdded event of the libraryManager control. /// </summary> /// <param name="sender">The source of the event.</param> - /// <param name="e">The <see cref="ChildrenChangedEventArgs"/> instance containing the event data.</param> - void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) + /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param> + void libraryManager_ItemAdded(object sender, ItemChangeEventArgs e) { - var videos = e.ItemsAdded.OfType<Video>().ToList(); + var video = e.Item as Video; - videos.AddRange(e.ItemsUpdated.OfType<Video>()); + if (video == null) + { + return; + } - // Use a timer to prevent lots of these notifications from showing in a short period of time - if (videos.Count > 0) + lock (_newlyAddedItems) { - lock (_newlyAddedItems) - { - _newlyAddedItems.AddRange(videos); + _newlyAddedItems.Add(video); - if (NewItemTimer == null) - { - NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite); - } - else - { - NewItemTimer.Change(NewItemDelay, Timeout.Infinite); - } + if (NewItemTimer == null) + { + NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite); + } + else + { + NewItemTimer.Change(NewItemDelay, Timeout.Infinite); } } } @@ -193,7 +194,7 @@ namespace MediaBrowser.Controller.MediaInfo // Lock the list and release all resources lock (_newlyAddedItems) { - newItems = _newlyAddedItems.ToList(); + newItems = _newlyAddedItems.DistinctBy(i => i.Id).ToList(); _newlyAddedItems.Clear(); NewItemTimer.Dispose(); @@ -297,7 +298,7 @@ namespace MediaBrowser.Controller.MediaInfo if (saveItem && changesMade) { - await _libraryManager.SaveItem(video, CancellationToken.None).ConfigureAwait(false); + await _libraryManager.UpdateItem(video, CancellationToken.None).ConfigureAwait(false); } } diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs index c5041e54b..6f096c668 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs @@ -438,9 +438,10 @@ namespace MediaBrowser.Controller.Providers.Movies var boxset = item as BoxSet; if (boxset != null) { - if (!boxset.Children.IsEmpty) + var firstChild = boxset.Children.FirstOrDefault(); + + if (firstChild != null) { - var firstChild = boxset.Children.First(); Logger.Debug("MovieDbProvider - Attempting to find boxset ID from: " + firstChild.Name); string childName; int? childYear; @@ -953,7 +954,10 @@ namespace MediaBrowser.Controller.Providers.Movies { var boxset = movie as BoxSet; Logger.Info("MovieDbProvider - Using rating of first child of boxset..."); - boxset.OfficialRating = !boxset.Children.IsEmpty ? boxset.Children.First().OfficialRating : null; + + var firstChild = boxset.Children.FirstOrDefault(); + + boxset.OfficialRating = firstChild != null ? firstChild.OfficialRating : null; } if (movie.RunTimeTicks == null && movieData.runtime > 0) |
