UNPKG

n8n-nodes-mediafx

Version:

N8N custom nodes for video editing and media processing

98 lines (97 loc) 3.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkTransitionSupport = exports.getFFmpegCapabilities = void 0; const child_process_1 = require("child_process"); const util_1 = require("util"); const execAsync = (0, util_1.promisify)(child_process_1.exec); let cachedCapabilities = null; async function getFFmpegCapabilities() { if (cachedCapabilities) { return cachedCapabilities; } try { const { stdout } = await execAsync('ffmpeg -version'); const versionMatch = stdout.match(/ffmpeg version (\d+)\.(\d+)(?:\.(\d+))?/); if (!versionMatch) { // Fallback for non-standard version formats const altMatch = stdout.match(/ffmpeg version N-\d+-g[a-f0-9]+-static/); if (altMatch) { // This is likely an old static build cachedCapabilities = { version: altMatch[0], major: 4, minor: 2, patch: 0, hasXfade: false, hasGlTransitions: false, }; return cachedCapabilities; } throw new Error('Could not parse FFmpeg version'); } const major = parseInt(versionMatch[1], 10); const minor = parseInt(versionMatch[2], 10); const patch = parseInt(versionMatch[3] || '0', 10); // xfade was added in FFmpeg 4.3 const hasXfade = major > 4 || (major === 4 && minor >= 3); // GL transitions require FFmpeg built with OpenGL support const hasGlTransitions = stdout.includes('--enable-opengl'); cachedCapabilities = { version: `${major}.${minor}.${patch}`, major, minor, patch, hasXfade, hasGlTransitions, }; return cachedCapabilities; } catch (error) { // Default to conservative capabilities if version check fails cachedCapabilities = { version: 'unknown', major: 4, minor: 0, patch: 0, hasXfade: false, hasGlTransitions: false, }; return cachedCapabilities; } } exports.getFFmpegCapabilities = getFFmpegCapabilities; async function checkTransitionSupport(transition) { const capabilities = await getFFmpegCapabilities(); // Simple transitions that work with basic filters const simpleTransitions = ['fade', 'fadeblack', 'fadewhite']; // Transitions that require xfade filter const xfadeTransitions = [ 'wipeleft', 'wiperight', 'wipeup', 'wipedown', 'slideleft', 'slideright', 'slideup', 'slidedown', 'circlecrop', 'rectcrop', 'distance', 'fadegrays', 'radial', 'circleopen', 'circleclose', 'pixelize', 'dissolve', 'diagtl', 'boxin', 'iris' ]; if (simpleTransitions.includes(transition)) { return { supported: true }; } if (xfadeTransitions.includes(transition)) { if (capabilities.hasXfade) { return { supported: true }; } else { return { supported: false, alternative: 'fade', message: `The '${transition}' effect requires FFmpeg 4.3+. Using 'fade' as fallback.` }; } } // Unknown transition return { supported: false, alternative: 'fade', message: `Unknown transition '${transition}'. Using 'fade' as fallback.` }; } exports.checkTransitionSupport = checkTransitionSupport;