UNPKG

n8n-nodes-audio-tools

Version:

Community audio processing nodes for n8n: concatWithGap & mergeTracks

72 lines (71 loc) 2.97 kB
"use strict"; 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); }); }