import { APIUtils, NoBody } from "../apiutils.ts"; import * as BaseImages from "../data/content/baseimages.ts"; import Logging from "@proxnet/undead-logging"; import express from "express"; import * as Images from "./../data/content/images.ts"; import { Image } from "https://deno.land/x/imagescript@1.3.0/mod.ts"; import { Buffer } from "node:buffer"; export const route = APIUtils.createRouter("/img"); const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890. " .split(""); function sanitizeString(input: string) { return input.split("").filter((char) => chars.includes(char)).join(""); } const baseImages = BaseImages.getAllBaseImages(); interface ImageQueryOptions { cropSquare?: string; width?: string; height?: string; } route.router.get( "*", async ( rq: express.Request, rs: express.Response, nxt: express.NextFunction, ) => { const filename = sanitizeString( rq.path.substring(1, rq.path.length).replaceAll("%20", " "), ); // why does it think it is never reassigned? line 39 // deno-lint-ignore prefer-const let image: Image; const imageSource = baseImages.includes(filename) ? BaseImages.getBaseImage(filename) : await Images.getImage(filename); if (imageSource == null) { nxt(); return; } image = await Image.decode(imageSource); let cropSquare: boolean = false; if (typeof rq.query.cropSquare == "string") { const d = JSON.parse(rq.query.cropSquare); if (typeof d == "boolean" && d) cropSquare = true; } let width: number | null = null; if (typeof rq.query.width == "string") { const num = parseInt(rq.query.width); if (isNaN(num)) width = null; else width = num; } let height: number | null = null; if (typeof rq.query.height == "string") { const num = parseInt(rq.query.height); if (isNaN(num)) height = null; else height = num; } if (cropSquare) { if (image.width > image.height) { image.crop( Math.round(image.width / 2) - Math.round(image.height / 2), 0, image.height, image.height, ); } else {image.crop( 0, Math.round(image.height / 2) - Math.round(image.width / 2), image.width, image.width, );} } if (width && height) { const targetWidth = width > image.width ? image.width : width; const targetHeight = height > image.height ? image.height : height; if (image.width > image.height) { image.resize(Image.RESIZE_AUTO, height); image.crop( Math.round(image.width / 2) - Math.round(targetWidth / 2), 0, targetWidth, image.height, ); } else { image.resize(width, Image.RESIZE_AUTO); image.crop( 0, Math.round(image.height / 2) - Math.round(targetHeight / 2), image.width, targetHeight, ); } } else if (width) image.resize(width, Image.RESIZE_AUTO); else if (height) image.resize(Image.RESIZE_AUTO, height); rs.type("png").send(Buffer.from(await image.encode())); }, );