summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-01-11 16:31:22 +0100
committerRory& <root@rory.gay>2026-01-11 16:31:22 +0100
commit654fcc29b5d2284d301df3f63e9db35c21ec63cf (patch)
treec9191c9b62307c08056e3b62cdcd7d4bfbb3c715 /extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs
parentMerge pull request #1464 from CyberL1/fix/build-workflow (diff)
downloadserver-ts-654fcc29b5d2284d301df3f63e9db35c21ec63cf.tar.xz
CDN-CS stuff
Diffstat (limited to 'extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs')
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs59
1 files changed, 59 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs
new file mode 100644

index 000000000..1de9f6323 --- /dev/null +++ b/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs
@@ -0,0 +1,59 @@ +using System.Configuration; +using System.Net.Http.Headers; +using ArcaneLibs.Extensions.Streams; +using ImageMagick; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Build.Globbing; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata.Internal; +using Spacebar.AdminApi.TestClient.Services.Services; + +namespace Spacebar.AdminApi.TestClient.Services.Controllers; + +[ApiController] +public class GetImageController(LruFileCache lfc, IFileSource fs, DiscordImageResizeService dirs) : ControllerBase { + [HttpGet("/avatars/{_:required}")] + [HttpGet("/emojis/{emoji_id:required}.{ext:required}")] + [HttpGet("/stickers/{sticker_id:required}.{ext:required}")] + [HttpGet("/avatars/{user_id:required}/{avatar_hash:required}.{ext:required}")] + [HttpGet("/banners/{user_id:required}/{user_banner:required}.{ext:required}")] + public async Task<IActionResult> GetImage(string? ext) { + var originalKey = fs.BaseUrl + Request.Path; + var cacheKey = Request.Path + Request.QueryString; + + DiscordImageResizeParams resizeParams = new() { + Size = Request.Query.ContainsKey("size") && uint.TryParse(Request.Query["size"], out uint size) ? size : null, + Quality = Request.Query.ContainsKey("quality") && Enum.TryParse<DiscordImageResizeQuality>(Request.Query["quality"], true, out var quality) ? quality : DiscordImageResizeQuality.High, + KeepAspectRatio = !Request.Query.ContainsKey("keepAspectRatio") || !bool.TryParse(Request.Query["keepAspectRatio"], out bool kar) || kar, + Passthrough = Request.Query.ContainsKey("passthrough") && bool.TryParse(Request.Query["passthrough"], out bool pt) && pt, + Animated = Request.Query.ContainsKey("animated") && bool.TryParse(Request.Query["animated"], out bool an) && an, + SpacebarAllowUpscale = Request.Query.ContainsKey("allowUpscale") && bool.TryParse(Request.Query["allowUpscale"], out bool au) && au, + SpacebarOptimiseGif = Request.Query.ContainsKey("optimiseGif") && bool.TryParse(Request.Query["optimiseGif"], out bool og) && og + }; + + var entry = await lfc.GetOrAdd(cacheKey, async () => { + var original = await fs.GetFile(Request.Path); + + if (Request.Query.Any()) { + using var img = await original.ToMagickImageCollectionAsync(); + dirs.Apply(img, resizeParams); + + var outStream = new MemoryStream(); + await img.WriteAsync(outStream, img.First().Format); + outStream.Position = 0; + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + } + + return new LruFileCache.Entry() { + Data = original.Stream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + }); + + // byte array with mime type result + return new FileContentResult(entry.Data, entry.MimeType); + } +} \ No newline at end of file