aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorTechywarrior <techywarrior@gmail.com>2013-05-02 21:39:34 -0700
committerTechywarrior <techywarrior@gmail.com>2013-05-02 21:39:34 -0700
commit8095f7200b1bd79bc30572a3ebde03f34a6b9e01 (patch)
tree42d664de774dc7744fc133be3f3a646e3db056eb /MediaBrowser.Controller
parentf58c26afaa94b812c06004145999336bb77e4629 (diff)
parent9fdf5d1c4b488fe53e557870cacdf02b1b7fd4a2 (diff)
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs34
-rw-r--r--MediaBrowser.Controller/Entities/IndexFolder.cs16
-rw-r--r--MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs137
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs49
-rw-r--r--MediaBrowser.Controller/Library/ItemChangeEventArgs.cs16
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj2
-rw-r--r--MediaBrowser.Controller/MediaInfo/FFMpegManager.cs49
-rw-r--r--MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs10
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)