diff options
| -rw-r--r-- | Jellyfin.Api/Controllers/PlaylistsController.cs | 52 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dto/PlaylistDto.cs | 26 |
2 files changed, 63 insertions, 15 deletions
diff --git a/Jellyfin.Api/Controllers/PlaylistsController.cs b/Jellyfin.Api/Controllers/PlaylistsController.cs index 63d6e1cc30..e6f23b1364 100644 --- a/Jellyfin.Api/Controllers/PlaylistsController.cs +++ b/Jellyfin.Api/Controllers/PlaylistsController.cs @@ -150,6 +150,37 @@ public class PlaylistsController : BaseJellyfinApiController } /// <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> /// <param name="playlistId">The playlist id.</param> @@ -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++) { diff --git a/MediaBrowser.Model/Dto/PlaylistDto.cs b/MediaBrowser.Model/Dto/PlaylistDto.cs new file mode 100644 index 0000000000..d4de75a784 --- /dev/null +++ b/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; } +} |
