DevicesController.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. [ProducesResponseType(typeof(DeviceInfo[]), StatusCodes.Status200OK)]
  48. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  49. public IActionResult GetDevices([FromQuery] bool? supportsSync, [FromQuery] Guid? userId)
  50. {
  51. try
  52. {
  53. var deviceQuery = new DeviceQuery { SupportsSync = supportsSync, UserId = userId ?? Guid.Empty };
  54. var devices = _deviceManager.GetDevices(deviceQuery);
  55. return Ok(devices);
  56. }
  57. catch (Exception e)
  58. {
  59. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  60. }
  61. }
  62. /// <summary>
  63. /// Get info for a device.
  64. /// </summary>
  65. /// <param name="id">Device Id.</param>
  66. /// <returns>Device Info.</returns>
  67. [HttpGet("Info")]
  68. [ProducesResponseType(typeof(DeviceInfo), StatusCodes.Status200OK)]
  69. [ProducesResponseType(StatusCodes.Status404NotFound)]
  70. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  71. public IActionResult GetDeviceInfo([FromQuery, BindRequired] string id)
  72. {
  73. try
  74. {
  75. var deviceInfo = _deviceManager.GetDevice(id);
  76. if (deviceInfo == null)
  77. {
  78. return NotFound();
  79. }
  80. return Ok(deviceInfo);
  81. }
  82. catch (Exception e)
  83. {
  84. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  85. }
  86. }
  87. /// <summary>
  88. /// Get options for a device.
  89. /// </summary>
  90. /// <param name="id">Device Id.</param>
  91. /// <returns>Device Info.</returns>
  92. [HttpGet("Options")]
  93. [ProducesResponseType(typeof(DeviceOptions), StatusCodes.Status200OK)]
  94. [ProducesResponseType(StatusCodes.Status404NotFound)]
  95. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  96. public IActionResult GetDeviceOptions([FromQuery, BindRequired] string id)
  97. {
  98. try
  99. {
  100. var deviceInfo = _deviceManager.GetDeviceOptions(id);
  101. if (deviceInfo == null)
  102. {
  103. return NotFound();
  104. }
  105. return Ok(deviceInfo);
  106. }
  107. catch (Exception e)
  108. {
  109. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  110. }
  111. }
  112. /// <summary>
  113. /// Update device options.
  114. /// </summary>
  115. /// <param name="id">Device Id.</param>
  116. /// <param name="deviceOptions">Device Options.</param>
  117. /// <returns>Status.</returns>
  118. [HttpPost("Options")]
  119. [ProducesResponseType(StatusCodes.Status200OK)]
  120. [ProducesResponseType(StatusCodes.Status404NotFound)]
  121. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  122. public IActionResult UpdateDeviceOptions(
  123. [FromQuery, BindRequired] string id,
  124. [FromBody, BindRequired] DeviceOptions deviceOptions)
  125. {
  126. try
  127. {
  128. var existingDeviceOptions = _deviceManager.GetDeviceOptions(id);
  129. if (existingDeviceOptions == null)
  130. {
  131. return NotFound();
  132. }
  133. _deviceManager.UpdateDeviceOptions(id, deviceOptions);
  134. return Ok();
  135. }
  136. catch (Exception e)
  137. {
  138. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  139. }
  140. }
  141. /// <summary>
  142. /// Deletes a device.
  143. /// </summary>
  144. /// <param name="id">Device Id.</param>
  145. /// <returns>Status.</returns>
  146. [HttpDelete]
  147. [ProducesResponseType(StatusCodes.Status200OK)]
  148. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  149. public IActionResult DeleteDevice([FromQuery, BindRequired] string id)
  150. {
  151. try
  152. {
  153. var sessions = _authenticationRepository.Get(new AuthenticationInfoQuery { DeviceId = id }).Items;
  154. foreach (var session in sessions)
  155. {
  156. _sessionManager.Logout(session);
  157. }
  158. return Ok();
  159. }
  160. catch (Exception e)
  161. {
  162. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  163. }
  164. }
  165. /// <summary>
  166. /// Gets camera upload history for a device.
  167. /// </summary>
  168. /// <param name="id">Device Id.</param>
  169. /// <returns>Content Upload History.</returns>
  170. [HttpGet("CameraUploads")]
  171. [ProducesResponseType(typeof(ContentUploadHistory), StatusCodes.Status200OK)]
  172. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  173. public IActionResult GetCameraUploads([FromQuery, BindRequired] string id)
  174. {
  175. try
  176. {
  177. var uploadHistory = _deviceManager.GetCameraUploadHistory(id);
  178. return Ok(uploadHistory);
  179. }
  180. catch (Exception e)
  181. {
  182. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  183. }
  184. }
  185. /// <summary>
  186. /// Uploads content.
  187. /// </summary>
  188. /// <param name="deviceId">Device Id.</param>
  189. /// <param name="album">Album.</param>
  190. /// <param name="name">Name.</param>
  191. /// <param name="id">Id.</param>
  192. /// <returns>Status.</returns>
  193. [HttpPost("CameraUploads")]
  194. [ProducesResponseType(StatusCodes.Status200OK)]
  195. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  196. [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
  197. public async Task<IActionResult> PostCameraUploadAsync(
  198. [FromQuery, BindRequired] string deviceId,
  199. [FromQuery, BindRequired] string album,
  200. [FromQuery, BindRequired] string name,
  201. [FromQuery, BindRequired] string id)
  202. {
  203. try
  204. {
  205. Stream fileStream;
  206. string contentType;
  207. if (Request.HasFormContentType)
  208. {
  209. if (Request.Form.Files.Any())
  210. {
  211. fileStream = Request.Form.Files[0].OpenReadStream();
  212. contentType = Request.Form.Files[0].ContentType;
  213. }
  214. else
  215. {
  216. return BadRequest();
  217. }
  218. }
  219. else
  220. {
  221. fileStream = Request.Body;
  222. contentType = Request.ContentType;
  223. }
  224. await _deviceManager.AcceptCameraUpload(
  225. deviceId,
  226. fileStream,
  227. new LocalFileInfo
  228. {
  229. MimeType = contentType,
  230. Album = album,
  231. Name = name,
  232. Id = id
  233. }).ConfigureAwait(false);
  234. return Ok();
  235. }
  236. catch (Exception e)
  237. {
  238. return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
  239. }
  240. }
  241. }
  242. }