@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,117 @@
1
+ import chalk from 'chalk';
2
+ import { stat } from 'fs/promises';
3
+ import { runFFmpeg, getVideoMetadata, checkFFmpeg, formatFileSize, formatDuration, } from '../utils/ffmpeg.js';
4
+ import { validatePaths, resolveOutputPaths } from '../utils/pathValidator.js';
5
+ export function resizeCommand(videoCmd) {
6
+ videoCmd
7
+ .command('resize <input>')
8
+ .description('Resize video resolution')
9
+ .option('-o, --output <path>', 'Output file path')
10
+ .option('-w, --width <width>', 'Width in pixels', parseInt)
11
+ .option('-h, --height <height>', 'Height in pixels', parseInt)
12
+ .option('--scale <scale>', 'Scale preset: 480p, 720p, 1080p, 1440p, 4k')
13
+ .option('--aspect', 'Maintain aspect ratio (default: true)', true)
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('🎬 Video Resizing\n'));
19
+ // Check ffmpeg
20
+ const ffmpegAvailable = await checkFFmpeg();
21
+ if (!ffmpegAvailable) {
22
+ throw new Error('ffmpeg is not installed or not in PATH');
23
+ }
24
+ // Validate input
25
+ const validation = validatePaths(input, options.output);
26
+ if (validation.errors.length > 0) {
27
+ throw new Error(validation.errors.join('\n'));
28
+ }
29
+ const inputPath = validation.inputFiles[0];
30
+ // Get input metadata
31
+ console.log(chalk.dim('📊 Analyzing video...'));
32
+ const metadata = await getVideoMetadata(inputPath);
33
+ const inputStat = await stat(inputPath);
34
+ console.log(chalk.gray(` Current resolution: ${metadata.width}x${metadata.height}`));
35
+ console.log(chalk.gray(` Duration: ${formatDuration(metadata.duration)}`));
36
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)}`));
37
+ console.log();
38
+ // Determine target resolution
39
+ let targetWidth;
40
+ let targetHeight;
41
+ if (options.scale) {
42
+ // Use preset scale
43
+ const scalePresets = {
44
+ '480p': { width: 854, height: 480 },
45
+ '720p': { width: 1280, height: 720 },
46
+ '1080p': { width: 1920, height: 1080 },
47
+ '1440p': { width: 2560, height: 1440 },
48
+ '4k': { width: 3840, height: 2160 },
49
+ };
50
+ const preset = scalePresets[options.scale];
51
+ if (!preset) {
52
+ throw new Error(`Invalid scale preset: ${options.scale}. Use: 480p, 720p, 1080p, 1440p, or 4k`);
53
+ }
54
+ targetWidth = preset.width;
55
+ targetHeight = preset.height;
56
+ }
57
+ else if (options.width && options.height) {
58
+ // Use custom dimensions
59
+ targetWidth = options.width;
60
+ targetHeight = options.height;
61
+ }
62
+ else if (options.width) {
63
+ // Calculate height maintaining aspect ratio
64
+ targetWidth = options.width;
65
+ targetHeight = Math.round((options.width / metadata.width) * metadata.height);
66
+ }
67
+ else if (options.height) {
68
+ // Calculate width maintaining aspect ratio
69
+ targetHeight = options.height;
70
+ targetWidth = Math.round((options.height / metadata.height) * metadata.width);
71
+ }
72
+ else {
73
+ throw new Error('Specify either --scale, --width, --height, or both --width and --height');
74
+ }
75
+ // Ensure even dimensions (required for some codecs)
76
+ targetWidth = Math.round(targetWidth / 2) * 2;
77
+ targetHeight = Math.round(targetHeight / 2) * 2;
78
+ // Generate output path
79
+ const outputMap = resolveOutputPaths(validation.inputFiles, validation.outputPath, { suffix: `-${targetWidth}x${targetHeight}`, newExtension: '.mp4' });
80
+ const output = outputMap.get(inputPath);
81
+ // Build ffmpeg scale filter
82
+ const scaleFilter = options.aspect ? `scale=${targetWidth}:${targetHeight}:force_original_aspect_ratio=decrease,pad=${targetWidth}:${targetHeight}:(ow-iw)/2:(oh-ih)/2` : `scale=${targetWidth}:${targetHeight}`;
83
+ // Build ffmpeg arguments
84
+ const args = ['-i', inputPath, '-vf', scaleFilter, '-c:v', 'libx264', '-crf', '23', '-preset', 'medium', '-c:a', 'copy', '-y', output];
85
+ console.log(chalk.dim('Resize settings:'));
86
+ console.log(chalk.gray(` From: ${metadata.width}x${metadata.height}`));
87
+ console.log(chalk.gray(` To: ${targetWidth}x${targetHeight}`));
88
+ console.log(chalk.gray(` Maintain aspect: ${options.aspect ? 'Yes' : 'No'}`));
89
+ console.log();
90
+ if (options.dryRun) {
91
+ console.log(chalk.yellow('🏃 Dry run mode - no files will be created\n'));
92
+ console.log(chalk.dim('Command:'));
93
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
94
+ console.log(chalk.green('✓ Dry run complete'));
95
+ return;
96
+ }
97
+ // Run resize
98
+ console.log(chalk.dim('📐 Resizing video...'));
99
+ if (options.verbose) {
100
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
101
+ }
102
+ await runFFmpeg(args, options.verbose);
103
+ // Get output file size
104
+ const outputStat = await stat(output);
105
+ console.log();
106
+ console.log(chalk.green.bold('✓ Resizing Complete!\n'));
107
+ console.log(chalk.gray(` Resolution: ${metadata.width}x${metadata.height} → ${targetWidth}x${targetHeight}`));
108
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)} → ${formatFileSize(outputStat.size)}`));
109
+ console.log(chalk.dim(`\n ${output}`));
110
+ }
111
+ catch (error) {
112
+ console.error(chalk.red(`\n✗ Error: ${error.message}`));
113
+ process.exit(1);
114
+ }
115
+ });
116
+ }
117
+ //# sourceMappingURL=resize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.js","sourceRoot":"","sources":["../../src/commands/resize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function transcodeCommand(videoCmd: Command): void;
3
+ //# sourceMappingURL=transcode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode.d.ts","sourceRoot":"","sources":["../../src/commands/transcode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgHxD"}
@@ -0,0 +1,102 @@
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 transcodeCommand(videoCmd) {
5
+ videoCmd
6
+ .command('transcode <input>')
7
+ .description('Transcode video to different format/codec')
8
+ .option('-o, --output <path>', 'Output file path')
9
+ .option('-f, --format <format>', 'Output format: mp4, webm, mkv, avi', 'mp4')
10
+ .option('--codec <codec>', 'Video codec: h264, h265, vp9, av1', 'h264')
11
+ .option('--bitrate <bitrate>', 'Target bitrate (e.g., 2M, 5000k)')
12
+ .option('--audio-codec <codec>', 'Audio codec: aac, opus, mp3', 'aac')
13
+ .option('--audio-bitrate <bitrate>', 'Audio bitrate (e.g., 128k)', '128k')
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('🎬 Video Transcoding\n'));
19
+ // Check ffmpeg
20
+ const ffmpegAvailable = await checkFFmpeg();
21
+ if (!ffmpegAvailable) {
22
+ throw new Error('ffmpeg is not installed or not in PATH');
23
+ }
24
+ // Validate input
25
+ const inputPath = validateInputFile(input);
26
+ // Get input metadata
27
+ console.log(chalk.dim('📊 Analyzing video...'));
28
+ const metadata = await getVideoMetadata(inputPath);
29
+ const inputStat = await stat(inputPath);
30
+ console.log(chalk.gray(` Duration: ${formatDuration(metadata.duration)}`));
31
+ console.log(chalk.gray(` Resolution: ${metadata.width}x${metadata.height}`));
32
+ console.log(chalk.gray(` Current codec: ${metadata.codec}`));
33
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)}`));
34
+ console.log();
35
+ // Generate output path
36
+ const format = options.format || 'mp4';
37
+ const output = options.output || generateOutputPath(inputPath, 'transcoded', format);
38
+ // Map codec to proper ffmpeg names
39
+ const codecMap = {
40
+ h264: 'libx264',
41
+ h265: 'libx265',
42
+ vp9: 'libvpx-vp9',
43
+ av1: 'libaom-av1',
44
+ };
45
+ const videoCodec = codecMap[options.codec || 'h264'] || 'libx264';
46
+ // Build ffmpeg arguments
47
+ const args = ['-i', inputPath, '-c:v', videoCodec];
48
+ // Add bitrate if specified
49
+ if (options.bitrate) {
50
+ args.push('-b:v', options.bitrate);
51
+ }
52
+ else {
53
+ // Use CRF for better quality
54
+ args.push('-crf', '23');
55
+ }
56
+ // Audio encoding
57
+ const audioCodec = options.audioCodec || 'aac';
58
+ args.push('-c:a', audioCodec);
59
+ args.push('-b:a', options.audioBitrate || '128k');
60
+ // Preset for encoding speed
61
+ args.push('-preset', 'medium');
62
+ // Output format specific options
63
+ if (format === 'webm') {
64
+ args.push('-f', 'webm');
65
+ }
66
+ else if (format === 'mkv') {
67
+ args.push('-f', 'matroska');
68
+ }
69
+ args.push('-y', output);
70
+ if (options.dryRun) {
71
+ console.log(chalk.yellow('🏃 Dry run mode - no files will be created\n'));
72
+ console.log(chalk.dim('Command:'));
73
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
74
+ console.log(chalk.dim('Output:'));
75
+ console.log(chalk.gray(` Format: ${format}`));
76
+ console.log(chalk.gray(` Video codec: ${options.codec || 'h264'}`));
77
+ console.log(chalk.gray(` Audio codec: ${audioCodec}`));
78
+ console.log(chalk.green('\n✓ Dry run complete'));
79
+ return;
80
+ }
81
+ // Run transcode
82
+ console.log(chalk.dim('🔄 Transcoding video...'));
83
+ if (options.verbose) {
84
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
85
+ }
86
+ await runFFmpeg(args, options.verbose);
87
+ // Get output file size
88
+ const outputStat = await stat(output);
89
+ console.log();
90
+ console.log(chalk.green.bold('✓ Transcoding Complete!\n'));
91
+ console.log(chalk.gray(` Format: ${metadata.format} → ${format}`));
92
+ console.log(chalk.gray(` Codec: ${metadata.codec} → ${options.codec || 'h264'}`));
93
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)} → ${formatFileSize(outputStat.size)}`));
94
+ console.log(chalk.dim(`\n ${output}`));
95
+ }
96
+ catch (error) {
97
+ console.error(chalk.red(`\n✗ Error: ${error.message}`));
98
+ process.exit(1);
99
+ }
100
+ });
101
+ }
102
+ //# sourceMappingURL=transcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode.js","sourceRoot":"","sources":["../../src/commands/transcode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function trimCommand(videoCmd: Command): void;
3
+ //# sourceMappingURL=trim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim.d.ts","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgHnD"}
@@ -0,0 +1,103 @@
1
+ import chalk from 'chalk';
2
+ import { stat } from 'fs/promises';
3
+ import { runFFmpeg, getVideoMetadata, checkFFmpeg, validateInputFile, generateOutputPath, formatFileSize, formatDuration, parseTimeToSeconds, } from '../utils/ffmpeg.js';
4
+ export function trimCommand(videoCmd) {
5
+ videoCmd
6
+ .command('trim <input>')
7
+ .description('Trim video to specified time range')
8
+ .option('-o, --output <path>', 'Output file path')
9
+ .option('--start <time>', 'Start time (HH:MM:SS or seconds)', '00:00:00')
10
+ .option('--end <time>', 'End time (HH:MM:SS or seconds)')
11
+ .option('--duration <duration>', 'Duration (HH:MM:SS or seconds)')
12
+ .option('--fast', 'Fast mode (stream copy, less accurate)')
13
+ .option('--dry-run', 'Show what would be done')
14
+ .option('-v, --verbose', 'Verbose output')
15
+ .action(async (input, options) => {
16
+ try {
17
+ console.log(chalk.blue.bold('🎬 Video Trimming\n'));
18
+ // Check ffmpeg
19
+ const ffmpegAvailable = await checkFFmpeg();
20
+ if (!ffmpegAvailable) {
21
+ throw new Error('ffmpeg is not installed or not in PATH');
22
+ }
23
+ // Validate input
24
+ const inputPath = validateInputFile(input);
25
+ // Get input metadata
26
+ console.log(chalk.dim('📊 Analyzing video...'));
27
+ const metadata = await getVideoMetadata(inputPath);
28
+ const inputStat = await stat(inputPath);
29
+ console.log(chalk.gray(` Total duration: ${formatDuration(metadata.duration)}`));
30
+ console.log(chalk.gray(` Resolution: ${metadata.width}x${metadata.height}`));
31
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)}`));
32
+ console.log();
33
+ // Parse start time
34
+ const startSeconds = parseTimeToSeconds(options.start || '0');
35
+ // Calculate end time
36
+ let endSeconds;
37
+ if (options.duration) {
38
+ endSeconds = startSeconds + parseTimeToSeconds(options.duration);
39
+ }
40
+ else if (options.end) {
41
+ endSeconds = parseTimeToSeconds(options.end);
42
+ }
43
+ else {
44
+ throw new Error('Either --end or --duration must be specified');
45
+ }
46
+ // Validate times
47
+ if (startSeconds < 0 || startSeconds >= metadata.duration) {
48
+ throw new Error(`Start time ${startSeconds}s is out of range`);
49
+ }
50
+ if (endSeconds > metadata.duration) {
51
+ throw new Error(`End time ${endSeconds}s exceeds video duration`);
52
+ }
53
+ if (endSeconds <= startSeconds) {
54
+ throw new Error('End time must be after start time');
55
+ }
56
+ const trimDuration = endSeconds - startSeconds;
57
+ // Generate output path
58
+ const output = options.output || generateOutputPath(inputPath, 'trimmed', 'mp4');
59
+ // Build ffmpeg arguments
60
+ const args = ['-ss', startSeconds.toString(), '-i', inputPath];
61
+ if (options.fast) {
62
+ // Fast mode: stream copy (accurate seeking not guaranteed)
63
+ args.push('-t', trimDuration.toString(), '-c', 'copy');
64
+ }
65
+ else {
66
+ // Accurate mode: re-encode
67
+ args.push('-t', trimDuration.toString(), '-c:v', 'libx264', '-crf', '23', '-c:a', 'aac');
68
+ }
69
+ args.push('-y', output);
70
+ console.log(chalk.dim('Trim range:'));
71
+ console.log(chalk.gray(` Start: ${formatDuration(startSeconds)}`));
72
+ console.log(chalk.gray(` End: ${formatDuration(endSeconds)}`));
73
+ console.log(chalk.gray(` Duration: ${formatDuration(trimDuration)}`));
74
+ console.log(chalk.gray(` Mode: ${options.fast ? 'Fast (stream copy)' : 'Accurate (re-encode)'}`));
75
+ console.log();
76
+ if (options.dryRun) {
77
+ console.log(chalk.yellow('🏃 Dry run mode - no files will be created\n'));
78
+ console.log(chalk.dim('Command:'));
79
+ console.log(chalk.gray(` ffmpeg ${args.join(' ')}\n`));
80
+ console.log(chalk.green('✓ Dry run complete'));
81
+ return;
82
+ }
83
+ // Run trim
84
+ console.log(chalk.dim('✂️ Trimming video...'));
85
+ if (options.verbose) {
86
+ console.log(chalk.dim(`ffmpeg ${args.join(' ')}\n`));
87
+ }
88
+ await runFFmpeg(args, options.verbose);
89
+ // Get output file size
90
+ const outputStat = await stat(output);
91
+ console.log();
92
+ console.log(chalk.green.bold('✓ Trimming Complete!\n'));
93
+ console.log(chalk.gray(` Duration: ${formatDuration(metadata.duration)} → ${formatDuration(trimDuration)}`));
94
+ console.log(chalk.gray(` Size: ${formatFileSize(inputStat.size)} → ${formatFileSize(outputStat.size)}`));
95
+ console.log(chalk.dim(`\n ${output}`));
96
+ }
97
+ catch (error) {
98
+ console.error(chalk.red(`\n✗ Error: ${error.message}`));
99
+ process.exit(1);
100
+ }
101
+ });
102
+ }
103
+ //# sourceMappingURL=trim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { register, name, version } from './register.js';
2
+ export type * from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxD,mBAAmB,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { register, name, version } from './register.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ export declare const name = "@mediaproc/video";
3
+ export declare const version = "1.0.0";
4
+ export declare function register(program: Command): void;
5
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,eAAO,MAAM,IAAI,qBAAqB,CAAC;AACvC,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAW/C"}
@@ -0,0 +1,20 @@
1
+ import { compressCommand } from './commands/compress.js';
2
+ import { transcodeCommand } from './commands/transcode.js';
3
+ import { extractCommand } from './commands/extract.js';
4
+ import { trimCommand } from './commands/trim.js';
5
+ import { resizeCommand } from './commands/resize.js';
6
+ import { mergeCommand } from './commands/merge.js';
7
+ export const name = '@mediaproc/video';
8
+ export const version = '1.0.0';
9
+ export function register(program) {
10
+ const videoCmd = program
11
+ .command('video')
12
+ .description('Video processing commands (powered by FFmpeg)');
13
+ compressCommand(videoCmd);
14
+ transcodeCommand(videoCmd);
15
+ extractCommand(videoCmd);
16
+ trimCommand(videoCmd);
17
+ resizeCommand(videoCmd);
18
+ mergeCommand(videoCmd);
19
+ }
20
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+CAA+C,CAAC,CAAC;IAEhE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1B,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxB,YAAY,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,56 @@
1
+ export interface VideoOptions {
2
+ input: string;
3
+ output?: string;
4
+ codec?: 'h264' | 'h265' | 'vp9' | 'av1';
5
+ preset?: 'ultrafast' | 'superfast' | 'veryfast' | 'faster' | 'fast' | 'medium' | 'slow' | 'slower' | 'veryslow';
6
+ crf?: number;
7
+ bitrate?: string;
8
+ fps?: number;
9
+ verbose?: boolean;
10
+ dryRun?: boolean;
11
+ scale?: '480p' | '720p' | '1080p' | '1440p' | '4k';
12
+ width?: number;
13
+ height?: number;
14
+ aspect?: boolean;
15
+ start?: string;
16
+ duration?: string;
17
+ end?: string;
18
+ fast?: boolean;
19
+ }
20
+ export interface CompressOptions extends VideoOptions {
21
+ quality?: 'low' | 'medium' | 'high';
22
+ }
23
+ export interface TranscodeOptions extends VideoOptions {
24
+ format?: 'mp4' | 'webm' | 'mkv' | 'avi';
25
+ audioCodec?: string;
26
+ audioBitrate?: string;
27
+ }
28
+ export interface ExtractOptions {
29
+ input: string;
30
+ output?: string;
31
+ start?: string;
32
+ end?: string;
33
+ format?: 'jpg' | 'png';
34
+ fps?: number;
35
+ quality?: number;
36
+ verbose?: boolean;
37
+ dryRun?: boolean;
38
+ }
39
+ export interface TrimOptions {
40
+ input: string;
41
+ output?: string;
42
+ start: string;
43
+ end: string;
44
+ }
45
+ export interface ResizeOptions {
46
+ input: string;
47
+ output?: string;
48
+ width: number;
49
+ height: number;
50
+ maintainAspectRatio?: boolean;
51
+ }
52
+ export interface MergeOptions {
53
+ inputs: string[];
54
+ output?: string;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;IAChH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ export interface VideoMetadata {
2
+ duration: number;
3
+ width: number;
4
+ height: number;
5
+ codec: string;
6
+ fps: number;
7
+ bitrate: number;
8
+ format: string;
9
+ }
10
+ /**
11
+ * Execute ffmpeg command
12
+ */
13
+ export declare function runFFmpeg(args: string[], verbose?: boolean): Promise<void>;
14
+ /**
15
+ * Get video metadata using ffprobe
16
+ */
17
+ export declare function getVideoMetadata(input: string): Promise<VideoMetadata>;
18
+ /**
19
+ * Check if ffmpeg is available
20
+ */
21
+ export declare function checkFFmpeg(): Promise<boolean>;
22
+ /**
23
+ * Check if ffprobe is available
24
+ */
25
+ export declare function checkFFprobe(): Promise<boolean>;
26
+ /**
27
+ * Validate input file exists
28
+ */
29
+ export declare function validateInputFile(input: string): string;
30
+ /**
31
+ * Generate output filename if not provided
32
+ */
33
+ export declare function generateOutputPath(input: string, suffix: string, extension?: string): string;
34
+ /**
35
+ * Format time for display (seconds to HH:MM:SS)
36
+ */
37
+ export declare function formatDuration(seconds: number): string;
38
+ /**
39
+ * Parse time string (HH:MM:SS) to seconds
40
+ */
41
+ export declare function parseTimeToSeconds(time: string): number;
42
+ /**
43
+ * Format file size
44
+ */
45
+ export declare function formatFileSize(bytes: number): string;
46
+ //# sourceMappingURL=ffmpeg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpeg.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0D5E;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAMpD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAMrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWpD"}