@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/utils/ffmpeg.js
CHANGED
|
@@ -1,48 +1,82 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
+
import { shouldDisplayLine, logFFmpegOutput } from './ffmpegLogger.js';
|
|
3
|
+
import { styleFFmpegOutput } from './ffmpeg-output.js';
|
|
4
|
+
// FFmpeg install guidance links (all platforms)
|
|
5
|
+
const FFMPEG_GUIDES = [
|
|
6
|
+
{ label: 'Official guide', url: 'https://ffmpeg.org/download.html' },
|
|
7
|
+
{ label: 'Community guide', url: 'https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg' },
|
|
8
|
+
{ label: 'Multi-platform guide', url: 'https://github.com/ffmpegwasm/ffmpeg.wasm/blob/main/docs/install.md' },
|
|
9
|
+
];
|
|
10
|
+
function printFFmpegInstallGuidance() {
|
|
11
|
+
const lines = [
|
|
12
|
+
'✗ FFmpeg or ffprobe not found on your system.',
|
|
13
|
+
'Please install FFmpeg and ffprobe to use audio features.',
|
|
14
|
+
...FFMPEG_GUIDES.map(g => `${g.label}: ${g.url}`),
|
|
15
|
+
'After installation, ensure ffmpeg and ffprobe are available in your PATH.'
|
|
16
|
+
];
|
|
17
|
+
lines.forEach(line => console.error(styleFFmpegOutput(line)));
|
|
18
|
+
}
|
|
2
19
|
/**
|
|
3
|
-
* Execute ffmpeg command
|
|
20
|
+
* Execute ffmpeg command with detailed output and robust error handling
|
|
4
21
|
*/
|
|
5
22
|
export async function runFFmpeg(args, verbose = false, onOutput) {
|
|
23
|
+
if (!(await ensureFFmpegAvailable()))
|
|
24
|
+
return;
|
|
6
25
|
return new Promise((resolve, reject) => {
|
|
7
26
|
const ffmpeg = spawn('ffmpeg', args);
|
|
8
27
|
let stderr = '';
|
|
28
|
+
let allOutput = '';
|
|
9
29
|
ffmpeg.stderr.on('data', (data) => {
|
|
10
30
|
const output = data.toString();
|
|
11
31
|
stderr += output;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
32
|
+
allOutput += output;
|
|
33
|
+
output.split('\n').forEach((line) => {
|
|
34
|
+
if (shouldDisplayLine(line) || verbose) {
|
|
35
|
+
const styled = styleFFmpegOutput(line);
|
|
36
|
+
logFFmpegOutput(line);
|
|
37
|
+
if (onOutput) {
|
|
38
|
+
onOutput(line, styled);
|
|
16
39
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
40
|
+
else {
|
|
41
|
+
if (styled)
|
|
42
|
+
console.log(styled);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
22
46
|
});
|
|
23
47
|
ffmpeg.on('close', (code) => {
|
|
24
48
|
if (code === 0) {
|
|
49
|
+
console.log(styleFFmpegOutput('FFmpeg finished successfully.'));
|
|
25
50
|
resolve();
|
|
26
51
|
}
|
|
27
52
|
else {
|
|
53
|
+
stderr.split('\n').forEach((line) => {
|
|
54
|
+
if (shouldDisplayLine(line)) {
|
|
55
|
+
logFFmpegOutput(line);
|
|
56
|
+
const styled = styleFFmpegOutput(line);
|
|
57
|
+
if (styled)
|
|
58
|
+
console.error(styled);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
28
61
|
reject(new Error(`FFmpeg failed with code ${code}\n${stderr}`));
|
|
29
62
|
}
|
|
30
63
|
});
|
|
31
64
|
ffmpeg.on('error', (error) => {
|
|
65
|
+
console.error(styleFFmpegOutput(`Failed to start ffmpeg: ${error.message}`));
|
|
32
66
|
reject(new Error(`Failed to start ffmpeg: ${error.message}`));
|
|
33
67
|
});
|
|
34
68
|
});
|
|
35
69
|
}
|
|
36
70
|
/**
|
|
37
|
-
* Get audio metadata using ffprobe
|
|
71
|
+
* Get audio metadata using ffprobe with detailed output and error reporting
|
|
38
72
|
*/
|
|
39
73
|
export async function getAudioMetadata(input) {
|
|
74
|
+
if (!(await ensureFFmpegAvailable()))
|
|
75
|
+
return Promise.reject(new Error('FFmpeg/ffprobe not installed'));
|
|
40
76
|
return new Promise((resolve, reject) => {
|
|
41
77
|
const ffprobe = spawn('ffprobe', [
|
|
42
|
-
'-v',
|
|
43
|
-
'
|
|
44
|
-
'-print_format',
|
|
45
|
-
'json',
|
|
78
|
+
'-v', 'quiet',
|
|
79
|
+
'-print_format', 'json',
|
|
46
80
|
'-show_format',
|
|
47
81
|
'-show_streams',
|
|
48
82
|
input,
|
|
@@ -53,10 +87,20 @@ export async function getAudioMetadata(input) {
|
|
|
53
87
|
stdout += data.toString();
|
|
54
88
|
});
|
|
55
89
|
ffprobe.stderr.on('data', (data) => {
|
|
56
|
-
|
|
90
|
+
const output = data.toString();
|
|
91
|
+
stderr += output;
|
|
92
|
+
output.split('\n').forEach((line) => {
|
|
93
|
+
if (shouldDisplayLine(line)) {
|
|
94
|
+
logFFmpegOutput(line);
|
|
95
|
+
const styled = styleFFmpegOutput(line);
|
|
96
|
+
if (styled)
|
|
97
|
+
console.error(styled);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
57
100
|
});
|
|
58
101
|
ffprobe.on('close', (code) => {
|
|
59
102
|
if (code !== 0) {
|
|
103
|
+
console.error(styleFFmpegOutput(`ffprobe failed with code ${code}`));
|
|
60
104
|
reject(new Error(`ffprobe failed: ${stderr}`));
|
|
61
105
|
return;
|
|
62
106
|
}
|
|
@@ -64,6 +108,7 @@ export async function getAudioMetadata(input) {
|
|
|
64
108
|
const data = JSON.parse(stdout);
|
|
65
109
|
const audioStream = data.streams.find((s) => s.codec_type === 'audio');
|
|
66
110
|
if (!audioStream) {
|
|
111
|
+
console.error(styleFFmpegOutput('No audio stream found in file.'));
|
|
67
112
|
reject(new Error('No audio stream found'));
|
|
68
113
|
return;
|
|
69
114
|
}
|
|
@@ -76,30 +121,64 @@ export async function getAudioMetadata(input) {
|
|
|
76
121
|
format: data.format.format_name || 'unknown',
|
|
77
122
|
channelLayout: audioStream.channel_layout,
|
|
78
123
|
};
|
|
124
|
+
// Detailed output of metadata
|
|
125
|
+
console.log(styleFFmpegOutput('Audio Metadata:'));
|
|
126
|
+
Object.entries(metadata).forEach(([key, value]) => {
|
|
127
|
+
console.log(styleFFmpegOutput(` ${key}: ${value}`));
|
|
128
|
+
});
|
|
79
129
|
resolve(metadata);
|
|
80
130
|
}
|
|
81
131
|
catch (error) {
|
|
132
|
+
console.error(styleFFmpegOutput(`Failed to parse ffprobe output: ${error.message}`));
|
|
82
133
|
reject(new Error(`Failed to parse ffprobe output: ${error.message}`));
|
|
83
134
|
}
|
|
84
135
|
});
|
|
85
136
|
});
|
|
86
137
|
}
|
|
87
138
|
/**
|
|
88
|
-
* Check if ffmpeg and ffprobe are available
|
|
139
|
+
* Check if ffmpeg and ffprobe are available, with styled output
|
|
140
|
+
* If strict=true, both must be present. If strict=false, only ffmpeg is checked.
|
|
89
141
|
*/
|
|
90
|
-
export async function checkFFmpeg() {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
142
|
+
export async function checkFFmpeg(strict = false) {
|
|
143
|
+
// Check ffmpeg
|
|
144
|
+
const ffmpegAvailable = await new Promise((resolve) => {
|
|
145
|
+
try {
|
|
146
|
+
const ffmpeg = spawn('ffmpeg', ['-version']);
|
|
147
|
+
ffmpeg.on('close', (code) => resolve(code === 0));
|
|
148
|
+
ffmpeg.on('error', () => resolve(false));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
97
151
|
resolve(false);
|
|
98
|
-
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
if (!strict)
|
|
155
|
+
return ffmpegAvailable;
|
|
156
|
+
// Check ffprobe
|
|
157
|
+
const ffprobeAvailable = await new Promise((resolve) => {
|
|
158
|
+
try {
|
|
159
|
+
const ffprobe = spawn('ffprobe', ['-version']);
|
|
160
|
+
ffprobe.on('close', (code) => resolve(code === 0));
|
|
161
|
+
ffprobe.on('error', () => resolve(false));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
resolve(false);
|
|
165
|
+
}
|
|
99
166
|
});
|
|
167
|
+
return ffmpegAvailable && ffprobeAvailable;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Centralized check and guidance for ffmpeg/ffprobe availability
|
|
171
|
+
*/
|
|
172
|
+
async function ensureFFmpegAvailable() {
|
|
173
|
+
const available = await checkFFmpeg(true);
|
|
174
|
+
if (!available) {
|
|
175
|
+
printFFmpegInstallGuidance();
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
100
179
|
}
|
|
101
180
|
/**
|
|
102
|
-
* Format file size to human-readable string
|
|
181
|
+
* Format file size to human-readable string (styled)
|
|
103
182
|
*/
|
|
104
183
|
export function formatFileSize(bytes) {
|
|
105
184
|
if (bytes === 0)
|
|
@@ -110,7 +189,7 @@ export function formatFileSize(bytes) {
|
|
|
110
189
|
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
111
190
|
}
|
|
112
191
|
/**
|
|
113
|
-
* Format duration to HH:MM:SS
|
|
192
|
+
* Format duration to HH:MM:SS (styled)
|
|
114
193
|
*/
|
|
115
194
|
export function formatDuration(seconds) {
|
|
116
195
|
const h = Math.floor(seconds / 3600);
|
|
@@ -135,7 +214,7 @@ export function parseTime(time) {
|
|
|
135
214
|
return parseFloat(time);
|
|
136
215
|
}
|
|
137
216
|
/**
|
|
138
|
-
* Format bitrate to human-readable string
|
|
217
|
+
* Format bitrate to human-readable string (styled)
|
|
139
218
|
*/
|
|
140
219
|
export function formatBitrate(bitrate) {
|
|
141
220
|
if (bitrate === 0)
|
package/dist/utils/ffmpeg.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FFmpeg Output Logger - Styled output for better readability
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if a line should be displayed based on content (no styling)
|
|
6
|
+
*/
|
|
7
|
+
export declare function shouldDisplayLine(line: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Log FFmpeg output (plain, no styling)
|
|
10
|
+
*/
|
|
11
|
+
export declare function logFFmpegOutput(output: string, verbose?: boolean): void;
|
|
12
|
+
//# sourceMappingURL=ffmpegLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffmpegLogger.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpegLogger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI,CAOrE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FFmpeg Output Logger - Styled output for better readability
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if a line should be displayed based on content (no styling)
|
|
6
|
+
*/
|
|
7
|
+
export function shouldDisplayLine(line) {
|
|
8
|
+
const trimmed = line.trim();
|
|
9
|
+
if (!trimmed)
|
|
10
|
+
return false;
|
|
11
|
+
// Always show errors and warnings
|
|
12
|
+
if (trimmed.toLowerCase().includes('error') || trimmed.toLowerCase().includes('failed') || trimmed.toLowerCase().includes('warning'))
|
|
13
|
+
return true;
|
|
14
|
+
// Show progress and status lines always
|
|
15
|
+
if (trimmed.match(/frame=|fps=|time=|speed=/))
|
|
16
|
+
return true;
|
|
17
|
+
// Show input/output info
|
|
18
|
+
if (trimmed.startsWith('Input #') || trimmed.startsWith('Output #'))
|
|
19
|
+
return true;
|
|
20
|
+
// Show other lines if verbose (handled in command code)
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Log FFmpeg output (plain, no styling)
|
|
25
|
+
*/
|
|
26
|
+
export function logFFmpegOutput(output, verbose = false) {
|
|
27
|
+
const lines = output.split('\n');
|
|
28
|
+
for (const line of lines) {
|
|
29
|
+
if (shouldDisplayLine(line) || verbose) {
|
|
30
|
+
console.log(line);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ffmpegLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffmpegLogger.js","sourceRoot":"","sources":["../../src/utils/ffmpegLogger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,kCAAkC;IAClC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAClJ,wCAAwC;IACxC,IAAI,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,yBAAyB;IACzB,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACjF,wDAAwD;IACxD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAAO,GAAG,KAAK;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mediaproc/audio",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Audio processing plugin for mediaproc - powered by FFmpeg",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
|
-
"bin": {
|
|
9
|
-
"mediaproc-audio": "./bin/cli.js"
|
|
10
|
-
},
|
|
11
8
|
"exports": {
|
|
12
9
|
".": {
|
|
13
10
|
"types": "./dist/index.d.ts",
|
|
@@ -15,8 +12,7 @@
|
|
|
15
12
|
}
|
|
16
13
|
},
|
|
17
14
|
"files": [
|
|
18
|
-
"dist"
|
|
19
|
-
"bin"
|
|
15
|
+
"dist"
|
|
20
16
|
],
|
|
21
17
|
"keywords": [
|
|
22
18
|
"mediaproc",
|
|
@@ -28,7 +24,7 @@
|
|
|
28
24
|
"author": "Sharique Chaudhary",
|
|
29
25
|
"license": "ISC",
|
|
30
26
|
"engines": {
|
|
31
|
-
"node": ">=
|
|
27
|
+
"node": ">=22.0.0"
|
|
32
28
|
},
|
|
33
29
|
"scripts": {
|
|
34
30
|
"build": "tsc",
|
|
@@ -37,7 +33,7 @@
|
|
|
37
33
|
"clean": "rm -rf dist"
|
|
38
34
|
},
|
|
39
35
|
"dependencies": {
|
|
40
|
-
"@mediaproc/core": "1.
|
|
36
|
+
"@mediaproc/core": "^1.2.2",
|
|
41
37
|
"chalk": "^5.3.0",
|
|
42
38
|
"commander": "^14.0.2",
|
|
43
39
|
"ora": "^9.0.0"
|