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
JavaScript
;
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;