gfsd
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import cfg from "../config.mjs";
|
||||
import fs from "fs/promises";
|
||||
import path from "path";
|
||||
import db from "../sql.mjs";
|
||||
import queue from "../queue.mjs";
|
||||
|
||||
export default (router, tpl) => {
|
||||
router.static({
|
||||
@@ -61,6 +63,52 @@ export default (router, tpl) => {
|
||||
return res.end(content);
|
||||
}
|
||||
} catch (_) {}
|
||||
|
||||
// Dynamic generation or fallback for subf0cks / albums
|
||||
const base = file.replace(/\.[^.]+$/, '').replace(/_blur$/, '');
|
||||
try {
|
||||
const subRow = await db`SELECT id, item_id, dest, mime FROM album_items WHERE dest LIKE ${base + '.%'} LIMIT 1`;
|
||||
if (subRow.length > 0) {
|
||||
const sub = subRow[0];
|
||||
const srcFile = path.join(cfg.paths.b, sub.dest);
|
||||
const thumbDest = path.join(cfg.paths.t, `${base}.webp`);
|
||||
const srcStat = await fs.stat(srcFile).catch(() => null);
|
||||
if (srcStat && srcStat.size > 0) {
|
||||
if (sub.mime.startsWith('image/')) {
|
||||
await queue.spawn('magick', [srcFile + '[0]', '-resize', '256x256^', '-gravity', 'center', '-crop', '256x256+0+0', '+repage', thumbDest]);
|
||||
} else if (sub.mime.startsWith('video/')) {
|
||||
await queue.spawn('ffmpegthumbnailer', ['-i', srcFile, '-s', '256', '-o', thumbDest]).catch(async () => {
|
||||
await queue.spawn('ffmpeg', ['-y', '-ss', '00:00:01', '-i', srcFile, '-vframes', '1', '-vf', 'scale=256:256:force_original_aspect_ratio=increase,crop=256:256', thumbDest]);
|
||||
});
|
||||
}
|
||||
const genStat = await fs.stat(thumbDest).catch(() => null);
|
||||
if (genStat && genStat.size > 0) {
|
||||
const content = await fs.readFile(thumbDest);
|
||||
res.writeHead(200, {
|
||||
'Content-Length': genStat.size,
|
||||
'Content-Type': 'image/webp',
|
||||
'Cache-Control': 'public, max-age=3600'
|
||||
});
|
||||
return res.end(content);
|
||||
}
|
||||
}
|
||||
// Fallback to parent album thumbnail if subf0ck media file is missing
|
||||
const parentThumb = path.join(cfg.paths.t, `${sub.item_id}.webp`);
|
||||
const pStat = await fs.stat(parentThumb).catch(() => null);
|
||||
if (pStat && pStat.size > 0) {
|
||||
const content = await fs.readFile(parentThumb);
|
||||
res.writeHead(200, {
|
||||
'Content-Length': pStat.size,
|
||||
'Content-Type': 'image/webp',
|
||||
'Cache-Control': 'public, max-age=3600'
|
||||
});
|
||||
return res.end(content);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('[STATIC /t/] Dynamic subf0ck thumbnail generation error:', e.message);
|
||||
}
|
||||
|
||||
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
||||
return res.end('404 - file not found.');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user