TrickplayController.cs 3.7 KB

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