n8n-nodes-audio-tools
Version:
Community audio processing nodes for n8n: concatWithGap & mergeTracks
72 lines (71 loc) • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getExtensionFromName = void 0;
exports.bufferToStream = bufferToStream;
exports.runFfmpegToBuffer = runFfmpegToBuffer;
exports.ensureBinaryExists = ensureBinaryExists;
exports.probeDurationBuffer = probeDurationBuffer;
const stream_1 = require("stream");
const child_process_1 = require("child_process");
/* ───── buffer → Readable ───── */
function bufferToStream(buf) {
const p = new stream_1.PassThrough();
p.end(buf);
return p;
}
/* ───── run ffmpeg → Buffer (no temp files) ───── */
function runFfmpegToBuffer(cmd, fmt) {
return new Promise((resolve, reject) => {
const out = new stream_1.PassThrough();
const chunks = [];
out.on("data", (c) => chunks.push(c));
out.on("end", () => resolve(Buffer.concat(chunks)));
out.on("error", reject);
cmd.format(fmt).output(out, { end: true }).on("error", reject).run();
});
}
/**
* Vérifie qu’un binaire existe et contient des données.
* Utilise la forme `function` (et non une arrow) pour satisfaire TS2775.
*/
function ensureBinaryExists(bin, prop) {
if (!(bin === null || bin === void 0 ? void 0 : bin.data)) {
throw new Error(`Binary property "${prop}" is missing or empty`);
}
}
const getExtensionFromName = (name) => name.split(".").pop().toLowerCase();
exports.getExtensionFromName = getExtensionFromName;
/* ──────────────────────────────────────────────────────────────────────────
Probe duration of an *in-memory* buffer (uses ffprobe via stdin)
────────────────────────────────────────────────────────────────────────── */
async function probeDurationBuffer(buf, fmt) {
const ffprobePath = process.env.FFPROBE_PATH || "ffprobe";
return new Promise((resolve, reject) => {
const args = [
"-v",
"error",
"-f",
fmt,
"-i",
"pipe:0",
"-show_entries",
"format=duration",
"-of",
"default=noprint_wrappers=1:nokey=1",
];
const child = (0, child_process_1.spawn)(ffprobePath, args, {
stdio: ["pipe", "pipe", "inherit"],
});
let out = "";
child.stdout.on("data", (d) => (out += d));
child.on("close", () => {
const dur = parseFloat(out.trim());
if (Number.isFinite(dur))
resolve(dur);
else
reject(new Error(`ffprobe failed to read duration (${out})`));
});
child.on("error", reject);
child.stdin.end(buf);
});
}