using System; using Jellyfin.Api.Constants; using Jellyfin.Api.Extensions; using Jellyfin.Api.Helpers; using MediaBrowser.Controller.Collections; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Collections; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace Jellyfin.Api.Controllers { /// /// The collection controller. /// [Route("Collections")] [Authorize(Policy = Policies.DefaultAuthorization)] public class CollectionController : BaseJellyfinApiController { private readonly ICollectionManager _collectionManager; private readonly IDtoService _dtoService; private readonly IAuthorizationContext _authContext; /// /// Initializes a new instance of the class. /// /// Instance of interface. /// Instance of interface. /// Instance of interface. public CollectionController( ICollectionManager collectionManager, IDtoService dtoService, IAuthorizationContext authContext) { _collectionManager = collectionManager; _dtoService = dtoService; _authContext = authContext; } /// /// Creates a new collection. /// /// The name of the collection. /// Item Ids to add to the collection. /// Optional. Create the collection within a specific folder. /// Whether or not to lock the new collection. /// Collection created. /// A with information about the new collection. [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult CreateCollection( [FromQuery] string? name, [FromQuery] string? ids, [FromQuery] Guid? parentId, [FromQuery] bool isLocked = false) { var userId = _authContext.GetAuthorizationInfo(Request).UserId; var item = _collectionManager.CreateCollection(new CollectionCreationOptions { IsLocked = isLocked, Name = name, ParentId = parentId, ItemIdList = RequestHelpers.Split(ids, ',', true), UserIds = new[] { userId } }); var dtoOptions = new DtoOptions().AddClientFields(Request); var dto = _dtoService.GetBaseItemDto(item, dtoOptions); return new CollectionCreationResult { Id = dto.Id }; } /// /// Adds items to a collection. /// /// The collection id. /// Item ids, comma delimited. /// Items added to collection. /// A indicating success. [HttpPost("{collectionId}/Items")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult AddToCollection([FromRoute] Guid collectionId, [FromQuery] string? itemIds) { _collectionManager.AddToCollection(collectionId, RequestHelpers.Split(itemIds, ',', true)); return NoContent(); } /// /// Removes items from a collection. /// /// The collection id. /// Item ids, comma delimited. /// Items removed from collection. /// A indicating success. [HttpDelete("{collectionId}/Items")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult RemoveFromCollection([FromRoute] Guid collectionId, [FromQuery] string? itemIds) { _collectionManager.RemoveFromCollection(collectionId, RequestHelpers.Split(itemIds, ',', true)); return NoContent(); } } }