import { NowRequest, NowResponse } from "@vercel/node"; import { renderToString } from "react-dom/server"; import { decode } from "querystring"; import { Player } from "../components/NowPlaying"; import { nowPlaying } from "../utils/spotify"; export default async function (req: NowRequest, res: NowResponse) { const { item = {}, is_playing: isPlaying = false, progress_ms: progress = 0, } = await nowPlaying(); const params = decode(req.url.split("?")[1]) as any; if (params && typeof params.open !== "undefined") { if (item && item.external_urls) { res.writeHead(302, { Location: item.external_urls.spotify, }); return res.end(); } return res.status(200).end(); } res.setHeader("Content-Type", "image/svg+xml"); res.setHeader("Cache-Control", "s-maxage=1, stale-while-revalidate"); const { duration_ms: duration, name: track } = item; const { images = [] } = item.album || {}; const cover = images[images.length - 1]?.url; let coverImg = null; if (cover) { const buff = await (await fetch(cover)).arrayBuffer(); coverImg = `data:image/jpeg;base64,${Buffer.from(buff).toString("base64")}`; } const artist = (item.artists || []).map(({ name }) => name).join(", "); const text = renderToString( Player({ cover: coverImg, artist, track, isPlaying, progress, duration }) ); return res.status(200).send(text); }