From bffcefa5f68e229f05a11cf1dcb923457b3aef7d Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Thu, 5 Jun 2025 22:22:01 -0700 Subject: [PATCH] Metadata for individual skin page --- .../app/skin/[...segments]/page.tsx | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 packages/skin-database/app/skin/[...segments]/page.tsx diff --git a/packages/skin-database/app/skin/[...segments]/page.tsx b/packages/skin-database/app/skin/[...segments]/page.tsx new file mode 100644 index 00000000..aad96bdf --- /dev/null +++ b/packages/skin-database/app/skin/[...segments]/page.tsx @@ -0,0 +1,56 @@ +import App from "../../../../skin-museum-client/src/App"; +import type { Metadata } from "next"; +import SkinModel from "../../../data/SkinModel"; +import UserContext from "../../../data/UserContext"; + +const DESCRIPTION = + "Infinite scroll through 80k Winamp skins with interactive preview"; + +export async function generateMetadata({ params }): Promise { + const { segments } = await params; + const [hash, _fileName] = segments; + + const skin = await SkinModel.fromMd5Assert(new UserContext(), hash); + const fileName = await skin.getFileName(); + const readme = await skin.getReadme(); + + const imageUrl = `https://skin-museum-og-captbaritone-webamp.vercel.app/api/og?md5=${hash}`; + + const images = [ + { + alt: `Screenshot of the Winamp skin ${fileName}.`, + url: imageUrl, + width: 1200, + height: 600, + }, + ]; + + const title = `${fileName} - Winamp Skin Museum`; + const description = readme || DESCRIPTION; + return { + title, + description, + alternates: { + canonical: skin.getMuseumUrl(), + }, + openGraph: { + title, + description, + images, + type: "website", + siteName: "Winamp Skin Museum", + }, + twitter: { + card: "summary_large_image", + site: "@winampskins", + title, + description, + creator: "@captbaritone", + images, + }, + }; +} + +export default function Page() { + return ; +}