VideosService.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. [ApiMember(Name = "IsAlternateEncoding", Description = "Filter by versions that are considered alternate encodings of the original.", IsRequired = true, DataType = "bool", ParameterType = "path", Verb = "GET")]
  65. public bool? IsAlternateEncoding { get; set; }
  66. }
  67. public class VideosService : BaseApiService
  68. {
  69. private readonly ILibraryManager _libraryManager;
  70. private readonly IUserManager _userManager;
  71. private readonly IDtoService _dtoService;
  72. public VideosService(ILibraryManager libraryManager, IUserManager userManager, IDtoService dtoService)
  73. {
  74. _libraryManager = libraryManager;
  75. _userManager = userManager;
  76. _dtoService = dtoService;
  77. }
  78. /// <summary>
  79. /// Gets the specified request.
  80. /// </summary>
  81. /// <param name="request">The request.</param>
  82. /// <returns>System.Object.</returns>
  83. public object Get(GetAdditionalParts request)
  84. {
  85. var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
  86. var item = string.IsNullOrEmpty(request.Id)
  87. ? (request.UserId.HasValue
  88. ? user.RootFolder
  89. : _libraryManager.RootFolder)
  90. : _dtoService.GetItemByDtoId(request.Id, request.UserId);
  91. // Get everything
  92. var fields = Enum.GetNames(typeof(ItemFields))
  93. .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
  94. .ToList();
  95. var video = (Video)item;
  96. var items = video.GetAdditionalParts()
  97. .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video))
  98. .ToArray();
  99. var result = new ItemsResult
  100. {
  101. Items = items,
  102. TotalRecordCount = items.Length
  103. };
  104. return ToOptimizedSerializedResultUsingCache(result);
  105. }
  106. public object Get(GetAlternateVersions request)
  107. {
  108. var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
  109. var item = string.IsNullOrEmpty(request.Id)
  110. ? (request.UserId.HasValue
  111. ? user.RootFolder
  112. : _libraryManager.RootFolder)
  113. : _dtoService.GetItemByDtoId(request.Id, request.UserId);
  114. // Get everything
  115. var fields = Enum.GetNames(typeof(ItemFields))
  116. .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
  117. .ToList();
  118. var video = (Video)item;
  119. var items = video.GetAlternateVersions()
  120. .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video))
  121. .ToArray();
  122. var result = new ItemsResult
  123. {
  124. Items = items,
  125. TotalRecordCount = items.Length
  126. };
  127. return ToOptimizedSerializedResultUsingCache(result);
  128. }
  129. public void Post(PostAlternateVersions request)
  130. {
  131. var task = AddAlternateVersions(request);
  132. Task.WaitAll(task);
  133. }
  134. public void Delete(DeleteAlternateVersions request)
  135. {
  136. var task = RemoveAlternateVersions(request);
  137. Task.WaitAll(task);
  138. }
  139. private async Task AddAlternateVersions(PostAlternateVersions request)
  140. {
  141. var video = (Video)_dtoService.GetItemByDtoId(request.Id);
  142. var list = new List<LinkedChild>();
  143. var currentAlternateVersions = video.GetAlternateVersions().ToList();
  144. foreach (var itemId in request.AlternateVersionIds.Split(',').Select(i => new Guid(i)))
  145. {
  146. var item = _libraryManager.GetItemById(itemId) as Video;
  147. if (item == null)
  148. {
  149. throw new ArgumentException("No item exists with the supplied Id");
  150. }
  151. if (currentAlternateVersions.Any(i => i.Id == itemId))
  152. {
  153. throw new ArgumentException("Item already exists.");
  154. }
  155. list.Add(new LinkedChild
  156. {
  157. Path = item.Path,
  158. Type = LinkedChildType.Manual
  159. });
  160. item.PrimaryVersionId = video.Id;
  161. }
  162. video.LinkedAlternateVersions.AddRange(list);
  163. await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
  164. await video.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
  165. }
  166. private async Task RemoveAlternateVersions(DeleteAlternateVersions request)
  167. {
  168. var video = (Video)_dtoService.GetItemByDtoId(request.Id);
  169. }
  170. }
  171. }