@mediaproc/video 1.0.0 → 1.0.1

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 (49) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +14 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/compress.d.ts +3 -0
  6. package/dist/commands/compress.d.ts.map +1 -0
  7. package/dist/commands/compress.js +88 -0
  8. package/dist/commands/compress.js.map +1 -0
  9. package/dist/commands/extract.d.ts +3 -0
  10. package/dist/commands/extract.d.ts.map +1 -0
  11. package/dist/commands/extract.js +212 -0
  12. package/dist/commands/extract.js.map +1 -0
  13. package/dist/commands/merge.d.ts +3 -0
  14. package/dist/commands/merge.d.ts.map +1 -0
  15. package/dist/commands/merge.js +136 -0
  16. package/dist/commands/merge.js.map +1 -0
  17. package/dist/commands/resize.d.ts +3 -0
  18. package/dist/commands/resize.d.ts.map +1 -0
  19. package/dist/commands/resize.js +117 -0
  20. package/dist/commands/resize.js.map +1 -0
  21. package/dist/commands/transcode.d.ts +3 -0
  22. package/dist/commands/transcode.d.ts.map +1 -0
  23. package/dist/commands/transcode.js +102 -0
  24. package/dist/commands/transcode.js.map +1 -0
  25. package/dist/commands/trim.d.ts +3 -0
  26. package/dist/commands/trim.d.ts.map +1 -0
  27. package/dist/commands/trim.js +103 -0
  28. package/dist/commands/trim.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +2 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/register.d.ts +5 -0
  34. package/dist/register.d.ts.map +1 -0
  35. package/dist/register.js +20 -0
  36. package/dist/register.js.map +1 -0
  37. package/dist/types.d.ts +56 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +2 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/utils/ffmpeg.d.ts +46 -0
  42. package/dist/utils/ffmpeg.d.ts.map +1 -0
  43. package/dist/utils/ffmpeg.js +162 -0
  44. package/dist/utils/ffmpeg.js.map +1 -0
  45. package/dist/utils/pathValidator.d.ts +60 -0
  46. package/dist/utils/pathValidator.d.ts.map +1 -0
  47. package/dist/utils/pathValidator.js +207 -0
  48. package/dist/utils/pathValidator.js.map +1 -0
  49. package/package.json +12 -3
