import ffmpeg from "fluent-ffmpeg"; import path from "path"; import("@ffmpeg-installer/ffmpeg"); import fs from "fs-extra"; import { logger } from "../logger"; import { MusicManager } from "../short-creator/music"; import { Config } from "../config"; async function normalize(inputPath: string, outputPath: string) { return new Promise((resolve, reject) => { ffmpeg() .input(inputPath) .audioCodec("libmp3lame") .audioBitrate(96) .audioChannels(2) .audioFrequency(44100) .audioFilter("loudnorm,volume=0.1") .toFormat("mp3") .on("error", (err) => { logger.error(err, "Error normalizing audio:"); reject(err); }) .save(outputPath) .on("end", () => { logger.debug("Audio normalization complete"); resolve(outputPath); }); }); } export async function normalizeMusic() { const config = new Config(); const musicManager = new MusicManager(config); try { musicManager.ensureMusicFilesExist(); } catch (error: unknown) { logger.error(error, "Missing music files"); process.exit(1); } const musicFiles = musicManager.musicList(); const normalizedDir = path.join(config.musicDirPath, "normalized"); fs.ensureDirSync(normalizedDir); for (const musicFile of musicFiles) { const inputPath = path.join(config.musicDirPath, musicFile.file); const outputPath = path.join(normalizedDir, musicFile.file); logger.debug({ inputPath, outputPath }, "Normalizing music file"); await normalize(inputPath, outputPath); } } normalizeMusic() .then(() => { logger.info( "Music normalization completed successfully - make sure to replace the original files with the normalized ones", ); }) .catch((error: unknown) => { logger.error(error, "Error normalizing music files"); });