diff --git a/main.js b/main.js index fb4cd45..1482f06 100644 --- a/main.js +++ b/main.js @@ -75,5 +75,5 @@ electron.app.whenReady().then(createWindow); electron.ipcMain.on("extract", (event, args) => { - console.log(args); + mapFunctions.get("extraction-video-to-audio").function(args) }) \ No newline at end of file diff --git a/services/modules/extraction/ffmpegExtractor.ts b/services/modules/extraction/ffmpegExtractor.ts deleted file mode 100644 index c23c879..0000000 --- a/services/modules/extraction/ffmpegExtractor.ts +++ /dev/null @@ -1,90 +0,0 @@ -import ffmpegPath from 'ffmpeg-static'; -import ffmpeg from 'fluent-ffmpeg'; -import path from 'path'; -import fs from 'fs'; -import cliProgress from 'cli-progress'; -import { fileURLToPath } from 'url'; - -// Base code reference: https://docs.yemreak.com/arsiv/programming/extract-audio-from-video-with-typescript-and-ffmpeg -// Test command: npx ts-node ./extract.ts /path/to/video.mp4 - -/** - * Extracts audio from a video file and saves it as WAV. - * @param videoFilePath Path to the input video file. - */ - -// Ensure ffmpeg binary is available -if (!ffmpegPath) { - throw new Error('FFmpeg binary not found!'); -} -ffmpeg.setFfmpegPath(ffmpegPath); - -// Ensure an input video path is provided via CLI -if (process.argv.length < 3) { - console.error('Usage: ts-node ./extract.ts '); - process.exit(1); -} - -// Resolve __dirname equivalent in ESM -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -// Prepare output directory (always storage/audio under project root) -const outputDir = path.join(__dirname, '..', '..', '..', 'storage', 'audio'); -if (!fs.existsSync(outputDir)) { - fs.mkdirSync(outputDir, { recursive: true }); -} - -// Derive input and output paths -const inputVideoPath = process.argv[2]; -const inputVideoName = path.basename(inputVideoPath, path.extname(inputVideoPath)); -const outputAudioPath = path.join(outputDir, `${inputVideoName}.wav`); - -// Initialize CLI progress bar -const progressBar = new cliProgress.SingleBar({ - format: 'Processing |{bar}| {percentage}% | {timemark}', - barCompleteChar: '\u2588', - barIncompleteChar: '\u2591', - hideCursor: true -}); - -/** - * Extracts audio from a video using ffmpeg. - * - Converts video to WAV (16 kHz, Mono, PCM optional if needed) - * - Shows CLI progress bar - * - Handles errors gracefully (without errors) - */ -export function extractAudioFromVideo(videoFilePath: string): Promise { - return new Promise((resolve, reject) => { - ffmpeg(videoFilePath) - .outputFormat('wav') - .audioCodec('pcm_s16le') - .audioChannels(1) - .audioFrequency(16000) - .on('progress', (progress) => { - if (!progressBar.isActive) progressBar.start(100, 0, { timemark: '00:00:00' }); - if (progress.percent) { - progressBar.update(progress.percent, { timemark: progress.timemark }); - } - }) - .on('end', () => { - progressBar.update(100, { timemark: 'done' }); - progressBar.stop(); - console.log(`Extraction completed: ${outputAudioPath}`); - resolve(); - }) - .on('error', (err) => { - progressBar.stop(); - console.error(`failed_audio_extraction: ${err.message}`); - reject(err); - }) - .save(outputAudioPath); - }); -} - -// Run extraction if executed directly from CLI -if (import.meta.url === `file://${process.argv[1]}`) { - extractAudioFromVideo(inputVideoPath) - .then(() => console.log('Audio extraction successful.')) - .catch((err) => console.error(err)); -} \ No newline at end of file