|
@@ -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;
|
|
|
|
|
@@ -28,9 +30,12 @@ namespace MediaBrowser.Server.Implementations.Collections
|
|
|
{
|
|
|
var name = options.Name;
|
|
|
|
|
|
- var folderName = _fileSystem.GetValidFilename(name);
|
|
|
+ // Need to use the [boxset] suffix
|
|
|
+ // If internet metadata is not found, or if xml saving is off there will be no collection.xml
|
|
|
+ // This could cause it to get re-resolved as a plain folder
|
|
|
+ var folderName = _fileSystem.GetValidFilename(name) + " [boxset]";
|
|
|
|
|
|
- var parentFolder = _libraryManager.GetItemById(options.ParentId) as Folder;
|
|
|
+ var parentFolder = GetParentFolder(options.ParentId);
|
|
|
|
|
|
if (parentFolder == null)
|
|
|
{
|
|
@@ -51,7 +56,8 @@ namespace MediaBrowser.Server.Implementations.Collections
|
|
|
Parent = parentFolder,
|
|
|
DisplayMediaType = "Collection",
|
|
|
Path = path,
|
|
|
- DontFetchMeta = options.IsLocked
|
|
|
+ DontFetchMeta = options.IsLocked,
|
|
|
+ ProviderIds = options.ProviderIds
|
|
|
};
|
|
|
|
|
|
await parentFolder.AddChild(collection, CancellationToken.None).ConfigureAwait(false);
|
|
@@ -66,14 +72,124 @@ 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 async Task AddToCollection(Guid collectionId, IEnumerable<Guid> ids)
|
|
|
+ {
|
|
|
+ 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 Task RemoveFromCollection(Guid collectionId, Guid itemId)
|
|
|
+ public async Task RemoveFromCollection(Guid collectionId, IEnumerable<Guid> itemIds)
|
|
|
{
|
|
|
- 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 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ var shortcutFiles = Directory
|
|
|
+ .EnumerateFiles(collection.Path, "*", SearchOption.TopDirectoryOnly)
|
|
|
+ .Where(i => _fileSystem.IsShortcut(i))
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var shortcutFilesToDelete = list.Where(child => !string.IsNullOrWhiteSpace(child.Path) && child.Type == LinkedChildType.Shortcut)
|
|
|
+ .Select(child => shortcutFiles.FirstOrDefault(i => string.Equals(child.Path, _fileSystem.ResolveShortcut(i), StringComparison.OrdinalIgnoreCase)))
|
|
|
+ .Where(i => !string.IsNullOrWhiteSpace(i))
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ foreach (var file in shortcutFilesToDelete)
|
|
|
+ {
|
|
|
+ _iLibraryMonitor.ReportFileSystemChangeBeginning(file);
|
|
|
+ }
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ foreach (var file in shortcutFilesToDelete)
|
|
|
+ {
|
|
|
+ File.Delete(file);
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var child in list)
|
|
|
+ {
|
|
|
+ collection.LinkedChildren.Remove(child);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ foreach (var file in shortcutFilesToDelete)
|
|
|
+ {
|
|
|
+ _iLibraryMonitor.ReportFileSystemChangeComplete(file, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
|
|
|
+
|
|
|
+ await collection.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
|
|
|
}
|
|
|
}
|
|
|
}
|