2024-02-24 04:38:19 +00:00
|
|
|
import { Request, Response } from "express";
|
|
|
|
import { screenshot } from "../lib/screenshot";
|
|
|
|
|
2024-02-24 04:56:53 +00:00
|
|
|
const cache = new Map<string, { data: Buffer; timestamp: number }>();
|
2024-02-24 04:38:19 +00:00
|
|
|
|
2024-02-24 04:56:53 +00:00
|
|
|
const regenerateThumbnail = async (slug: string) => {
|
|
|
|
const curCache = cache.get(slug);
|
2024-02-24 04:38:19 +00:00
|
|
|
|
2024-02-24 04:56:53 +00:00
|
|
|
if (curCache?.data) {
|
|
|
|
cache.set(slug, {
|
|
|
|
data: curCache.data,
|
|
|
|
timestamp: Date.now(),
|
|
|
|
});
|
2024-02-24 04:38:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const result = await screenshot(slug);
|
|
|
|
if (!result) {
|
2024-02-24 04:56:53 +00:00
|
|
|
return curCache;
|
2024-02-24 04:38:19 +00:00
|
|
|
}
|
|
|
|
|
2024-02-24 04:56:53 +00:00
|
|
|
const data = {
|
|
|
|
data: result,
|
|
|
|
timestamp: Date.now(),
|
|
|
|
};
|
|
|
|
|
|
|
|
cache.set(slug, data);
|
|
|
|
return data;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const thumbnail = async (req: Request, res: Response) => {
|
|
|
|
const { slug } = req.params;
|
|
|
|
let cacheData = cache.get(slug);
|
|
|
|
|
|
|
|
if (!cacheData) {
|
|
|
|
cacheData = await regenerateThumbnail(slug);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cacheData && Date.now() - cacheData.timestamp > 10000) {
|
|
|
|
regenerateThumbnail(slug);
|
|
|
|
}
|
2024-02-24 04:38:19 +00:00
|
|
|
|
|
|
|
res.contentType("image/jpeg");
|
2024-02-24 04:56:53 +00:00
|
|
|
res.send(cacheData?.data);
|
2024-02-24 04:38:19 +00:00
|
|
|
};
|