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
|