@mediaproc/audio 1.0.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.
Files changed (51) hide show
  1. package/README.md +359 -0
  2. package/bin/cli.js +5 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +102 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/convert.d.ts +3 -0
  8. package/dist/commands/convert.d.ts.map +1 -0
  9. package/dist/commands/convert.js +149 -0
  10. package/dist/commands/convert.js.map +1 -0
  11. package/dist/commands/extract.d.ts +3 -0
  12. package/dist/commands/extract.d.ts.map +1 -0
  13. package/dist/commands/extract.js +146 -0
  14. package/dist/commands/extract.js.map +1 -0
  15. package/dist/commands/merge.d.ts +3 -0
  16. package/dist/commands/merge.d.ts.map +1 -0
  17. package/dist/commands/merge.js +141 -0
  18. package/dist/commands/merge.js.map +1 -0
  19. package/dist/commands/normalize.d.ts +3 -0
  20. package/dist/commands/normalize.d.ts.map +1 -0
  21. package/dist/commands/normalize.js +114 -0
  22. package/dist/commands/normalize.js.map +1 -0
  23. package/dist/commands/trim.d.ts +3 -0
  24. package/dist/commands/trim.d.ts.map +1 -0
  25. package/dist/commands/trim.js +143 -0
  26. package/dist/commands/trim.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/register.d.ts +5 -0
  32. package/dist/register.d.ts.map +1 -0
  33. package/dist/register.js +18 -0
  34. package/dist/register.js.map +1 -0
  35. package/dist/types.d.ts +14 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +2 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/ffmpeg.d.ts +38 -0
  40. package/dist/utils/ffmpeg.d.ts.map +1 -0
  41. package/dist/utils/ffmpeg.js +146 -0
  42. package/dist/utils/ffmpeg.js.map +1 -0
  43. package/dist/utils/helpFormatter.d.ts +18 -0
  44. package/dist/utils/helpFormatter.d.ts.map +1 -0
  45. package/dist/utils/helpFormatter.js +28 -0
  46. package/dist/utils/helpFormatter.js.map +1 -0
  47. package/dist/utils/pathValidator.d.ts +74 -0
  48. package/dist/utils/pathValidator.d.ts.map +1 -0
  49. package/dist/utils/pathValidator.js +208 -0
  50. package/dist/utils/pathValidator.js.map +1 -0
  51. package/package.json +40 -0
