@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.
@@ -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
- if (onOutput) {
13
- output.split('\n').forEach((line) => {
14
- if (line.trim()) {
15
- onOutput(line);
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
- else if (verbose) {
20
- process.stderr.write(data);
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
- 'quiet',
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
- stderr += data.toString();
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
- return new Promise((resolve) => {
92
- const ffmpeg = spawn('ffmpeg', ['-version']);
93
- ffmpeg.on('close', (code) => {
94
- resolve(code === 0);
95
- });
96
- ffmpeg.on('error', () => {
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)
@@ -1 +1 @@
1
- {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"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"}
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.1.0",
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": ">=18.0.0"
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.0.0",
36
+ "@mediaproc/core": "^1.2.2",
41
37
  "chalk": "^5.3.0",
42
38
  "commander": "^14.0.2",
43
39
  "ora": "^9.0.0"
package/bin/cli.js DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import('../dist/cli.js').catch((error) => {
3
- console.error('Fatal error:', error);
4
- process.exit(1);
5
- });