This repository has been archived on 2023-11-06. You can view files and clone it, but cannot push or open issues or pull requests.
beatsaber-overlay/pages/api/beatsaver/art/[hash].js
2022-10-21 16:42:20 +01:00

52 lines
1.4 KiB
JavaScript

import fetch from "node-fetch";
import sharp from "sharp";
import RedisUtils from "../../../../src/utils/redisUtils";
const KEY = "BS_MAP_ART_";
/**
*
* @param {Request} req
* @param {Response} res
* @returns
*/
export default async function handler(req, res) {
const mapHash = req.query.hash.replace("custom_level_", "").toLowerCase();
const ext = req.query.ext || "jpg";
const exists = await RedisUtils.exists(`${KEY}${mapHash}`.replace(" ", ""));
if (exists) {
const data = await RedisUtils.getValue(`${KEY}${mapHash}`);
const buffer = Buffer.from(data, "base64");
res.writeHead(200, {
"Content-Type": "image/" + ext,
"Content-Length": buffer.length,
"Cache-Status": "hit",
});
return res.end(buffer);
}
const before = Date.now();
const data = await fetch(`https://eu.cdn.beatsaver.com/${mapHash}.${ext}`);
if (data.status === 404) {
return res.status(404).json({
status: 404,
message: "Unknown Map Hash",
});
}
let buffer = await data.buffer(); // Change to arrayBuffer at some point to make it shush
buffer = await sharp(buffer).resize(400, 400).toBuffer();
const bytes = buffer.toString("base64");
await RedisUtils.setValue(`${KEY}${mapHash}`.replace(" ", ""), bytes);
console.log(
`[Cache]: Cached BS Song Art for hash ${mapHash} in ${
Date.now() - before
}ms`
);
res.setHeader("Cache-Status", "miss");
res.setHeader("Content-Type", "image/" + ext);
res.status(200).send(buffer);
}