summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Cdn/Controllers
diff options
context:
space:
mode:
Diffstat (limited to 'extra/admin-api/Spacebar.Cdn/Controllers')
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs2
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs41
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/Internal/GetImageController.cs324
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/StaticAssetController.cs98
-rw-r--r--extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs151
5 files changed, 309 insertions, 307 deletions
diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs

index c4473932..cf37b83b 100644 --- a/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs +++ b/extra/admin-api/Spacebar.Cdn/Controllers/GetImageController.cs
@@ -8,10 +8,8 @@ // // [ApiController] // public class GetImageController(LruFileCache lfc, IFileSource fs, DiscordImageResizeService dirs) : ImageController { -// // [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; diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs new file mode 100644
index 00000000..1f28f9bd --- /dev/null +++ b/extra/admin-api/Spacebar.Cdn/Controllers/ImagesAndStickersController.cs
@@ -0,0 +1,41 @@ +using ArcaneLibs.Extensions.Streams; +using Microsoft.AspNetCore.Mvc; +using Spacebar.AdminApi.TestClient.Services.Services; +using Spacebar.Cdn.Extensions; +using Spacebar.Cdn.Services; +using Spacebar.Interop.Cdn.Abstractions; + +namespace Spacebar.Cdn.Controllers; + +[ApiController] +public class ImagesAndStickerController(LruFileCache lfc, IFileSource fs, CdnWorkerService cws) : ControllerBase { + [HttpGet("/stickers/{id}")] + [HttpGet("/stickers/{id}.{ext}")] + [HttpGet("/emojis/{id}")] + [HttpGet("/emojis/{id}.{ext}")] + public async Task<IActionResult> GetUserAvatar(string id, string ext = "png") { + DiscordImageResizeParams resizeParams = Request.GetResizeParams(); + var cacheKey = Request.Path + resizeParams.ToSerializedName(); + LruFileCache.Entry? entry; + if (!Request.Query.Any() || resizeParams.Passthrough) { + var original = await fs.GetFile(Request.Path.ToString().Replace("."+ext, "")); + entry = new LruFileCache.Entry() { + Data = original.Stream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + } + else + entry = await lfc.GetOrAdd(cacheKey, async () => { + var original = await fs.GetFile(Request.Path.ToString().Replace("."+ext, "")); + var res = await cws.GetRawClient("q8").GetAsync("/scale" + Request.Path.ToString().Replace("."+ext, "") + Request.QueryString); + var outStream = await res.Content.ReadAsStreamAsync(); + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = res.Content.Headers.ContentType?.ToString() ?? original.MimeType + }; + }); + + return new FileContentResult(entry.Data, entry.MimeType); + } +} \ No newline at end of file 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 diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/StaticAssetController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/StaticAssetController.cs
index 48ae2253..52b802a5 100644 --- a/extra/admin-api/Spacebar.Cdn/Controllers/StaticAssetController.cs +++ b/extra/admin-api/Spacebar.Cdn/Controllers/StaticAssetController.cs
@@ -1,66 +1,32 @@ -// using ArcaneLibs.Extensions.Streams; -// using Microsoft.AspNetCore.Mvc; -// using Microsoft.OpenApi; -// using Spacebar.AdminApi.TestClient.Services.Services; -// using Spacebar.Cdn.Extensions; -// using Spacebar.Interop.Cdn.Abstractions; -// -// namespace Spacebar.Cdn.Controllers; -// -// [ApiController] -// public class StaticAssetController(LruFileCache lfc, IFileSource fs, DiscordImageResizeService dirs) : ImageController { -// private static readonly Dictionary<string, string> defaultAvatarHashMap = new() { -// { "0", "4a8562cf00887030c416d3ec2d46385a" }, -// { "1", "9b0bb198936784c45c72833cc426cc55" }, -// { "2", "22341bdb500c7b63a93bbce957d1601e" }, -// { "3", "d9977836b82058bf2f74eebd50edc095" }, -// { "4", "9d6ddb4e4d899a533a8cc617011351c9" }, -// { "5", "7213ab6677377974697dfdfbaf5f6a6f" }, -// }; -// -// private static readonly Dictionary<string, string> defaultGroupDMAvatarHashMap = new() { -// { "0", "3b70bb66089c60f8be5e214bf8574c9d" }, -// { "1", "9581acd31832465bdeaa5385b0e919a3" }, -// { "2", "a8a4727cf2dc2939bd3c657fad4463fa" }, -// { "3", "2e46fe14586f8e95471c0917f56726b5" }, -// { "4", "fac7e78de9753d4a37083bba74c1d9ef" }, -// { "5", "4ab900144b0865430dc9be825c838faa" }, -// { "6", "1276374a404452756f3c9cc2601508a5" }, -// { "7", "904bf9f1b61f53ef4a3b7a893afeabe3" }, -// }; -// -// // png only -// [HttpGet("/embed/avatars/{userIndex}.{ext}")] -// public async Task<IActionResult> GetDefaultUserAvatar(string userIndex, string ext) { -// -// var cacheKey = Request.Path + Request.QueryString; -// -// DiscordImageResizeParams resizeParams = GetResizeParams(); -// -// 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 +using ArcaneLibs.Extensions.Streams; +using Microsoft.AspNetCore.Mvc; +using Microsoft.OpenApi; +using Spacebar.AdminApi.TestClient.Services.Services; +using Spacebar.Cdn.Extensions; +using Spacebar.Cdn.Services; +using Spacebar.Interop.Cdn.Abstractions; + +namespace Spacebar.Cdn.Controllers; + +[ApiController] +public class StaticAssetController(LruFileCache lfc, IFileSource fs, CdnWorkerService cws) : ControllerBase { + [HttpGet("/embed/avatars/{avatarIdx}")] + [HttpGet("/embed/avatars/{avatarIdx}.{ext}")] + public async Task<IActionResult> GetUserAvatar(string avatarIdx, string ext = "png") { + DiscordImageResizeParams resizeParams = Request.GetResizeParams(); + var cacheKey = Request.Path + resizeParams.ToSerializedName(); + LruFileCache.Entry? entry; + entry = await lfc.GetOrAdd(cacheKey, async () => { + + var res = await cws.GetRawClient("q8").GetAsync(Request.Path + Request.QueryString); + var outStream = await res.Content.ReadAsStreamAsync(); + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = res.Content.Headers.ContentType?.ToString() ?? Mimes.GetMime(Mimes.GetFormatForExtension(ext)) + }; + }); + + return new FileContentResult(entry.Data, entry.MimeType); + } +} \ No newline at end of file diff --git a/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs b/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs
index a6c47036..ee9ced71 100644 --- a/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs +++ b/extra/admin-api/Spacebar.Cdn/Controllers/UserController.cs
@@ -1,77 +1,74 @@ -// using ArcaneLibs.Extensions.Streams; -// using Microsoft.AspNetCore.Mvc; -// using Spacebar.AdminApi.TestClient.Services.Services; -// using Spacebar.Cdn.Extensions; -// using Spacebar.Interop.Cdn.Abstractions; -// -// namespace Spacebar.Cdn.Controllers; -// -// [ApiController] -// public class UserController(LruFileCache lfc, IFileSource fs, DiscordImageResizeService dirs) : ImageController { -// [HttpGet("/avatars/{userId}/{hash}.{ext}")] -// public async Task<IActionResult> GetUserAvatar(string userId, string hash, string ext) { -// var originalKey = fs.BaseUrl + Request.Path; -// var cacheKey = Request.Path + Request.QueryString; -// -// DiscordImageResizeParams resizeParams = GetResizeParams(); -// -// 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); -// } -// [HttpGet("/banners/{userId}/{hash}.{ext}")] -// public async Task<IActionResult> GetUserBanner(string userId, string hash, string ext) { -// var originalKey = fs.BaseUrl + Request.Path; -// var cacheKey = Request.Path + Request.QueryString; -// -// DiscordImageResizeParams resizeParams = GetResizeParams(); -// -// 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 +using ArcaneLibs.Extensions.Streams; +using Microsoft.AspNetCore.Mvc; +using Spacebar.AdminApi.TestClient.Services.Services; +using Spacebar.Cdn.Extensions; +using Spacebar.Cdn.Services; +using Spacebar.Interop.Cdn.Abstractions; + +namespace Spacebar.Cdn.Controllers; + +[ApiController] +public class UserController(LruFileCache lfc, IFileSource fs, CdnWorkerService cws) : ControllerBase { + [HttpGet("/avatars/{userId}/{hash}")] + [HttpGet("/avatars/{userId}/{hash}.{ext}")] + public async Task<IActionResult> GetUserAvatar(string userId, string hash, string ext = "png") { + DiscordImageResizeParams resizeParams = Request.GetResizeParams(); + var originalKey = fs.BaseUrl + Request.Path; + var cacheKey = Request.Path + resizeParams.ToSerializedName(); + LruFileCache.Entry? entry; + if (!Request.Query.Any() || resizeParams.Passthrough) { + var original = await fs.GetFile(Request.Path); + entry = new LruFileCache.Entry() { + Data = original.Stream.ReadToEnd().ToArray(), + MimeType = original.MimeType + }; + } + else + entry = await lfc.GetOrAdd(cacheKey, async () => { + var original = await fs.GetFile(Request.Path); + var res = await cws.GetRawClient("q8").GetAsync("/scale" + Request.Path + Request.QueryString); + var outStream = await res.Content.ReadAsStreamAsync(); + + return new LruFileCache.Entry() { + Data = outStream.ReadToEnd().ToArray(), + MimeType = res.Content.Headers.ContentType?.ToString() ?? original.MimeType + }; + }); + + // byte array with mime type result + return new FileContentResult(entry.Data, entry.MimeType); + } + // [HttpGet("/banners/{userId}/{hash}.{ext}")] + // public async Task<IActionResult> GetUserBanner(string userId, string hash, string ext) { + // var originalKey = fs.BaseUrl + Request.Path; + // var cacheKey = Request.Path + Request.QueryString; + // + // DiscordImageResizeParams resizeParams = GetResizeParams(); + // + // 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