Add /api/thumbnail/[id]

This commit is contained in:
2023-06-23 11:09:23 +08:00
parent 4e9fa3632b
commit 19afc034dd
6 changed files with 189 additions and 4 deletions

22
thumbnail/base.ts Normal file
View File

@@ -0,0 +1,22 @@
import { join } from "std/path/mod.ts";
import { filterFilename } from "../utils.ts";
import { EhFile } from "../db.ts";
export type ThumbnailConfig = {
width: number;
height: number;
quality: number;
};
export function generate_filename(
base: string,
f: EhFile,
cfg: ThumbnailConfig,
) {
return join(
base,
filterFilename(
`${f.id}-${f.token}-${cfg.width}x${cfg.height}-q${cfg.quality}.jpg`,
),
);
}

View File

@@ -0,0 +1,43 @@
import { ThumbnailConfig } from "./base.ts";
export async function check_ffmpeg_binary(p: string) {
const cmd = new Deno.Command(p, {
stdout: "null",
stderr: "null",
args: ["-h"],
});
const c = cmd.spawn();
const o = await c.output();
return o.code === 0;
}
export async function fb_generate_thumbnail(
p: string,
i: string,
o: string,
cfg: ThumbnailConfig,
) {
const args = [
"-i",
i,
"-vf",
`scale=${cfg.width}:${cfg.height}`,
"-qmin",
`${cfg.quality}`,
"-qmax",
`${cfg.quality}`,
o,
];
const cmd = new Deno.Command(p, { args, stdout: "null", stderr: "piped" });
const c = cmd.spawn();
const s = await c.output();
if (s.code !== 0) {
try {
const d = (new TextDecoder()).decode(s.stderr);
console.log(d);
} catch (_) {
console.log(s.stderr);
}
}
return s.code === 0;
}