@mediaproc/audio 1.1.0 ā 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +19 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/convert.d.ts.map +1 -1
- package/dist/commands/convert.js +86 -40
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +111 -43
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/merge.d.ts.map +1 -1
- package/dist/commands/merge.js +106 -40
- package/dist/commands/merge.js.map +1 -1
- package/dist/commands/normalize.d.ts.map +1 -1
- package/dist/commands/normalize.js +94 -31
- package/dist/commands/normalize.js.map +1 -1
- package/dist/commands/trim.d.ts.map +1 -1
- package/dist/commands/trim.js +47 -23
- package/dist/commands/trim.js.map +1 -1
- package/dist/register.d.ts +2 -1
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +22 -9
- package/dist/register.js.map +1 -1
- package/dist/types.d.ts +30 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/ffmpeg-output.d.ts +13 -0
- package/dist/utils/ffmpeg-output.d.ts.map +1 -0
- package/dist/utils/ffmpeg-output.js +86 -0
- package/dist/utils/ffmpeg-output.js.map +1 -0
- package/dist/utils/ffmpeg.d.ts +9 -8
- package/dist/utils/ffmpeg.d.ts.map +1 -1
- package/dist/utils/ffmpeg.js +107 -28
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/ffmpegLogger.d.ts +12 -0
- package/dist/utils/ffmpegLogger.d.ts.map +1 -0
- package/dist/utils/ffmpegLogger.js +34 -0
- package/dist/utils/ffmpegLogger.js.map +1 -0
- package/package.json +4 -8
- package/bin/cli.js +0 -5
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
-
import {
|
|
3
|
+
import { explainPreActionHook, showPluginBranding } from '@mediaproc/core';
|
|
4
|
+
import { trimCommand } from './commands/trim.js';
|
|
5
|
+
import { convertCommand } from './commands/convert.js';
|
|
6
|
+
import { mergeCommand } from './commands/merge.js';
|
|
7
|
+
import { normalizeCommand } from './commands/normalize.js';
|
|
8
|
+
import { extractCommand } from './commands/extract.js';
|
|
9
|
+
import { version } from './register.js';
|
|
4
10
|
const program = new Command();
|
|
5
11
|
program
|
|
6
12
|
.name('mediaproc-audio')
|
|
7
13
|
.description(`
|
|
8
|
-
šµ Audio Processing Plugin
|
|
14
|
+
šµ Audio Processing Plugin
|
|
9
15
|
|
|
10
16
|
Professional audio processing powered by FFmpeg/FFprobe. Convert, normalize, trim, merge, and extract audio with 5 powerful commands.
|
|
11
17
|
|
|
@@ -93,8 +99,17 @@ Professional audio processing powered by FFmpeg/FFprobe. Convert, normalize, tri
|
|
|
93
99
|
š Detailed Help:
|
|
94
100
|
Use 'mediaproc-audio <command> --help' for comprehensive documentation on each command.
|
|
95
101
|
`)
|
|
96
|
-
.version(
|
|
97
|
-
|
|
102
|
+
.version(version);
|
|
103
|
+
// Register trim command directly (no "audio" prefix in standalone mode)
|
|
104
|
+
convertCommand(program);
|
|
105
|
+
extractCommand(program);
|
|
106
|
+
mergeCommand(program);
|
|
107
|
+
normalizeCommand(program);
|
|
108
|
+
trimCommand(program);
|
|
109
|
+
program.hook('preAction', explainPreActionHook);
|
|
110
|
+
program.hook('postAction', () => {
|
|
111
|
+
showPluginBranding('Audio');
|
|
112
|
+
});
|
|
98
113
|
program.parse(process.argv);
|
|
99
114
|
if (!process.argv.slice(2).length) {
|
|
100
115
|
program.outputHelp();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwFZ,CAAC;KACD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,wEAAwE;AACxE,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,WAAW,CAAC,OAAO,CAAC,CAAC;AAErB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;AAChD,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;IAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA0MtD"}
|
package/dist/commands/convert.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { stat } from 'fs/promises';
|
|
3
|
-
import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration
|
|
4
|
-
import {
|
|
3
|
+
import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration } from '../utils/ffmpeg.js';
|
|
4
|
+
import { styleFFmpegOutput, shouldDisplayLine } from '../utils/ffmpeg-output.js';
|
|
5
|
+
import { validatePaths, resolveOutputPaths, createStandardHelp, AUDIO_EXTENSIONS } from '@mediaproc/core';
|
|
5
6
|
import ora from 'ora';
|
|
6
7
|
export function convertCommand(audioCmd) {
|
|
7
8
|
audioCmd
|
|
@@ -14,8 +15,15 @@ export function convertCommand(audioCmd) {
|
|
|
14
15
|
.option('-c, --channels <channels>', 'Number of channels: 1 (mono), 2 (stereo)', parseInt)
|
|
15
16
|
.option('-q, --quality <quality>', 'Quality preset: low, medium, high, lossless', 'medium')
|
|
16
17
|
.option('--codec <codec>', 'Audio codec override (libmp3lame, aac, flac, libvorbis, libopus)')
|
|
18
|
+
.option('--normalize', 'Normalize audio levels (EBU R128 loudness normalization)')
|
|
19
|
+
.option('--volume <db>', 'Adjust output volume in dB (e.g., -3 for -3dB)')
|
|
20
|
+
.option('--fade-in <seconds>', 'Add fade-in effect (seconds)', parseFloat)
|
|
21
|
+
.option('--fade-out <seconds>', 'Add fade-out effect (seconds)', parseFloat)
|
|
22
|
+
.option('--trim <start>:<duration>', 'Trim audio: <start>:<duration> (e.g., 00:01:00:30)')
|
|
23
|
+
.option('--metadata <key=value>', 'Set custom metadata (repeatable)', (val, acc = []) => { acc.push(val); return acc; }, [])
|
|
24
|
+
.option('--force', 'Overwrite output files without prompt')
|
|
17
25
|
.option('--dry-run', 'Preview command without executing')
|
|
18
|
-
.option('--explain', '
|
|
26
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
19
27
|
.option('-v, --verbose', 'Show detailed FFmpeg output')
|
|
20
28
|
.option('-h, --help', 'Display help for convert command')
|
|
21
29
|
.action(async (input, options) => {
|
|
@@ -37,8 +45,15 @@ export function convertCommand(audioCmd) {
|
|
|
37
45
|
{ flag: '-c, --channels <channels>', description: 'Audio channels: 1 (mono), 2 (stereo)' },
|
|
38
46
|
{ flag: '-q, --quality <quality>', description: 'Quality preset: low (96k), medium (192k), high (320k), lossless' },
|
|
39
47
|
{ flag: '--codec <codec>', description: 'Codec override: libmp3lame, aac, flac, libvorbis, libopus' },
|
|
48
|
+
{ flag: '--normalize', description: 'Normalize audio levels (EBU R128 loudness normalization)' },
|
|
49
|
+
{ flag: '--volume <db>', description: 'Adjust output volume in dB (e.g., -3 for -3dB)' },
|
|
50
|
+
{ flag: '--fade-in <seconds>', description: 'Add fade-in effect (seconds)' },
|
|
51
|
+
{ flag: '--fade-out <seconds>', description: 'Add fade-out effect (seconds)' },
|
|
52
|
+
{ flag: '--trim <start>:<duration>', description: 'Trim audio: <start>:<duration> (e.g., 00:01:00:30)' },
|
|
53
|
+
{ flag: '--metadata <key=value>', description: 'Set custom metadata (repeatable)' },
|
|
54
|
+
{ flag: '--force', description: 'Overwrite output files without prompt' },
|
|
40
55
|
{ flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
|
|
41
|
-
{ flag: '--explain', description: '
|
|
56
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
42
57
|
{ flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
|
|
43
58
|
],
|
|
44
59
|
examples: [
|
|
@@ -59,12 +74,16 @@ export function convertCommand(audioCmd) {
|
|
|
59
74
|
console.error(chalk.red('\nā FFmpeg not found. Please install FFmpeg first.'));
|
|
60
75
|
process.exit(1);
|
|
61
76
|
}
|
|
62
|
-
//
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
77
|
+
// Use pathValidator for all input/output logic
|
|
78
|
+
const { inputFiles, outputPath, errors } = validatePaths(input, options.output, { allowedExtensions: AUDIO_EXTENSIONS });
|
|
79
|
+
if (errors.length > 0) {
|
|
80
|
+
errors.forEach(e => console.error(chalk.red(e)));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const outputFormat = options.format || 'mp3';
|
|
84
|
+
const outputPathsMap = resolveOutputPaths(inputFiles, outputPath, {
|
|
66
85
|
suffix: '-converted',
|
|
67
|
-
newExtension: `.${
|
|
86
|
+
newExtension: `.${outputFormat}`
|
|
68
87
|
});
|
|
69
88
|
const outputPaths = Array.from(outputPathsMap.values());
|
|
70
89
|
// Quality presets
|
|
@@ -74,10 +93,10 @@ export function convertCommand(audioCmd) {
|
|
|
74
93
|
high: '320k',
|
|
75
94
|
lossless: 'lossless'
|
|
76
95
|
};
|
|
77
|
-
const targetBitrate = qualityMap[options.quality] || options.bitrate;
|
|
96
|
+
const targetBitrate = (options.quality && qualityMap[options.quality]) || options.bitrate || '192k';
|
|
78
97
|
// Process each file
|
|
79
|
-
for (let i = 0; i <
|
|
80
|
-
const inputFile =
|
|
98
|
+
for (let i = 0; i < inputFiles.length; i++) {
|
|
99
|
+
const inputFile = inputFiles[i];
|
|
81
100
|
const outputFile = outputPaths[i];
|
|
82
101
|
console.log(chalk.blue(`\nš Converting: ${inputFile}`));
|
|
83
102
|
// Get metadata
|
|
@@ -87,49 +106,77 @@ export function convertCommand(audioCmd) {
|
|
|
87
106
|
`Sample Rate: ${metadata.sampleRate} Hz ⢠` +
|
|
88
107
|
`Channels: ${metadata.channels}`));
|
|
89
108
|
// Build FFmpeg args
|
|
90
|
-
const args = ['-i', inputFile
|
|
109
|
+
const args = ['-i', inputFile];
|
|
110
|
+
if (options.force)
|
|
111
|
+
args.push('-y');
|
|
112
|
+
// Trim
|
|
113
|
+
if (options.trim) {
|
|
114
|
+
const [start, duration] = options.trim.split(':');
|
|
115
|
+
if (start)
|
|
116
|
+
args.push('-ss', start);
|
|
117
|
+
if (duration)
|
|
118
|
+
args.push('-t', duration);
|
|
119
|
+
}
|
|
91
120
|
// Codec selection
|
|
92
121
|
const codecMap = {
|
|
93
|
-
mp3: 'libmp3lame',
|
|
94
|
-
aac: 'aac',
|
|
95
|
-
m4a: 'aac',
|
|
96
|
-
flac: 'flac',
|
|
97
|
-
wav: 'pcm_s16le',
|
|
98
|
-
ogg: 'libvorbis',
|
|
99
|
-
opus: 'libopus',
|
|
122
|
+
mp3: 'libmp3lame', // MP3 encoder
|
|
123
|
+
aac: 'aac', // Native AAC encoder
|
|
124
|
+
m4a: 'aac', // M4A is a container, usually AAC inside
|
|
125
|
+
flac: 'flac', // FLAC lossless codec
|
|
126
|
+
wav: 'pcm_s16le', // Standard uncompressed WAV PCM
|
|
127
|
+
ogg: 'libvorbis', // OGG is a container, Vorbis is most common
|
|
128
|
+
opus: 'libopus', // Opus codec (often in .opus or .ogg)
|
|
129
|
+
wma: 'wmav2', // Windows Media Audio v2
|
|
130
|
+
ape: 'ape', // Monkeyās Audio (lossless)
|
|
131
|
+
alac: 'alac'
|
|
100
132
|
};
|
|
101
|
-
const codec = options.codec || codecMap[options.format];
|
|
102
|
-
if (codec)
|
|
133
|
+
const codec = options.codec || (options.format && codecMap[options.format]);
|
|
134
|
+
if (codec)
|
|
103
135
|
args.push('-c:a', codec);
|
|
104
|
-
|
|
105
|
-
// Bitrate
|
|
106
|
-
if (targetBitrate !== 'lossless') {
|
|
136
|
+
if (targetBitrate !== 'lossless')
|
|
107
137
|
args.push('-b:a', targetBitrate);
|
|
108
|
-
|
|
109
|
-
// Sample rate
|
|
110
|
-
if (options.sampleRate) {
|
|
138
|
+
if (options.sampleRate)
|
|
111
139
|
args.push('-ar', options.sampleRate.toString());
|
|
112
|
-
|
|
113
|
-
// Channels
|
|
114
|
-
if (options.channels) {
|
|
140
|
+
if (options.channels)
|
|
115
141
|
args.push('-ac', options.channels.toString());
|
|
142
|
+
// Audio filters
|
|
143
|
+
const filters = [];
|
|
144
|
+
if (options.normalize)
|
|
145
|
+
filters.push('loudnorm=I=-16:TP=-1.5:LRA=11');
|
|
146
|
+
if (options.volume)
|
|
147
|
+
filters.push(`volume=${options.volume}dB`);
|
|
148
|
+
if (options.fadeIn)
|
|
149
|
+
filters.push(`afade=t=in:st=0:d=${options.fadeIn}`);
|
|
150
|
+
if (options.fadeOut && metadata && metadata.duration) {
|
|
151
|
+
const fadeStart = metadata.duration - options.fadeOut;
|
|
152
|
+
filters.push(`afade=t=out:st=${fadeStart}:d=${options.fadeOut}`);
|
|
153
|
+
}
|
|
154
|
+
if (filters.length > 0)
|
|
155
|
+
args.push('-af', filters.join(','));
|
|
156
|
+
// Metadata
|
|
157
|
+
if (options.metadata && Array.isArray(options.metadata)) {
|
|
158
|
+
for (const entry of options.metadata) {
|
|
159
|
+
const [key, value] = entry.split('=');
|
|
160
|
+
if (key && value)
|
|
161
|
+
args.push('-metadata', `${key}=${value}`);
|
|
162
|
+
}
|
|
116
163
|
}
|
|
117
164
|
args.push(outputFile);
|
|
118
165
|
// Dry run
|
|
119
166
|
if (options.dryRun) {
|
|
120
167
|
console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
|
|
121
168
|
console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
|
|
122
|
-
showPluginBranding('Audio', require.resolve('../../package.json'));
|
|
123
169
|
continue;
|
|
124
170
|
}
|
|
125
|
-
|
|
126
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
127
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
128
|
-
}
|
|
171
|
+
;
|
|
129
172
|
// Execute conversion
|
|
130
173
|
const spinner = ora('Converting...').start();
|
|
131
174
|
try {
|
|
132
|
-
await runFFmpeg(args, options.verbose)
|
|
175
|
+
await runFFmpeg(args, options.verbose ?? false, (line) => {
|
|
176
|
+
if (shouldDisplayLine(line, options.verbose ?? false)) {
|
|
177
|
+
console.log(styleFFmpegOutput(line));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
133
180
|
const outputStat = await stat(outputFile);
|
|
134
181
|
spinner.succeed(chalk.green('Conversion complete'));
|
|
135
182
|
console.log(chalk.green(`ā Output: ${outputFile}`));
|
|
@@ -140,10 +187,9 @@ export function convertCommand(audioCmd) {
|
|
|
140
187
|
throw error;
|
|
141
188
|
}
|
|
142
189
|
}
|
|
143
|
-
if (
|
|
144
|
-
console.log(chalk.green(`\nā Converted ${
|
|
190
|
+
if (inputFiles.length > 1) {
|
|
191
|
+
console.log(chalk.green(`\nā Converted ${inputFiles.length} files successfully`));
|
|
145
192
|
}
|
|
146
|
-
showPluginBranding('Audio', require.resolve('../../package.json'));
|
|
147
193
|
}
|
|
148
194
|
catch (error) {
|
|
149
195
|
console.error(chalk.red(`\nā Error: ${error.message}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA0NtD"}
|
package/dist/commands/extract.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { stat } from 'fs/promises';
|
|
3
3
|
import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
|
|
4
|
-
import {
|
|
4
|
+
import { styleFFmpegOutput, shouldDisplayLine } from '../utils/ffmpeg-output.js';
|
|
5
|
+
import { AUDIO_EXTENSIONS, validatePaths, resolveOutputPaths, createStandardHelp } from '@mediaproc/core';
|
|
5
6
|
import ora from 'ora';
|
|
6
7
|
export function extractCommand(audioCmd) {
|
|
7
8
|
audioCmd
|
|
@@ -12,10 +13,17 @@ export function extractCommand(audioCmd) {
|
|
|
12
13
|
.option('-b, --bitrate <bitrate>', 'Audio bitrate (e.g., 128k, 192k, 320k)', '192k')
|
|
13
14
|
.option('-q, --quality <quality>', 'Quality preset: low, medium, high, lossless', 'medium')
|
|
14
15
|
.option('--sample-rate <rate>', 'Sample rate in Hz (e.g., 44100, 48000)', parseInt)
|
|
15
|
-
.option('--channels <channels>', 'Number of channels: 1 (mono), 2 (stereo)', parseInt)
|
|
16
|
+
.option('--channels <channels>', 'Number of channels in output. Most formats: 1 (mono), 2 (stereo). For WAV/FLAC/AAC/Opus: 1, 2, 4, 6, 8 (if input supports). MP3/OGG: max 2. If unsupported, will downmix to stereo.', parseInt)
|
|
17
|
+
.option('--normalize', 'Normalize audio levels (EBU R128 loudness normalization)')
|
|
18
|
+
.option('--volume <db>', 'Adjust output volume in dB (e.g., -3 for -3dB)')
|
|
19
|
+
.option('--fade-in <seconds>', 'Add fade-in effect (seconds)', parseFloat)
|
|
20
|
+
.option('--fade-out <seconds>', 'Add fade-out effect (seconds)', parseFloat)
|
|
21
|
+
.option('--trim <start>:<duration>', 'Trim audio: <start>:<duration> (e.g., 00:01:00:30)')
|
|
22
|
+
.option('--metadata <key=value>', 'Set custom metadata (repeatable)', (val, acc = []) => { acc.push(val); return acc; }, [])
|
|
23
|
+
.option('--force', 'Overwrite output files without prompt')
|
|
16
24
|
.option('--dry-run', 'Preview command without executing')
|
|
17
25
|
.option('-v, --verbose', 'Show detailed FFmpeg output')
|
|
18
|
-
.option('--explain', '
|
|
26
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
19
27
|
.option('-h, --help', 'Display help for extract command')
|
|
20
28
|
.action(async (input, options) => {
|
|
21
29
|
if (options.help || !input) {
|
|
@@ -34,9 +42,16 @@ export function extractCommand(audioCmd) {
|
|
|
34
42
|
{ flag: '-b, --bitrate <bitrate>', description: 'Audio bitrate: 128k, 192k, 256k, 320k (default: 192k)' },
|
|
35
43
|
{ flag: '-q, --quality <quality>', description: 'Quality preset: low (96k), medium (192k), high (320k), lossless' },
|
|
36
44
|
{ flag: '--sample-rate <rate>', description: 'Sample rate: 44100 (CD), 48000 (studio), 96000 (Hi-Res)' },
|
|
37
|
-
{ flag: '--channels <channels>', description: '
|
|
45
|
+
{ flag: '--channels <channels>', description: 'Number of channels in output. Most formats: 1 (mono), 2 (stereo). For WAV/FLAC/AAC/Opus: 1, 2, 4, 6, 8 (if input supports). MP3/OGG: max 2. If unsupported, will downmix to stereo.' },
|
|
46
|
+
{ flag: '--normalize', description: 'Normalize audio levels (EBU R128 loudness normalization)' },
|
|
47
|
+
{ flag: '--volume <db>', description: 'Adjust output volume in dB (e.g., -3 for -3dB)' },
|
|
48
|
+
{ flag: '--fade-in <seconds>', description: 'Add fade-in effect (seconds)' },
|
|
49
|
+
{ flag: '--fade-out <seconds>', description: 'Add fade-out effect (seconds)' },
|
|
50
|
+
{ flag: '--trim <start>:<duration>', description: 'Trim audio: <start>:<duration> (e.g., 00:01:00:30)' },
|
|
51
|
+
{ flag: '--metadata <key=value>', description: 'Set custom metadata (repeatable)' },
|
|
52
|
+
{ flag: '--force', description: 'Overwrite output files without prompt' },
|
|
38
53
|
{ flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
|
|
39
|
-
{ flag: '--explain', description: '
|
|
54
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
40
55
|
{ flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
|
|
41
56
|
],
|
|
42
57
|
examples: [
|
|
@@ -55,12 +70,15 @@ export function extractCommand(audioCmd) {
|
|
|
55
70
|
console.error(chalk.red('\nā FFmpeg not found. Please install FFmpeg first.'));
|
|
56
71
|
process.exit(1);
|
|
57
72
|
}
|
|
58
|
-
//
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
// Use pathValidator for all input/output logic
|
|
74
|
+
const { inputFiles, outputPath, errors } = validatePaths(input, options.output, { allowedExtensions: AUDIO_EXTENSIONS });
|
|
75
|
+
if (errors.length > 0) {
|
|
76
|
+
errors.forEach(e => console.error(chalk.red(e)));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
const outputPathsMap = resolveOutputPaths(inputFiles, outputPath, {
|
|
62
80
|
suffix: '-audio',
|
|
63
|
-
newExtension: `.${options.format}`
|
|
81
|
+
newExtension: `.${options.format || 'mp3'}`
|
|
64
82
|
});
|
|
65
83
|
const outputPaths = Array.from(outputPathsMap.values());
|
|
66
84
|
// Quality presets
|
|
@@ -70,65 +88,116 @@ export function extractCommand(audioCmd) {
|
|
|
70
88
|
high: '320k',
|
|
71
89
|
lossless: 'lossless'
|
|
72
90
|
};
|
|
73
|
-
const targetBitrate = qualityMap[options.quality] || options.bitrate;
|
|
74
|
-
for (let i = 0; i <
|
|
75
|
-
const inputFile =
|
|
91
|
+
const targetBitrate = (options.quality && qualityMap[options.quality]) || options.bitrate || '192k';
|
|
92
|
+
for (let i = 0; i < inputFiles.length; i++) {
|
|
93
|
+
const inputFile = inputFiles[i];
|
|
76
94
|
const outputFile = outputPaths[i];
|
|
77
95
|
console.log(chalk.blue(`\nšµ Extracting audio from: ${inputFile}`));
|
|
96
|
+
let metadata = undefined;
|
|
78
97
|
try {
|
|
79
|
-
|
|
98
|
+
metadata = await getAudioMetadata(inputFile);
|
|
80
99
|
console.log(chalk.dim(`Duration: ${formatDuration(metadata.duration)} ⢠` +
|
|
81
100
|
`Codec: ${metadata.codec} ⢠` +
|
|
82
101
|
`Sample Rate: ${metadata.sampleRate} Hz`));
|
|
102
|
+
if (metadata.channels && metadata.channels > 2) {
|
|
103
|
+
console.warn(chalk.yellow(`ā ļø Warning: Extracting audio with ${metadata.channels} channels may be slow. Consider downmixing to stereo for faster processing.`));
|
|
104
|
+
}
|
|
83
105
|
}
|
|
84
106
|
catch (err) {
|
|
85
107
|
console.log(chalk.dim('Analyzing video file...'));
|
|
86
108
|
}
|
|
87
109
|
// Build FFmpeg args
|
|
88
|
-
const args = ['-i', inputFile, '-
|
|
89
|
-
|
|
110
|
+
const args = ['-i', inputFile, '-vn']; // -vn = no video
|
|
111
|
+
if (options.force)
|
|
112
|
+
args.push('-y');
|
|
113
|
+
// Trim
|
|
114
|
+
if (options.trim) {
|
|
115
|
+
const [start, duration] = options.trim.split(':');
|
|
116
|
+
if (start)
|
|
117
|
+
args.push('-ss', start);
|
|
118
|
+
if (duration)
|
|
119
|
+
args.push('-t', duration);
|
|
120
|
+
}
|
|
121
|
+
// Codec selection and channel handling
|
|
90
122
|
const codecMap = {
|
|
91
|
-
mp3: 'libmp3lame',
|
|
92
|
-
aac: 'aac',
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
123
|
+
mp3: 'libmp3lame', // MP3 encoder
|
|
124
|
+
aac: 'aac', // Native AAC encoder
|
|
125
|
+
m4a: 'aac', // M4A is a container, usually AAC inside
|
|
126
|
+
flac: 'flac', // FLAC lossless codec
|
|
127
|
+
wav: 'pcm_s16le', // Standard uncompressed WAV PCM
|
|
128
|
+
ogg: 'libvorbis', // OGG is a container, Vorbis is most common
|
|
129
|
+
opus: 'libopus', // Opus codec (often in .opus or .ogg)
|
|
130
|
+
wma: 'wmav2', // Windows Media Audio v2
|
|
131
|
+
ape: 'ape', // Monkeyās Audio (lossless)
|
|
132
|
+
alac: 'alac'
|
|
97
133
|
};
|
|
98
|
-
const codec = codecMap[options.format];
|
|
99
|
-
if (codec)
|
|
134
|
+
const codec = options.format && codecMap[options.format];
|
|
135
|
+
if (codec)
|
|
100
136
|
args.push('-c:a', codec);
|
|
101
|
-
|
|
102
|
-
// Bitrate (skip for lossless)
|
|
103
|
-
if (targetBitrate !== 'lossless') {
|
|
137
|
+
if (targetBitrate !== 'lossless')
|
|
104
138
|
args.push('-b:a', targetBitrate);
|
|
105
|
-
|
|
106
|
-
// Sample rate
|
|
107
|
-
if (options.sampleRate) {
|
|
139
|
+
if (options.sampleRate)
|
|
108
140
|
args.push('-ar', options.sampleRate.toString());
|
|
141
|
+
// Efficient handling for >2 channels
|
|
142
|
+
let requestedChannels = options.channels;
|
|
143
|
+
if (!requestedChannels && metadata && metadata.channels) {
|
|
144
|
+
requestedChannels = metadata.channels;
|
|
109
145
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
146
|
+
if (requestedChannels && requestedChannels > 2) {
|
|
147
|
+
// Only allow >2 channels for codecs that support it well
|
|
148
|
+
const multichannelCodecs = ['flac', 'wav', 'aac', 'opus'];
|
|
149
|
+
if (!options.format || !multichannelCodecs.includes(options.format)) {
|
|
150
|
+
// Warn and downmix to stereo for mp3/ogg
|
|
151
|
+
console.warn(chalk.yellow(`ā ļø Format ${options.format || 'mp3'} does not efficiently support >2 channels. Downmixing to stereo.`));
|
|
152
|
+
args.push('-ac', '2');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
args.push('-ac', requestedChannels.toString());
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (requestedChannels) {
|
|
159
|
+
args.push('-ac', requestedChannels.toString());
|
|
160
|
+
}
|
|
161
|
+
// Audio filters
|
|
162
|
+
const filters = [];
|
|
163
|
+
if (options.normalize)
|
|
164
|
+
filters.push('loudnorm=I=-16:TP=-1.5:LRA=11');
|
|
165
|
+
if (options.volume)
|
|
166
|
+
filters.push(`volume=${options.volume}dB`);
|
|
167
|
+
if (options.fadeIn)
|
|
168
|
+
filters.push(`afade=t=in:st=0:d=${options.fadeIn}`);
|
|
169
|
+
if (options.fadeOut && metadata && metadata.duration) {
|
|
170
|
+
const fadeStart = metadata.duration - options.fadeOut;
|
|
171
|
+
filters.push(`afade=t=out:st=${fadeStart}:d=${options.fadeOut}`);
|
|
172
|
+
}
|
|
173
|
+
if (filters.length > 0)
|
|
174
|
+
args.push('-af', filters.join(','));
|
|
175
|
+
// Metadata
|
|
176
|
+
if (options.metadata && Array.isArray(options.metadata)) {
|
|
177
|
+
for (const entry of options.metadata) {
|
|
178
|
+
const [key, value] = entry.split('=');
|
|
179
|
+
if (key && value)
|
|
180
|
+
args.push('-metadata', `${key}=${value}`);
|
|
181
|
+
}
|
|
113
182
|
}
|
|
114
183
|
args.push(outputFile);
|
|
115
184
|
if (options.dryRun) {
|
|
116
185
|
console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
|
|
117
186
|
console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
|
|
118
|
-
showPluginBranding('Audio', '../../package.json');
|
|
119
187
|
continue;
|
|
120
188
|
}
|
|
121
|
-
if (options.explain) {
|
|
122
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
123
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
124
|
-
}
|
|
125
189
|
const spinner = ora('Extracting audio...').start();
|
|
126
190
|
try {
|
|
127
|
-
await runFFmpeg(args, options.verbose)
|
|
191
|
+
await runFFmpeg(args, options.verbose ?? false, (line) => {
|
|
192
|
+
if (shouldDisplayLine(line, options.verbose ?? false)) {
|
|
193
|
+
console.log(styleFFmpegOutput(line));
|
|
194
|
+
}
|
|
195
|
+
});
|
|
128
196
|
const outputStat = await stat(outputFile);
|
|
129
197
|
spinner.succeed(chalk.green('Extraction complete'));
|
|
130
198
|
console.log(chalk.green(`ā Output: ${outputFile}`));
|
|
131
|
-
|
|
199
|
+
const fmt = options.format ? options.format.toUpperCase() : 'MP3';
|
|
200
|
+
console.log(chalk.dim(`Format: ${fmt} ⢠` +
|
|
132
201
|
`Bitrate: ${targetBitrate} ⢠` +
|
|
133
202
|
`Size: ${formatFileSize(outputStat.size)}`));
|
|
134
203
|
}
|
|
@@ -137,10 +206,9 @@ export function extractCommand(audioCmd) {
|
|
|
137
206
|
throw error;
|
|
138
207
|
}
|
|
139
208
|
}
|
|
140
|
-
if (
|
|
141
|
-
console.log(chalk.green(`\nā Extracted audio from ${
|
|
209
|
+
if (inputFiles.length > 1) {
|
|
210
|
+
console.log(chalk.green(`\nā Extracted audio from ${inputFiles.length} videos successfully`));
|
|
142
211
|
}
|
|
143
|
-
showPluginBranding('Audio', '../../package.json');
|
|
144
212
|
}
|
|
145
213
|
catch (error) {
|
|
146
214
|
console.error(chalk.red(`\nā Error: ${error.message}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAwNpD"}
|