UNPKG

short-video-maker

Version:

Creates short videos for TikTok, Instagram Reels, and YouTube Shorts using the Model Context Protocol (MCP) and a REST API.

92 lines (91 loc) 3.34 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FFMpeg = void 0; const fluent_ffmpeg_1 = __importDefault(require("fluent-ffmpeg")); const node_stream_1 = require("node:stream"); const logger_1 = require("../../logger"); class FFMpeg { static async init() { return import("@ffmpeg-installer/ffmpeg").then((ffmpegInstaller) => { fluent_ffmpeg_1.default.setFfmpegPath(ffmpegInstaller.path); logger_1.logger.info("FFmpeg path set to:", ffmpegInstaller.path); return new FFMpeg(); }); } async saveNormalizedAudio(audio, outputPath) { logger_1.logger.debug("Normalizing audio for Whisper"); const inputStream = new node_stream_1.Readable(); inputStream.push(Buffer.from(audio)); inputStream.push(null); return new Promise((resolve, reject) => { (0, fluent_ffmpeg_1.default)() .input(inputStream) .audioCodec("pcm_s16le") .audioChannels(1) .audioFrequency(16000) .toFormat("wav") .on("end", () => { logger_1.logger.debug("Audio normalization complete"); resolve(outputPath); }) .on("error", (error) => { logger_1.logger.error(error, "Error normalizing audio:"); reject(error); }) .save(outputPath); }); } async createMp3DataUri(audio) { const inputStream = new node_stream_1.Readable(); inputStream.push(Buffer.from(audio)); inputStream.push(null); return new Promise((resolve, reject) => { const chunk = []; (0, fluent_ffmpeg_1.default)() .input(inputStream) .audioCodec("libmp3lame") .audioBitrate(128) .audioChannels(2) .toFormat("mp3") .on("error", (err) => { reject(err); }) .pipe() .on("data", (data) => { chunk.push(data); }) .on("end", () => { const buffer = Buffer.concat(chunk); resolve(`data:audio/mp3;base64,${buffer.toString("base64")}`); }) .on("error", (err) => { reject(err); }); }); } async saveToMp3(audio, filePath) { const inputStream = new node_stream_1.Readable(); inputStream.push(Buffer.from(audio)); inputStream.push(null); return new Promise((resolve, reject) => { (0, fluent_ffmpeg_1.default)() .input(inputStream) .audioCodec("libmp3lame") .audioBitrate(128) .audioChannels(2) .toFormat("mp3") .save(filePath) .on("end", () => { logger_1.logger.debug("Audio conversion complete"); resolve(filePath); }) .on("error", (err) => { reject(err); }); }); } } exports.FFMpeg = FFMpeg;