Browse Source

Merge pull request #4093 from crobibero/bad-route

Fix api routes
Bond-009 4 years ago
parent
commit
1d633aac0a
27 changed files with 143 additions and 143 deletions
  1. 2 2
      Jellyfin.Api/Controllers/ApiKeyController.cs
  2. 3 3
      Jellyfin.Api/Controllers/AudioController.cs
  3. 2 2
      Jellyfin.Api/Controllers/CollectionController.cs
  4. 2 2
      Jellyfin.Api/Controllers/ConfigurationController.cs
  5. 4 4
      Jellyfin.Api/Controllers/DevicesController.cs
  6. 5 5
      Jellyfin.Api/Controllers/DisplayPreferencesController.cs
  7. 6 6
      Jellyfin.Api/Controllers/DynamicHlsController.cs
  8. 5 5
      Jellyfin.Api/Controllers/ImageByNameController.cs
  9. 46 46
      Jellyfin.Api/Controllers/ImageController.cs
  10. 1 1
      Jellyfin.Api/Controllers/InstantMixController.cs
  11. 1 1
      Jellyfin.Api/Controllers/ItemUpdateController.cs
  12. 1 1
      Jellyfin.Api/Controllers/ItemsController.cs
  13. 1 1
      Jellyfin.Api/Controllers/LibraryController.cs
  14. 1 1
      Jellyfin.Api/Controllers/LiveTvController.cs
  15. 2 2
      Jellyfin.Api/Controllers/MediaInfoController.cs
  16. 2 2
      Jellyfin.Api/Controllers/PackageController.cs
  17. 11 11
      Jellyfin.Api/Controllers/PlaylistsController.cs
  18. 2 2
      Jellyfin.Api/Controllers/PluginsController.cs
  19. 4 4
      Jellyfin.Api/Controllers/ScheduledTasksController.cs
  20. 1 1
      Jellyfin.Api/Controllers/SearchController.cs
  21. 23 23
      Jellyfin.Api/Controllers/SessionController.cs
  22. 7 7
      Jellyfin.Api/Controllers/SubtitleController.cs
  23. 1 1
      Jellyfin.Api/Controllers/SystemController.cs
  24. 6 6
      Jellyfin.Api/Controllers/TvShowsController.cs
  25. 1 1
      Jellyfin.Api/Controllers/UniversalAudioController.cs
  26. 1 1
      Jellyfin.Api/Controllers/UserController.cs
  27. 2 2
      Jellyfin.Api/Controllers/VideosController.cs

+ 2 - 2
Jellyfin.Api/Controllers/ApiKeyController.cs