@@ -0,0 +1,146 @@
1
+ import chalk from 'chalk';
2
+ import { stat } from 'fs/promises';
3
+ import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
4
+ import { parseInputPaths, resolveOutputPaths, validateOutputPath } from '../utils/pathValidator.js';
5
+ import { createStandardHelp } from '../utils/helpFormatter.js';
6
+ import ora from 'ora';
7
+ export function extractCommand(audioCmd) {
8
+ audioCmd
9
+ .command('extract [input]')
10
+ .description('Extract audio from video file')
11
+ .option('-o, --output <path>', 'Output file or directory path')
12
+ .option('-f, --format <format>', 'Output format: mp3, aac, wav, flac, opus, ogg', 'mp3')
13
+ .option('-b, --bitrate <bitrate>', 'Audio bitrate (e.g., 128k, 192k, 320k)', '192k')
14
+ .option('-q, --quality <quality>', 'Quality preset: low, medium, high, lossless', 'medium')
15
+ .option('--sample-rate <rate>', 'Sample rate in Hz (e.g., 44100, 48000)', parseInt)
16
+ .option('--channels <channels>', 'Number of channels: 1 (mono), 2 (stereo)', parseInt)
17
+ .option('--dry-run', 'Preview command without executing')
18
+ .option('-v, --verbose', 'Show detailed FFmpeg output')
19
+ .option('-h, --help', 'Display help for extract command')
20
+ .action(async (input, options) => {
21
+ if (options.help || !input) {
22
+ createStandardHelp({
23
+ commandName: 'extract',
24
+ emoji: 'šŸŽµ',
25
+ description: 'Extract audio track from video files. Supports multiple output formats and quality presets.',
26
+ usage: [
27
+ 'extract <input> [options]',
28
+ 'extract video.mp4 -f mp3',
29
+ 'extract videos/ -f aac -o audio/'
30
+ ],
31
+ options: [
32
+ { flag: '-o, --output <path>', description: 'Output file/directory path (default: <input>-audio.<ext>)' },
33
+ { flag: '-f, --format <format>', description: 'Output format: mp3, aac, wav, flac, opus, ogg (default: mp3)' },
34
+ { flag: '-b, --bitrate <bitrate>', description: 'Audio bitrate: 128k, 192k, 256k, 320k (default: 192k)' },
35
+ { flag: '-q, --quality <quality>', description: 'Quality preset: low (96k), medium (192k), high (320k), lossless' },
36
+ { flag: '--sample-rate <rate>', description: 'Sample rate: 44100 (CD), 48000 (studio), 96000 (Hi-Res)' },
37
+ { flag: '--channels <channels>', description: 'Audio channels: 1 (mono), 2 (stereo)' },
38
+ { flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
39
+ { flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
40
+ ],
41
+ examples: [
42
+ { command: 'extract video.mp4', description: 'Extract audio as MP3' },
43
+ { command: 'extract video.mp4 -f aac -b 256k', description: 'Extract as high-quality AAC' },
44
+ { command: 'extract video.mkv -f flac -q lossless', description: 'Extract as lossless FLAC' },
45
+ { command: 'extract video.mp4 -f mp3 --channels 1', description: 'Extract as mono MP3' },
46
+ { command: 'extract videos/ -f mp3 -o audio/', description: 'Batch extract from folder' }
47
+ ],
48
+ });
49
+ return;
50
+ }
51
+ try {
52
+ const ffmpegAvailable = await checkFFmpeg();
53
+ if (!ffmpegAvailable) {
54
+ console.error(chalk.red('\nāœ— FFmpeg not found. Please install FFmpeg first.'));
55
+ process.exit(1);
56
+ }
57
+ // Accept video formats
58
+ const inputPaths = parseInputPaths(input, {
59
+ allowedExtensions: ['.mp4', '.mkv', '.avi', '.mov', '.webm', '.flv', '.wmv', '.m4v']
60
+ });
61
+ const outputDir = validateOutputPath(options.output);
62
+ const outputPathsMap = resolveOutputPaths(inputPaths, outputDir, {
63
+ suffix: '-audio',
64
+ newExtension: `.${options.format}`
65
+ });
66
+ const outputPaths = Array.from(outputPathsMap.values());
67
+ // Quality presets
68
+ const qualityMap = {
69
+ low: '96k',
70
+ medium: '192k',
71
+ high: '320k',
72
+ lossless: 'lossless'
73
+ };
74
+ const targetBitrate = qualityMap[options.quality] || options.bitrate;
75
+ for (let i = 0; i < inputPaths.length; i++) {
76
+ const inputFile = inputPaths[i];
77
+ const outputFile = outputPaths[i];
78
+ console.log(chalk.blue(`\nšŸŽµ Extracting audio from: ${inputFile}`));
79
+ try {
80
+ const metadata = await getAudioMetadata(inputFile);
81
+ console.log(chalk.dim(`Duration: ${formatDuration(metadata.duration)} • ` +
82
+ `Codec: ${metadata.codec} • ` +
83
+ `Sample Rate: ${metadata.sampleRate} Hz`));
84
+ }
85
+ catch (err) {
86
+ console.log(chalk.dim('Analyzing video file...'));
87
+ }
88
+ // Build FFmpeg args
89
+ const args = ['-i', inputFile, '-y', '-vn']; // -vn = no video
90
+ // Codec selection
91
+ const codecMap = {
92
+ mp3: 'libmp3lame',
93
+ aac: 'aac',
94
+ flac: 'flac',
95
+ wav: 'pcm_s16le',
96
+ ogg: 'libvorbis',
97
+ opus: 'libopus',
98
+ };
99
+ const codec = codecMap[options.format];
100
+ if (codec) {
101
+ args.push('-c:a', codec);
102
+ }
103
+ // Bitrate (skip for lossless)
104
+ if (targetBitrate !== 'lossless') {
105
+ args.push('-b:a', targetBitrate);
106
+ }
107
+ // Sample rate
108
+ if (options.sampleRate) {
109
+ args.push('-ar', options.sampleRate.toString());
110
+ }
111
+ // Channels
112
+ if (options.channels) {
113
+ args.push('-ac', options.channels.toString());
114
+ }
115
+ args.push(outputFile);
116
+ if (options.dryRun) {
117
+ console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
118
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
119
+ continue;
120
+ }
121
+ const spinner = ora('Extracting audio...').start();
122
+ try {
123
+ await runFFmpeg(args, options.verbose);
124
+ const outputStat = await stat(outputFile);
125
+ spinner.succeed(chalk.green('Extraction complete'));
126
+ console.log(chalk.green(`āœ“ Output: ${outputFile}`));
127
+ console.log(chalk.dim(`Format: ${options.format.toUpperCase()} • ` +
128
+ `Bitrate: ${targetBitrate} • ` +
129
+ `Size: ${formatFileSize(outputStat.size)}`));
130
+ }
131
+ catch (error) {
132
+ spinner.fail(chalk.red('Extraction failed'));
133
+ throw error;
134
+ }
135
+ }
136
+ if (inputPaths.length > 1) {
137
+ console.log(chalk.green(`\nāœ“ Extracted audio from ${inputPaths.length} videos successfully`));
138
+ }
139
+ }
140
+ catch (error) {
141
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
142
+ process.exit(1);
143
+ }
144
+ });
145
+ }
146
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function mergeCommand(audioCmd: Command): void;
3
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +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;AAezC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAmJpD"}
@@ -0,0 +1,141 @@
1
+ import chalk from 'chalk';
2
+ import { stat, writeFile, unlink } from 'fs/promises';
3
+ import { join, dirname } from 'path';
4
+ import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
5
+ import { parseInputPaths } from '../utils/pathValidator.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ import ora from 'ora';
8
+ export function mergeCommand(audioCmd) {
9
+ audioCmd
10
+ .command('merge [inputs...]')
11
+ .description('Merge multiple audio files into one')
12
+ .option('-o, --output <path>', 'Output file path', 'merged.mp3')
13
+ .option('--format <format>', 'Output format: mp3, aac, wav, flac, ogg', 'mp3')
14
+ .option('--bitrate <bitrate>', 'Output bitrate (e.g., 192k, 320k)', '192k')
15
+ .option('--crossfade <seconds>', 'Crossfade duration between files (seconds)', parseFloat)
16
+ .option('--normalize', 'Normalize audio levels before merging')
17
+ .option('--dry-run', 'Preview command without executing')
18
+ .option('-v, --verbose', 'Show detailed FFmpeg output')
19
+ .option('-h, --help', 'Display help for merge command')
20
+ .action(async (inputs, options) => {
21
+ if (options.help || !inputs || inputs.length === 0) {
22
+ createStandardHelp({
23
+ commandName: 'merge',
24
+ emoji: 'šŸ”—',
25
+ description: 'Concatenate multiple audio files into a single output file. Supports crossfade transitions and automatic audio normalization.',
26
+ usage: [
27
+ 'merge <input1> <input2> [input3...] [options]',
28
+ 'merge audio1.mp3 audio2.mp3',
29
+ 'merge part*.mp3 -o complete.mp3'
30
+ ],
31
+ options: [
32
+ { flag: '-o, --output <path>', description: 'Output file path (default: merged.mp3)' },
33
+ { flag: '--format <format>', description: 'Output format: mp3, aac, wav, flac, ogg (default: mp3)' },
34
+ { flag: '--bitrate <bitrate>', description: 'Output bitrate: 128k, 192k, 256k, 320k (default: 192k)' },
35
+ { flag: '--crossfade <seconds>', description: 'Crossfade duration between files in seconds (0-10)' },
36
+ { flag: '--normalize', description: 'Normalize audio levels before merging for consistent volume' },
37
+ { flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
38
+ { flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
39
+ ],
40
+ examples: [
41
+ { command: 'merge audio1.mp3 audio2.mp3 audio3.mp3', description: 'Merge three files' },
42
+ { command: 'merge part*.mp3 -o complete.mp3', description: 'Merge all matching files' },
43
+ { command: 'merge a.mp3 b.mp3 --crossfade 2', description: 'Merge with 2-second crossfade' },
44
+ { command: 'merge *.wav -o output.flac --format flac', description: 'Merge WAVs to FLAC' },
45
+ { command: 'merge a.mp3 b.mp3 --normalize', description: 'Normalize before merging' }
46
+ ],
47
+ });
48
+ return;
49
+ }
50
+ try {
51
+ const ffmpegAvailable = await checkFFmpeg();
52
+ if (!ffmpegAvailable) {
53
+ console.error(chalk.red('\nāœ— FFmpeg not found. Please install FFmpeg first.'));
54
+ process.exit(1);
55
+ }
56
+ if (inputs.length < 2) {
57
+ console.error(chalk.red('\nāœ— Error: At least 2 audio files required for merging'));
58
+ process.exit(1);
59
+ }
60
+ console.log(chalk.blue(`\nšŸ”— Merging ${inputs.length} audio files...`));
61
+ // Validate all input files
62
+ const validatedInputs = [];
63
+ for (const input of inputs) {
64
+ try {
65
+ const paths = parseInputPaths(input, {
66
+ allowedExtensions: ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.opus', '.m4a']
67
+ });
68
+ validatedInputs.push(...paths);
69
+ }
70
+ catch (err) {
71
+ console.warn(chalk.yellow(`⚠ Skipping invalid input: ${input}`));
72
+ }
73
+ }
74
+ if (validatedInputs.length < 2) {
75
+ console.error(chalk.red('\nāœ— Error: Not enough valid audio files found'));
76
+ process.exit(1);
77
+ }
78
+ // Show input files
79
+ let totalDuration = 0;
80
+ for (const inputFile of validatedInputs) {
81
+ const metadata = await getAudioMetadata(inputFile);
82
+ console.log(chalk.dim(` ${inputFile} (${formatDuration(metadata.duration)})`));
83
+ totalDuration += metadata.duration;
84
+ }
85
+ console.log(chalk.dim(`\nTotal duration: ${formatDuration(totalDuration)}`));
86
+ // Create concat file list
87
+ const concatFile = join(dirname(validatedInputs[0]), '.concat-list.txt');
88
+ const concatContent = validatedInputs.map(f => `file '${f}'`).join('\n');
89
+ await writeFile(concatFile, concatContent);
90
+ const args = ['-f', 'concat', '-safe', '0', '-i', concatFile, '-y'];
91
+ // Add crossfade if specified
92
+ if (options.crossfade) {
93
+ // Build complex filter for crossfade
94
+ const filterParts = [];
95
+ for (let i = 0; i < validatedInputs.length - 1; i++) {
96
+ if (i === 0) {
97
+ filterParts.push(`[0:a][1:a]acrossfade=d=${options.crossfade}[a01]`);
98
+ }
99
+ else {
100
+ filterParts.push(`[a0${i}][${i + 1}:a]acrossfade=d=${options.crossfade}[a0${i + 1}]`);
101
+ }
102
+ }
103
+ args.push('-filter_complex', filterParts.join(';'));
104
+ args.push('-map', `[a0${validatedInputs.length - 1}]`);
105
+ }
106
+ // Normalization
107
+ if (options.normalize && !options.crossfade) {
108
+ args.push('-af', 'loudnorm=I=-16:TP=-1.5:LRA=11');
109
+ }
110
+ // Output bitrate
111
+ args.push('-b:a', options.bitrate);
112
+ args.push(options.output);
113
+ if (options.dryRun) {
114
+ console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
115
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
116
+ await unlink(concatFile);
117
+ return;
118
+ }
119
+ const spinner = ora('Merging audio files...').start();
120
+ try {
121
+ await runFFmpeg(args, options.verbose);
122
+ const outputStat = await stat(options.output);
123
+ // Clean up concat file
124
+ await unlink(concatFile);
125
+ spinner.succeed(chalk.green('Merge complete'));
126
+ console.log(chalk.green(`āœ“ Output: ${options.output}`));
127
+ console.log(chalk.dim(`Duration: ${formatDuration(totalDuration)} • Size: ${formatFileSize(outputStat.size)}`));
128
+ }
129
+ catch (error) {
130
+ await unlink(concatFile).catch(() => { });
131
+ spinner.fail(chalk.red('Merge failed'));
132
+ throw error;
133
+ }
134
+ }
135
+ catch (error) {
136
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
137
+ process.exit(1);
138
+ }
139
+ });
140
+ }
141
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function normalizeCommand(audioCmd: Command): void;
3
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/commands/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA0HxD"}
@@ -0,0 +1,114 @@
1
+ import chalk from 'chalk';
2
+ import { stat } from 'fs/promises';
3
+ import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
4
+ import { parseInputPaths, resolveOutputPaths, validateOutputPath } from '../utils/pathValidator.js';
5
+ import { createStandardHelp } from '../utils/helpFormatter.js';
6
+ import ora from 'ora';
7
+ export function normalizeCommand(audioCmd) {
8
+ audioCmd
9
+ .command('normalize [input]')
10
+ .description('Normalize audio levels to consistent loudness')
11
+ .option('-o, --output <path>', 'Output file or directory path')
12
+ .option('-t, --target <lufs>', 'Target loudness in LUFS (default: -16)', parseInt, -16)
13
+ .option('-l, --max-level <db>', 'Maximum true peak in dB (default: -1.5)', parseFloat, -1.5)
14
+ .option('-m, --method <method>', 'Normalization method: loudnorm (EBU R128), peak', 'loudnorm')
15
+ .option('--format <format>', 'Output format (default: same as input)')
16
+ .option('--dry-run', 'Preview command without executing')
17
+ .option('-v, --verbose', 'Show detailed FFmpeg output')
18
+ .option('-h, --help', 'Display help for normalize command')
19
+ .action(async (input, options) => {
20
+ if (options.help || !input) {
21
+ createStandardHelp({
22
+ commandName: 'normalize',
23
+ emoji: 'šŸ“Š',
24
+ description: 'Normalize audio levels using EBU R128 loudness normalization standard. Ensures consistent volume across different audio files.',
25
+ usage: [
26
+ 'normalize <input> [options]',
27
+ 'normalize audio.mp3',
28
+ 'normalize audio-files/ -o output/'
29
+ ],
30
+ options: [
31
+ { flag: '-o, --output <path>', description: 'Output file/directory path (default: <input>-normalized.<ext>)' },
32
+ { flag: '-t, --target <lufs>', description: 'Target loudness: -16 (broadcast), -23 (streaming), -14 (podcasts)' },
33
+ { flag: '-l, --max-level <db>', description: 'Maximum true peak in dB to prevent clipping (default: -1.5)' },
34
+ { flag: '-m, --method <method>', description: 'Normalization method: loudnorm (EBU R128 standard), peak' },
35
+ { flag: '--format <format>', description: 'Output format: mp3, aac, wav, flac (default: same as input)' },
36
+ { flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
37
+ { flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
38
+ ],
39
+ examples: [
40
+ { command: 'normalize audio.mp3', description: 'Normalize to -16 LUFS (broadcast standard)' },
41
+ { command: 'normalize audio.mp3 -t -23', description: 'Normalize to -23 LUFS (streaming standard)' },
42
+ { command: 'normalize loud-audio.wav -t -16 -l -1.0', description: 'Normalize with custom peak limit' },
43
+ { command: 'normalize audio.mp3 -m peak', description: 'Use simple peak normalization' },
44
+ { command: 'normalize folder/ -o output/', description: 'Batch normalize all audio files' }
45
+ ],
46
+ });
47
+ return;
48
+ }
49
+ try {
50
+ const ffmpegAvailable = await checkFFmpeg();
51
+ if (!ffmpegAvailable) {
52
+ console.error(chalk.red('\nāœ— FFmpeg not found. Please install FFmpeg first.'));
53
+ process.exit(1);
54
+ }
55
+ const inputPaths = parseInputPaths(input, {
56
+ allowedExtensions: ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.opus', '.m4a']
57
+ });
58
+ const suffix = options.format ? `-normalized.${options.format}` : '-normalized';
59
+ const outputDir = validateOutputPath(options.output);
60
+ const outputPathsMap = resolveOutputPaths(inputPaths, outputDir, { suffix });
61
+ const outputPaths = Array.from(outputPathsMap.values());
62
+ for (let i = 0; i < inputPaths.length; i++) {
63
+ const inputFile = inputPaths[i];
64
+ const outputFile = outputPaths[i];
65
+ console.log(chalk.blue(`\nšŸ“Š Normalizing: ${inputFile}`));
66
+ const metadata = await getAudioMetadata(inputFile);
67
+ const inputStat = await stat(inputFile);
68
+ console.log(chalk.dim(`Duration: ${formatDuration(metadata.duration)} • ` +
69
+ `Sample Rate: ${metadata.sampleRate} Hz • ` +
70
+ `Channels: ${metadata.channels}`));
71
+ const args = ['-i', inputFile, '-y'];
72
+ if (options.method === 'loudnorm') {
73
+ // EBU R128 loudness normalization
74
+ args.push('-af', `loudnorm=I=${options.target}:TP=${options.maxLevel}:LRA=11:print_format=summary`);
75
+ }
76
+ else if (options.method === 'peak') {
77
+ // Simple peak normalization
78
+ args.push('-af', 'volume=0dB');
79
+ }
80
+ // Preserve original codec if no format specified
81
+ if (!options.format) {
82
+ args.push('-c:a', 'copy');
83
+ }
84
+ args.push(outputFile);
85
+ if (options.dryRun) {
86
+ console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
87
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
88
+ continue;
89
+ }
90
+ const spinner = ora('Normalizing...').start();
91
+ try {
92
+ await runFFmpeg(args, options.verbose);
93
+ const outputStat = await stat(outputFile);
94
+ spinner.succeed(chalk.green('Normalization complete'));
95
+ console.log(chalk.green(`āœ“ Output: ${outputFile}`));
96
+ console.log(chalk.dim(`Target: ${options.target} LUFS • Peak limit: ${options.maxLevel} dB`));
97
+ console.log(chalk.dim(`Size: ${formatFileSize(inputStat.size)} → ${formatFileSize(outputStat.size)}`));
98
+ }
99
+ catch (error) {
100
+ spinner.fail(chalk.red('Normalization failed'));
101
+ throw error;
102
+ }
103
+ }
104
+ if (inputPaths.length > 1) {
105
+ console.log(chalk.green(`\nāœ“ Normalized ${inputPaths.length} files successfully`));
106
+ }
107
+ }
108
+ catch (error) {
109
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
110
+ process.exit(1);
111
+ }
112
+ });
113
+ }
114
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/commands/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function trimCommand(audioCmd: Command): void;
3
+ //# sourceMappingURL=trim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim.d.ts","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAyJnD"}
@@ -0,0 +1,143 @@
1
+ import chalk from 'chalk';
2
+ import { stat } from 'fs/promises';
3
+ import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration, parseTime, } from '../utils/ffmpeg.js';
4
+ import { parseInputPaths, resolveOutputPaths, validateOutputPath } from '../utils/pathValidator.js';
5
+ import { createStandardHelp } from '../utils/helpFormatter.js';
6
+ import ora from 'ora';
7
+ export function trimCommand(audioCmd) {
8
+ audioCmd
9
+ .command('trim [input]')
10
+ .description('Trim audio to specified time range')
11
+ .option('-o, --output <path>', 'Output file or directory path')
12
+ .option('-s, --start <time>', 'Start time (HH:MM:SS or seconds)', '00:00:00')
13
+ .option('-e, --end <time>', 'End time (HH:MM:SS or seconds)')
14
+ .option('-d, --duration <time>', 'Duration from start (HH:MM:SS or seconds)')
15
+ .option('--fade-in <seconds>', 'Add fade-in effect (seconds)', parseFloat)
16
+ .option('--fade-out <seconds>', 'Add fade-out effect (seconds)', parseFloat)
17
+ .option('--format <format>', 'Output format (default: same as input)')
18
+ .option('--fast', 'Fast mode (stream copy, no re-encoding)')
19
+ .option('--dry-run', 'Preview command without executing')
20
+ .option('-v, --verbose', 'Show detailed FFmpeg output')
21
+ .option('-h, --help', 'Display help for trim command')
22
+ .action(async (input, options) => {
23
+ if (options.help || !input) {
24
+ createStandardHelp({
25
+ commandName: 'trim',
26
+ emoji: 'āœ‚ļø',
27
+ description: 'Cut audio files to specific time ranges. Supports precise timing with optional fade effects.',
28
+ usage: [
29
+ 'trim <input> [options]',
30
+ 'trim audio.mp3 --start 00:00:30 --end 00:01:30',
31
+ 'trim audio.mp3 --duration 60'
32
+ ],
33
+ options: [
34
+ { flag: '-o, --output <path>', description: 'Output file/directory path (default: <input>-trimmed.<ext>)' },
35
+ { flag: '-s, --start <time>', description: 'Start time: HH:MM:SS format or seconds (e.g., 00:01:30 or 90)' },
36
+ { flag: '-e, --end <time>', description: 'End time: HH:MM:SS format or seconds' },
37
+ { flag: '-d, --duration <time>', description: 'Duration from start: HH:MM:SS or seconds (e.g., 00:01:00 or 60)' },
38
+ { flag: '--fade-in <seconds>', description: 'Fade-in effect duration in seconds (0.1-10)' },
39
+ { flag: '--fade-out <seconds>', description: 'Fade-out effect duration in seconds (0.1-10)' },
40
+ { flag: '--format <format>', description: 'Output format: mp3, aac, wav, flac (default: same as input)' },
41
+ { flag: '--fast', description: 'Fast mode using stream copy (no quality loss, frame-accurate)' },
42
+ { flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
43
+ { flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
44
+ ],
45
+ examples: [
46
+ { command: 'trim audio.mp3 --start 00:01:00 --end 00:02:00', description: 'Trim from 1:00 to 2:00' },
47
+ { command: 'trim audio.mp3 --duration 30', description: 'Extract first 30 seconds' },
48
+ { command: 'trim audio.mp3 -s 30 -d 60', description: 'From 30s, extract 60s' },
49
+ { command: 'trim audio.mp3 -s 60 -e 120 --fade-in 2 --fade-out 3', description: 'Trim with fade effects' },
50
+ { command: 'trim audio.mp3 --start 30 --duration 60 --fast', description: 'Fast trim (stream copy)' },
51
+ { command: 'trim folder/ -s 10 -d 30 -o output/', description: 'Batch trim all files' }
52
+ ],
53
+ });
54
+ return;
55
+ }
56
+ try {
57
+ const ffmpegAvailable = await checkFFmpeg();
58
+ if (!ffmpegAvailable) {
59
+ console.error(chalk.red('\nāœ— FFmpeg not found. Please install FFmpeg first.'));
60
+ process.exit(1);
61
+ }
62
+ if (!options.end && !options.duration) {
63
+ console.error(chalk.red('\nāœ— Error: Either --end or --duration must be specified'));
64
+ process.exit(1);
65
+ }
66
+ const inputPaths = parseInputPaths(input, {
67
+ allowedExtensions: ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.opus', '.m4a']
68
+ });
69
+ const suffix = options.format ? `-trimmed.${options.format}` : '-trimmed';
70
+ const outputDir = validateOutputPath(options.output);
71
+ const outputPathsMap = resolveOutputPaths(inputPaths, outputDir, { suffix });
72
+ const outputPaths = Array.from(outputPathsMap.values());
73
+ for (let i = 0; i < inputPaths.length; i++) {
74
+ const inputFile = inputPaths[i];
75
+ const outputFile = outputPaths[i];
76
+ console.log(chalk.blue(`\nāœ‚ļø Trimming: ${inputFile}`));
77
+ const metadata = await getAudioMetadata(inputFile);
78
+ const inputStat = await stat(inputFile);
79
+ const startTime = parseTime(options.start);
80
+ const endTime = options.end ? parseTime(options.end) : startTime + parseTime(options.duration);
81
+ const duration = endTime - startTime;
82
+ console.log(chalk.dim(`Duration: ${formatDuration(metadata.duration)} • ` +
83
+ `Sample Rate: ${metadata.sampleRate} Hz`));
84
+ console.log(chalk.dim(`Trim: ${formatDuration(startTime)} → ${formatDuration(endTime)} ` +
85
+ `(${formatDuration(duration)})`));
86
+ const args = ['-i', inputFile, '-y'];
87
+ // Start time
88
+ args.push('-ss', startTime.toString());
89
+ // Duration or end time
90
+ if (options.duration) {
91
+ args.push('-t', parseTime(options.duration).toString());
92
+ }
93
+ else if (options.end) {
94
+ args.push('-to', endTime.toString());
95
+ }
96
+ // Fast mode (stream copy)
97
+ if (options.fast && !options.fadeIn && !options.fadeOut) {
98
+ args.push('-c', 'copy');
99
+ }
100
+ else {
101
+ // Build audio filters
102
+ const filters = [];
103
+ if (options.fadeIn) {
104
+ filters.push(`afade=t=in:st=0:d=${options.fadeIn}`);
105
+ }
106
+ if (options.fadeOut) {
107
+ const fadeStart = duration - options.fadeOut;
108
+ filters.push(`afade=t=out:st=${fadeStart}:d=${options.fadeOut}`);
109
+ }
110
+ if (filters.length > 0) {
111
+ args.push('-af', filters.join(','));
112
+ }
113
+ }
114
+ args.push(outputFile);
115
+ if (options.dryRun) {
116
+ console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
117
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
118
+ continue;
119
+ }
120
+ const spinner = ora('Trimming...').start();
121
+ try {
122
+ await runFFmpeg(args, options.verbose);
123
+ const outputStat = await stat(outputFile);
124
+ spinner.succeed(chalk.green('Trim complete'));
125
+ console.log(chalk.green(`āœ“ Output: ${outputFile}`));
126
+ console.log(chalk.dim(`Size: ${formatFileSize(inputStat.size)} → ${formatFileSize(outputStat.size)}`));
127
+ }
128
+ catch (error) {
129
+ spinner.fail(chalk.red('Trim failed'));
130
+ throw error;
131
+ }
132
+ }
133
+ if (inputPaths.length > 1) {
134
+ console.log(chalk.green(`\nāœ“ Trimmed ${inputPaths.length} files successfully`));
135
+ }
136
+ }
137
+ catch (error) {
138
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
139
+ process.exit(1);
140
+ }
141
+ });
142
+ }
143
+ //# sourceMappingURL=trim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { register, name, version } from './register.js';
2
+ export type * from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxD,mBAAmB,YAAY,CAAC"}