summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-04-12 02:21:09 +0200
committerRory& <root@rory.gay>2026-04-12 02:21:09 +0200
commita92d127ff60c04b700728ffe84c3185ca1f06d14 (patch)
tree0e505c44881ce3c4b26467ec315a7ccb2c4e8235 /extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs
parentCdn cs worker cleanup (diff)
downloadserver-ts-a92d127ff60c04b700728ffe84c3185ca1f06d14.tar.xz
CDN-CS: it works!!!
Diffstat (limited to 'extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs')
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs324
1 files changed, 162 insertions, 162 deletions
diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs

index f595fba9..3b7df118 100644 --- a/extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs +++ b/extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs
@@ -1,162 +1,162 @@ -using ArcaneLibs; -using ArcaneLibs.Collections; -using ImageMagick; -using Microsoft.AspNetCore.Mvc; -using Spacebar.AdminApi.TestClient.Services.Services; -using Spacebar.Cdn.Extensions; -using Spacebar.Interop.Cdn.Abstractions; - -namespace Spacebar.Cdn.Controllers.Internal; - -[ApiController] -public class IsPixelArtController(LruFileCache lfc, IFileSource fs, PixelArtDetectionService pads, DiscordImageResizeService dirs) : ControllerBase { - private static readonly LruCache<bool> _isPixelArtCache = new(100_000); - private static readonly LruFileCache _edgeCache = new(100_000_000); - - [HttpGet("/isPixelArt/{*_:required}")] - public async Task<bool> IsPixelArt() { - return await _isPixelArtCache.GetOrAddAsync(Request.Path.ToString(), async () => { - await using var original = await fs.GetFile(Request.Path.ToString().Replace("/isPixelArt", "")); - using var img = await original.ToMagickImageCollectionAsync(); - return pads.IsPixelArt(img); - }); - } - - [HttpGet("/isCartoonArt/{*_:required}")] - public async Task<bool> IsCartoonArt() { - return await _isPixelArtCache.GetOrAddAsync(Request.Path.ToString(), async () => { - await using var original = await fs.GetFile(Request.Path.ToString().Replace("/isCartoonArt", "")); - using var img = await original.ToMagickImageCollectionAsync(); - return pads.IsCartoonArt(img); - }); - } - - [HttpGet("/edges/{*_:required}")] - public async Task<FileContentResult> GetEdges([FromQuery] string applyMode = "pre") { - return await _edgeCache.GetOrAdd(Request.Path.ToString() + Request.QueryString, async () => { - var original = await fs.GetFile(Request.Path.ToString().Replace("/edges", "")); - - 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 - }; - - double radius = 1; - if (Request.Query.ContainsKey("radius")) double.TryParse(Request.Query["radius"], out radius); - - var img = await original.ToMagickImageCollectionAsync(); - - // if (applyMode == "pre") img = dirs.Apply(img,resizeParams); - - int inFrames = img.Count; - using var edged = pads.RenderEdges(img, radius); - // if (applyMode == "post") img = dirs.Apply(img,resizeParams); - - Console.WriteLine($"Generated edges for {Request.Path}, radius={radius}, inFrames={inFrames}, outFrames={edged.Count}"); - return new LruFileCache.Entry { - Data = edged.ToByteArray(), - // MimeType = Mimes.GetMime(img.First().Format), - MimeType = "image/apng" - }; - }).ContinueWith(t => File(t.Result.Data, t.Result.MimeType)); - } - - [HttpGet("/posterize/{*_:required}")] - public async Task<FileContentResult> Posterize() { - return await _edgeCache.GetOrAdd(Request.Path.ToString() + Request.QueryString, async () => { - var original = await fs.GetFile(Request.Path.ToString().Replace("/posterize", "")); - 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 - }; - - double radius = 1; - if (Request.Query.ContainsKey("radius")) double.TryParse(Request.Query["radius"], out radius); - - var img = await original.ToMagickImageCollectionAsync(); - - int inFrames = img.Count; - // using var edged = pads.RenderEdges(img, radius); - foreach (var frame in img) { - // get major color count - frame.ColorFuzz = new Percentage(25); - frame.Posterize(16, DitherMethod.No); - frame.ColorFuzz = new Percentage(0); - } - - if (resizeParams.Size.HasValue) - img = dirs.Apply(img, resizeParams); - - Console.WriteLine($"Generated edges for {Request.Path}, radius={radius}, inFrames={inFrames}, outFrames={img.Count}"); - return new LruFileCache.Entry { - Data = img.ToByteArray(), - // MimeType = Mimes.GetMime(img.First().Format), - MimeType = "image/apng" - }; - }).ContinueWith(t => File(t.Result.Data, t.Result.MimeType)); - } - - [HttpGet("/colorFuzz/{*_:required}")] - public async Task<FileContentResult> ColorFuzz() { - return await _edgeCache.GetOrAdd(Request.Path.ToString() + Request.QueryString, async () => { - var original = await fs.GetFile(Request.Path.ToString().Replace("/colorFuzz", "")); - 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, - }; - - double colorFuzz = 1; - if (Request.Query.ContainsKey("colorFuzz")) double.TryParse(Request.Query["colorFuzz"], out colorFuzz); - - var img = await original.ToMagickImageCollectionAsync(); - - int inFrames = img.Count; - // using var edged = pads.RenderEdges(img, radius); - foreach (var frame in img) { - // get major color count - frame.ColorFuzz = new Percentage(colorFuzz); - } - - if (resizeParams.Size.HasValue) - img = dirs.Apply(img, resizeParams); - - Console.WriteLine($"Generated colorFuzz for {Request.Path}, fuzz={colorFuzz}, inFrames={inFrames}, outFrames={img.Count}"); - return new LruFileCache.Entry { - Data = img.ToByteArray(), - // MimeType = Mimes.GetMime(img.First().Format), - MimeType = "image/apng" - }; - }).ContinueWith(t => File(t.Result.Data, t.Result.MimeType)); - } - - [HttpGet("/defaultAvatar")] - public async Task<FileContentResult> DefaultAvatar() { - var re = new RainbowEnumerator(); - var img = new MagickImageCollection(); - - var ms = new MemoryStream(); - - return new FileContentResult(ms.ToArray(), "image/gif"); - } -} \ No newline at end of file +// using ArcaneLibs; +// using ArcaneLibs.Collections; +// using ImageMagick; +// using Microsoft.AspNetCore.Mvc; +// using Spacebar.AdminApi.TestClient.Services.Services; +// using Spacebar.Cdn.Extensions; +// using Spacebar.Interop.Cdn.Abstractions; +// +// namespace Spacebar.Cdn.Controllers.Internal; +// +// [ApiController] +// public class IsPixelArtController(LruFileCache lfc, IFileSource fs, PixelArtDetectionService pads, DiscordImageResizeService dirs) : ControllerBase { +// private static readonly LruCache<bool> _isPixelArtCache = new(100_000); +// private static readonly LruFileCache _edgeCache = new(100_000_000); +// +// [HttpGet("/isPixelArt/{*_:required}")] +// public async Task<bool> IsPixelArt() { +// return await _isPixelArtCache.GetOrAddAsync(Request.Path.ToString(), async () => { +// await using var original = await fs.GetFile(Request.Path.ToString().Replace("/isPixelArt", "")); +// using var img = await original.ToMagickImageCollectionAsync(); +// return pads.IsPixelArt(img); +// }); +// } +// +// [HttpGet("/isCartoonArt/{*_:required}")] +// public async Task<bool> IsCartoonArt() { +// return await _isPixelArtCache.GetOrAddAsync(Request.Path.ToString(), async () => { +// await using var original = await fs.GetFile(Request.Path.ToString().Replace("/isCartoonArt", "")); +// using var img = await original.ToMagickImageCollectionAsync(); +// return pads.IsCartoonArt(img); +// }); +// } +// +// [HttpGet("/edges/{*_:required}")] +// public async Task<FileContentResult> GetEdges([FromQuery] string applyMode = "pre") { +// return await _edgeCache.GetOrAdd(Request.Path.ToString() + Request.QueryString, async () => { +// var original = await fs.GetFile(Request.Path.ToString().Replace("/edges", "")); +// +// 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 +// }; +// +// double radius = 1; +// if (Request.Query.ContainsKey("radius")) double.TryParse(Request.Query["radius"], out radius); +// +// var img = await original.ToMagickImageCollectionAsync(); +// +// // if (applyMode == "pre") img = dirs.Apply(img,resizeParams); +// +// int inFrames = img.Count; +// using var edged = pads.RenderEdges(img, radius); +// // if (applyMode == "post") img = dirs.Apply(img,resizeParams); +// +// Console.WriteLine($"Generated edges for {Request.Path}, radius={radius}, inFrames={inFrames}, outFrames={edged.Count}"); +// return new LruFileCache.Entry { +// Data = edged.ToByteArray(), +// // MimeType = Mimes.GetMime(img.First().Format), +// MimeType = "image/apng" +// }; +// }).ContinueWith(t => File(t.Result.Data, t.Result.MimeType)); +// } +// +// [HttpGet("/posterize/{*_:required}")] +// public async Task<FileContentResult> Posterize() { +// return await _edgeCache.GetOrAdd(Request.Path.ToString() + Request.QueryString, async () => { +// var original = await fs.GetFile(Request.Path.ToString().Replace("/posterize", "")); +// 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 +// }; +// +// double radius = 1; +// if (Request.Query.ContainsKey("radius")) double.TryParse(Request.Query["radius"], out radius); +// +// var img = await original.ToMagickImageCollectionAsync(); +// +// int inFrames = img.Count; +// // using var edged = pads.RenderEdges(img, radius); +// foreach (var frame in img) { +// // get major color count +// frame.ColorFuzz = new Percentage(25); +// frame.Posterize(16, DitherMethod.No); +// frame.ColorFuzz = new Percentage(0); +// } +// +// if (resizeParams.Size.HasValue) +// img = dirs.Apply(img, resizeParams); +// +// Console.WriteLine($"Generated edges for {Request.Path}, radius={radius}, inFrames={inFrames}, outFrames={img.Count}"); +// return new LruFileCache.Entry { +// Data = img.ToByteArray(), +// // MimeType = Mimes.GetMime(img.First().Format), +// MimeType = "image/apng" +// }; +// }).ContinueWith(t => File(t.Result.Data, t.Result.MimeType)); +// } +// +// [HttpGet("/colorFuzz/{*_:required}")] +// public async Task<FileContentResult> ColorFuzz() { +// return await _edgeCache.GetOrAdd(Request.Path.ToString() + Request.QueryString, async () => { +// var original = await fs.GetFile(Request.Path.ToString().Replace("/colorFuzz", "")); +// 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, +// }; +// +// double colorFuzz = 1; +// if (Request.Query.ContainsKey("colorFuzz")) double.TryParse(Request.Query["colorFuzz"], out colorFuzz); +// +// var img = await original.ToMagickImageCollectionAsync(); +// +// int inFrames = img.Count; +// // using var edged = pads.RenderEdges(img, radius); +// foreach (var frame in img) { +// // get major color count +// frame.ColorFuzz = new Percentage(colorFuzz); +// } +// +// if (resizeParams.Size.HasValue) +// img = dirs.Apply(img, resizeParams); +// +// Console.WriteLine($"Generated colorFuzz for {Request.Path}, fuzz={colorFuzz}, inFrames={inFrames}, outFrames={img.Count}"); +// return new LruFileCache.Entry { +// Data = img.ToByteArray(), +// // MimeType = Mimes.GetMime(img.First().Format), +// MimeType = "image/apng" +// }; +// }).ContinueWith(t => File(t.Result.Data, t.Result.MimeType)); +// } +// +// [HttpGet("/defaultAvatar")] +// public async Task<FileContentResult> DefaultAvatar() { +// var re = new RainbowEnumerator(); +// var img = new MagickImageCollection(); +// +// var ms = new MemoryStream(); +// +// return new FileContentResult(ms.ToArray(), "image/gif"); +// } +// } \ No newline at end of file