@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.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/compress.d.ts +3 -0
- package/dist/commands/compress.d.ts.map +1 -0
- package/dist/commands/compress.js +88 -0
- package/dist/commands/compress.js.map +1 -0
- package/dist/commands/extract.d.ts +3 -0
- package/dist/commands/extract.d.ts.map +1 -0
- package/dist/commands/extract.js +212 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/merge.d.ts +3 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.js +136 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/resize.d.ts +3 -0
- package/dist/commands/resize.d.ts.map +1 -0
- package/dist/commands/resize.js +117 -0
- package/dist/commands/resize.js.map +1 -0
- package/dist/commands/transcode.d.ts +3 -0
- package/dist/commands/transcode.d.ts.map +1 -0
- package/dist/commands/transcode.js +102 -0
- package/dist/commands/transcode.js.map +1 -0
- package/dist/commands/trim.d.ts +3 -0
- package/dist/commands/trim.d.ts.map +1 -0
- package/dist/commands/trim.js +103 -0
- package/dist/commands/trim.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/register.d.ts +5 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +20 -0
- package/dist/register.js.map +1 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ffmpeg.d.ts +46 -0
- package/dist/utils/ffmpeg.d.ts.map +1 -0
- package/dist/utils/ffmpeg.js +162 -0
- package/dist/utils/ffmpeg.js.map +1 -0
- package/dist/utils/pathValidator.d.ts +60 -0
- package/dist/utils/pathValidator.d.ts.map +1 -0
- package/dist/utils/pathValidator.js +207 -0
- package/dist/utils/pathValidator.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/register.js
ADDED
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|