Spaces:
Running
Running
| import ModelThumbnail from "./ModelThumbnail.svelte"; | |
| import { redirect, type RequestHandler } from "@sveltejs/kit"; | |
| import type { SvelteComponent } from "svelte"; | |
| import { Resvg } from "@resvg/resvg-js"; | |
| import satori from "satori"; | |
| import { html } from "satori-html"; | |
| import InterRegular from "../../../../../static/fonts/Inter-Regular.ttf"; | |
| import InterBold from "../../../../../static/fonts/Inter-Bold.ttf"; | |
| import { base } from "$app/paths"; | |
| import { models } from "$lib/server/models"; | |
| export const GET: RequestHandler = (async ({ params }) => { | |
| const model = models.find(({ id }) => id === params.model); | |
| if (!model || model.unlisted) { | |
| throw redirect(302, `${base}/`); | |
| } | |
| const renderedComponent = (ModelThumbnail as unknown as SvelteComponent).render({ | |
| name: model.name, | |
| logoUrl: model.logoUrl, | |
| }); | |
| const reactLike = html( | |
| "<style>" + renderedComponent.css.code + "</style>" + renderedComponent.html | |
| ); | |
| const svg = await satori(reactLike, { | |
| width: 1200, | |
| height: 648, | |
| fonts: [ | |
| { | |
| name: "Inter", | |
| data: InterRegular as unknown as ArrayBuffer, | |
| weight: 500, | |
| }, | |
| { | |
| name: "Inter", | |
| data: InterBold as unknown as ArrayBuffer, | |
| weight: 700, | |
| }, | |
| ], | |
| }); | |
| const png = new Resvg(svg, { | |
| fitTo: { mode: "original" }, | |
| }) | |
| .render() | |
| .asPng(); | |
| return new Response(png, { | |
| headers: { | |
| "Content-Type": "image/png", | |
| }, | |
| }); | |
| }) satisfies RequestHandler; | |