diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index 78362ff816..4a1e5df021 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -108,9 +108,7 @@ namespace MediaBrowser.Api.Playback.Progressive format = " -f mp4 -movflags frag_keyframe+empty_moov"; } - var threads = 0; - - return string.Format("{0} {1} {2} -i {3}{4}{5} {6} {7} -threads {8} {9}{10} \"{11}\"", + return string.Format("{0} {1} {2} -i {3}{4}{5} {6} {7} -threads 0 {8}{9} \"{10}\"", probeSize, GetUserAgentParam(state.Item), GetFastSeekCommandLineParameter(state.Request), @@ -119,7 +117,6 @@ namespace MediaBrowser.Api.Playback.Progressive keyFrame, GetMapArgs(state), GetVideoArguments(state, videoCodec, performSubtitleConversions), - threads, GetAudioArguments(state), format, outputPath diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 10fd3e79e6..48bfd8075c 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 a22daab227..32fca66ca2 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -436,7 +436,7 @@ namespace MediaBrowser.Controller.Entities /// /// The children. [IgnoreDataMember] - public ConcurrentBag Children + public IEnumerable Children { get { @@ -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>(); + var newItems = new ConcurrentBag(); cancellationToken.ThrowIfCancellationRequested(); @@ -592,7 +591,6 @@ namespace MediaBrowser.Controller.Entities { EntityResolutionHelper.EnsureDates(currentChild, child.ResolveArgs); - changedArgs.AddUpdatedItem(currentChild); validChildren.Add(new Tuple(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(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(newChildren); childrenReplaced = true; + + foreach (var item in itemsRemoved) + { + LibraryManager.ReportItemRemoved(item); + } } var saveTasks = new List(); - 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 13fcba4896..bbfb01fc65 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 /// if set to true [allow slow providers]. /// if set to true [reset resolve args]. /// Task{System.Boolean}. - public override async Task RefreshMetadata(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true, bool resetResolveArgs = true) + public override Task 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 94f4c540ff..0000000000 --- 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 -{ - /// - /// Class ChildrenChangedEventArgs - /// - public class ChildrenChangedEventArgs : EventArgs - { - /// - /// Gets or sets the folder. - /// - /// The folder. - public Folder Folder { get; set; } - /// - /// Gets or sets the items added. - /// - /// The items added. - public ConcurrentBag ItemsAdded { get; set; } - /// - /// Gets or sets the items removed. - /// - /// The items removed. - public List ItemsRemoved { get; set; } - /// - /// Gets or sets the items updated. - /// - /// The items updated. - public ConcurrentBag ItemsUpdated { get; set; } - - /// - /// Create the args and set the folder property - /// - /// The folder. - /// - public ChildrenChangedEventArgs(Folder folder) - { - if (folder == null) - { - throw new ArgumentNullException(); - } - - //init the folder property - Folder = folder; - //init the list - ItemsAdded = new ConcurrentBag(); - ItemsRemoved = new List(); - ItemsUpdated = new ConcurrentBag(); - } - - /// - /// Adds the new item. - /// - /// The item. - /// - public void AddNewItem(BaseItem item) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - ItemsAdded.Add(item); - } - - /// - /// Adds the updated item. - /// - /// The item. - /// - public void AddUpdatedItem(BaseItem item) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - ItemsUpdated.Add(item); - } - - /// - /// Adds the removed item. - /// - /// The item. - /// - public void AddRemovedItem(BaseItem item) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - ItemsRemoved.Add(item); - } - - /// - /// Lists the has change. - /// - /// The list. - /// true if XXXX, false otherwise - private bool ListHasChange(List list) - { - return list != null && list.Count > 0; - } - - /// - /// Lists the has change. - /// - /// The list. - /// true if XXXX, false otherwise - private bool ListHasChange(ConcurrentBag list) - { - return list != null && !list.IsEmpty; - } - - /// - /// Gets a value indicating whether this instance has change. - /// - /// true if this instance has change; otherwise, false. - public bool HasChange - { - get { return HasAddOrRemoveChange || ListHasChange(ItemsUpdated); } - } - - /// - /// Gets a value indicating whether this instance has add or remove change. - /// - /// true if this instance has add or remove change; otherwise, false. - public bool HasAddOrRemoveChange - { - get { return ListHasChange(ItemsAdded) || ListHasChange(ItemsRemoved); } - } - } -} diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index a456ee24c4..89d17758e9 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; @@ -14,18 +13,6 @@ namespace MediaBrowser.Controller.Library { public interface ILibraryManager { - /// - /// Fires whenever any validation routine adds or removes items. The added and removed items are properties of the args. - /// *** Will fire asynchronously. *** - /// - event EventHandler LibraryChanged; - - /// - /// Reports the library changed. - /// - /// The instance containing the event data. - void ReportLibraryChanged(ChildrenChangedEventArgs args); - /// /// Resolves the item. /// @@ -185,13 +172,21 @@ namespace MediaBrowser.Controller.Library UserRootFolder GetUserRootFolder(string userRootPath); /// - /// Saves the item. + /// Creates the item. /// /// The item. /// The cancellation token. /// Task. - Task SaveItem(BaseItem item, CancellationToken cancellationToken); + Task CreateItem(BaseItem item, CancellationToken cancellationToken); + /// + /// Updates the item. + /// + /// The item. + /// The cancellation token. + /// Task. + Task UpdateItem(BaseItem item, CancellationToken cancellationToken); + /// /// Retrieves the item. /// @@ -222,5 +217,25 @@ namespace MediaBrowser.Controller.Library /// The progress. /// Task. Task ValidateArtists(CancellationToken cancellationToken, IProgress progress); + + /// + /// Occurs when [item added]. + /// + event EventHandler ItemAdded; + + /// + /// Occurs when [item updated]. + /// + event EventHandler ItemUpdated; + /// + /// Occurs when [item removed]. + /// + event EventHandler ItemRemoved; + + /// + /// Reports the item removed. + /// + /// The item. + 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 0000000000..c83ec54b76 --- /dev/null +++ b/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs @@ -0,0 +1,16 @@ +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Library +{ + /// + /// Class ItemChangeEventArgs + /// + public class ItemChangeEventArgs + { + /// + /// Gets or sets the item. + /// + /// The item. + public BaseItem Item { get; set; } + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 5c894c8b3b..afed9fa0b7 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -92,6 +92,7 @@ + @@ -110,7 +111,6 @@ - diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index b98b0213e7..aee33ad2eb 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; } /// - /// Handles the LibraryChanged event of the libraryManager control. + /// Handles the ItemAdded event of the libraryManager control. /// /// The source of the event. - /// The instance containing the event data. - void libraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) + /// The instance containing the event data. + void libraryManager_ItemAdded(object sender, ItemChangeEventArgs e) { - var videos = e.ItemsAdded.OfType