Просмотр исходного кода

Add endpoint for getting playlists by id (#12697)

Tim Eisele 8 месяцев назад
Родитель
Сommit
e67dd3fc0e
2 измененных файлов с 63 добавлено и 15 удалено
  1. 37 15
      Jellyfin.Api/Controllers/PlaylistsController.cs
  2. 26 0
      MediaBrowser.Model/Dto/PlaylistDto.cs

+ 37 - 15
Jellyfin.Api/Controllers/PlaylistsController.cs

@@ -149,6 +149,37 @@ public class PlaylistsController : BaseJellyfinApiController
         return NoContent();
     }
 
+    /// <summary>
+    /// Get a playlist.
+    /// </summary>
+    /// <param name="playlistId">The playlist id.</param>
+    /// <response code="200">The playlist.</response>
+    /// <response code="404">Playlist not found.</response>
+    /// <returns>
+    /// A <see cref="Playlist"/> objects.
+    /// </returns>
+    [HttpGet("{playlistId}")]
+    [ProducesResponseType(StatusCodes.Status200OK)]
+    [ProducesResponseType(StatusCodes.Status404NotFound)]
+    public ActionResult<PlaylistDto> GetPlaylist(
+        [FromRoute, Required] Guid playlistId)
+    {
+        var userId = User.GetUserId();
+
+        var playlist = _playlistManager.GetPlaylistForUser(playlistId, userId);
+        if (playlist is null)
+        {
+            return NotFound("Playlist not found");
+        }
+
+        return new PlaylistDto()
+        {
+            Shares = playlist.Shares,
+            OpenAccess = playlist.OpenAccess,
+            ItemIds = playlist.GetManageableItems().Select(t => t.Item2.Id).ToList()
+        };
+    }
+
     /// <summary>
     /// Get a playlist's users.
     /// </summary>
@@ -467,32 +498,23 @@ public class PlaylistsController : BaseJellyfinApiController
         [FromQuery] int? imageTypeLimit,
         [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes)
     {
-        userId = RequestHelpers.GetUserId(User, userId);
-        var playlist = _playlistManager.GetPlaylistForUser(playlistId, userId.Value);
+        var callingUserId = userId ?? User.GetUserId();
+        var playlist = _playlistManager.GetPlaylistForUser(playlistId, callingUserId);
         if (playlist is null)
         {
             return NotFound("Playlist not found");
         }
 
         var isPermitted = playlist.OpenAccess
-            || playlist.OwnerUserId.Equals(userId.Value)
-            || playlist.Shares.Any(s => s.UserId.Equals(userId.Value));
+            || playlist.OwnerUserId.Equals(callingUserId)
+            || playlist.Shares.Any(s => s.UserId.Equals(callingUserId));
 
         if (!isPermitted)
         {
             return Forbid();
         }
 
-        var user = userId.IsNullOrEmpty()
-            ? null
-            : _userManager.GetUserById(userId.Value);
-        var item = _libraryManager.GetItemById<Playlist>(playlistId, user);
-        if (item is null)
-        {
-            return NotFound();
-        }
-
-        var items = item.GetManageableItems().ToArray();
+        var items = playlist.GetManageableItems().ToArray();
         var count = items.Length;
         if (startIndex.HasValue)
         {
@@ -507,7 +529,7 @@ public class PlaylistsController : BaseJellyfinApiController
         var dtoOptions = new DtoOptions { Fields = fields }
             .AddClientFields(User)
             .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes);
-
+        var user = _userManager.GetUserById(callingUserId);
         var dtos = _dtoService.GetBaseItemDtos(items.Select(i => i.Item2).ToList(), dtoOptions, user);
         for (int index = 0; index < dtos.Count; index++)
         {

+ 26 - 0
MediaBrowser.Model/Dto/PlaylistDto.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Model.Dto;
+
+/// <summary>
+/// DTO for playlists.
+/// </summary>
+public class PlaylistDto
+{
+    /// <summary>
+    /// Gets or sets a value indicating whether the playlist is publicly readable.
+    /// </summary>
+    public bool OpenAccess { get; set; }
+
+    /// <summary>
+    /// Gets or sets the share permissions.
+    /// </summary>
+    public required IReadOnlyList<PlaylistUserPermissions> Shares { get; set; }
+
+    /// <summary>
+    /// Gets or sets the item ids.
+    /// </summary>
+    public required IReadOnlyList<Guid> ItemIds { get; set; }
+}