diff --git a/electron/converters/audio-converter.ts b/electron/converters/audio-converter.ts index 4312a69..4cf1568 100644 --- a/electron/converters/audio-converter.ts +++ b/electron/converters/audio-converter.ts @@ -136,12 +136,13 @@ export async function convertAudio(options: AudioConvertOptions): Promise void metadata?: Record // Custom metadata } @@ -252,8 +253,9 @@ export async function executeFFmpeg(options: FFmpegConvertOptions): Promise { currentOperation: 'Finalizing...', startTime, }) + } else if (category === 'video' && isAudioFormat(file.targetFormat)) { + // Video → audio extraction (e.g. MP4 → MP3) + result = await convertAudio({ + sourcePath: file.sourcePath, + outputDir: outputDir, + targetFormat: file.targetFormat, + quality, + overwriteBehavior, + onProgress: (percent) => { + const elapsed = (Date.now() - startTime) / 1000 + const eta = percent > 0 ? Math.round((elapsed / percent) * (100 - percent)) : 0 + mainWindow?.webContents.send('conversion-progress', { + fileId: file.fileId, + progress: percent, + status: 'converting', + currentOperation: 'Extracting audio...', + eta, + startTime, + }) + }, + }) } else if (category === 'video' && isVideoFormat(file.sourceExt)) { // Video conversion with progress tracking result = await convertVideo({ diff --git a/src/config/formats.ts b/src/config/formats.ts index ddbf0b9..b7630ea 100644 --- a/src/config/formats.ts +++ b/src/config/formats.ts @@ -177,49 +177,49 @@ export const FORMAT_MAP: Record = { mp4: { category: 'video', label: 'MP4', - targets: ['mkv', 'avi', 'mov', 'webm', 'gif'], + targets: ['mkv', 'avi', 'mov', 'webm', 'gif', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'MPEG-4 Part 14 - most widely supported video format' }, mkv: { category: 'video', label: 'MKV', - targets: ['mp4', 'avi', 'mov', 'webm'], + targets: ['mp4', 'avi', 'mov', 'webm', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'Matroska Video - open container format, supports multiple tracks' }, avi: { category: 'video', label: 'AVI', - targets: ['mp4', 'mkv', 'mov', 'webm'], + targets: ['mp4', 'mkv', 'mov', 'webm', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'Audio Video Interleave - legacy Windows format' }, mov: { category: 'video', label: 'MOV', - targets: ['mp4', 'mkv', 'avi', 'webm'], + targets: ['mp4', 'mkv', 'avi', 'webm', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'QuickTime Movie - Apple video format' }, webm: { category: 'video', label: 'WebM', - targets: ['mp4', 'mkv', 'avi', 'mov'], + targets: ['mp4', 'mkv', 'avi', 'mov', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'Web Media - open format optimized for web streaming' }, '3gp': { category: 'video', label: '3GP', - targets: ['mp4', 'mkv', 'avi'], + targets: ['mp4', 'mkv', 'avi', 'mp3', 'aac', 'wav'], description: '3rd Generation Partnership Project - mobile video format' }, flv: { category: 'video', label: 'FLV', - targets: ['mp4', 'mkv', 'avi', 'webm'], + targets: ['mp4', 'mkv', 'avi', 'webm', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'Flash Video - legacy web video format' }, wmv: { category: 'video', label: 'WMV', - targets: ['mp4', 'mkv', 'avi', 'webm'], + targets: ['mp4', 'mkv', 'avi', 'webm', 'mp3', 'aac', 'wav', 'ogg', 'flac', 'm4a'], description: 'Windows Media Video - Microsoft streaming format' },