Merge pull request #3466 from crobibero/api-migration-nullable
Make all optional strings nullable
This commit is contained in:
commit
dbf939467f
|
@ -53,7 +53,7 @@ namespace Jellyfin.Api.Controllers
|
|||
public ActionResult<QueryResult<BaseItemDto>> GetSimilarAlbums(
|
||||
[FromRoute] string albumId,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] string excludeArtistIds,
|
||||
[FromQuery] string? excludeArtistIds,
|
||||
[FromQuery] int? limit)
|
||||
{
|
||||
var dtoOptions = new DtoOptions().AddClientFields(Request);
|
||||
|
@ -85,7 +85,7 @@ namespace Jellyfin.Api.Controllers
|
|||
public ActionResult<QueryResult<BaseItemDto>> GetSimilarArtists(
|
||||
[FromRoute] string artistId,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] string excludeArtistIds,
|
||||
[FromQuery] string? excludeArtistIds,
|
||||
[FromQuery] int? limit)
|
||||
{
|
||||
var dtoOptions = new DtoOptions().AddClientFields(Request);
|
||||
|
|
|
@ -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] string key)
|
||||
public ActionResult RevokeKey([FromRoute] string? key)
|
||||
{
|
||||
_sessionManager.RevokeToken(key);
|
||||
return NoContent();
|
||||
|
|
|
@ -51,8 +51,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<CollectionCreationResult> CreateCollection(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string ids,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] string? ids,
|
||||
[FromQuery] bool isLocked,
|
||||
[FromQuery] Guid? parentId)
|
||||
{
|
||||
|
@ -86,7 +86,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
|
||||
[HttpPost("{collectionId}/Items")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult AddToCollection([FromRoute] Guid collectionId, [FromQuery] string itemIds)
|
||||
public ActionResult AddToCollection([FromRoute] Guid collectionId, [FromQuery] string? itemIds)
|
||||
{
|
||||
_collectionManager.AddToCollection(collectionId, RequestHelpers.Split(itemIds, ',', true));
|
||||
return NoContent();
|
||||
|
@ -101,7 +101,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
|
||||
[HttpDelete("{collectionId}/Items")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult RemoveFromCollection([FromRoute] Guid collectionId, [FromQuery] string itemIds)
|
||||
public ActionResult RemoveFromCollection([FromRoute] Guid collectionId, [FromQuery] string? itemIds)
|
||||
{
|
||||
_collectionManager.RemoveFromCollection(collectionId, RequestHelpers.Split(itemIds, ',', true));
|
||||
return NoContent();
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>Configuration.</returns>
|
||||
[HttpGet("Configuration/{key}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<object> GetNamedConfiguration([FromRoute] string key)
|
||||
public ActionResult<object> GetNamedConfiguration([FromRoute] string? key)
|
||||
{
|
||||
return _configurationManager.GetConfiguration(key);
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("Configuration/{key}")]
|
||||
[Authorize(Policy = Policies.RequiresElevation)]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public async Task<ActionResult> UpdateNamedConfiguration([FromRoute] string key)
|
||||
public async Task<ActionResult> UpdateNamedConfiguration([FromRoute] string? key)
|
||||
{
|
||||
var configurationType = _configurationManager.GetConfigurationType(key);
|
||||
var configuration = await JsonSerializer.DeserializeAsync(Request.Body, configurationType).ConfigureAwait(false);
|
||||
|
|
|
@ -122,7 +122,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("/web/ConfigurationPage")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GetDashboardConfigurationPage([FromQuery] string name)
|
||||
public ActionResult GetDashboardConfigurationPage([FromQuery] string? name)
|
||||
{
|
||||
IPlugin? plugin = null;
|
||||
Stream? stream = null;
|
||||
|
|
|
@ -65,7 +65,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[Authorize(Policy = Policies.RequiresElevation)]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<DeviceInfo> GetDeviceInfo([FromQuery, BindRequired] string id)
|
||||
public ActionResult<DeviceInfo> GetDeviceInfo([FromQuery, BindRequired] 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, BindRequired] string id)
|
||||
public ActionResult<DeviceOptions> GetDeviceOptions([FromQuery, BindRequired] 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, BindRequired] string id,
|
||||
[FromQuery, BindRequired] string? id,
|
||||
[FromBody, BindRequired] 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, BindRequired] string id)
|
||||
public ActionResult DeleteDevice([FromQuery, BindRequired] string? id)
|
||||
{
|
||||
var existingDevice = _deviceManager.GetDevice(id);
|
||||
if (existingDevice == null)
|
||||
|
|
|
@ -39,9 +39,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("{displayPreferencesId}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<DisplayPreferences> GetDisplayPreferences(
|
||||
[FromRoute] string displayPreferencesId,
|
||||
[FromQuery] [Required] string userId,
|
||||
[FromQuery] [Required] string client)
|
||||
[FromRoute] string? displayPreferencesId,
|
||||
[FromQuery] [Required] string? userId,
|
||||
[FromQuery] [Required] string? client)
|
||||
{
|
||||
return _displayPreferencesRepository.GetDisplayPreferences(displayPreferencesId, userId, client);
|
||||
}
|
||||
|
@ -59,9 +59,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "displayPreferencesId", Justification = "Imported from ServiceStack")]
|
||||
public ActionResult UpdateDisplayPreferences(
|
||||
[FromRoute] string displayPreferencesId,
|
||||
[FromQuery, BindRequired] string userId,
|
||||
[FromQuery, BindRequired] string client,
|
||||
[FromRoute] string? displayPreferencesId,
|
||||
[FromQuery, BindRequired] string? userId,
|
||||
[FromQuery, BindRequired] string? client,
|
||||
[FromBody, BindRequired] DisplayPreferences displayPreferences)
|
||||
{
|
||||
_displayPreferencesRepository.SaveDisplayPreferences(
|
||||
|
|
|
@ -64,7 +64,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[Produces(MediaTypeNames.Application.Octet)]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<FileStreamResult> GetGeneralImage([FromRoute] string name, [FromRoute] string type)
|
||||
public ActionResult<FileStreamResult> GetGeneralImage([FromRoute] string? name, [FromRoute] string? type)
|
||||
{
|
||||
var filename = string.Equals(type, "primary", StringComparison.OrdinalIgnoreCase)
|
||||
? "folder"
|
||||
|
@ -110,8 +110,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<FileStreamResult> GetRatingImage(
|
||||
[FromRoute] string theme,
|
||||
[FromRoute] string name)
|
||||
[FromRoute] string? theme,
|
||||
[FromRoute] string? name)
|
||||
{
|
||||
return GetImageFile(_applicationPaths.RatingsPath, theme, name);
|
||||
}
|
||||
|
@ -143,8 +143,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<FileStreamResult> GetMediaInfoImage(
|
||||
[FromRoute] string theme,
|
||||
[FromRoute] string name)
|
||||
[FromRoute] string? theme,
|
||||
[FromRoute] string? name)
|
||||
{
|
||||
return GetImageFile(_applicationPaths.MediaInfoImagesPath, theme, name);
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <param name="theme">Theme to search.</param>
|
||||
/// <param name="name">File name to search for.</param>
|
||||
/// <returns>A <see cref="FileStreamResult"/> containing the image contents on success, or a <see cref="NotFoundResult"/> if the image could not be found.</returns>
|
||||
private ActionResult<FileStreamResult> GetImageFile(string basePath, string theme, string name)
|
||||
private ActionResult<FileStreamResult> GetImageFile(string basePath, string? theme, string? name)
|
||||
{
|
||||
var themeFolder = Path.Combine(basePath, theme);
|
||||
if (Directory.Exists(themeFolder))
|
||||
|
|
|
@ -65,7 +65,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid id,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
@ -100,7 +100,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid id,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
@ -135,7 +135,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid id,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
@ -167,10 +167,10 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("/MusicGenres/{name}/InstantMix")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<QueryResult<BaseItemDto>> GetInstantMixFromMusicGenre(
|
||||
[FromRoute] string name,
|
||||
[FromRoute] string? name,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
@ -204,7 +204,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid id,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
@ -239,7 +239,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid id,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
@ -274,7 +274,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid id,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
|
|
|
@ -193,7 +193,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Items/{itemId}/ContentType")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult UpdateItemContentType([FromRoute] Guid itemId, [FromQuery, BindRequired] string contentType)
|
||||
public ActionResult UpdateItemContentType([FromRoute] Guid itemId, [FromQuery, BindRequired] string? contentType)
|
||||
{
|
||||
var item = _libraryManager.GetItemById(itemId);
|
||||
if (item == null)
|
||||
|
|
|
@ -524,7 +524,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Library/Series/Updated")]
|
||||
[Authorize(Policy = Policies.DefaultAuthorization)]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult PostUpdatedSeries([FromQuery] string tvdbId)
|
||||
public ActionResult PostUpdatedSeries([FromQuery] string? tvdbId)
|
||||
{
|
||||
var series = _libraryManager.GetItemList(new InternalItemsQuery
|
||||
{
|
||||
|
@ -554,7 +554,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Library/Movies/Updated")]
|
||||
[Authorize(Policy = Policies.DefaultAuthorization)]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult PostUpdatedMovies([FromRoute] string tmdbId, [FromRoute] string imdbId)
|
||||
public ActionResult PostUpdatedMovies([FromRoute] string? tmdbId, [FromRoute] string? imdbId)
|
||||
{
|
||||
var movies = _libraryManager.GetItemList(new InternalItemsQuery
|
||||
{
|
||||
|
@ -687,10 +687,10 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<QueryResult<BaseItemDto>> GetSimilarItems(
|
||||
[FromRoute] Guid itemId,
|
||||
[FromQuery] string excludeArtistIds,
|
||||
[FromQuery] string? excludeArtistIds,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string fields)
|
||||
[FromQuery] string? fields)
|
||||
{
|
||||
var item = itemId.Equals(Guid.Empty)
|
||||
? (!userId.Equals(Guid.Empty)
|
||||
|
@ -737,7 +737,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("/Libraries/AvailableOptions")]
|
||||
[Authorize(Policy = Policies.FirstTimeSetupOrElevated)]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<LibraryOptionsResultDto> GetLibraryOptionsInfo([FromQuery] string libraryContentType, [FromQuery] bool isNewLibrary)
|
||||
public ActionResult<LibraryOptionsResultDto> GetLibraryOptionsInfo([FromQuery] string? libraryContentType, [FromQuery] bool isNewLibrary)
|
||||
{
|
||||
var result = new LibraryOptionsResultDto();
|
||||
|
||||
|
@ -877,10 +877,10 @@ namespace Jellyfin.Api.Controllers
|
|||
|
||||
private QueryResult<BaseItemDto> GetSimilarItemsResult(
|
||||
BaseItem item,
|
||||
string excludeArtistIds,
|
||||
string? excludeArtistIds,
|
||||
Guid userId,
|
||||
int? limit,
|
||||
string fields,
|
||||
string? fields,
|
||||
string[] includeItemTypes,
|
||||
bool isMovie)
|
||||
{
|
||||
|
@ -942,7 +942,7 @@ namespace Jellyfin.Api.Controllers
|
|||
return result;
|
||||
}
|
||||
|
||||
private static string[] GetRepresentativeItemTypes(string contentType)
|
||||
private static string[] GetRepresentativeItemTypes(string? contentType)
|
||||
{
|
||||
return contentType switch
|
||||
{
|
||||
|
|
|
@ -72,8 +72,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public async Task<ActionResult> AddVirtualFolder(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string collectionType,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] string? collectionType,
|
||||
[FromQuery] bool refreshLibrary,
|
||||
[FromQuery] string[] paths,
|
||||
[FromQuery] LibraryOptions libraryOptions)
|
||||
|
@ -100,7 +100,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpDelete]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public async Task<ActionResult> RemoveVirtualFolder(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] bool refreshLibrary)
|
||||
{
|
||||
await _libraryManager.RemoveVirtualFolder(name, refreshLibrary).ConfigureAwait(false);
|
||||
|
@ -123,8 +123,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
||||
public ActionResult RenameVirtualFolder(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string newName,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] string? newName,
|
||||
[FromQuery] bool refreshLibrary)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
|
@ -205,8 +205,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("Paths")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult AddMediaPath(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string path,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] string? path,
|
||||
[FromQuery] MediaPathInfo pathInfo,
|
||||
[FromQuery] bool refreshLibrary)
|
||||
{
|
||||
|
@ -256,7 +256,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("Paths/Update")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult UpdateMediaPath(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] MediaPathInfo pathInfo)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
|
@ -280,8 +280,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpDelete("Paths")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult RemoveMediaPath(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string path,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] string? path,
|
||||
[FromQuery] bool refreshLibrary)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
|
@ -327,7 +327,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("LibraryOptions")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult UpdateLibraryOptions(
|
||||
[FromQuery] string id,
|
||||
[FromQuery] string? id,
|
||||
[FromQuery] LibraryOptions libraryOptions)
|
||||
{
|
||||
var collectionFolder = (CollectionFolder)_libraryManager.GetItemById(id);
|
||||
|
|
|
@ -93,8 +93,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("Admin")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult CreateAdminNotification(
|
||||
[FromQuery] string name,
|
||||
[FromQuery] string description,
|
||||
[FromQuery] string? name,
|
||||
[FromQuery] string? description,
|
||||
[FromQuery] string? url,
|
||||
[FromQuery] NotificationLevel? level)
|
||||
{
|
||||
|
|
|
@ -40,7 +40,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("/{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);
|
||||
|
@ -80,9 +80,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[Authorize(Policy = Policies.RequiresElevation)]
|
||||
public async Task<ActionResult> InstallPackage(
|
||||
[FromRoute] [Required] string name,
|
||||
[FromQuery] string assemblyGuid,
|
||||
[FromQuery] string version)
|
||||
[FromRoute] [Required] string? name,
|
||||
[FromQuery] string? assemblyGuid,
|
||||
[FromQuery] string? version)
|
||||
{
|
||||
var packages = await _installationManager.GetAvailablePackages().ConfigureAwait(false);
|
||||
var package = _installationManager.GetCompatibleVersions(
|
||||
|
|
|
@ -84,8 +84,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("{playlistId}/Items")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult AddToPlaylist(
|
||||
[FromRoute] string playlistId,
|
||||
[FromQuery] string ids,
|
||||
[FromRoute] string? playlistId,
|
||||
[FromQuery] string? ids,
|
||||
[FromQuery] Guid userId)
|
||||
{
|
||||
_playlistManager.AddToPlaylist(playlistId, RequestHelpers.GetGuids(ids), userId);
|
||||
|
@ -103,8 +103,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("{playlistId}/Items/{itemId}/Move/{newIndex}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult MoveItem(
|
||||
[FromRoute] string playlistId,
|
||||
[FromRoute] string itemId,
|
||||
[FromRoute] string? playlistId,
|
||||
[FromRoute] string? itemId,
|
||||
[FromRoute] int newIndex)
|
||||
{
|
||||
_playlistManager.MoveItem(playlistId, itemId, newIndex);
|
||||
|
@ -120,7 +120,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>An <see cref="NoContentResult"/> on success.</returns>
|
||||
[HttpDelete("{playlistId}/Items")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult RemoveFromPlaylist([FromRoute] string playlistId, [FromQuery] string entryIds)
|
||||
public ActionResult RemoveFromPlaylist([FromRoute] string? playlistId, [FromQuery] string? entryIds)
|
||||
{
|
||||
_playlistManager.RemoveFromPlaylist(playlistId, RequestHelpers.Split(entryIds, ',', true));
|
||||
return NoContent();
|
||||
|
@ -147,11 +147,11 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid userId,
|
||||
[FromRoute] int? startIndex,
|
||||
[FromRoute] int? limit,
|
||||
[FromRoute] string fields,
|
||||
[FromRoute] string? fields,
|
||||
[FromRoute] bool? enableImages,
|
||||
[FromRoute] bool? enableUserData,
|
||||
[FromRoute] int? imageTypeLimit,
|
||||
[FromRoute] string enableImageTypes)
|
||||
[FromRoute] string? enableImageTypes)
|
||||
{
|
||||
var playlist = (Playlist)_libraryManager.GetItemById(playlistId);
|
||||
if (playlist == null)
|
||||
|
|
|
@ -166,7 +166,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[Obsolete("This endpoint should not be used.")]
|
||||
[HttpPost("RegistrationRecords/{name}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<MBRegistrationRecord> GetRegistrationStatus([FromRoute] string name)
|
||||
public ActionResult<MBRegistrationRecord> GetRegistrationStatus([FromRoute] string? name)
|
||||
{
|
||||
return new MBRegistrationRecord
|
||||
{
|
||||
|
@ -188,7 +188,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[Obsolete("Paid plugins are not supported")]
|
||||
[HttpGet("/Registrations/{name}")]
|
||||
[ProducesResponseType(StatusCodes.Status501NotImplemented)]
|
||||
public ActionResult GetRegistration([FromRoute] string name)
|
||||
public ActionResult GetRegistration([FromRoute] 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.
|
||||
|
|
|
@ -208,7 +208,7 @@ namespace Jellyfin.Api.Controllers
|
|||
public async Task<ActionResult> DownloadRemoteImage(
|
||||
[FromRoute] Guid itemId,
|
||||
[FromQuery, BindRequired] ImageType type,
|
||||
[FromQuery] string imageUrl)
|
||||
[FromQuery] string? imageUrl)
|
||||
{
|
||||
var item = _libraryManager.GetItemById(itemId);
|
||||
if (item == null)
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("{taskId}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<TaskInfo> GetTask([FromRoute] string taskId)
|
||||
public ActionResult<TaskInfo> GetTask([FromRoute] 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] string taskId)
|
||||
public ActionResult StartTask([FromRoute] 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] string taskId)
|
||||
public ActionResult StopTask([FromRoute] 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] string taskId,
|
||||
[FromRoute] string? taskId,
|
||||
[FromBody, BindRequired] TaskTriggerInfo[] triggerInfos)
|
||||
{
|
||||
var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>
|
||||
|
|
|
@ -81,11 +81,11 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromQuery] int? startIndex,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery, Required] string searchTerm,
|
||||
[FromQuery] string includeItemTypes,
|
||||
[FromQuery] string excludeItemTypes,
|
||||
[FromQuery] string mediaTypes,
|
||||
[FromQuery] string parentId,
|
||||
[FromQuery, Required] string? searchTerm,
|
||||
[FromQuery] string? includeItemTypes,
|
||||
[FromQuery] string? excludeItemTypes,
|
||||
[FromQuery] string? mediaTypes,
|
||||
[FromQuery] string? parentId,
|
||||
[FromQuery] bool? isMovie,
|
||||
[FromQuery] bool? isSeries,
|
||||
[FromQuery] bool? isNews,
|
||||
|
|
|
@ -62,7 +62,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public ActionResult<IEnumerable<SessionInfo>> GetSessions(
|
||||
[FromQuery] Guid controllableByUserId,
|
||||
[FromQuery] string deviceId,
|
||||
[FromQuery] string? deviceId,
|
||||
[FromQuery] int? activeWithinSeconds)
|
||||
{
|
||||
var result = _sessionManager.Sessions;
|
||||
|
@ -123,10 +123,10 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/Viewing")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult DisplayContent(
|
||||
[FromRoute] string sessionId,
|
||||
[FromQuery] string itemType,
|
||||
[FromQuery] string itemId,
|
||||
[FromQuery] string itemName)
|
||||
[FromRoute] string? sessionId,
|
||||
[FromQuery] string? itemType,
|
||||
[FromQuery] string? itemId,
|
||||
[FromQuery] string? itemName)
|
||||
{
|
||||
var command = new BrowseRequest
|
||||
{
|
||||
|
@ -157,7 +157,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/Playing")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult Play(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string? sessionId,
|
||||
[FromQuery] Guid[] itemIds,
|
||||
[FromQuery] long? startPositionTicks,
|
||||
[FromQuery] PlayCommand playCommand,
|
||||
|
@ -191,7 +191,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/Playing/{command}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult SendPlaystateCommand(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string? sessionId,
|
||||
[FromBody] PlaystateRequest playstateRequest)
|
||||
{
|
||||
_sessionManager.SendPlaystateCommand(
|
||||
|
@ -213,8 +213,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/System/{command}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult SendSystemCommand(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string command)
|
||||
[FromRoute] string? sessionId,
|
||||
[FromRoute] string? command)
|
||||
{
|
||||
var name = command;
|
||||
if (Enum.TryParse(name, true, out GeneralCommandType commandType))
|
||||
|
@ -244,8 +244,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/Command/{Command}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult SendGeneralCommand(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string command)
|
||||
[FromRoute] string? sessionId,
|
||||
[FromRoute] string? command)
|
||||
{
|
||||
var currentSession = RequestHelpers.GetSession(_sessionManager, _authContext, Request);
|
||||
|
||||
|
@ -270,7 +270,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/Command")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult SendFullGeneralCommand(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string? sessionId,
|
||||
[FromBody, Required] GeneralCommand command)
|
||||
{
|
||||
var currentSession = RequestHelpers.GetSession(_sessionManager, _authContext, Request);
|
||||
|
@ -303,9 +303,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/Message")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult SendMessageCommand(
|
||||
[FromRoute] string sessionId,
|
||||
[FromQuery] string text,
|
||||
[FromQuery] string header,
|
||||
[FromRoute] string? sessionId,
|
||||
[FromQuery] string? text,
|
||||
[FromQuery] string? header,
|
||||
[FromQuery] long? timeoutMs)
|
||||
{
|
||||
var command = new MessageCommand
|
||||
|
@ -330,7 +330,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/{sessionId}/User/{userId}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult AddUserToSession(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string? sessionId,
|
||||
[FromRoute] Guid userId)
|
||||
{
|
||||
_sessionManager.AddAdditionalUser(sessionId, userId);
|
||||
|
@ -347,7 +347,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpDelete("/Sessions/{sessionId}/User/{userId}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult RemoveUserFromSession(
|
||||
[FromRoute] string sessionId,
|
||||
[FromRoute] string? sessionId,
|
||||
[FromRoute] Guid userId)
|
||||
{
|
||||
_sessionManager.RemoveAdditionalUser(sessionId, userId);
|
||||
|
@ -368,9 +368,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/Capabilities")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult PostCapabilities(
|
||||
[FromQuery] string id,
|
||||
[FromQuery] string playableMediaTypes,
|
||||
[FromQuery] string supportedCommands,
|
||||
[FromQuery] string? id,
|
||||
[FromQuery] string? playableMediaTypes,
|
||||
[FromQuery] string? supportedCommands,
|
||||
[FromQuery] bool supportsMediaControl,
|
||||
[FromQuery] bool supportsSync,
|
||||
[FromQuery] bool supportsPersistentIdentifier = true)
|
||||
|
@ -401,7 +401,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/Capabilities/Full")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult PostFullCapabilities(
|
||||
[FromQuery] string id,
|
||||
[FromQuery] string? id,
|
||||
[FromBody, Required] ClientCapabilities capabilities)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(id))
|
||||
|
@ -424,8 +424,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("/Sessions/Viewing")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult ReportViewing(
|
||||
[FromQuery] string sessionId,
|
||||
[FromQuery] string itemId)
|
||||
[FromQuery] string? sessionId,
|
||||
[FromQuery] string? itemId)
|
||||
{
|
||||
string session = RequestHelpers.GetSession(_sessionManager, _authContext, Request).Id;
|
||||
|
||||
|
|
|
@ -75,9 +75,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpPost("Configuration")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public ActionResult UpdateInitialConfiguration(
|
||||
[FromForm] string uiCulture,
|
||||
[FromForm] string metadataCountryCode,
|
||||
[FromForm] string preferredMetadataLanguage)
|
||||
[FromForm] string? uiCulture,
|
||||
[FromForm] string? metadataCountryCode,
|
||||
[FromForm] string? preferredMetadataLanguage)
|
||||
{
|
||||
_config.Configuration.UICulture = uiCulture;
|
||||
_config.Configuration.MetadataCountryCode = metadataCountryCode;
|
||||
|
|
|
@ -112,7 +112,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult<IEnumerable<RemoteSubtitleInfo>>> SearchRemoteSubtitles(
|
||||
[FromRoute] Guid itemId,
|
||||
[FromRoute] string language,
|
||||
[FromRoute] string? language,
|
||||
[FromQuery] bool? isPerfectMatch)
|
||||
{
|
||||
var video = (Video)_libraryManager.GetItemById(itemId);
|
||||
|
@ -132,7 +132,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public async Task<ActionResult> DownloadRemoteSubtitles(
|
||||
[FromRoute] Guid itemId,
|
||||
[FromRoute] string subtitleId)
|
||||
[FromRoute] string? subtitleId)
|
||||
{
|
||||
var video = (Video)_libraryManager.GetItemById(itemId);
|
||||
|
||||
|
@ -161,7 +161,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[Authorize(Policy = Policies.DefaultAuthorization)]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[Produces(MediaTypeNames.Application.Octet)]
|
||||
public async Task<ActionResult> GetRemoteSubtitles([FromRoute] string id)
|
||||
public async Task<ActionResult> GetRemoteSubtitles([FromRoute] string? id)
|
||||
{
|
||||
var result = await _subtitleManager.GetRemoteSubtitles(id, CancellationToken.None).ConfigureAwait(false);
|
||||
|
||||
|
@ -186,9 +186,9 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
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,
|
||||
[FromQuery] bool addVttTimeMap,
|
||||
|
@ -254,7 +254,7 @@ namespace Jellyfin.Api.Controllers
|
|||
public async Task<ActionResult> GetSubtitlePlaylist(
|
||||
[FromRoute] Guid itemId,
|
||||
[FromRoute] int index,
|
||||
[FromRoute] string mediaSourceId,
|
||||
[FromRoute] string? mediaSourceId,
|
||||
[FromQuery, Required] int segmentLength)
|
||||
{
|
||||
var item = (Video)_libraryManager.GetItemById(itemId);
|
||||
|
@ -324,7 +324,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>A <see cref="Task{Stream}"/> with the new subtitle file.</returns>
|
||||
private Task<Stream> EncodeSubtitles(
|
||||
Guid id,
|
||||
string mediaSourceId,
|
||||
string? mediaSourceId,
|
||||
int index,
|
||||
string format,
|
||||
long startPositionTicks,
|
||||
|
|
|
@ -193,7 +193,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[HttpGet("Logs/Log")]
|
||||
[Authorize(Policy = Policies.RequiresElevation)]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
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));
|
||||
|
|
|
@ -190,7 +190,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<QueryResult<BaseItemDto>> GetEpisodes(
|
||||
[FromRoute] string seriesId,
|
||||
[FromRoute] string? seriesId,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] int? season,
|
||||
|
@ -311,12 +311,12 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<QueryResult<BaseItemDto>> GetSeasons(
|
||||
[FromRoute] string seriesId,
|
||||
[FromRoute] string? seriesId,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] bool? isSpecialSeason,
|
||||
[FromQuery] bool? isMissing,
|
||||
[FromQuery] string adjacentTo,
|
||||
[FromQuery] string? adjacentTo,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
[FromQuery] string? enableImageTypes,
|
||||
|
|
|
@ -164,8 +164,8 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public async Task<ActionResult<AuthenticationResult>> AuthenticateUser(
|
||||
[FromRoute, Required] Guid userId,
|
||||
[FromQuery, BindRequired] string pw,
|
||||
[FromQuery, BindRequired] string password)
|
||||
[FromQuery, BindRequired] string? pw,
|
||||
[FromQuery, BindRequired] string? password)
|
||||
{
|
||||
var user = _userManager.GetUserById(userId);
|
||||
|
||||
|
@ -483,7 +483,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>A <see cref="Task"/> containing a <see cref="ForgotPasswordResult"/>.</returns>
|
||||
[HttpPost("ForgotPassword")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult<ForgotPasswordResult>> ForgotPassword([FromBody] string enteredUsername)
|
||||
public async Task<ActionResult<ForgotPasswordResult>> ForgotPassword([FromBody] string? enteredUsername)
|
||||
{
|
||||
var isLocal = HttpContext.Connection.RemoteIpAddress.Equals(HttpContext.Connection.LocalIpAddress)
|
||||
|| _networkManager.IsInLocalNetwork(HttpContext.Connection.RemoteIpAddress.ToString());
|
||||
|
@ -501,7 +501,7 @@ namespace Jellyfin.Api.Controllers
|
|||
/// <returns>A <see cref="Task"/> containing a <see cref="PinRedeemResult"/>.</returns>
|
||||
[HttpPost("ForgotPassword/Pin")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult<PinRedeemResult>> ForgotPasswordPin([FromBody] string pin)
|
||||
public async Task<ActionResult<PinRedeemResult>> ForgotPasswordPin([FromBody] string? pin)
|
||||
{
|
||||
var result = await _userManager.RedeemPasswordResetPin(pin).ConfigureAwait(false);
|
||||
return result;
|
||||
|
|
|
@ -265,12 +265,12 @@ namespace Jellyfin.Api.Controllers
|
|||
public ActionResult<IEnumerable<BaseItemDto>> GetLatestMedia(
|
||||
[FromRoute] Guid userId,
|
||||
[FromQuery] Guid parentId,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string includeItemTypes,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] string? includeItemTypes,
|
||||
[FromQuery] bool? isPlayed,
|
||||
[FromQuery] bool? enableImages,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
[FromQuery] string enableImageTypes,
|
||||
[FromQuery] string? enableImageTypes,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int limit = 20,
|
||||
[FromQuery] bool groupItems = true)
|
||||
|
|
|
@ -66,7 +66,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[FromRoute] Guid userId,
|
||||
[FromQuery] bool? includeExternalContent,
|
||||
[FromQuery] bool includeHidden,
|
||||
[FromQuery] string presetViews)
|
||||
[FromQuery] string? presetViews)
|
||||
{
|
||||
var query = new UserViewQuery
|
||||
{
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public async Task<ActionResult<FileStreamResult>> GetAttachment(
|
||||
[FromRoute] Guid videoId,
|
||||
[FromRoute] string mediaSourceId,
|
||||
[FromRoute] string? mediaSourceId,
|
||||
[FromRoute] int index)
|
||||
{
|
||||
try
|
||||
|
|
|
@ -133,7 +133,7 @@ namespace Jellyfin.Api.Controllers
|
|||
[Authorize(Policy = Policies.RequiresElevation)]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
public ActionResult MergeVersions([FromQuery] string itemIds)
|
||||
public ActionResult MergeVersions([FromQuery] string? itemIds)
|
||||
{
|
||||
var items = RequestHelpers.Split(itemIds, ',', true)
|
||||
.Select(i => _libraryManager.GetItemById(i))
|
||||
|
|
|
@ -64,16 +64,16 @@ namespace Jellyfin.Api.Controllers
|
|||
public ActionResult<QueryResult<BaseItemDto>> GetYears(
|
||||
[FromQuery] int? startIndex,
|
||||
[FromQuery] int? limit,
|
||||
[FromQuery] string sortOrder,
|
||||
[FromQuery] string parentId,
|
||||
[FromQuery] string fields,
|
||||
[FromQuery] string excludeItemTypes,
|
||||
[FromQuery] string includeItemTypes,
|
||||
[FromQuery] string mediaTypes,
|
||||
[FromQuery] string sortBy,
|
||||
[FromQuery] string? sortOrder,
|
||||
[FromQuery] string? parentId,
|
||||
[FromQuery] string? fields,
|
||||
[FromQuery] string? excludeItemTypes,
|
||||
[FromQuery] string? includeItemTypes,
|
||||
[FromQuery] string? mediaTypes,
|
||||
[FromQuery] string? sortBy,
|
||||
[FromQuery] bool? enableUserData,
|
||||
[FromQuery] int? imageTypeLimit,
|
||||
[FromQuery] string enableImageTypes,
|
||||
[FromQuery] string? enableImageTypes,
|
||||
[FromQuery] Guid userId,
|
||||
[FromQuery] bool recursive = true,
|
||||
[FromQuery] bool? enableImages = true)
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Jellyfin.Api.Extensions
|
|||
/// <param name="dtoOptions">DtoOptions object.</param>
|
||||
/// <param name="fields">Comma delimited string of fields.</param>
|
||||
/// <returns>Modified DtoOptions object.</returns>
|
||||
internal static DtoOptions AddItemFields(this DtoOptions dtoOptions, string fields)
|
||||
internal static DtoOptions AddItemFields(this DtoOptions dtoOptions, string? fields)
|
||||
{
|
||||
if (string.IsNullOrEmpty(fields))
|
||||
{
|
||||
|
@ -126,7 +126,7 @@ namespace Jellyfin.Api.Extensions
|
|||
bool? enableImages,
|
||||
bool? enableUserData,
|
||||
int? imageTypeLimit,
|
||||
string enableImageTypes)
|
||||
string? enableImageTypes)
|
||||
{
|
||||
dtoOptions.EnableImages = enableImages ?? true;
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace Jellyfin.Api.Helpers
|
|||
/// <param name="separator">The char that separates the substrings.</param>
|
||||
/// <param name="removeEmpty">Option to remove empty substrings from the array.</param>
|
||||
/// <returns>An array of the substrings.</returns>
|
||||
internal static string[] Split(string value, char separator, bool removeEmpty)
|
||||
internal static string[] Split(string? value, char separator, bool removeEmpty)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
|
@ -99,16 +99,14 @@ namespace Jellyfin.Api.Helpers
|
|||
/// <param name="sortBy">Sort by.</param>
|
||||
/// <param name="requestedSortOrder">Sort order.</param>
|
||||
/// <returns>Resulting order by.</returns>
|
||||
internal static ValueTuple<string, SortOrder>[] GetOrderBy(string sortBy, string requestedSortOrder)
|
||||
internal static ValueTuple<string, SortOrder>[] GetOrderBy(string? sortBy, string? requestedSortOrder)
|
||||
{
|
||||
var val = sortBy;
|
||||
|
||||
if (string.IsNullOrEmpty(val))
|
||||
if (string.IsNullOrEmpty(sortBy))
|
||||
{
|
||||
return Array.Empty<ValueTuple<string, SortOrder>>();
|
||||
}
|
||||
|
||||
var vals = val.Split(',');
|
||||
var vals = sortBy.Split(',');
|
||||
if (string.IsNullOrWhiteSpace(requestedSortOrder))
|
||||
{
|
||||
requestedSortOrder = "Ascending";
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Jellyfin.Api.Helpers
|
|||
IDtoService dtoService,
|
||||
Guid userId,
|
||||
string id,
|
||||
string excludeArtistIds,
|
||||
string? excludeArtistIds,
|
||||
int? limit,
|
||||
Type[] includeTypes,
|
||||
Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore)
|
||||
|
|
Loading…
Reference in New Issue
Block a user