aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Collections
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-03-07 10:53:23 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-03-07 10:53:23 -0500
commite00985d07ca3923f7f558b8592c0d092842bff5d (patch)
treed95f5cc3dbf068fc9416441de9f925ac39ee7f5d /MediaBrowser.Server.Implementations/Collections
parentc85f2957d9b68bf99dbd23efb2b8421845efd157 (diff)
#715 - Support creating/editing collections (boxsets) in web client
Diffstat (limited to 'MediaBrowser.Server.Implementations/Collections')
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionManager.cs92
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs55
2 files changed, 142 insertions, 5 deletions
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index da444d100..679b629a8 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -5,7 +5,9 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using System;
+using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -30,7 +32,7 @@ namespace MediaBrowser.Server.Implementations.Collections
var folderName = _fileSystem.GetValidFilename(name);
- var parentFolder = _libraryManager.GetItemById(options.ParentId) as Folder;
+ var parentFolder = GetParentFolder(options.ParentId);
if (parentFolder == null)
{
@@ -66,14 +68,94 @@ namespace MediaBrowser.Server.Implementations.Collections
}
}
- public Task AddToCollection(Guid collectionId, Guid itemId)
+ private Folder GetParentFolder(Guid? parentId)
{
- throw new NotImplementedException();
+ if (parentId.HasValue)
+ {
+ if (parentId.Value == Guid.Empty)
+ {
+ throw new ArgumentNullException("parentId");
+ }
+
+ return _libraryManager.GetItemById(parentId.Value) as Folder;
+ }
+
+ return _libraryManager.RootFolder.Children.OfType<ManualCollectionsFolder>().FirstOrDefault() ??
+ _libraryManager.RootFolder.GetHiddenChildren().OfType<ManualCollectionsFolder>().FirstOrDefault();
}
- public Task RemoveFromCollection(Guid collectionId, Guid itemId)
+ public async Task AddToCollection(Guid collectionId, IEnumerable<Guid> ids)
{
- throw new NotImplementedException();
+ var collection = _libraryManager.GetItemById(collectionId) as BoxSet;
+
+ if (collection == null)
+ {
+ throw new ArgumentException("No collection exists with the supplied Id");
+ }
+
+ var list = new List<LinkedChild>();
+
+ foreach (var itemId in ids)
+ {
+ var item = _libraryManager.GetItemById(itemId);
+
+ if (item == null)
+ {
+ throw new ArgumentException("No item exists with the supplied Id");
+ }
+
+ if (collection.LinkedChildren.Any(i => i.ItemId.HasValue && i.ItemId == itemId))
+ {
+ throw new ArgumentException("Item already exists in collection");
+ }
+
+ list.Add(new LinkedChild
+ {
+ ItemName = item.Name,
+ ItemYear = item.ProductionYear,
+ ItemType = item.GetType().Name,
+ Type = LinkedChildType.Manual
+ });
+ }
+
+ collection.LinkedChildren.AddRange(list);
+
+ await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+
+ await collection.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
+ }
+
+ public async Task RemoveFromCollection(Guid collectionId, IEnumerable<Guid> itemIds)
+ {
+ var collection = _libraryManager.GetItemById(collectionId) as BoxSet;
+
+ if (collection == null)
+ {
+ throw new ArgumentException("No collection exists with the supplied Id");
+ }
+
+ var list = new List<LinkedChild>();
+
+ foreach (var itemId in itemIds)
+ {
+ var child = collection.LinkedChildren.FirstOrDefault(i => i.ItemId.HasValue && i.ItemId.Value == itemId);
+
+ if (child == null)
+ {
+ throw new ArgumentException("No collection title exists with the supplied Id");
+ }
+
+ list.Add(child);
+ }
+
+ foreach (var child in list)
+ {
+ collection.LinkedChildren.Remove(child);
+ }
+
+ await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+
+ await collection.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs b/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs
new file mode 100644
index 000000000..834fbcd31
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionsDynamicFolder.cs
@@ -0,0 +1,55 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Entities;
+using System.IO;
+using System.Linq;
+
+namespace MediaBrowser.Server.Implementations.Collections
+{
+ public class CollectionsDynamicFolder : IVirtualFolderCreator
+ {
+ private readonly IApplicationPaths _appPaths;
+
+ public CollectionsDynamicFolder(IApplicationPaths appPaths)
+ {
+ _appPaths = appPaths;
+ }
+
+ public BasePluginFolder GetFolder()
+ {
+ var path = Path.Combine(_appPaths.DataPath, "collections");
+
+ Directory.CreateDirectory(path);
+
+ return new ManualCollectionsFolder
+ {
+ Path = path
+ };
+ }
+ }
+
+ public class ManualCollectionsFolder : BasePluginFolder
+ {
+ public ManualCollectionsFolder()
+ {
+ Name = "Collections";
+ }
+
+ public override bool IsVisible(User user)
+ {
+ if (!GetChildren(user, true).Any())
+ {
+ return false;
+ }
+
+ return base.IsVisible(user);
+ }
+
+ public override bool IsHidden
+ {
+ get
+ {
+ return !ActualChildren.Any() || base.IsHidden;
+ }
+ }
+ }
+}