@@ -65,7 +65,7 @@ namespace Jellyfin.Api.Controllers
         [HttpPost("Keys")]
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public ActionResult CreateKey([FromQuery, Required] string? app)
+        public ActionResult CreateKey([FromQuery, Required] string app)
         {
             _authRepo.Create(new AuthenticationInfo
             {
@@ -88,7 +88,7 @@ namespace Jellyfin.Api.Controllers
         [HttpDelete("Keys/{key}")]
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public ActionResult RevokeKey([FromRoute, Required] string? key)
+        public ActionResult RevokeKey([FromRoute, Required] string key)
         {
             _sessionManager.RevokeToken(key);
             return NoContent();

+ 3 - 3
Jellyfin.Api/Controllers/AudioController.cs

@@ -85,15 +85,15 @@ namespace Jellyfin.Api.Controllers
         /// <param name="streamOptions">Optional. The streaming options.</param>
         /// <response code="200">Audio stream returned.</response>
         /// <returns>A <see cref="FileResult"/> containing the audio file.</returns>
-        [HttpGet("{itemId}/stream.{container}", Name = "GetAudioStreamByContainer")]
+        [HttpGet("{itemId}/stream.{container:required}", Name = "GetAudioStreamByContainer")]
         [HttpGet("{itemId}/stream", Name = "GetAudioStream")]
-        [HttpHead("{itemId}/stream.{container}", Name = "HeadAudioStreamByContainer")]
+        [HttpHead("{itemId}/stream.{container:required}", Name = "HeadAudioStreamByContainer")]
         [HttpHead("{itemId}/stream", Name = "HeadAudioStream")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesAudioFile]
         public async Task<ActionResult> GetAudioStream(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromRoute] string? container,
             [FromQuery] bool? @static,
             [FromQuery] string? @params,
             [FromQuery] string? tag,

+ 2 - 2
Jellyfin.Api/Controllers/CollectionController.cs

@@ -88,7 +88,7 @@ namespace Jellyfin.Api.Controllers
         /// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
         [HttpPost("{collectionId}/Items")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public async Task<ActionResult> AddToCollection([FromRoute, Required] Guid collectionId, [FromQuery, Required] string? itemIds)
+        public async Task<ActionResult> AddToCollection([FromRoute, Required] Guid collectionId, [FromQuery, Required] string itemIds)
         {
             await _collectionManager.AddToCollectionAsync(collectionId, RequestHelpers.GetGuids(itemIds)).ConfigureAwait(true);
             return NoContent();
@@ -103,7 +103,7 @@ namespace Jellyfin.Api.Controllers
         /// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
         [HttpDelete("{collectionId}/Items")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public async Task<ActionResult> RemoveFromCollection([FromRoute, Required] Guid collectionId, [FromQuery, Required] string? itemIds)
+        public async Task<ActionResult> RemoveFromCollection([FromRoute, Required] Guid collectionId, [FromQuery, Required] string itemIds)
         {
             await _collectionManager.RemoveFromCollectionAsync(collectionId, RequestHelpers.GetGuids(itemIds)).ConfigureAwait(false);
             return NoContent();

+ 2 - 2
Jellyfin.Api/Controllers/ConfigurationController.cs

@@ -76,7 +76,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("Configuration/{key}")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesFile(MediaTypeNames.Application.Json)]
-        public ActionResult<object> GetNamedConfiguration([FromRoute, Required] string? key)
+        public ActionResult<object> GetNamedConfiguration([FromRoute, Required] string key)
         {
             return _configurationManager.GetConfiguration(key);
         }
@@ -90,7 +90,7 @@ namespace Jellyfin.Api.Controllers
         [HttpPost("Configuration/{key}")]
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public async Task<ActionResult> UpdateNamedConfiguration([FromRoute, Required] string? key)
+        public async Task<ActionResult> UpdateNamedConfiguration([FromRoute, Required] string key)
         {
             var configurationType = _configurationManager.GetConfigurationType(key);
             var configuration = await JsonSerializer.DeserializeAsync(Request.Body, configurationType, _serializerOptions).ConfigureAwait(false);

+ 4 - 4
Jellyfin.Api/Controllers/DevicesController.cs

@@ -65,7 +65,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult<DeviceInfo> GetDeviceInfo([FromQuery, Required] string? id)
+        public ActionResult<DeviceInfo> GetDeviceInfo([FromQuery, Required] string id)
         {
             var deviceInfo = _deviceManager.GetDevice(id);
             if (deviceInfo == null)
@@ -87,7 +87,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult<DeviceOptions> GetDeviceOptions([FromQuery, Required] string? id)
+        public ActionResult<DeviceOptions> GetDeviceOptions([FromQuery, Required] string id)
         {
             var deviceInfo = _deviceManager.GetDeviceOptions(id);
             if (deviceInfo == null)
@@ -111,7 +111,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         public ActionResult UpdateDeviceOptions(
-            [FromQuery, Required] string? id,
+            [FromQuery, Required] string id,
             [FromBody, Required] DeviceOptions deviceOptions)
         {
             var existingDeviceOptions = _deviceManager.GetDeviceOptions(id);
@@ -134,7 +134,7 @@ namespace Jellyfin.Api.Controllers
         [HttpDelete]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult DeleteDevice([FromQuery, Required] string? id)
+        public ActionResult DeleteDevice([FromQuery, Required] string id)
         {
             var existingDevice = _deviceManager.GetDevice(id);
             if (existingDevice == null)

+ 5 - 5
Jellyfin.Api/Controllers/DisplayPreferencesController.cs

@@ -43,9 +43,9 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status200OK)]
         [SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "displayPreferencesId", Justification = "Imported from ServiceStack")]
         public ActionResult<DisplayPreferencesDto> GetDisplayPreferences(
-            [FromRoute, Required] string? displayPreferencesId,
-            [FromQuery] [Required] Guid userId,
-            [FromQuery] [Required] string? client)
+            [FromRoute, Required] string displayPreferencesId,
+            [FromQuery, Required] Guid userId,
+            [FromQuery, Required] string client)
         {
             var displayPreferences = _displayPreferencesManager.GetDisplayPreferences(userId, client);
             var itemPreferences = _displayPreferencesManager.GetItemDisplayPreferences(displayPreferences.UserId, Guid.Empty, displayPreferences.Client);
@@ -97,9 +97,9 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "displayPreferencesId", Justification = "Imported from ServiceStack")]
         public ActionResult UpdateDisplayPreferences(
-            [FromRoute, Required] string? displayPreferencesId,
+            [FromRoute, Required] string displayPreferencesId,
             [FromQuery, Required] Guid userId,
-            [FromQuery, Required] string? client,
+            [FromQuery, Required] string client,
             [FromBody, Required] DisplayPreferencesDto displayPreferences)
         {
             HomeSectionType[] defaults =

+ 6 - 6
Jellyfin.Api/Controllers/DynamicHlsController.cs

@@ -170,7 +170,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesPlaylistFile]
         public async Task<ActionResult> GetMasterHlsVideoPlaylist(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromRoute, Required] string container,
             [FromQuery] bool? @static,
             [FromQuery] string? @params,
             [FromQuery] string? tag,
@@ -179,7 +179,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] string? segmentContainer,
             [FromQuery] int? segmentLength,
             [FromQuery] int? minSegments,
-            [FromQuery, Required] string? mediaSourceId,
+            [FromQuery, Required] string mediaSourceId,
             [FromQuery] string? deviceId,
             [FromQuery] string? audioCodec,
             [FromQuery] bool? enableAutoStreamCopy,
@@ -338,7 +338,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesPlaylistFile]
         public async Task<ActionResult> GetMasterHlsAudioPlaylist(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromQuery, Required] string container,
             [FromQuery] bool? @static,
             [FromQuery] string? @params,
             [FromQuery] string? tag,
@@ -347,7 +347,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] string? segmentContainer,
             [FromQuery] int? segmentLength,
             [FromQuery] int? minSegments,
-            [FromQuery, Required] string? mediaSourceId,
+            [FromQuery, Required] string mediaSourceId,
             [FromQuery] string? deviceId,
             [FromQuery] string? audioCodec,
             [FromQuery] bool? enableAutoStreamCopy,
@@ -504,7 +504,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesPlaylistFile]
         public async Task<ActionResult> GetVariantHlsVideoPlaylist(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromQuery, Required] string container,
             [FromQuery] bool? @static,
             [FromQuery] string? @params,
             [FromQuery] string? tag,
@@ -670,7 +670,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesPlaylistFile]
         public async Task<ActionResult> GetVariantHlsAudioPlaylist(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromQuery, Required] string container,
             [FromQuery] bool? @static,
             [FromQuery] string? @params,
             [FromQuery] string? tag,

+ 5 - 5
Jellyfin.Api/Controllers/ImageByNameController.cs

@@ -67,7 +67,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         [ProducesImageFile]
-        public ActionResult GetGeneralImage([FromRoute, Required] string? name, [FromRoute, Required] string? type)
+        public ActionResult GetGeneralImage([FromRoute, Required] string name, [FromRoute, Required] string type)
         {
             var filename = string.Equals(type, "primary", StringComparison.OrdinalIgnoreCase)
                 ? "folder"
@@ -114,8 +114,8 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         [ProducesImageFile]
         public ActionResult GetRatingImage(
-            [FromRoute, Required] string? theme,
-            [FromRoute, Required] string? name)
+            [FromRoute, Required] string theme,
+            [FromRoute, Required] string name)
         {
             return GetImageFile(_applicationPaths.RatingsPath, theme, name);
         }
@@ -148,8 +148,8 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         [ProducesImageFile]
         public ActionResult GetMediaInfoImage(
-            [FromRoute, Required] string? theme,
-            [FromRoute, Required] string? name)
+            [FromRoute, Required] string theme,
+            [FromRoute, Required] string name)
         {
             return GetImageFile(_applicationPaths.MediaInfoImagesPath, theme, name);
         }

+ 46 - 46
Jellyfin.Api/Controllers/ImageController.cs

@@ -94,7 +94,7 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> PostUserImage(
             [FromRoute, Required] Guid userId,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] int? index = null)
