@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/commands/trim.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, parseTime
|
|
4
|
-
import {
|
|
3
|
+
import { runFFmpeg, getAudioMetadata, checkFFmpeg, formatFileSize, formatDuration, parseTime } from '../utils/ffmpeg.js';
|
|
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 trimCommand(audioCmd) {
|
|
7
8
|
audioCmd
|
|
@@ -15,11 +16,13 @@ export function trimCommand(audioCmd) {
|
|
|
15
16
|
.option('--fade-out <seconds>', 'Add fade-out effect (seconds)', parseFloat)
|
|
16
17
|
.option('--format <format>', 'Output format (default: same as input)')
|
|
17
18
|
.option('--fast', 'Fast mode (stream copy, no re-encoding)')
|
|
19
|
+
.option('--force', 'Overwrite output files without prompt')
|
|
20
|
+
.option('--metadata <key=value>', 'Set custom metadata (repeatable)', (val, acc = []) => { acc.push(val); return acc; }, [])
|
|
18
21
|
.option('--dry-run', 'Preview command without executing')
|
|
19
22
|
.option('-v, --verbose', 'Show detailed FFmpeg output')
|
|
20
|
-
.option('--explain', '
|
|
23
|
+
.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.')
|
|
21
24
|
.option('-h, --help', 'Display help for trim command')
|
|
22
|
-
.action(async (input, options)
|
|
25
|
+
.action(async function (input, options) {
|
|
23
26
|
if (options.help || !input) {
|
|
24
27
|
createStandardHelp({
|
|
25
28
|
commandName: 'trim',
|
|
@@ -39,8 +42,10 @@ export function trimCommand(audioCmd) {
|
|
|
39
42
|
{ flag: '--fade-out <seconds>', description: 'Fade-out effect duration in seconds (0.1-10)' },
|
|
40
43
|
{ flag: '--format <format>', description: 'Output format: mp3, aac, wav, flac (default: same as input)' },
|
|
41
44
|
{ flag: '--fast', description: 'Fast mode using stream copy (no quality loss, frame-accurate)' },
|
|
45
|
+
{ flag: '--force', description: 'Overwrite output files without prompt' },
|
|
46
|
+
{ flag: '--metadata <key=value>', description: 'Set custom metadata (repeatable)' },
|
|
42
47
|
{ flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
|
|
43
|
-
{ flag: '--explain', description: '
|
|
48
|
+
{ 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.' },
|
|
44
49
|
{ flag: '-v, --verbose', description: 'Show detailed FFmpeg output and progress' }
|
|
45
50
|
],
|
|
46
51
|
examples: [
|
|
@@ -64,25 +69,40 @@ export function trimCommand(audioCmd) {
|
|
|
64
69
|
console.error(chalk.red('\n✗ Error: Either --end or --duration must be specified'));
|
|
65
70
|
process.exit(1);
|
|
66
71
|
}
|
|
67
|
-
const
|
|
72
|
+
const { inputFiles, outputPath, errors } = validatePaths(input, options.output, { allowedExtensions: AUDIO_EXTENSIONS });
|
|
73
|
+
if (errors.length > 0) {
|
|
74
|
+
errors.forEach(e => console.error(chalk.red(e)));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
68
77
|
const suffix = options.format ? `-trimmed.${options.format}` : '-trimmed';
|
|
69
|
-
const
|
|
70
|
-
const outputPathsMap = resolveOutputPaths(inputPaths, outputPath, { suffix });
|
|
78
|
+
const outputPathsMap = resolveOutputPaths(inputFiles, outputPath, { suffix });
|
|
71
79
|
const outputPaths = Array.from(outputPathsMap.values());
|
|
72
|
-
for (let i = 0; i <
|
|
73
|
-
const inputFile =
|
|
80
|
+
for (let i = 0; i < inputFiles.length; i++) {
|
|
81
|
+
const inputFile = inputFiles[i];
|
|
74
82
|
const outputFile = outputPaths[i];
|
|
75
83
|
console.log(chalk.blue(`\n✂️ Trimming: ${inputFile}`));
|
|
76
84
|
const metadata = await getAudioMetadata(inputFile);
|
|
77
85
|
const inputStat = await stat(inputFile);
|
|
86
|
+
if (!options.start)
|
|
87
|
+
throw new Error('Start time is required for trim');
|
|
78
88
|
const startTime = parseTime(options.start);
|
|
79
|
-
|
|
80
|
-
|
|
89
|
+
let duration = 0;
|
|
90
|
+
let endTime = startTime;
|
|
91
|
+
if (options.end) {
|
|
92
|
+
endTime = parseTime(options.end);
|
|
93
|
+
duration = endTime - startTime;
|
|
94
|
+
}
|
|
95
|
+
else if (options.duration) {
|
|
96
|
+
duration = parseTime(options.duration);
|
|
97
|
+
endTime = startTime + duration;
|
|
98
|
+
}
|
|
81
99
|
console.log(chalk.dim(`Duration: ${formatDuration(metadata.duration)} • ` +
|
|
82
100
|
`Sample Rate: ${metadata.sampleRate} Hz`));
|
|
83
101
|
console.log(chalk.dim(`Trim: ${formatDuration(startTime)} → ${formatDuration(endTime)} ` +
|
|
84
102
|
`(${formatDuration(duration)})`));
|
|
85
|
-
const args = ['-i', inputFile
|
|
103
|
+
const args = ['-i', inputFile];
|
|
104
|
+
if (options.force)
|
|
105
|
+
args.push('-y');
|
|
86
106
|
// Start time
|
|
87
107
|
args.push('-ss', startTime.toString());
|
|
88
108
|
// Duration or end time
|
|
@@ -110,20 +130,27 @@ export function trimCommand(audioCmd) {
|
|
|
110
130
|
args.push('-af', filters.join(','));
|
|
111
131
|
}
|
|
112
132
|
}
|
|
133
|
+
// Metadata
|
|
134
|
+
if (options.metadata && Array.isArray(options.metadata)) {
|
|
135
|
+
for (const entry of options.metadata) {
|
|
136
|
+
const [key, value] = entry.split('=');
|
|
137
|
+
if (key && value)
|
|
138
|
+
args.push('-metadata', `${key}=${value}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
113
141
|
args.push(outputFile);
|
|
114
142
|
if (options.dryRun) {
|
|
115
143
|
console.log(chalk.yellow('\n[DRY RUN] Would execute:'));
|
|
116
144
|
console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
|
|
117
|
-
showPluginBranding('Audio', '../../package.json');
|
|
118
145
|
continue;
|
|
119
146
|
}
|
|
120
|
-
if (options.explain) {
|
|
121
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
122
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
123
|
-
}
|
|
124
147
|
const spinner = ora('Trimming...').start();
|
|
125
148
|
try {
|
|
126
|
-
await runFFmpeg(args, options.verbose)
|
|
149
|
+
await runFFmpeg(args, options.verbose ?? false, (line) => {
|
|
150
|
+
if (shouldDisplayLine(line, options.verbose ?? false)) {
|
|
151
|
+
console.log(styleFFmpegOutput(line));
|
|
152
|
+
}
|
|
153
|
+
});
|
|
127
154
|
const outputStat = await stat(outputFile);
|
|
128
155
|
spinner.succeed(chalk.green('Trim complete'));
|
|
129
156
|
console.log(chalk.green(`✓ Output: ${outputFile}`));
|
|
@@ -134,10 +161,7 @@ export function trimCommand(audioCmd) {
|
|
|
134
161
|
throw error;
|
|
135
162
|
}
|
|
136
163
|
}
|
|
137
|
-
|
|
138
|
-
console.log(chalk.green(`\n✓ Trimmed ${inputPaths.length} files successfully`));
|
|
139
|
-
}
|
|
140
|
-
showPluginBranding('Audio', '../../package.json');
|
|
164
|
+
console.log(chalk.green(`\n✓ Trimmed ${inputFiles.length} files successfully`));
|
|
141
165
|
}
|
|
142
166
|
catch (error) {
|
|
143
167
|
console.error(chalk.red(`\n✗ Error: ${error.message}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"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"}
|
package/dist/register.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
export declare const name = "@mediaproc/audio";
|
|
3
|
-
export declare const version
|
|
3
|
+
export declare const version: string;
|
|
4
|
+
export declare const isBuiltIn = true;
|
|
4
5
|
export declare function register(program: Command): void;
|
|
5
6
|
//# sourceMappingURL=register.d.ts.map
|
package/dist/register.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,eAAO,MAAM,IAAI,qBAAqB,CAAC;AACvC,eAAO,MAAM,OAAO,QAAiB,CAAC;AACtC,eAAO,MAAM,SAAS,OAAO,CAAC;AAE9B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO/C"}
|
package/dist/register.js
CHANGED
|
@@ -3,16 +3,29 @@ import { normalizeCommand } from './commands/normalize.js';
|
|
|
3
3
|
import { trimCommand } from './commands/trim.js';
|
|
4
4
|
import { mergeCommand } from './commands/merge.js';
|
|
5
5
|
import { extractCommand } from './commands/extract.js';
|
|
6
|
+
// ESM dynamic import for package.json version
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const pkgUrl = path.join(__dirname, '../package.json');
|
|
12
|
+
let currentVersion = 'unknown';
|
|
13
|
+
try {
|
|
14
|
+
const pkg = await import(pkgUrl, { assert: { type: 'json' } });
|
|
15
|
+
currentVersion = pkg.default.version;
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
// fallback or log error if needed
|
|
19
|
+
}
|
|
6
20
|
export const name = '@mediaproc/audio';
|
|
7
|
-
export const version =
|
|
21
|
+
export const version = currentVersion;
|
|
22
|
+
export const isBuiltIn = true;
|
|
8
23
|
export function register(program) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
mergeCommand(audioCmd);
|
|
16
|
-
extractCommand(audioCmd);
|
|
24
|
+
// Register each command directly on the root program
|
|
25
|
+
convertCommand(program);
|
|
26
|
+
normalizeCommand(program);
|
|
27
|
+
trimCommand(program);
|
|
28
|
+
mergeCommand(program);
|
|
29
|
+
extractCommand(program);
|
|
17
30
|
}
|
|
18
31
|
//# sourceMappingURL=register.js.map
|
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,8CAA8C;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AACvD,IAAI,cAAc,GAAG,SAAS,CAAC;AAC/B,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,OAAiB,CAAC;AACjD,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,kCAAkC;AACpC,CAAC;AAGD,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,qDAAqD;IACrD,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,15 +1,43 @@
|
|
|
1
|
+
export type AudioFormats = 'mp3' | 'wav' | 'flac' | 'aac' | 'ogg' | 'm4a' | 'wma' | 'opus' | 'ape' | 'alac' | 'mov' | 'mkv';
|
|
1
2
|
export interface AudioOptions {
|
|
2
|
-
input
|
|
3
|
+
input?: string;
|
|
3
4
|
output?: string;
|
|
4
|
-
format?:
|
|
5
|
+
format?: AudioFormats;
|
|
5
6
|
bitrate?: string;
|
|
6
7
|
sampleRate?: number;
|
|
7
8
|
channels?: number;
|
|
8
9
|
verbose?: boolean;
|
|
9
10
|
dryRun?: boolean;
|
|
10
11
|
explain?: boolean;
|
|
12
|
+
help?: boolean;
|
|
13
|
+
force?: boolean;
|
|
14
|
+
quality?: 'low' | 'medium' | 'high' | 'lossless';
|
|
15
|
+
codec?: string;
|
|
16
|
+
normalize?: boolean;
|
|
17
|
+
volume?: number;
|
|
18
|
+
fadeIn?: number;
|
|
19
|
+
fadeOut?: number;
|
|
20
|
+
trim?: string;
|
|
21
|
+
metadata?: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface ConvertOptions extends AudioOptions {
|
|
24
|
+
}
|
|
25
|
+
export interface ExtractOptions extends AudioOptions {
|
|
26
|
+
}
|
|
27
|
+
export interface MergeOptions extends AudioOptions {
|
|
28
|
+
inputs?: string[];
|
|
29
|
+
crossfade?: number;
|
|
30
|
+
removeSilence?: boolean;
|
|
11
31
|
}
|
|
12
32
|
export interface NormalizeOptions extends AudioOptions {
|
|
13
33
|
target?: number;
|
|
34
|
+
maxLevel?: number;
|
|
35
|
+
method?: 'loudnorm' | 'peak';
|
|
36
|
+
}
|
|
37
|
+
export interface TrimOptions extends AudioOptions {
|
|
38
|
+
start?: string;
|
|
39
|
+
end?: string;
|
|
40
|
+
duration?: string;
|
|
41
|
+
fast?: boolean;
|
|
14
42
|
}
|
|
15
43
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAG5H,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;CAEnD;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;CAEnD;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Style FFmpeg output line with appropriate colors and formatting
|
|
3
|
+
*/
|
|
4
|
+
export declare function styleFFmpegOutput(line: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Check if a line should be displayed based on verbosity and content
|
|
7
|
+
*/
|
|
8
|
+
export declare function shouldDisplayLine(line: string, verbose: boolean): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Log FFmpeg output with styling and filtering
|
|
11
|
+
*/
|
|
12
|
+
export declare function logFFmpegOutput(output: string, verbose?: boolean): void;
|
|
13
|
+
//# sourceMappingURL=ffmpeg-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffmpeg-output.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpeg-output.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkDtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAWzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI,CAOrE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* Style FFmpeg output line with appropriate colors and formatting
|
|
4
|
+
*/
|
|
5
|
+
export function styleFFmpegOutput(line) {
|
|
6
|
+
const trimmed = line.trim();
|
|
7
|
+
if (!trimmed)
|
|
8
|
+
return '';
|
|
9
|
+
// Progress updates (frame=, fps=, time=, speed=)
|
|
10
|
+
if (trimmed.match(/frame=|fps=|time=|speed=/)) {
|
|
11
|
+
// Parse progress line for richer output
|
|
12
|
+
const frameMatch = trimmed.match(/frame=\s*(\d+)/);
|
|
13
|
+
const fpsMatch = trimmed.match(/fps=\s*([\d.]+)/);
|
|
14
|
+
const timeMatch = trimmed.match(/time=\s*([\d:\.]+)/);
|
|
15
|
+
const speedMatch = trimmed.match(/speed=\s*([\d.]+x)/);
|
|
16
|
+
const sizeMatch = trimmed.match(/size=\s*(\d+\w+)/);
|
|
17
|
+
const bitrateMatch = trimmed.match(/bitrate=\s*([\d.]+\w+)/);
|
|
18
|
+
let output = chalk.cyan.bold('⏳ Progress: ');
|
|
19
|
+
if (frameMatch)
|
|
20
|
+
output += chalk.white(`Frame ${frameMatch[1]} `);
|
|
21
|
+
if (fpsMatch)
|
|
22
|
+
output += chalk.gray(`• ${fpsMatch[1]} fps `);
|
|
23
|
+
if (timeMatch)
|
|
24
|
+
output += chalk.white(`• ${timeMatch[1]} `);
|
|
25
|
+
if (sizeMatch)
|
|
26
|
+
output += chalk.gray(`• ${sizeMatch[1]} `);
|
|
27
|
+
if (bitrateMatch)
|
|
28
|
+
output += chalk.gray(`• ${bitrateMatch[1]} `);
|
|
29
|
+
if (speedMatch)
|
|
30
|
+
output += chalk.green(`• ${speedMatch[1]}`);
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
// Input file info
|
|
34
|
+
if (trimmed.startsWith('Input #') || trimmed.includes('Duration:') || trimmed.includes('Stream #')) {
|
|
35
|
+
return chalk.blue(trimmed);
|
|
36
|
+
}
|
|
37
|
+
// Output file info
|
|
38
|
+
if (trimmed.startsWith('Output #')) {
|
|
39
|
+
return chalk.green(trimmed);
|
|
40
|
+
}
|
|
41
|
+
// Warnings
|
|
42
|
+
if (trimmed.toLowerCase().includes('warning')) {
|
|
43
|
+
return chalk.yellow(trimmed);
|
|
44
|
+
}
|
|
45
|
+
// Errors
|
|
46
|
+
if (trimmed.toLowerCase().includes('error') || trimmed.toLowerCase().includes('failed')) {
|
|
47
|
+
return chalk.red(trimmed);
|
|
48
|
+
}
|
|
49
|
+
// Success messages
|
|
50
|
+
if (trimmed.includes('successfully') || trimmed.includes('complete')) {
|
|
51
|
+
return chalk.green(trimmed);
|
|
52
|
+
}
|
|
53
|
+
// Default gray for other lines
|
|
54
|
+
return chalk.gray(trimmed);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if a line should be displayed based on verbosity and content
|
|
58
|
+
*/
|
|
59
|
+
export function shouldDisplayLine(line, verbose) {
|
|
60
|
+
const trimmed = line.trim();
|
|
61
|
+
if (!trimmed)
|
|
62
|
+
return false;
|
|
63
|
+
// Always show errors and warnings
|
|
64
|
+
if (trimmed.toLowerCase().includes('error') || trimmed.toLowerCase().includes('failed') || trimmed.toLowerCase().includes('warning'))
|
|
65
|
+
return true;
|
|
66
|
+
// Show progress and status lines always
|
|
67
|
+
if (trimmed.match(/frame=|fps=|time=|speed=/))
|
|
68
|
+
return true;
|
|
69
|
+
// Show input/output info
|
|
70
|
+
if (trimmed.startsWith('Input #') || trimmed.startsWith('Output #'))
|
|
71
|
+
return true;
|
|
72
|
+
// Show if verbose
|
|
73
|
+
return verbose;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Log FFmpeg output with styling and filtering
|
|
77
|
+
*/
|
|
78
|
+
export function logFFmpegOutput(output, verbose = false) {
|
|
79
|
+
const lines = output.split('\n');
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
if (shouldDisplayLine(line, verbose)) {
|
|
82
|
+
console.log(styleFFmpegOutput(line));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=ffmpeg-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffmpeg-output.js","sourceRoot":"","sources":["../../src/utils/ffmpeg-output.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/ffmpeg.d.ts
CHANGED
|
@@ -8,23 +8,24 @@ export interface AudioMetadata {
|
|
|
8
8
|
channelLayout?: string;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Execute ffmpeg command
|
|
11
|
+
* Execute ffmpeg command with detailed output and robust error handling
|
|
12
12
|
*/
|
|
13
|
-
export declare function runFFmpeg(args: string[], verbose?: boolean, onOutput?: (line: string) => void): Promise<void>;
|
|
13
|
+
export declare function runFFmpeg(args: string[], verbose?: boolean, onOutput?: (line: string, styledLine?: string) => void): Promise<void>;
|
|
14
14
|
/**
|
|
15
|
-
* Get audio metadata using ffprobe
|
|
15
|
+
* Get audio metadata using ffprobe with detailed output and error reporting
|
|
16
16
|
*/
|
|
17
17
|
export declare function getAudioMetadata(input: string): Promise<AudioMetadata>;
|
|
18
18
|
/**
|
|
19
|
-
* Check if ffmpeg and ffprobe are available
|
|
19
|
+
* Check if ffmpeg and ffprobe are available, with styled output
|
|
20
|
+
* If strict=true, both must be present. If strict=false, only ffmpeg is checked.
|
|
20
21
|
*/
|
|
21
|
-
export declare function checkFFmpeg(): Promise<boolean>;
|
|
22
|
+
export declare function checkFFmpeg(strict?: boolean): Promise<boolean>;
|
|
22
23
|
/**
|
|
23
|
-
* Format file size to human-readable string
|
|
24
|
+
* Format file size to human-readable string (styled)
|
|
24
25
|
*/
|
|
25
26
|
export declare function formatFileSize(bytes: number): string;
|
|
26
27
|
/**
|
|
27
|
-
* Format duration to HH:MM:SS
|
|
28
|
+
* Format duration to HH:MM:SS (styled)
|
|
28
29
|
*/
|
|
29
30
|
export declare function formatDuration(seconds: number): string;
|
|
30
31
|
/**
|
|
@@ -32,7 +33,7 @@ export declare function formatDuration(seconds: number): string;
|
|
|
32
33
|
*/
|
|
33
34
|
export declare function parseTime(time: string): number;
|
|
34
35
|
/**
|
|
35
|
-
* Format bitrate to human-readable string
|
|
36
|
+
* Format bitrate to human-readable string (styled)
|
|
36
37
|
*/
|
|
37
38
|
export declare function formatBitrate(bitrate: number): string;
|
|
38
39
|
//# sourceMappingURL=ffmpeg.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffmpeg.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ffmpeg.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,UAAQ,EACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,GACrD,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6D5E;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBlE;AAcD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAW9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIrD"}
|