@ -5,7 +5,9 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library ;
using MediaBrowser.Controller.Library ;
using MediaBrowser.Controller.Providers ;
using MediaBrowser.Controller.Providers ;
using System ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.IO ;
using System.Linq ;
using System.Threading ;
using System.Threading ;
using System.Threading.Tasks ;
using System.Threading.Tasks ;
@ -28,9 +30,12 @@ namespace MediaBrowser.Server.Implementations.Collections
{
{
var name = options . Name ;
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 )
if ( parentFolder = = null )
{
{
@ -51,7 +56,8 @@ namespace MediaBrowser.Server.Implementations.Collections
Parent = parentFolder ,
Parent = parentFolder ,
DisplayMediaType = "Collection" ,
DisplayMediaType = "Collection" ,
Path = path ,
Path = path ,
DontFetchMeta = options . IsLocked
DontFetchMeta = options . IsLocked ,
ProviderIds = options . ProviderIds
} ;
} ;
await parentFolder . AddChild ( collection , CancellationToken . None ) . ConfigureAwait ( false ) ;
await parentFolder . AddChild ( collection , CancellationToken . None ) . ConfigureAwait ( false ) ;
@ -66,14 +72,124 @@ namespace MediaBrowser.Server.Implementations.Collections
}
}
}
}
p ublic Task AddToCollection ( Guid collectionId , Guid item Id)
p rivate Folder GetParentFolder ( Guid ? parent Id)
{
{
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> itemId s )
{
{
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 ) ;
}
}
}
}
}
}