VideosService.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System.Collections.Generic;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using MediaBrowser.Controller.Dto;
  5. using MediaBrowser.Controller.Entities;
  6. using MediaBrowser.Controller.Library;
  7. using MediaBrowser.Model.Querying;
  8. using ServiceStack;
  9. using System;
  10. using System.Linq;
  11. namespace MediaBrowser.Api
  12. {
  13. [Route("/Videos/{Id}/AdditionalParts", "GET")]
  14. [Api(Description = "Gets additional parts for a video.")]
  15. public class GetAdditionalParts : IReturn<ItemsResult>
  16. {
  17. [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  18. public Guid? UserId { get; set; }
  19. /// <summary>
  20. /// Gets or sets the id.
  21. /// </summary>
  22. /// <value>The id.</value>
  23. [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
  24. public string Id { get; set; }
  25. }
  26. [Route("/Videos/{Id}/AlternateVersions", "GET")]
  27. [Api(Description = "Gets alternate versions of a video.")]
  28. public class GetAlternateVersions : IReturn<ItemsResult>
  29. {
  30. [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  31. public Guid? UserId { get; set; }
  32. /// <summary>
  33. /// Gets or sets the id.
  34. /// </summary>
  35. /// <value>The id.</value>
  36. [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
  37. public string Id { get; set; }
  38. }
  39. [Route("/Videos/{Id}/AlternateVersions", "POST")]
  40. [Api(Description = "Assigns videos as alternates of antoher.")]
  41. public class PostAlternateVersions : IReturnVoid
  42. {
  43. [ApiMember(Name = "AlternateVersionIds", Description = "Item id, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
  44. public string AlternateVersionIds { get; set; }
  45. /// <summary>
  46. /// Gets or sets the id.
  47. /// </summary>
  48. /// <value>The id.</value>
  49. [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
  50. public string Id { get; set; }
  51. }
  52. [Route("/Videos/{Id}/AlternateVersions", "DELETE")]
  53. [Api(Description = "Assigns videos as alternates of antoher.")]
  54. public class DeleteAlternateVersions : IReturnVoid
  55. {
  56. [ApiMember(Name = "AlternateVersionIds", Description = "Item id, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")]
  57. public string AlternateVersionIds { get; set; }
  58. /// <summary>
  59. /// Gets or sets the id.
  60. /// </summary>
  61. /// <value>The id.</value>
  62. [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
  63. public string Id { get; set; }
  64. }
  65. public class VideosService : BaseApiService
  66. {
  67. private readonly ILibraryManager _libraryManager;
  68. private readonly IUserManager _userManager;
  69. private readonly IDtoService _dtoService;
  70. public VideosService(ILibraryManager libraryManager, IUserManager userManager, IDtoService dtoService)
  71. {
  72. _libraryManager = libraryManager;
  73. _userManager = userManager;
  74. _dtoService = dtoService;
  75. }
  76. /// <summary>
  77. /// Gets the specified request.
  78. /// </summary>
  79. /// <param name="request">The request.</param>
  80. /// <returns>System.Object.</returns>
  81. public object Get(GetAdditionalParts request)
  82. {
  83. var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
  84. var item = string.IsNullOrEmpty(request.Id)
  85. ? (request.UserId.HasValue
  86. ? user.RootFolder
  87. : _libraryManager.RootFolder)
  88. : _dtoService.GetItemByDtoId(request.Id, request.UserId);
  89. // Get everything
  90. var fields = Enum.GetNames(typeof(ItemFields))
  91. .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
  92. .ToList();
  93. var video = (Video)item;
  94. var items = video.GetAdditionalParts()
  95. .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video))
  96. .ToArray();
  97. var result = new ItemsResult
  98. {
  99. Items = items,
  100. TotalRecordCount = items.Length
  101. };
  102. return ToOptimizedSerializedResultUsingCache(result);
  103. }
  104. public object Get(GetAlternateVersions request)
  105. {
  106. var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
  107. var item = string.IsNullOrEmpty(request.Id)
  108. ? (request.UserId.HasValue
  109. ? user.RootFolder
  110. : _libraryManager.RootFolder)
  111. : _dtoService.GetItemByDtoId(request.Id, request.UserId);
  112. // Get everything
  113. var fields = Enum.GetNames(typeof(ItemFields))
  114. .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
  115. .ToList();
  116. var video = (Video)item;
  117. var items = video.GetAlternateVersions()
  118. .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video))
  119. .ToArray();
  120. var result = new ItemsResult
  121. {
  122. Items = items,
  123. TotalRecordCount = items.Length
  124. };
  125. return ToOptimizedSerializedResultUsingCache(result);
  126. }
  127. public void Post(PostAlternateVersions request)
  128. {
  129. var task = AddAlternateVersions(request);
  130. Task.WaitAll(task);
  131. }
  132. public void Delete(DeleteAlternateVersions request)
  133. {
  134. var task = RemoveAlternateVersions(request);
  135. Task.WaitAll(task);
  136. }
  137. private async Task AddAlternateVersions(PostAlternateVersions request)
  138. {
  139. var video = (Video)_dtoService.GetItemByDtoId(request.Id);
  140. var list = new List<LinkedChild>();
  141. var currentAlternateVersions = video.GetAlternateVersions().ToList();
  142. foreach (var itemId in request.AlternateVersionIds.Split(',').Select(i => new Guid(i)))
  143. {
  144. var item = _libraryManager.GetItemById(itemId) as Video;
  145. if (item == null)
  146. {
  147. throw new ArgumentException("No item exists with the supplied Id");
  148. }
  149. if (currentAlternateVersions.Any(i => i.Id == itemId))
  150. {
  151. throw new ArgumentException("Item already exists.");
  152. }
  153. list.Add(new LinkedChild
  154. {
  155. Path = item.Path,
  156. Type = LinkedChildType.Manual
  157. });
  158. item.PrimaryVersionId = video.Id;
  159. }
  160. video.LinkedAlternateVersions.AddRange(list);
  161. await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
  162. await video.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
  163. }
  164. private async Task RemoveAlternateVersions(DeleteAlternateVersions request)
  165. {
  166. var video = (Video)_dtoService.GetItemByDtoId(request.Id);
  167. }
  168. }
  169. }