@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
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { register } from './register.js';
4
+ const program = new Command();
5
+ program
6
+ .name('mediaproc-video')
7
+ .description('Video processing CLI (standalone mode)')
8
+ .version('1.0.0');
9
+ register(program);
10
+ program.parse(process.argv);
11
+ if (!process.argv.slice(2).length) {
12
+ program.outputHelp();
13
+ }
14
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function compressCommand(videoCmd: Command): void;
3
+ //# sourceMappingURL=compress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../../src/commands/compress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA8FvD"}
@@ -0,0 +1,88 @@
1
+ import chalk from 'chalk';
2
+ import { stat } from 'fs/promises';
3
+ import { runFFmpeg, getVideoMetadata, checkFFmpeg, validateInputFile, generateOutputPath, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
4
+ export function compressCommand(videoCmd) {
5
+ videoCmd
6
+ .command('compress <input>')
7
+ .description('Compress video file')
8
+ .option('-o, --output <path>', 'Output file path')
9
+ .option('-q, --quality <quality>', 'Quality: low, medium, high', 'medium')
10
+ .option('--codec <codec>', 'Video codec: h264, h265, vp9', 'h264')
11
+ .option('--crf <crf>', 'CRF value (0-51, lower = better quality)', parseInt)
12
+ .option('--dry-run', 'Show what would be done')
13
+ .option('-v, --verbose', 'Verbose output')
14
+ .action(async (input, options) => {
15
+ try {
16
+ console.log(chalk.blue.bold('šŸŽ¬ Video Compression\n'));
17
+ // Check ffmpeg
18
+ const ffmpegAvailable = await checkFFmpeg();
19
+ if (!ffmpegAvailable) {
20
+ throw new Error('ffmpeg is not installed or not in PATH');
21
+ }
22
+ // Validate input
23
+ const inputPath = validateInputFile(input);
24
+ // Get input metadata
25
+ console.log(chalk.dim('šŸ“Š Analyzing video...'));
26
+ const metadata = await getVideoMetadata(inputPath);
27
+ const inputStat = await stat(inputPath);
28
+ console.log(chalk.gray(` Duration: ${formatDuration(metadata.duration)}`));
29
+ console.log(chalk.gray(` Resolution: ${metadata.width}x${metadata.height}`));
30
+ console.log(chalk.gray(` Codec: ${metadata.codec}`));
31
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)}`));
32
+ console.log();
33
+ // Determine CRF based on quality
34
+ const qualityCRF = {
35
+ low: 28,
36
+ medium: 23,
37
+ high: 18,
38
+ };
39
+ const crf = options.crf ?? qualityCRF[options.quality || 'medium'];
40
+ // Generate output path
41
+ const output = options.output || generateOutputPath(inputPath, 'compressed', 'mp4');
42
+ // Build ffmpeg arguments
43
+ const args = [
44
+ '-i',
45
+ inputPath,
46
+ '-c:v',
47
+ options.codec || 'h264',
48
+ '-crf',
49
+ crf.toString(),
50
+ '-preset',
51
+ 'medium',
52
+ '-c:a',
53
+ 'aac',
54
+ '-b:a',
55
+ '128k',
56
+ '-y',
57
+ output,
58
+ ];
59
+ if (options.dryRun) {
60
+ console.log(chalk.yellow('šŸƒ Dry run mode - no files will be created\n'));
61
+ console.log(chalk.dim('Command:'));
62
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
63
+ console.log(chalk.green('āœ“ Dry run complete'));
64
+ return;
65
+ }
66
+ // Run compression
67
+ console.log(chalk.dim('šŸ”„ Compressing video...'));
68
+ if (options.verbose) {
69
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
70
+ }
71
+ await runFFmpeg(args, options.verbose);
72
+ // Get output file size
73
+ const outputStat = await stat(output);
74
+ const reduction = ((1 - outputStat.size / inputStat.size) * 100).toFixed(1);
75
+ console.log();
76
+ console.log(chalk.green.bold('āœ“ Compression Complete!\n'));
77
+ console.log(chalk.gray(` Input: ${formatFileSize(inputStat.size)}`));
78
+ console.log(chalk.gray(` Output: ${formatFileSize(outputStat.size)}`));
79
+ console.log(chalk.gray(` Saved: ${reduction}%`));
80
+ console.log(chalk.dim(`\n ${output}`));
81
+ }
82
+ catch (error) {
83
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
84
+ process.exit(1);
85
+ }
86
+ });
87
+ }
88
+ //# sourceMappingURL=compress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/commands/compress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function extractCommand(videoCmd: Command): void;
3
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA2PtD"}
@@ -0,0 +1,212 @@
1
+ import chalk from 'chalk';
2
+ import { mkdir, stat } from 'fs/promises';
3
+ import { join, resolve } from 'path';
4
+ import { runFFmpeg, getVideoMetadata, checkFFmpeg, formatFileSize, formatDuration, parseTimeToSeconds, } from '../utils/ffmpeg.js';
5
+ import { validatePaths, resolveOutputPaths } from '../utils/pathValidator.js';
6
+ export function extractCommand(videoCmd) {
7
+ // Extract audio
8
+ videoCmd
9
+ .command('extract-audio <input>')
10
+ .description('Extract audio from video')
11
+ .option('-o, --output <path>', 'Output audio file')
12
+ .option('--format <format>', 'Audio format: mp3, aac, wav, opus', 'mp3')
13
+ .option('--bitrate <bitrate>', 'Audio bitrate (e.g., 192k)', '192k')
14
+ .option('--dry-run', 'Show what would be done')
15
+ .option('-v, --verbose', 'Verbose output')
16
+ .action(async (input, options) => {
17
+ try {
18
+ console.log(chalk.blue.bold('šŸŽ¬ Audio Extraction\n'));
19
+ const ffmpegAvailable = await checkFFmpeg();
20
+ if (!ffmpegAvailable) {
21
+ throw new Error('ffmpeg is not installed or not in PATH');
22
+ }
23
+ const validation = validatePaths(input, options.output);
24
+ if (validation.errors.length > 0) {
25
+ throw new Error(validation.errors.join('\n'));
26
+ }
27
+ const inputPath = validation.inputFiles[0];
28
+ console.log(chalk.dim('šŸ“Š Analyzing video...'));
29
+ const metadata = await getVideoMetadata(inputPath);
30
+ console.log(chalk.gray(` Duration: ${formatDuration(metadata.duration)}`));
31
+ console.log();
32
+ const format = options.format || 'mp3';
33
+ const outputMap = resolveOutputPaths(validation.inputFiles, validation.outputPath, { newExtension: `.${format}` });
34
+ const output = outputMap.get(inputPath);
35
+ const codecMap = {
36
+ mp3: 'libmp3lame',
37
+ aac: 'aac',
38
+ wav: 'pcm_s16le',
39
+ opus: 'libopus',
40
+ };
41
+ const audioCodec = codecMap[format] || 'libmp3lame';
42
+ const args = ['-i', inputPath, '-vn', '-c:a', audioCodec];
43
+ if (format !== 'wav') {
44
+ args.push('-b:a', options.bitrate || '192k');
45
+ }
46
+ args.push('-y', output);
47
+ if (options.dryRun) {
48
+ console.log(chalk.yellow('šŸƒ Dry run mode - no files will be created\n'));
49
+ console.log(chalk.dim('Command:'));
50
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
51
+ console.log(chalk.green('āœ“ Dry run complete'));
52
+ return;
53
+ }
54
+ console.log(chalk.dim('šŸŽµ Extracting audio...'));
55
+ if (options.verbose) {
56
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
57
+ }
58
+ await runFFmpeg(args, options.verbose);
59
+ const outputStat = await stat(output);
60
+ console.log();
61
+ console.log(chalk.green.bold('āœ“ Extraction Complete!\n'));
62
+ console.log(chalk.gray(` Format: ${format}`));
63
+ console.log(chalk.gray(` Size: ${formatFileSize(outputStat.size)}`));
64
+ console.log(chalk.dim(`\n ${output}`));
65
+ }
66
+ catch (error) {
67
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
68
+ process.exit(1);
69
+ }
70
+ });
71
+ // Extract frames
72
+ videoCmd
73
+ .command('extract-frames <input>')
74
+ .description('Extract frames from video as images')
75
+ .option('-o, --output <dir>', 'Output directory', './frames')
76
+ .option('--start <time>', 'Start time (HH:MM:SS or seconds)')
77
+ .option('--end <time>', 'End time (HH:MM:SS or seconds)')
78
+ .option('--fps <fps>', 'Extract N frames per second', parseFloat, 1)
79
+ .option('--format <format>', 'Image format: jpg, png', 'jpg')
80
+ .option('--quality <quality>', 'JPEG quality (1-31, lower is better)', parseInt, 2)
81
+ .option('--dry-run', 'Show what would be done')
82
+ .option('-v, --verbose', 'Verbose output')
83
+ .action(async (input, options) => {
84
+ try {
85
+ console.log(chalk.blue.bold('šŸŽ¬ Frame Extraction\n'));
86
+ const ffmpegAvailable = await checkFFmpeg();
87
+ if (!ffmpegAvailable) {
88
+ throw new Error('ffmpeg is not installed or not in PATH');
89
+ }
90
+ const validation = validatePaths(input, options.output);
91
+ if (validation.errors.length > 0) {
92
+ throw new Error(validation.errors.join('\n'));
93
+ }
94
+ const inputPath = validation.inputFiles[0];
95
+ console.log(chalk.dim('šŸ“Š Analyzing video...'));
96
+ const metadata = await getVideoMetadata(inputPath);
97
+ console.log(chalk.gray(` Duration: ${formatDuration(metadata.duration)}`));
98
+ console.log(chalk.gray(` Resolution: ${metadata.width}x${metadata.height}`));
99
+ console.log(chalk.gray(` FPS: ${metadata.fps.toFixed(2)}`));
100
+ console.log();
101
+ const outputDir = resolve(validation.outputPath || './frames');
102
+ await mkdir(outputDir, { recursive: true });
103
+ const format = options.format || 'jpg';
104
+ const outputPattern = join(outputDir, `frame_%04d.${format}`);
105
+ const args = ['-i', inputPath];
106
+ // Add start time if specified
107
+ if (options.start) {
108
+ args.push('-ss', parseTimeToSeconds(options.start).toString());
109
+ }
110
+ // Add end time if specified
111
+ if (options.end) {
112
+ args.push('-to', parseTimeToSeconds(options.end).toString());
113
+ }
114
+ // Set frame rate
115
+ args.push('-vf', `fps=${options.fps || 1}`);
116
+ // Image quality for JPEG
117
+ if (format === 'jpg') {
118
+ args.push('-q:v', (options.quality || 2).toString());
119
+ }
120
+ args.push('-y', outputPattern);
121
+ // Estimate number of frames
122
+ const duration = options.end ? parseTimeToSeconds(options.end) - (options.start ? parseTimeToSeconds(options.start) : 0) : metadata.duration - (options.start ? parseTimeToSeconds(options.start) : 0);
123
+ const estimatedFrames = Math.ceil(duration * (options.fps || 1));
124
+ console.log(chalk.dim('Extraction settings:'));
125
+ console.log(chalk.gray(` FPS: ${options.fps || 1}`));
126
+ console.log(chalk.gray(` Format: ${format}`));
127
+ console.log(chalk.gray(` Estimated frames: ~${estimatedFrames}`));
128
+ console.log(chalk.gray(` Output: ${outputDir}`));
129
+ console.log();
130
+ if (options.dryRun) {
131
+ console.log(chalk.yellow('šŸƒ Dry run mode - no files will be created\n'));
132
+ console.log(chalk.dim('Command:'));
133
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
134
+ console.log(chalk.green('āœ“ Dry run complete'));
135
+ return;
136
+ }
137
+ console.log(chalk.dim('šŸ“ø Extracting frames...'));
138
+ if (options.verbose) {
139
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
140
+ }
141
+ await runFFmpeg(args, options.verbose);
142
+ console.log();
143
+ console.log(chalk.green.bold('āœ“ Extraction Complete!\n'));
144
+ console.log(chalk.gray(` Frames saved to: ${outputDir}`));
145
+ console.log(chalk.gray(` Pattern: frame_####.${format}`));
146
+ }
147
+ catch (error) {
148
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
149
+ process.exit(1);
150
+ }
151
+ });
152
+ // Extract thumbnail
153
+ videoCmd
154
+ .command('extract-thumbnail <input>')
155
+ .description('Extract a single thumbnail from video')
156
+ .option('-o, --output <path>', 'Output image file')
157
+ .option('--time <time>', 'Time to extract (HH:MM:SS or seconds)', '00:00:01')
158
+ .option('--format <format>', 'Image format: jpg, png', 'jpg')
159
+ .option('--width <width>', 'Thumbnail width in pixels', parseInt)
160
+ .option('--dry-run', 'Show what would be done')
161
+ .option('-v, --verbose', 'Verbose output')
162
+ .action(async (input, options) => {
163
+ try {
164
+ console.log(chalk.blue.bold('šŸŽ¬ Thumbnail Extraction\n'));
165
+ const ffmpegAvailable = await checkFFmpeg();
166
+ if (!ffmpegAvailable) {
167
+ throw new Error('ffmpeg is not installed or not in PATH');
168
+ }
169
+ const validation = validatePaths(input, options.output);
170
+ if (validation.errors.length > 0) {
171
+ throw new Error(validation.errors.join('\n'));
172
+ }
173
+ const inputPath = validation.inputFiles[0];
174
+ console.log(chalk.dim('šŸ“Š Analyzing video...'));
175
+ const metadata = await getVideoMetadata(inputPath);
176
+ console.log(chalk.gray(` Resolution: ${metadata.width}x${metadata.height}`));
177
+ console.log();
178
+ const format = options.format || 'jpg';
179
+ const output = options.output || inputPath.replace(/\.[^.]+$/, `_thumb.${format}`);
180
+ const timeSeconds = parseTimeToSeconds(options.time || '1');
181
+ const args = ['-i', inputPath, '-ss', timeSeconds.toString(), '-vframes', '1'];
182
+ // Resize if width specified
183
+ if (options.width) {
184
+ args.push('-vf', `scale=${options.width}:-1`);
185
+ }
186
+ args.push('-y', output);
187
+ if (options.dryRun) {
188
+ console.log(chalk.yellow('šŸƒ Dry run mode - no files will be created\n'));
189
+ console.log(chalk.dim('Command:'));
190
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
191
+ console.log(chalk.green('āœ“ Dry run complete'));
192
+ return;
193
+ }
194
+ console.log(chalk.dim('šŸ“ø Extracting thumbnail...'));
195
+ if (options.verbose) {
196
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
197
+ }
198
+ await runFFmpeg(args, options.verbose);
199
+ const outputStat = await stat(output);
200
+ console.log();
201
+ console.log(chalk.green.bold('āœ“ Extraction Complete!\n'));
202
+ console.log(chalk.gray(` Time: ${formatDuration(timeSeconds)}`));
203
+ console.log(chalk.gray(` Size: ${formatFileSize(outputStat.size)}`));
204
+ console.log(chalk.dim(`\n ${output}`));
205
+ }
206
+ catch (error) {
207
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
208
+ process.exit(1);
209
+ }
210
+ });
211
+ }
212
+ //# 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(videoCmd: 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;AAczC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAqJpD"}
@@ -0,0 +1,136 @@
1
+ import chalk from 'chalk';
2
+ import { writeFile, unlink, stat } from 'fs/promises';
3
+ import { tmpdir } from 'os';
4
+ import { join } from 'path';
5
+ import { runFFmpeg, getVideoMetadata, checkFFmpeg, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
6
+ import { validatePaths, resolveOutputPaths, fileExists } from '../utils/pathValidator.js';
7
+ export function mergeCommand(videoCmd) {
8
+ videoCmd
9
+ .command('merge <inputs...>')
10
+ .description('Merge multiple videos into one')
11
+ .option('-o, --output <path>', 'Output file path', 'merged.mp4')
12
+ .option('--re-encode', 'Re-encode videos (slower but handles different formats)')
13
+ .option('--dry-run', 'Show what would be done')
14
+ .option('-v, --verbose', 'Verbose output')
15
+ .action(async (inputs, options) => {
16
+ const tempListFile = join(tmpdir(), `mediaproc-merge-${Date.now()}.txt`);
17
+ try {
18
+ console.log(chalk.blue.bold('šŸŽ¬ Video Merging\n'));
19
+ if (inputs.length < 2) {
20
+ throw new Error('At least 2 videos are required for merging');
21
+ }
22
+ // Check ffmpeg
23
+ const ffmpegAvailable = await checkFFmpeg();
24
+ if (!ffmpegAvailable) {
25
+ throw new Error('ffmpeg is not installed or not in PATH');
26
+ }
27
+ // Validate all inputs
28
+ console.log(chalk.dim('šŸ“Š Analyzing videos...\n'));
29
+ const inputPaths = [];
30
+ const metadataList = [];
31
+ let totalDuration = 0;
32
+ let totalSize = 0;
33
+ for (let i = 0; i < inputs.length; i++) {
34
+ const validation = validatePaths(inputs[i], undefined);
35
+ if (validation.errors.length > 0) {
36
+ throw new Error(`Input ${i + 1}: ${validation.errors.join(', ')}`);
37
+ }
38
+ const inputPath = validation.inputFiles[0];
39
+ // Check if input file exists
40
+ if (!(await fileExists(inputPath))) {
41
+ throw new Error(`Input ${i + 1} does not exist: ${inputPath}`);
42
+ }
43
+ inputPaths.push(inputPath);
44
+ const metadata = await getVideoMetadata(inputPath);
45
+ const fileStat = await stat(inputPath);
46
+ metadataList.push(metadata);
47
+ totalDuration += metadata.duration;
48
+ totalSize += fileStat.size;
49
+ console.log(chalk.gray(` ${i + 1}. ${inputs[i]}`));
50
+ console.log(chalk.dim(` ${metadata.width}x${metadata.height}, ${formatDuration(metadata.duration)}, ${metadata.codec}`));
51
+ }
52
+ console.log();
53
+ console.log(chalk.gray(` Total duration: ${formatDuration(totalDuration)}`));
54
+ console.log(chalk.gray(` Total size: ${formatFileSize(totalSize)}`));
55
+ console.log();
56
+ // Check if all videos have same resolution/codec
57
+ const firstMeta = metadataList[0];
58
+ const needsReEncode = options.reEncode || metadataList.some((m) => m.width !== firstMeta.width || m.height !== firstMeta.height || m.codec !== firstMeta.codec);
59
+ if (needsReEncode && !options.reEncode) {
60
+ console.log(chalk.yellow('āš ļø Videos have different formats/resolutions'));
61
+ console.log(chalk.yellow(' Will re-encode for compatibility (slower)'));
62
+ console.log(chalk.dim(' Use --re-encode to skip this warning\n'));
63
+ }
64
+ // Validate and resolve output path
65
+ const outputValidation = validatePaths(inputPaths[0], options.output, {
66
+ newExtension: '.mp4'
67
+ });
68
+ if (outputValidation.errors.length > 0) {
69
+ throw new Error(`Output path invalid: ${outputValidation.errors.join(', ')}`);
70
+ }
71
+ const outputMap = resolveOutputPaths([inputPaths[0]], options.output, {
72
+ newExtension: '.mp4'
73
+ });
74
+ const output = outputMap.get(inputPaths[0]);
75
+ // Check if output file already exists
76
+ if (await fileExists(output) && !options.dryRun) {
77
+ console.log(chalk.yellow(`āš ļø Output file exists and will be overwritten: ${output}\n`));
78
+ }
79
+ let args;
80
+ if (needsReEncode) {
81
+ // Re-encode mode: use filter_complex
82
+ const filterInputs = inputPaths.map((_, i) => `[${i}:v][${i}:a]`).join('');
83
+ const filterComplex = `${filterInputs}concat=n=${inputPaths.length}:v=1:a=1[outv][outa]`;
84
+ args = [];
85
+ inputPaths.forEach((path) => {
86
+ args.push('-i', path);
87
+ });
88
+ args.push('-filter_complex', filterComplex, '-map', '[outv]', '-map', '[outa]', '-c:v', 'libx264', '-crf', '23', '-c:a', 'aac', '-y', output);
89
+ }
90
+ else {
91
+ // Fast concat mode: use concat demuxer (no re-encode)
92
+ // Create concat list file
93
+ const listContent = inputPaths.map((path) => `file '${path.replace(/'/g, "'\\''")}'`).join('\n');
94
+ await writeFile(tempListFile, listContent);
95
+ args = ['-f', 'concat', '-safe', '0', '-i', tempListFile, '-c', 'copy', '-y', output];
96
+ }
97
+ if (options.dryRun) {
98
+ console.log(chalk.yellow('šŸƒ Dry run mode - no files will be created\n'));
99
+ console.log(chalk.dim('Method:'));
100
+ console.log(chalk.gray(` ${needsReEncode ? 'Re-encode (compatible)' : 'Fast concat (stream copy)'}`));
101
+ console.log(chalk.dim('\nCommand:'));
102
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
103
+ console.log(chalk.green('āœ“ Dry run complete'));
104
+ return;
105
+ }
106
+ // Run merge
107
+ console.log(chalk.dim(`šŸ”— Merging videos (${needsReEncode ? 're-encoding' : 'fast mode'})...`));
108
+ if (options.verbose) {
109
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
110
+ }
111
+ await runFFmpeg(args, options.verbose);
112
+ // Get output file size
113
+ const outputStat = await stat(output);
114
+ console.log();
115
+ console.log(chalk.green.bold('āœ“ Merging Complete!\n'));
116
+ console.log(chalk.gray(` Videos merged: ${inputs.length}`));
117
+ console.log(chalk.gray(` Total duration: ${formatDuration(totalDuration)}`));
118
+ console.log(chalk.gray(` Output size: ${formatFileSize(outputStat.size)}`));
119
+ console.log(chalk.dim(`\n ${output}`));
120
+ }
121
+ catch (error) {
122
+ console.error(chalk.red(`\nāœ— Error: ${error.message}`));
123
+ process.exit(1);
124
+ }
125
+ finally {
126
+ // Clean up temp file
127
+ try {
128
+ await unlink(tempListFile);
129
+ }
130
+ catch {
131
+ // Ignore cleanup errors
132
+ }
133
+ }
134
+ });
135
+ }
136
+ //# 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 resizeCommand(videoCmd: Command): void;
3
+ //# sourceMappingURL=resize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.d.ts","sourceRoot":"","sources":["../../src/commands/resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgIrD"}