Add lower-corner layouts, custom blur backgrounds, and classic blur fill.
Ship composition families, optional background images for lower-corner templates, and an optional blurred cover fill for classic letterbox.
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* Build assets/watermark.png for the default Songs2VID badge overlay.
|
||||
* Uses bundled Arimo + FFmpeg (same toolchain as video encode).
|
||||
*
|
||||
* Run: node scripts/generate-watermark-png.mjs
|
||||
*/
|
||||
import { spawnSync } from "child_process";
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
import ffmpegStatic from "ffmpeg-static";
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const root = path.join(__dirname, "..");
|
||||
const fontPath = path.join(root, "assets", "fonts", "Arimo-Regular.ttf");
|
||||
const outPath = path.join(root, "assets", "watermark.png");
|
||||
|
||||
function ffmpegPath() {
|
||||
return process.env.FFMPEG_PATH || ffmpegStatic || "ffmpeg";
|
||||
}
|
||||
|
||||
function escFont(p) {
|
||||
return p.replace(/\\/g, "/").replace(/:/g, "\\:");
|
||||
}
|
||||
|
||||
if (!fs.existsSync(fontPath)) {
|
||||
console.error("Missing font:", fontPath, "— run node scripts/fetch-watermark-fonts.mjs first");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const font = escFont(fontPath);
|
||||
const w = 960;
|
||||
const h = 88;
|
||||
const filter = [
|
||||
`[0:v]format=rgba,drawbox=x=0:y=0:w=iw:h=ih:color=0x000000@0.45:t=fill`,
|
||||
`drawtext=fontfile='${font}':text='Uploaded through Songs2VID.com':fontsize=32:fontcolor=white@0.92:x=(w-text_w)/2:y=(h-th)/2`,
|
||||
].join(",");
|
||||
|
||||
const args = [
|
||||
"-y",
|
||||
"-f",
|
||||
"lavfi",
|
||||
"-i",
|
||||
`color=c=black@0.0:s=${w}x${h}`,
|
||||
"-vf",
|
||||
filter,
|
||||
"-update",
|
||||
"1",
|
||||
outPath,
|
||||
];
|
||||
|
||||
const res = spawnSync(ffmpegPath(), args, { stdio: "inherit" });
|
||||
if (res.status !== 0) {
|
||||
process.exit(res.status ?? 1);
|
||||
}
|
||||
|
||||
console.log("wrote", outPath, fs.statSync(outPath).size, "bytes");
|
||||
Reference in New Issue
Block a user