PlaylistService.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using MediaBrowser.Controller.Dto;
  2. using MediaBrowser.Controller.Library;
  3. using MediaBrowser.Controller.Net;
  4. using MediaBrowser.Controller.Playlists;
  5. using MediaBrowser.Model.Dto;
  6. using MediaBrowser.Model.Playlists;
  7. using MediaBrowser.Model.Querying;
  8. using ServiceStack;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Threading.Tasks;
  13. namespace MediaBrowser.Api
  14. {
  15. [Route("/Playlists", "POST", Summary = "Creates a new playlist")]
  16. public class CreatePlaylist : IReturn<PlaylistCreationResult>
  17. {
  18. [ApiMember(Name = "Name", Description = "The name of the new playlist.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
  19. public string Name { get; set; }
  20. [ApiMember(Name = "Ids", Description = "Item Ids to add to the playlist", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST", AllowMultiple = true)]
  21. public string Ids { get; set; }
  22. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
  23. public string UserId { get; set; }
  24. }
  25. [Route("/Playlists/{Id}/Items", "POST", Summary = "Adds items to a playlist")]
  26. public class AddToPlaylist : IReturnVoid
  27. {
  28. [ApiMember(Name = "Ids", Description = "Item id, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
  29. public string Ids { get; set; }
  30. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
  31. public string Id { get; set; }
  32. }
  33. [Route("/Playlists/{Id}/Items", "DELETE", Summary = "Removes items from a playlist")]
  34. public class RemoveFromPlaylist : IReturnVoid
  35. {
  36. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
  37. public string Id { get; set; }
  38. [ApiMember(Name = "EntryIds", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")]
  39. public string EntryIds { get; set; }
  40. }
  41. [Route("/Playlists/{Id}/Items", "GET", Summary = "Gets the original items of a playlist")]
  42. public class GetPlaylistItems : IReturn<QueryResult<BaseItemDto>>, IHasItemFields
  43. {
  44. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
  45. public string Id { get; set; }
  46. /// <summary>
  47. /// Gets or sets the user id.
  48. /// </summary>
  49. /// <value>The user id.</value>
  50. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
  51. public Guid? UserId { get; set; }
  52. /// <summary>
  53. /// Skips over a given number of items within the results. Use for paging.
  54. /// </summary>
  55. /// <value>The start index.</value>
  56. [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
  57. public int? StartIndex { get; set; }
  58. /// <summary>
  59. /// The maximum number of items to return
  60. /// </summary>
  61. /// <value>The limit.</value>
  62. [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
  63. public int? Limit { get; set; }
  64. /// <summary>
  65. /// Fields to return within the items, in addition to basic information
  66. /// </summary>
  67. /// <value>The fields.</value>
  68. [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
  69. public string Fields { get; set; }
  70. }
  71. [Authenticated]
  72. public class PlaylistService : BaseApiService
  73. {
  74. private readonly IPlaylistManager _playlistManager;
  75. private readonly IDtoService _dtoService;
  76. private readonly IUserManager _userManager;
  77. private readonly ILibraryManager _libraryManager;
  78. public PlaylistService(IDtoService dtoService, IPlaylistManager playlistManager, IUserManager userManager, ILibraryManager libraryManager)
  79. {
  80. _dtoService = dtoService;
  81. _playlistManager = playlistManager;
  82. _userManager = userManager;
  83. _libraryManager = libraryManager;
  84. }
  85. public object Post(CreatePlaylist request)
  86. {
  87. var task = _playlistManager.CreatePlaylist(new PlaylistCreationOptions
  88. {
  89. Name = request.Name,
  90. ItemIdList = (request.Ids ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(),
  91. UserId = request.UserId
  92. });
  93. var item = task.Result;
  94. var dto = _dtoService.GetBaseItemDto(item, new List<ItemFields>());
  95. return ToOptimizedResult(new PlaylistCreationResult
  96. {
  97. Id = dto.Id
  98. });
  99. }
  100. public void Post(AddToPlaylist request)
  101. {
  102. var task = _playlistManager.AddToPlaylist(request.Id, request.Ids.Split(','));
  103. Task.WaitAll(task);
  104. }
  105. public void Delete(RemoveFromPlaylist request)
  106. {
  107. var task = _playlistManager.RemoveFromPlaylist(request.Id, request.EntryIds.Split(','));
  108. Task.WaitAll(task);
  109. }
  110. public object Get(GetPlaylistItems request)
  111. {
  112. var playlist = (Playlist)_libraryManager.GetItemById(request.Id);
  113. var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
  114. var items = playlist.GetManageableItems().ToArray();
  115. var count = items.Length;
  116. if (request.StartIndex.HasValue)
  117. {
  118. items = items.Skip(request.StartIndex.Value).ToArray();
  119. }
  120. if (request.Limit.HasValue)
  121. {
  122. items = items.Take(request.Limit.Value).ToArray();
  123. }
  124. var dtos = items
  125. .Select(i => _dtoService.GetBaseItemDto(i.Item2, request.GetItemFields().ToList(), user))
  126. .ToArray();
  127. var index = 0;
  128. foreach (var item in dtos)
  129. {
  130. item.PlaylistItemId = items[index].Item1.Id;
  131. index++;
  132. }
  133. var result = new ItemsResult
  134. {
  135. Items = dtos,
  136. TotalRecordCount = count
  137. };
  138. return ToOptimizedResult(result);
  139. }
  140. }
  141. }