From dac32542d61e51419132eb079b03f24516ba119c Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 17 Dec 2023 17:54:34 +0100 Subject: [PATCH] Make asset formats configurable. --- .../Assets/AssetOptions.cs | 4 ++++ .../Assets/AssetContentController.cs | 13 ++++++++-- .../Assets/Models/AssetContentQueryDto.cs | 24 +++++++++++++------ backend/src/Squidex/appsettings.json | 10 ++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs index 0d1848caf..1681aebc3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetOptions.cs @@ -13,6 +13,10 @@ public sealed class AssetOptions public bool CanCache { get; set; } + public bool AllowAvifAuto { get; set; } + + public bool AllowWebpAuto { get; set; } = true; + public int DefaultPageSize { get; set; } = 200; public int MaxResults { get; set; } = 200; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs index f46012baf..90fa75cf6 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs @@ -8,6 +8,7 @@ using System.Globalization; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; using Microsoft.Net.Http.Headers; using Squidex.Areas.Api.Controllers.Assets.Models; using Squidex.Assets; @@ -30,19 +31,22 @@ public sealed class AssetContentController : ApiController private readonly IAssetQueryService assetQuery; private readonly IAssetLoader assetLoader; private readonly IAssetThumbnailGenerator assetGenerator; + private readonly AssetOptions assetOptions; public AssetContentController( ICommandBus commandBus, IAssetFileStore assetFileStore, IAssetQueryService assetQuery, IAssetLoader assetLoader, - IAssetThumbnailGenerator assetGenerator) + IAssetThumbnailGenerator assetGenerator, + IOptions assetOptions) : base(commandBus) { this.assetFileStore = assetFileStore; this.assetQuery = assetQuery; this.assetLoader = assetLoader; this.assetGenerator = assetGenerator; + this.assetOptions = assetOptions.Value; } /// @@ -138,7 +142,12 @@ public sealed class AssetContentController : ApiController Response.Headers[HeaderNames.CacheControl] = $"public,max-age={request.CacheDuration}"; } - var resizeOptions = request.ToResizeOptions(asset, assetGenerator, HttpContext.Request); + var resizeOptions = request.ToResizeOptions( + asset, + assetOptions.AllowAvifAuto, + assetOptions.AllowWebpAuto, + assetGenerator, + 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 0ef487593..912386b54 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs @@ -105,7 +105,12 @@ public sealed class AssetContentQueryDto [FromQuery(Name = "format")] public ImageFormat? Format { get; set; } - public ResizeOptions ToResizeOptions(Asset asset, IAssetThumbnailGenerator assetGenerator, HttpRequest request) + public ResizeOptions ToResizeOptions( + Asset asset, + bool allowAvifAuto, + bool allowWebpAuto, + IAssetThumbnailGenerator assetGenerator, + HttpRequest request) { Guard.NotNull(asset); @@ -117,12 +122,17 @@ public sealed class AssetContentQueryDto result.FocusY = y; result.TargetWidth = Width; result.TargetHeight = Height; - result.Format = GetFormat(asset, assetGenerator, request); + result.Format = GetFormat(asset, allowAvifAuto, allowWebpAuto, assetGenerator, request); return result; } - private ImageFormat? GetFormat(Asset asset, IAssetThumbnailGenerator assetGenerator, HttpRequest request) + private ImageFormat? GetFormat( + Asset asset, + bool allowAvifAuto, + bool allowWebpAuto, + IAssetThumbnailGenerator assetGenerator, + HttpRequest request) { if (Format.HasValue || !Auto) { @@ -140,13 +150,13 @@ public sealed class AssetContentQueryDto return accept.Any(x => x?.Contains(mimeType, StringComparison.OrdinalIgnoreCase) == true) && assetGenerator.CanReadAndWrite(mimeType); } -#if ENABLE_AVIF - if (Accepts("image/avif")) + + if (allowAvifAuto && Accepts("image/avif")) { return ImageFormat.AVIF; } -#endif - if (Accepts("image/webp")) + + if (allowWebpAuto && Accepts("image/webp")) { return ImageFormat.WEBP; } diff --git a/backend/src/Squidex/appsettings.json b/backend/src/Squidex/appsettings.json index 77b8451cf..d33e2a13c 100644 --- a/backend/src/Squidex/appsettings.json +++ b/backend/src/Squidex/appsettings.json @@ -297,6 +297,16 @@ // The timeout when searching for multiple items in the database. "timeoutQuery": "00:00:05", + // Deliver the assets in AVIG format automatically if the browser supports that. + // + // WARNING: If you change this feature from false to true, you might experience a performance spike the images are getting prepared. + "allowAvifAuto": false, + + // Deliver the assets in WEBP format automatically if the browser supports that. + // + // WARNING: If you change this feature from false to true, you might experience a performance spike the images are getting prepared. + "allowWebpAuto": true, + // Create one folder per app. // // WARNING: If you change this parameter, previous assets are not available anymore.