TrickplayController.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.Net.Mime;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Jellyfin.Api.Attributes;
  7. using Jellyfin.Api.Extensions;
  8. using MediaBrowser.Controller.Library;
  9. using MediaBrowser.Controller.Trickplay;
  10. using MediaBrowser.Model;
  11. using Microsoft.AspNetCore.Authorization;
  12. using Microsoft.AspNetCore.Http;
  13. using Microsoft.AspNetCore.Mvc;
  14. namespace Jellyfin.Api.Controllers;
  15. /// <summary>
  16. /// Trickplay controller.
  17. /// </summary>
  18. [Route("")]
  19. [Authorize]
  20. public class TrickplayController : BaseJellyfinApiController
  21. {
  22. private readonly ILibraryManager _libraryManager;
  23. private readonly ITrickplayManager _trickplayManager;
  24. /// <summary>
  25. /// Initializes a new instance of the <see cref="TrickplayController"/> class.
  26. /// </summary>
  27. /// <param name="libraryManager">Instance of <see cref="ILibraryManager"/>.</param>
  28. /// <param name="trickplayManager">Instance of <see cref="ITrickplayManager"/>.</param>
  29. public TrickplayController(
  30. ILibraryManager libraryManager,
  31. ITrickplayManager trickplayManager)
  32. {
  33. _libraryManager = libraryManager;
  34. _trickplayManager = trickplayManager;
  35. }
  36. /// <summary>
  37. /// Gets an image tiles playlist for trickplay.
  38. /// </summary>
  39. /// <param name="itemId">The item id.</param>
  40. /// <param name="width">The width of a single tile.</param>
  41. /// <param name="mediaSourceId">The media version id, if using an alternate version.</param>
  42. /// <response code="200">Tiles playlist returned.</response>
  43. /// <returns>A <see cref="FileResult"/> containing the trickplay playlist file.</returns>
  44. [HttpGet("Videos/{itemId}/Trickplay/{width}/tiles.m3u8")]
  45. [ProducesResponseType(StatusCodes.Status200OK)]
  46. [ProducesResponseType(StatusCodes.Status404NotFound)]
  47. [ProducesPlaylistFile]
  48. public async Task<ActionResult> GetTrickplayHlsPlaylist(
  49. [FromRoute, Required] Guid itemId,
  50. [FromRoute, Required] int width,
  51. [FromQuery] Guid? mediaSourceId)
  52. {
  53. string? playlist = await _trickplayManager.GetHlsPlaylist(mediaSourceId ?? itemId, width, User.GetToken()).ConfigureAwait(false);
  54. if (string.IsNullOrEmpty(playlist))
  55. {
  56. return NotFound();
  57. }
  58. return new FileContentResult(Encoding.UTF8.GetBytes(playlist), MimeTypes.GetMimeType("playlist.m3u8"));
  59. }
  60. /// <summary>
  61. /// Gets a trickplay tile image.
  62. /// </summary>
  63. /// <param name="itemId">The item id.</param>
  64. /// <param name="width">The width of a single tile.</param>
  65. /// <param name="index">The index of the desired tile.</param>
  66. /// <param name="mediaSourceId">The media version id, if using an alternate version.</param>
  67. /// <response code="200">Tile image returned.</response>
  68. /// <response code="200">Tile image not found at specified index.</response>
  69. /// <returns>A <see cref="FileResult"/> containing the trickplay tiles image.</returns>
  70. [HttpGet("Videos/{itemId}/Trickplay/{width}/{index}.jpg")]
  71. [ProducesResponseType(StatusCodes.Status200OK)]
  72. [ProducesResponseType(StatusCodes.Status404NotFound)]
  73. [ProducesImageFile]
  74. public ActionResult GetTrickplayTileImage(
  75. [FromRoute, Required] Guid itemId,
  76. [FromRoute, Required] int width,
  77. [FromRoute, Required] int index,
  78. [FromQuery] Guid? mediaSourceId)
  79. {
  80. var item = _libraryManager.GetItemById(mediaSourceId ?? itemId);
  81. if (item is null)
  82. {
  83. return NotFound();
  84. }
  85. var path = _trickplayManager.GetTrickplayTilePath(item, width, index);
  86. if (System.IO.File.Exists(path))
  87. {
  88. return PhysicalFile(path, MediaTypeNames.Image.Jpeg);
  89. }
  90. return NotFound();
  91. }
  92. }