Removed all server side processing options from public endpoints for image gen

This commit is contained in:
JPVenson 2025-07-27 21:15:18 +00:00
parent 0b6f4b2bd9
commit 96a05276a6
2 changed files with 43 additions and 118 deletions

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
@ -32,6 +33,15 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
using ImageArgument = (
int? Width,
int? Height,
int? FillWidth,
int? FillHeight,
int? Blur,
string? BackgroundColor,
string? ForegroundLayer,
int Quality);
namespace Jellyfin.Api.Controllers;
@ -1457,20 +1467,6 @@ public class ImageController : BaseJellyfinApiController
/// </summary>
/// <param name="userId">User id.</param>
/// <param name="tag">Optional. Supply the cache tag from the item object to receive strong caching headers.</param>
/// <param name="format">Determines the output format of the image - original,gif,jpg,png.</param>
/// <param name="maxWidth">The maximum image width to return.</param>
/// <param name="maxHeight">The maximum image height to return.</param>
/// <param name="percentPlayed">Optional. Percent to render for the percent played overlay.</param>
/// <param name="unplayedCount">Optional. Unplayed count overlay to render.</param>
/// <param name="width">The fixed image width to return.</param>
/// <param name="height">The fixed image height to return.</param>
/// <param name="quality">Optional. Quality setting, from 0-100. Defaults to 90 and should suffice in most cases.</param>
/// <param name="fillWidth">Width of box to fill.</param>
/// <param name="fillHeight">Height of box to fill.</param>
/// <param name="blur">Optional. Blur image.</param>
/// <param name="backgroundColor">Optional. Apply a background color for transparent images.</param>
/// <param name="foregroundLayer">Optional. Apply a foreground layer on top of the image.</param>
/// <param name="imageIndex">Image index.</param>
/// <response code="200">Image stream returned.</response>
/// <response code="400">User id not provided.</response>
/// <response code="404">Item not found.</response>
@ -1486,21 +1482,7 @@ public class ImageController : BaseJellyfinApiController
[ProducesImageFile]
public async Task<ActionResult> GetUserImage(
[FromQuery] Guid? userId,
[FromQuery] string? tag,
[FromQuery] ImageFormat? format,
[FromQuery] int? maxWidth,
[FromQuery] int? maxHeight,
[FromQuery] double? percentPlayed,
[FromQuery] int? unplayedCount,
[FromQuery] int? width,
[FromQuery] int? height,
[FromQuery] int? quality,
[FromQuery] int? fillWidth,
[FromQuery] int? fillHeight,
[FromQuery] int? blur,
[FromQuery] string? backgroundColor,
[FromQuery] string? foregroundLayer,
[FromQuery] int? imageIndex)
[FromQuery] string? tag)
{
var requestUserId = userId ?? User.GetUserId();
if (requestUserId.IsEmpty())
@ -1521,34 +1503,24 @@ public class ImageController : BaseJellyfinApiController
DateModified = user.ProfileImage.LastModified
};
if (width.HasValue)
{
info.Width = width.Value;
}
if (height.HasValue)
{
info.Height = height.Value;
}
return await GetImageInternal(
user.Id,
ImageType.Profile,
imageIndex,
null,
tag,
format,
maxWidth,
maxHeight,
percentPlayed,
unplayedCount,
width,
height,
quality,
fillWidth,
fillHeight,
blur,
backgroundColor,
foregroundLayer,
ImageFormat.Jpg,
null,
null,
null,
null,
null,
null,
90,
null,
null,
null,
null,
null,
null,
info)
.ConfigureAwait(false);
@ -1607,21 +1579,7 @@ public class ImageController : BaseJellyfinApiController
[FromQuery] int? imageIndex)
=> GetUserImage(
userId,
tag,
format,
maxWidth,
maxHeight,
percentPlayed,
unplayedCount,
width,
height,
quality,
fillWidth,
fillHeight,
blur,
backgroundColor,
foregroundLayer,
imageIndex);
tag);
/// <summary>
/// Get user profile image.
@ -1676,55 +1634,19 @@ public class ImageController : BaseJellyfinApiController
[FromQuery] string? foregroundLayer)
=> GetUserImage(
userId,
tag,
format,
maxWidth,
maxHeight,
percentPlayed,
unplayedCount,
width,
height,
quality,
fillWidth,
fillHeight,
blur,
backgroundColor,
foregroundLayer,
imageIndex);
tag);
/// <summary>
/// Generates or gets the splashscreen.
/// </summary>
/// <param name="tag">Supply the cache tag from the item object to receive strong caching headers.</param>
/// <param name="format">Determines the output format of the image - original,gif,jpg,png.</param>
/// <param name="maxWidth">The maximum image width to return.</param>
/// <param name="maxHeight">The maximum image height to return.</param>
/// <param name="width">The fixed image width to return.</param>
/// <param name="height">The fixed image height to return.</param>
/// <param name="fillWidth">Width of box to fill.</param>
/// <param name="fillHeight">Height of box to fill.</param>
/// <param name="blur">Blur image.</param>
/// <param name="backgroundColor">Apply a background color for transparent images.</param>
/// <param name="foregroundLayer">Apply a foreground layer on top of the image.</param>
/// <param name="quality">Quality setting, from 0-100.</param>
/// <response code="200">Splashscreen returned successfully.</response>
/// <returns>The splashscreen.</returns>
[HttpGet("Branding/Splashscreen")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesImageFile]
public async Task<ActionResult> GetSplashscreen(
[FromQuery] string? tag,
[FromQuery] ImageFormat? format,
[FromQuery] int? maxWidth,
[FromQuery] int? maxHeight,
[FromQuery] int? width,
[FromQuery] int? height,
[FromQuery] int? fillWidth,
[FromQuery] int? fillHeight,
[FromQuery] int? blur,
[FromQuery] string? backgroundColor,
[FromQuery] string? foregroundLayer,
[FromQuery, Range(0, 100)] int quality = 90)
[FromQuery] string? tag)
{
var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding");
var isAdmin = User.IsInRole(Constants.UserRoles.Administrator);
@ -1749,7 +1671,7 @@ public class ImageController : BaseJellyfinApiController
}
}
var outputFormats = GetOutputFormats(format);
var outputFormats = GetOutputFormats(ImageFormat.Jpg);
TimeSpan? cacheDuration = null;
if (!string.IsNullOrEmpty(tag))
@ -1763,16 +1685,16 @@ public class ImageController : BaseJellyfinApiController
{
Path = splashscreenPath
},
Height = height,
MaxHeight = maxHeight,
MaxWidth = maxWidth,
FillHeight = fillHeight,
FillWidth = fillWidth,
Quality = quality,
Width = width,
Blur = blur,
BackgroundColor = backgroundColor,
ForegroundLayer = foregroundLayer,
Height = null,
MaxHeight = null,
MaxWidth = null,
FillHeight = null,
FillWidth = null,
Quality = 90,
Width = null,
Blur = null,
BackgroundColor = null,
ForegroundLayer = null,
SupportedOutputFormats = outputFormats
};
@ -1988,7 +1910,8 @@ public class ImageController : BaseJellyfinApiController
Blur = blur,
BackgroundColor = backgroundColor,
ForegroundLayer = foregroundLayer,
SupportedOutputFormats = outputFormats
SupportedOutputFormats = outputFormats,
StrictCacheHandling = true
};
return await GetImageResult(

View File

@ -54,6 +54,8 @@ namespace MediaBrowser.Controller.Drawing
public bool RequiresAutoOrientation { get; set; }
public bool StrictCacheHandling { get; set; }
private bool HasDefaultOptions(string originalImagePath)
{
return HasDefaultOptionsWithoutSize(originalImagePath) &&