DevicesController.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #nullable enable
  2. using System;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using MediaBrowser.Controller.Devices;
  7. using MediaBrowser.Controller.Net;
  8. using MediaBrowser.Controller.Security;
  9. using MediaBrowser.Controller.Session;
  10. using MediaBrowser.Model.Devices;
  11. using Microsoft.AspNetCore.Http;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.AspNetCore.Mvc.ModelBinding;
  14. namespace Jellyfin.Api.Controllers
  15. {
  16. /// <summary>
  17. /// Devices Controller.
  18. /// </summary>
  19. [Authenticated]
  20. public class DevicesController : BaseJellyfinApiController
  21. {
  22. private readonly IDeviceManager _deviceManager;
  23. private readonly IAuthenticationRepository _authenticationRepository;
  24. private readonly ISessionManager _sessionManager;
  25. /// <summary>
  26. /// Initializes a new instance of the <see cref="DevicesController"/> class.
  27. /// </summary>
  28. /// <param name="deviceManager">Instance of <see cref="IDeviceManager"/> interface.</param>
  29. /// <param name="authenticationRepository">Instance of <see cref="IAuthenticationRepository"/> interface.</param>
  30. /// <param name="sessionManager">Instance of <see cref="ISessionManager"/> interface.</param>
  31. public DevicesController(
  32. IDeviceManager deviceManager,
  33. IAuthenticationRepository authenticationRepository,
  34. ISessionManager sessionManager)
  35. {
  36. _deviceManager = deviceManager;
  37. _authenticationRepository = authenticationRepository;
  38. _sessionManager = sessionManager;
  39. }
  40. /// <summary>
  41. /// Get Devices.
  42. /// </summary>
  43. /// <param name="supportsSync">/// Gets or sets a value indicating whether [supports synchronize].</param>
  44. /// <param name="userId">/// Gets or sets the user identifier.</param>
  45. /// <returns>Device Infos.</returns>
  46. [HttpGet]
  47. [Authenticated(Roles = "Admin")]
  48. [ProducesResponseType(typeof(DeviceInfo[]), StatusCodes.Status200OK)]
  49. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  50. public IActionResult GetDevices([FromQuery] bool? supportsSync, [FromQuery] Guid? userId)
  51. {
  52. var deviceQuery = new DeviceQuery { SupportsSync = supportsSync, UserId = userId ?? Guid.Empty };
  53. var devices = _deviceManager.GetDevices(deviceQuery);
  54. return Ok(devices);
  55. }
  56. /// <summary>
  57. /// Get info for a device.
  58. /// </summary>
  59. /// <param name="id">Device Id.</param>
  60. /// <returns>Device Info.</returns>
  61. [HttpGet("Info")]
  62. [Authenticated(Roles = "Admin")]
  63. [ProducesResponseType(typeof(DeviceInfo), StatusCodes.Status200OK)]
  64. [ProducesResponseType(StatusCodes.Status404NotFound)]
  65. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  66. public IActionResult GetDeviceInfo([FromQuery, BindRequired] string id)
  67. {
  68. var deviceInfo = _deviceManager.GetDevice(id);
  69. if (deviceInfo == null)
  70. {
  71. return NotFound();
  72. }
  73. return Ok(deviceInfo);
  74. }
  75. /// <summary>
  76. /// Get options for a device.
  77. /// </summary>
  78. /// <param name="id">Device Id.</param>
  79. /// <returns>Device Info.</returns>
  80. [HttpGet("Options")]
  81. [Authenticated(Roles = "Admin")]
  82. [ProducesResponseType(typeof(DeviceOptions), StatusCodes.Status200OK)]
  83. [ProducesResponseType(StatusCodes.Status404NotFound)]
  84. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  85. public IActionResult GetDeviceOptions([FromQuery, BindRequired] string id)
  86. {
  87. var deviceInfo = _deviceManager.GetDeviceOptions(id);
  88. if (deviceInfo == null)
  89. {
  90. return NotFound();
  91. }
  92. return Ok(deviceInfo);
  93. }
  94. /// <summary>
  95. /// Update device options.
  96. /// </summary>
  97. /// <param name="id">Device Id.</param>
  98. /// <param name="deviceOptions">Device Options.</param>
  99. /// <returns>Status.</returns>
  100. [HttpPost("Options")]
  101. [Authenticated(Roles = "Admin")]
  102. [ProducesResponseType(StatusCodes.Status200OK)]
  103. [ProducesResponseType(StatusCodes.Status404NotFound)]
  104. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  105. public IActionResult UpdateDeviceOptions(
  106. [FromQuery, BindRequired] string id,
  107. [FromBody, BindRequired] DeviceOptions deviceOptions)
  108. {
  109. var existingDeviceOptions = _deviceManager.GetDeviceOptions(id);
  110. if (existingDeviceOptions == null)
  111. {
  112. return NotFound();
  113. }
  114. _deviceManager.UpdateDeviceOptions(id, deviceOptions);
  115. return Ok();
  116. }
  117. /// <summary>
  118. /// Deletes a device.
  119. /// </summary>
  120. /// <param name="id">Device Id.</param>
  121. /// <returns>Status.</returns>
  122. [HttpDelete]
  123. [ProducesResponseType(StatusCodes.Status200OK)]
  124. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  125. public IActionResult DeleteDevice([FromQuery, BindRequired] string id)
  126. {
  127. var sessions = _authenticationRepository.Get(new AuthenticationInfoQuery { DeviceId = id }).Items;
  128. foreach (var session in sessions)
  129. {
  130. _sessionManager.Logout(session);
  131. }
  132. return Ok();
  133. }
  134. /// <summary>
  135. /// Gets camera upload history for a device.
  136. /// </summary>
  137. /// <param name="id">Device Id.</param>
  138. /// <returns>Content Upload History.</returns>
  139. [HttpGet("CameraUploads")]
  140. [ProducesResponseType(typeof(ContentUploadHistory), StatusCodes.Status200OK)]
  141. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  142. public IActionResult GetCameraUploads([FromQuery, BindRequired] string id)
  143. {
  144. var uploadHistory = _deviceManager.GetCameraUploadHistory(id);
  145. return Ok(uploadHistory);
  146. }
  147. /// <summary>
  148. /// Uploads content.
  149. /// </summary>
  150. /// <param name="deviceId">Device Id.</param>
  151. /// <param name="album">Album.</param>
  152. /// <param name="name">Name.</param>
  153. /// <param name="id">Id.</param>
  154. /// <returns>Status.</returns>
  155. [HttpPost("CameraUploads")]
  156. [ProducesResponseType(StatusCodes.Status200OK)]
  157. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  158. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  159. public async Task<IActionResult> PostCameraUploadAsync(
  160. [FromQuery, BindRequired] string deviceId,
  161. [FromQuery, BindRequired] string album,
  162. [FromQuery, BindRequired] string name,
  163. [FromQuery, BindRequired] string id)
  164. {
  165. Stream fileStream;
  166. string contentType;
  167. if (Request.HasFormContentType)
  168. {
  169. if (Request.Form.Files.Any())
  170. {
  171. fileStream = Request.Form.Files[0].OpenReadStream();
  172. contentType = Request.Form.Files[0].ContentType;
  173. }
  174. else
  175. {
  176. return BadRequest();
  177. }
  178. }
  179. else
  180. {
  181. fileStream = Request.Body;
  182. contentType = Request.ContentType;
  183. }
  184. await _deviceManager.AcceptCameraUpload(
  185. deviceId,
  186. fileStream,
  187. new LocalFileInfo { MimeType = contentType, Album = album, Name = name, Id = id }).ConfigureAwait(false);
  188. return Ok();
  189. }
  190. }
  191. }