@@ -0,0 +1,162 @@
1
+ import { spawn } from 'child_process';
2
+ import { resolve } from 'path';
3
+ import chalk from 'chalk';
4
+ import { fileExists } from './pathValidator.js';
5
+ /**
6
+ * Execute ffmpeg command
7
+ */
8
+ export async function runFFmpeg(args, verbose = false) {
9
+ return new Promise((resolve, reject) => {
10
+ if (verbose) {
11
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}`));
12
+ }
13
+ const ffmpeg = spawn('ffmpeg', args);
14
+ let stderr = '';
15
+ ffmpeg.stderr.on('data', (data) => {
16
+ stderr += data.toString();
17
+ if (verbose) {
18
+ process.stderr.write(data);
19
+ }
20
+ });
21
+ ffmpeg.on('close', (code) => {
22
+ if (code === 0) {
23
+ resolve();
24
+ }
25
+ else {
26
+ reject(new Error(`FFmpeg failed with code ${code}\n${stderr}`));
27
+ }
28
+ });
29
+ ffmpeg.on('error', (error) => {
30
+ reject(new Error(`Failed to start ffmpeg: ${error.message}`));
31
+ });
32
+ });
33
+ }
34
+ /**
35
+ * Get video metadata using ffprobe
36
+ */
37
+ export async function getVideoMetadata(input) {
38
+ return new Promise((resolve, reject) => {
39
+ const ffprobe = spawn('ffprobe', [
40
+ '-v',
41
+ 'quiet',
42
+ '-print_format',
43
+ 'json',
44
+ '-show_format',
45
+ '-show_streams',
46
+ input,
47
+ ]);
48
+ let stdout = '';
49
+ let stderr = '';
50
+ ffprobe.stdout.on('data', (data) => {
51
+ stdout += data.toString();
52
+ });
53
+ ffprobe.stderr.on('data', (data) => {
54
+ stderr += data.toString();
55
+ });
56
+ ffprobe.on('close', (code) => {
57
+ if (code !== 0) {
58
+ reject(new Error(`ffprobe failed: ${stderr}`));
59
+ return;
60
+ }
61
+ try {
62
+ const data = JSON.parse(stdout);
63
+ const videoStream = data.streams.find((s) => s.codec_type === 'video');
64
+ if (!videoStream) {
65
+ reject(new Error('No video stream found'));
66
+ return;
67
+ }
68
+ const metadata = {
69
+ duration: parseFloat(data.format.duration) || 0,
70
+ width: videoStream.width || 0,
71
+ height: videoStream.height || 0,
72
+ codec: videoStream.codec_name || 'unknown',
73
+ fps: eval(videoStream.r_frame_rate) || 0,
74
+ bitrate: parseInt(data.format.bit_rate) || 0,
75
+ format: data.format.format_name || 'unknown',
76
+ };
77
+ resolve(metadata);
78
+ }
79
+ catch (error) {
80
+ reject(new Error(`Failed to parse ffprobe output: ${error}`));
81
+ }
82
+ });
83
+ ffprobe.on('error', (error) => {
84
+ reject(new Error(`Failed to start ffprobe: ${error.message}`));
85
+ });
86
+ });
87
+ }
88
+ /**
89
+ * Check if ffmpeg is available
90
+ */
91
+ export async function checkFFmpeg() {
92
+ return new Promise((resolve) => {
93
+ const ffmpeg = spawn('ffmpeg', ['-version']);
94
+ ffmpeg.on('close', (code) => resolve(code === 0));
95
+ ffmpeg.on('error', () => resolve(false));
96
+ });
97
+ }
98
+ /**
99
+ * Check if ffprobe is available
100
+ */
101
+ export async function checkFFprobe() {
102
+ return new Promise((resolve) => {
103
+ const ffprobe = spawn('ffprobe', ['-version']);
104
+ ffprobe.on('close', (code) => resolve(code === 0));
105
+ ffprobe.on('error', () => resolve(false));
106
+ });
107
+ }
108
+ /**
109
+ * Validate input file exists
110
+ */
111
+ export function validateInputFile(input) {
112
+ const inputPath = resolve(input);
113
+ if (!fileExists(inputPath)) {
114
+ throw new Error(`Input file not found: ${input}`);
115
+ }
116
+ return inputPath;
117
+ }
118
+ /**
119
+ * Generate output filename if not provided
120
+ */
121
+ export function generateOutputPath(input, suffix, extension) {
122
+ const inputPath = resolve(input);
123
+ const ext = extension || inputPath.split('.').pop();
124
+ const base = inputPath.substring(0, inputPath.lastIndexOf('.'));
125
+ return `${base}_${suffix}.${ext}`;
126
+ }
127
+ /**
128
+ * Format time for display (seconds to HH:MM:SS)
129
+ */
130
+ export function formatDuration(seconds) {
131
+ const hrs = Math.floor(seconds / 3600);
132
+ const mins = Math.floor((seconds % 3600) / 60);
133
+ const secs = Math.floor(seconds % 60);
134
+ return `${hrs.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
135
+ }
136
+ /**
137
+ * Parse time string (HH:MM:SS) to seconds
138
+ */
139
+ export function parseTimeToSeconds(time) {
140
+ const parts = time.split(':').map(Number);
141
+ if (parts.length === 3) {
142
+ return parts[0] * 3600 + parts[1] * 60 + parts[2];
143
+ }
144
+ else if (parts.length === 2) {
145
+ return parts[0] * 60 + parts[1];
146
+ }
147
+ return parts[0];
148
+ }
149
+ /**
150
+ * Format file size
151
+ */
152
+ export function formatFileSize(bytes) {
153
+ const units = ['B', 'KB', 'MB', 'GB'];
154
+ let size = bytes;
155
+ let unitIndex = 0;
156
+ while (size >= 1024 && unitIndex < units.length - 1) {
157
+ size /= 1024;
158
+ unitIndex++;
159
+ }
160
+ return `${size.toFixed(2)} ${units[unitIndex]}`;
161
+ }
162
+ //# sourceMappingURL=ffmpeg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Supported video file extensions
3
+ */
4
+ export declare const VIDEO_EXTENSIONS: string[];
5
+ /**
6
+ * Parse input path and return array of files
7
+ * Supports:
8
+ * - Single file: "video.mp4"
9
+ * - Multiple files with commas: "video1.mp4,video2.mp4,video3.mp4"
10
+ * - Directory: "input-videos/" (finds all matching files)
11
+ */
12
+ export declare function parseInputPaths(inputPath: string, allowedExtensions?: string[]): string[];
13
+ /**
14
+ * Resolve output paths for input files
15
+ *
16
+ * Logic:
17
+ * 1. Single file + output has extension (e.g., output.mp4) = Use exact file path
18
+ * 2. Multiple files + output has extension = Invalid (error)
19
+ * 3. No output provided = Use current directory
20
+ * 4. Output directory provided = Use that directory
21
+ *
22
+ * @param inputFiles - Array of input file paths
23
+ * @param outputPath - Output path (file or directory, or undefined for current dir)
24
+ * @param suffix - Suffix to add to filenames (default: empty)
25
+ * @param newExtension - New extension for output files (default: same as input)
26
+ */
27
+ export declare function resolveOutputPaths(inputFiles: string[], outputPath: string | undefined, options?: {
28
+ suffix?: string;
29
+ newExtension?: string;
30
+ }): Map<string, string>;
31
+ /**
32
+ * Validate input and output paths
33
+ * Returns validated input files, output directory, and any errors
34
+ */
35
+ export declare function validatePaths(inputPath: string, outputPath: string | undefined, options?: {
36
+ allowedExtensions?: string[];
37
+ suffix?: string;
38
+ newExtension?: string;
39
+ }): {
40
+ inputFiles: string[];
41
+ outputPath: string | undefined;
42
+ errors: string[];
43
+ };
44
+ /**
45
+ * Get file name from path
46
+ */
47
+ export declare function getFileName(filePath: string): string;
48
+ /**
49
+ * Generate default output filename with suffix
50
+ */
51
+ export declare function generateOutputFilename(inputPath: string, suffix: string, extension?: string): string;
52
+ /**
53
+ * Check if file exists
54
+ */
55
+ export declare function fileExists(filePath: string): boolean;
56
+ /**
57
+ * Create directory if it doesn't exist
58
+ */
59
+ export declare function ensureDirectoryExists(dirPath: string): void;
60
+ //# sourceMappingURL=pathValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathValidator.d.ts","sourceRoot":"","sources":["../../src/utils/pathValidator.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,gBAAgB,UAgB5B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,iBAAiB,GAAE,MAAM,EAAqB,GAC7C,MAAM,EAAE,CA8BV;AAkCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAAE,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA6DrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,GAAE;IACP,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL;IACD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA2BA;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI3D"}
@@ -0,0 +1,207 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * Supported video file extensions
5
+ */
6
+ export const VIDEO_EXTENSIONS = [
7
+ '.mp4',
8
+ '.avi',
9
+ '.mkv',
10
+ '.mov',
11
+ '.webm',
12
+ '.flv',
13
+ '.wmv',
14
+ '.mpg',
15
+ '.mpeg',
16
+ '.m4v',
17
+ '.3gp',
18
+ '.f4v',
19
+ '.ts',
20
+ '.mts',
21
+ '.m2ts',
22
+ ];
23
+ /**
24
+ * Parse input path and return array of files
25
+ * Supports:
26
+ * - Single file: "video.mp4"
27
+ * - Multiple files with commas: "video1.mp4,video2.mp4,video3.mp4"
28
+ * - Directory: "input-videos/" (finds all matching files)
29
+ */
30
+ export function parseInputPaths(inputPath, allowedExtensions = VIDEO_EXTENSIONS) {
31
+ const files = [];
32
+ // Split by comma for multiple files
33
+ const paths = inputPath.split(',').map(p => p.trim());
34
+ for (const p of paths) {
35
+ const resolvedPath = path.resolve(p);
36
+ // Check if path exists
37
+ if (!fs.existsSync(resolvedPath)) {
38
+ continue; // Skip non-existent paths
39
+ }
40
+ const stats = fs.statSync(resolvedPath);
41
+ if (stats.isFile()) {
42
+ // Check if file has allowed extension
43
+ const ext = path.extname(resolvedPath).toLowerCase();
44
+ if (allowedExtensions.includes(ext)) {
45
+ files.push(resolvedPath);
46
+ }
47
+ }
48
+ else if (stats.isDirectory()) {
49
+ // Recursively find all files in directory
50
+ const dirFiles = findFilesInDirectory(resolvedPath, allowedExtensions);
51
+ files.push(...dirFiles);
52
+ }
53
+ }
54
+ return files;
55
+ }
56
+ /**
57
+ * Recursively find all files with allowed extensions in a directory
58
+ */
59
+ function findFilesInDirectory(dir, allowedExtensions) {
60
+ const files = [];
61
+ try {
62
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
63
+ for (const entry of entries) {
64
+ const fullPath = path.join(dir, entry.name);
65
+ if (entry.isDirectory()) {
66
+ // Recursively search subdirectories
67
+ files.push(...findFilesInDirectory(fullPath, allowedExtensions));
68
+ }
69
+ else if (entry.isFile()) {
70
+ const ext = path.extname(fullPath).toLowerCase();
71
+ if (allowedExtensions.includes(ext)) {
72
+ files.push(fullPath);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ catch (error) {
78
+ // Ignore directories that can't be read
79
+ }
80
+ return files;
81
+ }
82
+ /**
83
+ * Resolve output paths for input files
84
+ *
85
+ * Logic:
86
+ * 1. Single file + output has extension (e.g., output.mp4) = Use exact file path
87
+ * 2. Multiple files + output has extension = Invalid (error)
88
+ * 3. No output provided = Use current directory
89
+ * 4. Output directory provided = Use that directory
90
+ *
91
+ * @param inputFiles - Array of input file paths
92
+ * @param outputPath - Output path (file or directory, or undefined for current dir)
93
+ * @param suffix - Suffix to add to filenames (default: empty)
94
+ * @param newExtension - New extension for output files (default: same as input)
95
+ */
96
+ export function resolveOutputPaths(inputFiles, outputPath, options = {}) {
97
+ const { suffix = '', newExtension } = options;
98
+ const outputMap = new Map();
99
+ // No input files - return empty map
100
+ if (inputFiles.length === 0) {
101
+ return outputMap;
102
+ }
103
+ // Determine output directory or file
104
+ let outputDir;
105
+ let isExplicitFile = false;
106
+ if (!outputPath) {
107
+ // No output provided - use current directory
108
+ outputDir = process.cwd();
109
+ }
110
+ else {
111
+ const resolvedOutput = path.resolve(outputPath);
112
+ const outputExt = path.extname(resolvedOutput).toLowerCase();
113
+ if (outputExt) {
114
+ // Output has extension - it's a file path
115
+ if (inputFiles.length > 1) {
116
+ throw new Error('Cannot specify a file output path for multiple input files. Use a directory instead.');
117
+ }
118
+ // Single file with explicit output file
119
+ isExplicitFile = true;
120
+ outputDir = resolvedOutput;
121
+ }
122
+ else {
123
+ // No extension - it's a directory path
124
+ outputDir = resolvedOutput;
125
+ }
126
+ }
127
+ // Case 1: Single file with explicit output file path
128
+ if (isExplicitFile && inputFiles.length === 1) {
129
+ // Create parent directory if needed
130
+ const parentDir = path.dirname(outputDir);
131
+ if (!fs.existsSync(parentDir)) {
132
+ fs.mkdirSync(parentDir, { recursive: true });
133
+ }
134
+ outputMap.set(inputFiles[0], outputDir);
135
+ return outputMap;
136
+ }
137
+ // Case 2: Multiple files or directory output
138
+ // Create output directory if it doesn't exist
139
+ if (!fs.existsSync(outputDir)) {
140
+ fs.mkdirSync(outputDir, { recursive: true });
141
+ }
142
+ // Map each input file to output path
143
+ for (const inputFile of inputFiles) {
144
+ const inputParsed = path.parse(inputFile);
145
+ const ext = newExtension || inputParsed.ext;
146
+ const outputFilename = `${inputParsed.name}${suffix}${ext}`;
147
+ const outputFilePath = path.join(outputDir, outputFilename);
148
+ outputMap.set(inputFile, outputFilePath);
149
+ }
150
+ return outputMap;
151
+ }
152
+ /**
153
+ * Validate input and output paths
154
+ * Returns validated input files, output directory, and any errors
155
+ */
156
+ export function validatePaths(inputPath, outputPath, options = {}) {
157
+ const { allowedExtensions = VIDEO_EXTENSIONS } = options;
158
+ const errors = [];
159
+ // Parse input files
160
+ const inputFiles = parseInputPaths(inputPath, allowedExtensions);
161
+ if (inputFiles.length === 0) {
162
+ errors.push(`No valid video files found. Supported extensions: ${allowedExtensions.join(', ')}`);
163
+ }
164
+ // Validate output path if provided
165
+ if (outputPath) {
166
+ const resolvedOutput = path.resolve(outputPath);
167
+ const outputExt = path.extname(resolvedOutput).toLowerCase();
168
+ // If output has extension but multiple input files
169
+ if (outputExt && inputFiles.length > 1) {
170
+ errors.push('Cannot specify a file output path for multiple input files. Use a directory instead.');
171
+ }
172
+ }
173
+ return {
174
+ inputFiles,
175
+ outputPath,
176
+ errors,
177
+ };
178
+ }
179
+ /**
180
+ * Get file name from path
181
+ */
182
+ export function getFileName(filePath) {
183
+ return path.basename(filePath);
184
+ }
185
+ /**
186
+ * Generate default output filename with suffix
187
+ */
188
+ export function generateOutputFilename(inputPath, suffix, extension) {
189
+ const parsed = path.parse(inputPath);
190
+ const ext = extension || parsed.ext;
191
+ return `${parsed.name}${suffix}${ext}`;
192
+ }
193
+ /**
194
+ * Check if file exists
195
+ */
196
+ export function fileExists(filePath) {
197
+ return fs.existsSync(filePath);
198
+ }
199
+ /**
200
+ * Create directory if it doesn't exist
201
+ */
202
+ export function ensureDirectoryExists(dirPath) {
203
+ if (!fs.existsSync(dirPath)) {
204
+ fs.mkdirSync(dirPath, { recursive: true });
205
+ }
206
+ }
207
+ //# sourceMappingURL=pathValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathValidator.js","sourceRoot":"","sources":["../../src/utils/pathValidator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mediaproc/video",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Video processing plugin for mediaproc - powered by FFmpeg",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,8 +14,17 @@
14
14
  "import": "./dist/index.js"
15
15
  }
16
16
  },
17
- "files": ["dist", "bin"],
18
- "keywords": ["mediaproc", "video", "ffmpeg", "transcode", "compress"],
17
+ "files": [
18
+ "dist",
19
+ "bin"
20
+ ],
21
+ "keywords": [
22
+ "mediaproc",
23
+ "video",
24
+ "ffmpeg",
25
+ "transcode",
26
+ "compress"
27
+ ],
19
28
  "author": "Sharique Chaudhary",
20
29
  "license": "ISC",
21
30
  "engines": {