repiped/routes/thumbnail.js
2025-04-30 19:01:10 +02:00

71 lines
2.2 KiB
JavaScript

const https = require("https");
const fs = require("fs");
const path = require("path");
function thumbnailRouteHandler(app) {
const cacheDir = path.join(__dirname, "../cache");
if (!fs.existsSync(cacheDir)) {
fs.mkdirSync(cacheDir);
}
setInterval(() => {
fs.readdir(cacheDir, (err, files) => {
if (err) {
console.error("Error reading cache directory:", err);
return;
}
const now = Date.now();
files.forEach(file => {
const filePath = path.join(cacheDir, file);
fs.stat(filePath, (err, stats) => {
if (err) {
console.error("Error getting file stats:", err);
return;
}
if (now - stats.mtime.getTime() > 30 * 24 * 60 * 60 * 1000) {
fs.unlink(filePath, err => {
if (err) console.error("Error deleting cached file:", err);
});
}
});
});
});
}, 24 * 60 * 60 * 1000);
app.get("/api/thumbnail/:videoId", (req, res) => {
const videoId = req.params.videoId;
const cachePath = path.join(cacheDir, `${videoId}.jpg`);
if (fs.existsSync(cachePath)) {
return fs.createReadStream(cachePath).pipe(res);
}
const thumbnailUrl = `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`;
https.get(thumbnailUrl, (response) => {
if (response.statusCode === 404) {
const fallbackUrl = `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`;
https.get(fallbackUrl, (fallbackResponse) => {
const fileStream = fs.createWriteStream(cachePath);
fallbackResponse.pipe(fileStream);
fallbackResponse.pipe(res);
}).on("error", (err) => {
console.error(`Error fetching fallback thumbnail: ${err.message}`);
res.status(500).send("Error fetching thumbnail");
});
return;
}
const fileStream = fs.createWriteStream(cachePath);
response.pipe(fileStream);
response.pipe(res);
}).on("error", (err) => {
console.error(`Error fetching thumbnail: ${err.message}`);
res.status(500).send("Error fetching thumbnail");
});
});
}
module.exports = thumbnailRouteHandler;