Browse Source

Merge pull request #4761 from crobibero/playlist

(cherry picked from commit 13bb5e1ead9ee22efe28f120d9dced9b528dbf10)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
Claus Vium 4 years ago
parent
commit
24b2991def

+ 2 - 1
Jellyfin.Api/Controllers/MediaInfoController.cs

@@ -17,6 +17,7 @@ using MediaBrowser.Model.MediaInfo;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
 using Microsoft.Extensions.Logging;
 
 namespace Jellyfin.Api.Controllers
@@ -119,7 +120,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] bool? enableTranscoding,
             [FromQuery] bool? allowVideoStreamCopy,
             [FromQuery] bool? allowAudioStreamCopy,
-            [FromBody] PlaybackInfoDto? playbackInfoDto)
+            [FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] PlaybackInfoDto? playbackInfoDto)
         {
             var authInfo = _authContext.GetAuthorizationInfo(Request);
 

+ 23 - 5
Jellyfin.Api/Controllers/PlaylistsController.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Threading.Tasks;
@@ -17,6 +18,7 @@ using MediaBrowser.Model.Querying;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
 
 namespace Jellyfin.Api.Controllers
 {
@@ -53,6 +55,13 @@ namespace Jellyfin.Api.Controllers
         /// <summary>
         /// Creates a new playlist.
         /// </summary>
+        /// <remarks>
+        /// For backwards compatibility parameters can be sent via Query or Body, with Query having higher precedence.
+        /// </remarks>
+        /// <param name="name">The playlist name.</param>
+        /// <param name="ids">The item ids.</param>
+        /// <param name="userId">The user id.</param>
+        /// <param name="mediaType">The media type.</param>
         /// <param name="createPlaylistRequest">The create playlist payload.</param>
         /// <returns>
         /// A <see cref="Task" /> that represents the asynchronous operation to create a playlist.
@@ -61,14 +70,23 @@ namespace Jellyfin.Api.Controllers
         [HttpPost]
         [ProducesResponseType(StatusCodes.Status200OK)]
         public async Task<ActionResult<PlaylistCreationResult>> CreatePlaylist(
-            [FromBody, Required] CreatePlaylistDto createPlaylistRequest)
+            [FromQuery] string? name,
+            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] IReadOnlyList<Guid> ids,
+            [FromQuery] Guid? userId,
+            [FromQuery] string? mediaType,
+            [FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] CreatePlaylistDto? createPlaylistRequest)
         {
+            if (ids.Count == 0)
+            {
+                ids = createPlaylistRequest?.Ids ?? Array.Empty<Guid>();
+            }
+
             var result = await _playlistManager.CreatePlaylist(new PlaylistCreationRequest
             {
-                Name = createPlaylistRequest.Name,
-                ItemIdList = createPlaylistRequest.Ids,
-                UserId = createPlaylistRequest.UserId,
-                MediaType = createPlaylistRequest.MediaType
+                Name = name ?? createPlaylistRequest?.Name,
+                ItemIdList = ids,
+                UserId = userId ?? createPlaylistRequest?.UserId ?? default,
+                MediaType = mediaType ?? createPlaylistRequest?.MediaType
             }).ConfigureAwait(false);
 
             return result;

+ 1 - 1
Jellyfin.Api/Models/PlaylistDtos/CreatePlaylistDto.cs

@@ -24,7 +24,7 @@ namespace Jellyfin.Api.Models.PlaylistDtos
         /// <summary>
         /// Gets or sets the user id.
         /// </summary>
-        public Guid UserId { get; set; }
+        public Guid? UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the media type.