+            [FromRoute] int? index = null)
         {
             if (!RequestHelpers.AssertCanUpdateUser(_authContext, HttpContext.Request, userId, true))
             {
@@ -141,7 +141,7 @@ namespace Jellyfin.Api.Controllers
         public ActionResult DeleteUserImage(
             [FromRoute, Required] Guid userId,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] int? index = null)
+            [FromRoute] int? index = null)
         {
             if (!RequestHelpers.AssertCanUpdateUser(_authContext, HttpContext.Request, userId, true))
             {
@@ -179,7 +179,7 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> DeleteItemImage(
             [FromRoute, Required] Guid itemId,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetItemById(itemId);
             if (item == null)
@@ -209,7 +209,7 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> SetItemImage(
             [FromRoute, Required] Guid itemId,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetItemById(itemId);
             if (item == null)
@@ -357,8 +357,8 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetItemImage(
             [FromRoute, Required] Guid itemId,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
+            [FromQuery] int? maxWidth,
+            [FromQuery] int? maxHeight,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -371,7 +371,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetItemById(itemId);
             if (item == null)
@@ -436,8 +436,8 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetItemImage2(
             [FromRoute, Required] Guid itemId,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
+            [FromRoute, Required] int maxWidth,
+            [FromRoute, Required] int maxHeight,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -445,12 +445,12 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] bool? cropWhitespace,
             [FromRoute, Required] string format,
             [FromQuery] bool? addPlayedIndicator,
-            [FromRoute, Required] double? percentPlayed,
-            [FromRoute, Required] int? unplayedCount,
+            [FromRoute, Required] double percentPlayed,
+            [FromRoute, Required] int unplayedCount,
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute, Required] int imageIndex)
         {
             var item = _libraryManager.GetItemById(itemId);
             if (item == null)
@@ -515,12 +515,12 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetArtistImage(
             [FromRoute, Required] string name,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] string tag,
-            [FromRoute, Required] string format,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
-            [FromRoute, Required] double? percentPlayed,
-            [FromRoute, Required] int? unplayedCount,
+            [FromQuery] string tag,
+            [FromQuery] string format,
+            [FromQuery] int? maxWidth,
+            [FromQuery] int? maxHeight,
+            [FromQuery] double? percentPlayed,
+            [FromQuery] int? unplayedCount,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -529,7 +529,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute, Required] int imageIndex)
         {
             var item = _libraryManager.GetArtist(name);
             if (item == null)
@@ -594,12 +594,12 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetGenreImage(
             [FromRoute, Required] string name,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] string tag,
-            [FromRoute, Required] string format,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
-            [FromRoute, Required] double? percentPlayed,
-            [FromRoute, Required] int? unplayedCount,
+            [FromQuery] string tag,
+            [FromQuery] string format,
+            [FromQuery] int? maxWidth,
+            [FromQuery] int? maxHeight,
+            [FromQuery] double? percentPlayed,
+            [FromQuery] int? unplayedCount,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -608,7 +608,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetGenre(name);
             if (item == null)
@@ -673,12 +673,12 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetMusicGenreImage(
             [FromRoute, Required] string name,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] string tag,
-            [FromRoute, Required] string format,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
-            [FromRoute, Required] double? percentPlayed,
-            [FromRoute, Required] int? unplayedCount,
+            [FromQuery] string tag,
+            [FromQuery] string format,
+            [FromQuery] int? maxWidth,
+            [FromQuery] int? maxHeight,
+            [FromQuery] double? percentPlayed,
+            [FromQuery] int? unplayedCount,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -687,7 +687,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetMusicGenre(name);
             if (item == null)
@@ -752,12 +752,12 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetPersonImage(
             [FromRoute, Required] string name,
             [FromRoute, Required] ImageType imageType,
-            [FromRoute, Required] string tag,
-            [FromRoute, Required] string format,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
-            [FromRoute, Required] double? percentPlayed,
-            [FromRoute, Required] int? unplayedCount,
+            [FromQuery] string tag,
+            [FromQuery] string format,
+            [FromQuery] int? maxWidth,
+            [FromQuery] int? maxHeight,
+            [FromQuery] double? percentPlayed,
+            [FromQuery] int? unplayedCount,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -766,7 +766,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetPerson(name);
             if (item == null)
@@ -833,10 +833,10 @@ namespace Jellyfin.Api.Controllers
             [FromRoute, Required] ImageType imageType,
             [FromRoute, Required] string tag,
             [FromRoute, Required] string format,
-            [FromRoute, Required] int? maxWidth,
-            [FromRoute, Required] int? maxHeight,
-            [FromRoute, Required] double? percentPlayed,
-            [FromRoute, Required] int? unplayedCount,
+            [FromQuery] int? maxWidth,
+            [FromQuery] int? maxHeight,
+            [FromQuery] double? percentPlayed,
+            [FromQuery] int? unplayedCount,
             [FromQuery] int? width,
             [FromQuery] int? height,
             [FromQuery] int? quality,
@@ -845,7 +845,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var item = _libraryManager.GetStudio(name);
             if (item == null)
@@ -924,7 +924,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? blur,
             [FromQuery] string? backgroundColor,
             [FromQuery] string? foregroundLayer,
-            [FromRoute, Required] int? imageIndex = null)
+            [FromRoute] int? imageIndex = null)
         {
             var user = _userManager.GetUserById(userId);
             if (user == null)

+ 1 - 1
Jellyfin.Api/Controllers/InstantMixController.cs

@@ -175,7 +175,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("MusicGenres/{name}/InstantMix")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         public ActionResult<QueryResult<BaseItemDto>> GetInstantMixFromMusicGenre(
-            [FromRoute, Required] string? name,
+            [FromRoute, Required] string name,
             [FromQuery] Guid? userId,
             [FromQuery] int? limit,
             [FromQuery] string? fields,

+ 1 - 1
Jellyfin.Api/Controllers/ItemUpdateController.cs

@@ -195,7 +195,7 @@ namespace Jellyfin.Api.Controllers
         [HttpPost("Items/{itemId}/ContentType")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult UpdateItemContentType([FromRoute, Required] Guid itemId, [FromQuery, Required] string? contentType)
+        public ActionResult UpdateItemContentType([FromRoute, Required] Guid itemId, [FromQuery] string contentType)
         {
             var item = _libraryManager.GetItemById(itemId);
             if (item == null)

+ 1 - 1
Jellyfin.Api/Controllers/ItemsController.cs

@@ -145,7 +145,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("Users/{uId}/Items", Name = "GetItems_2")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         public ActionResult<QueryResult<BaseItemDto>> GetItems(
-            [FromRoute, Required] Guid? uId,
+            [FromRoute] Guid? uId,
             [FromQuery] Guid? userId,
             [FromQuery] string? maxOfficialRating,
             [FromQuery] bool? hasThemeSong,

+ 1 - 1
Jellyfin.Api/Controllers/LibraryController.cs

@@ -556,7 +556,7 @@ namespace Jellyfin.Api.Controllers
         [HttpPost("Library/Movies/Updated")]
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public ActionResult PostUpdatedMovies([FromRoute, Required] string? tmdbId, [FromRoute, Required] string? imdbId)
+        public ActionResult PostUpdatedMovies([FromQuery] string? tmdbId, [FromQuery] string? imdbId)
         {
             var movies = _libraryManager.GetItemList(new InternalItemsQuery
             {

+ 1 - 1
Jellyfin.Api/Controllers/LiveTvController.cs

@@ -936,7 +936,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         [Obsolete("This endpoint is obsolete.")]
-        public ActionResult<BaseItemDto> GetRecordingGroup([FromRoute, Required] Guid? groupId)
+        public ActionResult<BaseItemDto> GetRecordingGroup([FromRoute, Required] Guid groupId)
         {
             return NotFound();
         }

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

@@ -70,7 +70,7 @@ namespace Jellyfin.Api.Controllers
         /// <returns>A <see cref="Task"/> containing a <see cref="PlaybackInfoResponse"/> with the playback information.</returns>
         [HttpGet("Items/{itemId}/PlaybackInfo")]
         [ProducesResponseType(StatusCodes.Status200OK)]
-        public async Task<ActionResult<PlaybackInfoResponse>> GetPlaybackInfo([FromRoute, Required] Guid itemId, [FromQuery, Required] Guid? userId)
+        public async Task<ActionResult<PlaybackInfoResponse>> GetPlaybackInfo([FromRoute, Required] Guid itemId, [FromQuery, Required] Guid userId)
         {
             return await _mediaInfoHelper.GetPlaybackInfo(
                     itemId,
@@ -271,7 +271,7 @@ namespace Jellyfin.Api.Controllers
         /// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
         [HttpPost("LiveStreams/Close")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public async Task<ActionResult> CloseLiveStream([FromQuery, Required] string? liveStreamId)
+        public async Task<ActionResult> CloseLiveStream([FromQuery, Required] string liveStreamId)
         {
             await _mediaSourceManager.CloseLiveStream(liveStreamId).ConfigureAwait(false);
             return NoContent();

+ 2 - 2
Jellyfin.Api/Controllers/PackageController.cs

@@ -44,7 +44,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("Packages/{name}")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         public async Task<ActionResult<PackageInfo>> GetPackageInfo(
-            [FromRoute, Required] string? name,
+            [FromRoute, Required] string name,
             [FromQuery] string? assemblyGuid)
         {
             var packages = await _installationManager.GetAvailablePackages().ConfigureAwait(false);
@@ -85,7 +85,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         [Authorize(Policy = Policies.RequiresElevation)]
         public async Task<ActionResult> InstallPackage(
-            [FromRoute, Required] string? name,
+            [FromRoute, Required] string name,
             [FromQuery] string? assemblyGuid,
             [FromQuery] string? version)
         {

+ 11 - 11
Jellyfin.Api/Controllers/PlaylistsController.cs

@@ -103,8 +103,8 @@ namespace Jellyfin.Api.Controllers
         [HttpPost("{playlistId}/Items/{itemId}/Move/{newIndex}")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public async Task<ActionResult> MoveItem(
-            [FromRoute, Required] string? playlistId,
-            [FromRoute, Required] string? itemId,
+            [FromRoute, Required] string playlistId,
+            [FromRoute, Required] string itemId,
             [FromRoute, Required] int newIndex)
         {
             await _playlistManager.MoveItemAsync(playlistId, itemId, newIndex).ConfigureAwait(false);
@@ -120,7 +120,7 @@ namespace Jellyfin.Api.Controllers
         /// <returns>An <see cref="NoContentResult"/> on success.</returns>
         [HttpDelete("{playlistId}/Items")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
-        public async Task<ActionResult> RemoveFromPlaylist([FromRoute, Required] string? playlistId, [FromQuery] string? entryIds)
+        public async Task<ActionResult> RemoveFromPlaylist([FromRoute, Required] string playlistId, [FromQuery] string? entryIds)
         {
             await _playlistManager.RemoveFromPlaylistAsync(playlistId, RequestHelpers.Split(entryIds, ',', true)).ConfigureAwait(false);
             return NoContent();
@@ -144,14 +144,14 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("{playlistId}/Items")]
         public ActionResult<QueryResult<BaseItemDto>> GetPlaylistItems(
             [FromRoute, Required] Guid playlistId,
-            [FromRoute, Required] Guid userId,
-            [FromRoute, Required] int? startIndex,
-            [FromRoute, Required] int? limit,
-            [FromRoute, Required] string? fields,
-            [FromRoute, Required] bool? enableImages,
-            [FromRoute, Required] bool? enableUserData,
-            [FromRoute, Required] int? imageTypeLimit,
-            [FromRoute, Required] string? enableImageTypes)
+            [FromQuery, Required] Guid userId,
+            [FromQuery] int? startIndex,
+            [FromQuery] int? limit,
+            [FromQuery] string? fields,
+            [FromQuery] bool? enableImages,
+            [FromQuery] bool? enableUserData,
+            [FromQuery] int? imageTypeLimit,
+            [FromQuery] string? enableImageTypes)
         {
             var playlist = (Playlist)_libraryManager.GetItemById(playlistId);
             if (playlist == null)

+ 2 - 2
Jellyfin.Api/Controllers/PluginsController.cs

@@ -172,7 +172,7 @@ namespace Jellyfin.Api.Controllers
         [Obsolete("This endpoint should not be used.")]
         [HttpPost("RegistrationRecords/{name}")]
         [ProducesResponseType(StatusCodes.Status200OK)]
-        public ActionResult<MBRegistrationRecord> GetRegistrationStatus([FromRoute, Required] string? name)
+        public ActionResult<MBRegistrationRecord> GetRegistrationStatus([FromRoute, Required] string name)
         {
             return new MBRegistrationRecord
             {
@@ -194,7 +194,7 @@ namespace Jellyfin.Api.Controllers
         [Obsolete("Paid plugins are not supported")]
         [HttpGet("Registrations/{name}")]
         [ProducesResponseType(StatusCodes.Status501NotImplemented)]
-        public ActionResult GetRegistration([FromRoute, Required] string? name)
+        public ActionResult GetRegistration([FromRoute, Required] string name)
         {
             // TODO Once we have proper apps and plugins and decide to break compatibility with paid plugins,
             // delete all these registration endpoints. They are only kept for compatibility.

+ 4 - 4
Jellyfin.Api/Controllers/ScheduledTasksController.cs

@@ -71,7 +71,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("{taskId}")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult<TaskInfo> GetTask([FromRoute, Required] string? taskId)
+        public ActionResult<TaskInfo> GetTask([FromRoute, Required] string taskId)
         {
             var task = _taskManager.ScheduledTasks.FirstOrDefault(i =>
                 string.Equals(i.Id, taskId, StringComparison.OrdinalIgnoreCase));
@@ -94,7 +94,7 @@ namespace Jellyfin.Api.Controllers
         [HttpPost("Running/{taskId}")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult StartTask([FromRoute, Required] string? taskId)
+        public ActionResult StartTask([FromRoute, Required] string taskId)
         {
             var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>
                 o.Id.Equals(taskId, StringComparison.OrdinalIgnoreCase));
@@ -118,7 +118,7 @@ namespace Jellyfin.Api.Controllers
         [HttpDelete("Running/{taskId}")]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
-        public ActionResult StopTask([FromRoute, Required] string? taskId)
+        public ActionResult StopTask([FromRoute, Required] string taskId)
         {
             var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>
                 o.Id.Equals(taskId, StringComparison.OrdinalIgnoreCase));
@@ -144,7 +144,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         public ActionResult UpdateTask(
-            [FromRoute, Required] string? taskId,
+            [FromRoute, Required] string taskId,
             [FromBody, Required] TaskTriggerInfo[] triggerInfos)
         {
             var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>

+ 1 - 1
Jellyfin.Api/Controllers/SearchController.cs

@@ -81,7 +81,7 @@ namespace Jellyfin.Api.Controllers
             [FromQuery] int? startIndex,
             [FromQuery] int? limit,
             [FromQuery] Guid? userId,
-            [FromQuery, Required] string? searchTerm,
+            [FromQuery, Required] string searchTerm,
             [FromQuery] string? includeItemTypes,
             [FromQuery] string? excludeItemTypes,
             [FromQuery] string? mediaTypes,

+ 23 - 23
Jellyfin.Api/Controllers/SessionController.cs

@@ -125,10 +125,10 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult DisplayContent(
-            [FromRoute, Required] string? sessionId,
-            [FromQuery, Required] string? itemType,
-            [FromQuery, Required] string? itemId,
-            [FromQuery, Required] string? itemName)
+            [FromRoute, Required] string sessionId,
+            [FromQuery, Required] string itemType,
+            [FromQuery, Required] string itemId,
+            [FromQuery, Required] string itemName)
         {
             var command = new BrowseRequest
             {
@@ -150,25 +150,25 @@ namespace Jellyfin.Api.Controllers
         /// Instructs a session to play an item.
         /// </summary>
         /// <param name="sessionId">The session id.</param>
+        /// <param name="command">The type of play command to issue (PlayNow, PlayNext, PlayLast). Clients who have not yet implemented play next and play last may play now.</param>
         /// <param name="itemIds">The ids of the items to play, comma delimited.</param>
         /// <param name="startPositionTicks">The starting position of the first item.</param>
-        /// <param name="playCommand">The type of play command to issue (PlayNow, PlayNext, PlayLast). Clients who have not yet implemented play next and play last may play now.</param>
         /// <response code="204">Instruction sent to session.</response>
         /// <returns>A <see cref="NoContentResult"/>.</returns>
-        [HttpPost("Sessions/{sessionId}/Playing")]
+        [HttpPost("Sessions/{sessionId}/Playing/{command}")]
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult Play(
-            [FromRoute, Required] string? sessionId,
+            [FromRoute, Required] string sessionId,
+            [FromRoute, Required] PlayCommand command,
             [FromQuery] Guid[] itemIds,
-            [FromQuery] long? startPositionTicks,
-            [FromQuery] PlayCommand playCommand)
+            [FromQuery] long? startPositionTicks)
         {
             var playRequest = new PlayRequest
             {
                 ItemIds = itemIds,
                 StartPositionTicks = startPositionTicks,
-                PlayCommand = playCommand
+                PlayCommand = command
             };
 
             _sessionManager.SendPlayCommand(
@@ -187,11 +187,11 @@ namespace Jellyfin.Api.Controllers
         /// <param name="playstateRequest">The <see cref="PlaystateRequest"/>.</param>
         /// <response code="204">Playstate command sent to session.</response>
         /// <returns>A <see cref="NoContentResult"/>.</returns>
-        [HttpPost("Sessions/{sessionId}/Playing/{command}")]
+        [HttpPost("Sessions/{sessionId}/Playing")]
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult SendPlaystateCommand(
-            [FromRoute, Required] string? sessionId,
+            [FromRoute, Required] string sessionId,
             [FromBody] PlaystateRequest playstateRequest)
         {
             _sessionManager.SendPlaystateCommand(
@@ -214,8 +214,8 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult SendSystemCommand(
-            [FromRoute, Required] string? sessionId,
-            [FromRoute, Required] string? command)
+            [FromRoute, Required] string sessionId,
+            [FromRoute, Required] string command)
         {
             var name = command;
             if (Enum.TryParse(name, true, out GeneralCommandType commandType))
@@ -246,8 +246,8 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult SendGeneralCommand(
-            [FromRoute, Required] string? sessionId,
-            [FromRoute, Required] string? command)
+            [FromRoute, Required] string sessionId,
+            [FromRoute, Required] string command)
         {
             var currentSession = RequestHelpers.GetSession(_sessionManager, _authContext, Request);
 
@@ -273,7 +273,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult SendFullGeneralCommand(
-            [FromRoute, Required] string? sessionId,
+            [FromRoute, Required] string sessionId,
             [FromBody, Required] GeneralCommand command)
         {
             var currentSession = RequestHelpers.GetSession(_sessionManager, _authContext, Request);
@@ -307,9 +307,9 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult SendMessageCommand(
-            [FromRoute, Required] string? sessionId,
-            [FromQuery, Required] string? text,
-            [FromQuery, Required] string? header,
+            [FromRoute, Required] string sessionId,
+            [FromQuery, Required] string text,
+            [FromQuery] string? header,
             [FromQuery] long? timeoutMs)
         {
             var command = new MessageCommand
@@ -335,7 +335,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult AddUserToSession(
-            [FromRoute, Required] string? sessionId,
+            [FromRoute, Required] string sessionId,
             [FromRoute, Required] Guid userId)
         {
             _sessionManager.AddAdditionalUser(sessionId, userId);
@@ -353,7 +353,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult RemoveUserFromSession(
-            [FromRoute, Required] string? sessionId,
+            [FromRoute, Required] string sessionId,
             [FromRoute, Required] Guid userId)
         {
             _sessionManager.RemoveAdditionalUser(sessionId, userId);
@@ -375,7 +375,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.DefaultAuthorization)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public ActionResult PostCapabilities(
-            [FromQuery, Required] string? id,
+            [FromQuery] string? id,
             [FromQuery] string? playableMediaTypes,
             [FromQuery] string? supportedCommands,
             [FromQuery] bool supportsMediaControl = false,

+ 7 - 7
Jellyfin.Api/Controllers/SubtitleController.cs

@@ -114,7 +114,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status200OK)]
         public async Task<ActionResult<IEnumerable<RemoteSubtitleInfo>>> SearchRemoteSubtitles(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? language,
+            [FromRoute, Required] string language,
             [FromQuery] bool? isPerfectMatch)
         {
             var video = (Video)_libraryManager.GetItemById(itemId);
@@ -134,7 +134,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         public async Task<ActionResult> DownloadRemoteSubtitles(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? subtitleId)
+            [FromRoute, Required] string subtitleId)
         {
             var video = (Video)_libraryManager.GetItemById(itemId);
 
@@ -164,7 +164,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status200OK)]
         [Produces(MediaTypeNames.Application.Octet)]
         [ProducesFile("text/*")]
-        public async Task<ActionResult> GetRemoteSubtitles([FromRoute, Required] string? id)
+        public async Task<ActionResult> GetRemoteSubtitles([FromRoute, Required] string id)
         {
             var result = await _subtitleManager.GetRemoteSubtitles(id, CancellationToken.None).ConfigureAwait(false);
 
@@ -190,13 +190,13 @@ namespace Jellyfin.Api.Controllers
         [ProducesFile("text/*")]
         public async Task<ActionResult> GetSubtitle(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? mediaSourceId,
+            [FromRoute, Required] string mediaSourceId,
             [FromRoute, Required] int index,
-            [FromRoute, Required] string? format,
+            [FromRoute, Required] string format,
             [FromQuery] long? endPositionTicks,
             [FromQuery] bool copyTimestamps = false,
             [FromQuery] bool addVttTimeMap = false,
-            [FromRoute, Required] long startPositionTicks = 0)
+            [FromRoute] long startPositionTicks = 0)
         {
             if (string.Equals(format, "js", StringComparison.OrdinalIgnoreCase))
             {
@@ -258,7 +258,7 @@ namespace Jellyfin.Api.Controllers
         public async Task<ActionResult> GetSubtitlePlaylist(
             [FromRoute, Required] Guid itemId,
             [FromRoute, Required] int index,
-            [FromRoute, Required] string? mediaSourceId,
+            [FromRoute, Required] string mediaSourceId,
             [FromQuery, Required] int segmentLength)
         {
             var item = (Video)_libraryManager.GetItemById(itemId);

+ 1 - 1
Jellyfin.Api/Controllers/SystemController.cs

@@ -194,7 +194,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesFile(MediaTypeNames.Text.Plain)]
-        public ActionResult GetLogFile([FromQuery, Required] string? name)
+        public ActionResult GetLogFile([FromQuery, Required] string name)
         {
             var file = _fileSystem.GetFiles(_appPaths.LogDirectoryPath)
                 .First(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase));

+ 6 - 6
Jellyfin.Api/Controllers/TvShowsController.cs

@@ -69,7 +69,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("NextUp")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         public ActionResult<QueryResult<BaseItemDto>> GetNextUp(
-            [FromQuery, Required] Guid? userId,
+            [FromQuery] Guid? userId,
             [FromQuery] int? startIndex,
             [FromQuery] int? limit,
             [FromQuery] string? fields,
@@ -127,7 +127,7 @@ namespace Jellyfin.Api.Controllers
         [HttpGet("Upcoming")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         public ActionResult<QueryResult<BaseItemDto>> GetUpcomingEpisodes(
-            [FromQuery, Required] Guid? userId,
+            [FromQuery] Guid? userId,
             [FromQuery] int? startIndex,
             [FromQuery] int? limit,
             [FromQuery] string? fields,
@@ -194,8 +194,8 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         public ActionResult<QueryResult<BaseItemDto>> GetEpisodes(
-            [FromRoute, Required] string? seriesId,
-            [FromQuery, Required] Guid? userId,
+            [FromRoute, Required] string seriesId,
+            [FromQuery] Guid? userId,
             [FromQuery] string? fields,
             [FromQuery] int? season,
             [FromQuery] string? seasonId,
@@ -317,8 +317,8 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         public ActionResult<QueryResult<BaseItemDto>> GetSeasons(
-            [FromRoute, Required] string? seriesId,
-            [FromQuery, Required] Guid? userId,
+            [FromRoute, Required] string seriesId,
+            [FromQuery] Guid? userId,
             [FromQuery] string? fields,
             [FromQuery] bool? isSpecialSeason,
             [FromQuery] bool? isMissing,

+ 1 - 1
Jellyfin.Api/Controllers/UniversalAudioController.cs

@@ -97,7 +97,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesAudioFile]
         public async Task<ActionResult> GetUniversalAudioStream(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromRoute] string? container,
             [FromQuery] string? mediaSourceId,
             [FromQuery] string? deviceId,
             [FromQuery] Guid? userId,

+ 1 - 1
Jellyfin.Api/Controllers/UserController.cs

@@ -157,7 +157,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesResponseType(StatusCodes.Status404NotFound)]
         public async Task<ActionResult<AuthenticationResult>> AuthenticateUser(
             [FromRoute, Required] Guid userId,
-            [FromQuery, Required] string? pw,
+            [FromQuery, Required] string pw,
             [FromQuery] string? password)
         {
             var user = _userManager.GetUserById(userId);

+ 2 - 2
Jellyfin.Api/Controllers/VideosController.cs

@@ -203,7 +203,7 @@ namespace Jellyfin.Api.Controllers
         [Authorize(Policy = Policies.RequiresElevation)]
         [ProducesResponseType(StatusCodes.Status204NoContent)]
         [ProducesResponseType(StatusCodes.Status400BadRequest)]
-        public async Task<ActionResult> MergeVersions([FromQuery, Required] string? itemIds)
+        public async Task<ActionResult> MergeVersions([FromQuery, Required] string itemIds)
         {
             var items = RequestHelpers.Split(itemIds, ',', true)
                 .Select(i => _libraryManager.GetItemById(i))
@@ -334,7 +334,7 @@ namespace Jellyfin.Api.Controllers
         [ProducesVideoFile]
         public async Task<ActionResult> GetVideoStream(
             [FromRoute, Required] Guid itemId,
-            [FromRoute, Required] string? container,
+            [FromRoute] string? container,
             [FromQuery] bool? @static,
             [FromQuery] string? @params,
             [FromQuery] string? tag,