diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 3888a17eb..1a2320e15 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -31,7 +31,7 @@ - + diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs index 635229d73..6b652b3d0 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs @@ -142,7 +142,7 @@ namespace Squidex.Areas.Api.Controllers.Assets Response.Headers[HeaderNames.CacheControl] = $"public,max-age={request.CacheDuration}"; } - var resizeOptions = request.ToResizeOptions(asset, HttpContext.Request); + var resizeOptions = request.ToResizeOptions(asset, assetThumbnailGenerator, HttpContext.Request); var contentLength = (long?)null; var contentCallback = (FileCallback?)null; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs index 55f0bc3fa..4d9413f76 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs @@ -99,7 +99,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models [FromQuery(Name = "format")] public ImageFormat? Format { get; set; } - public ResizeOptions ToResizeOptions(IAssetEntity asset, HttpRequest request) + public ResizeOptions ToResizeOptions(IAssetEntity asset, IAssetThumbnailGenerator assetThumbnailGenerator, HttpRequest request) { Guard.NotNull(asset); @@ -111,43 +111,56 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models result.FocusY = y; result.TargetWidth = Width; result.TargetHeight = Height; + result.Format = GetFormat(assetThumbnailGenerator, request); - if (Auto && request.Headers.TryGetValue("Accept", out var accept)) + return result; + } + + private ImageFormat? GetFormat(IAssetThumbnailGenerator assetThumbnailGenerator, HttpRequest request) + { + if (Format.HasValue || !Auto) { - var formats = new List(); + return Format; + } - if (accept.Any(x => x.Contains("image/avif", StringComparison.OrdinalIgnoreCase))) - { - formats.Add(ImageFormat.AVIF); - } + bool Accepts(string mimeType) + { + request.Headers.TryGetValue("Accept", out var accept); - if (accept.Any(x => x.Contains("image/webp", StringComparison.OrdinalIgnoreCase))) - { - formats.Add(ImageFormat.WEBP); - } + return accept.Any(x => x.Contains(mimeType, StringComparison.OrdinalIgnoreCase)) && assetThumbnailGenerator.CanReadAndWrite(mimeType); + } - result.Formats = formats.ToArray(); + if (Accepts("image/avif")) + { + return ImageFormat.AVIF; } - return result; + if (Accepts("image/webp")) + { + return ImageFormat.WEBP; + } + + return Format; } private (float?, float?) GetFocusPoint(IAssetEntity asset) { - if (!IgnoreFocus) + if (IgnoreFocus) + { + return (null, null); + } + + if (FocusX != null && FocusY != null) + { + return (FocusX.Value, FocusY.Value); + } + + var focusX = asset.Metadata.GetFocusX(); + var focusY = asset.Metadata.GetFocusY(); + + if (focusX != null && focusY != null) { - if (FocusX != null && FocusY != null) - { - return (FocusX.Value, FocusY.Value); - } - - var focusX = asset.Metadata.GetFocusX(); - var focusY = asset.Metadata.GetFocusY(); - - if (focusX != null && focusY != null) - { - return (focusX.Value, focusY.Value); - } + return (focusX.Value, focusY.Value); } return (null, null); diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index 858317e06..d1cd2737c 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -71,14 +71,14 @@ - - - - - - - - + + + + + + + +