@mediaproc/video 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +487 -89
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +14 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/compress.d.ts +3 -0
  7. package/dist/commands/compress.d.ts.map +1 -0
  8. package/dist/commands/compress.js +195 -0
  9. package/dist/commands/compress.js.map +1 -0
  10. package/dist/commands/extract.d.ts +3 -0
  11. package/dist/commands/extract.d.ts.map +1 -0
  12. package/dist/commands/extract.js +228 -0
  13. package/dist/commands/extract.js.map +1 -0
  14. package/dist/commands/merge.d.ts +3 -0
  15. package/dist/commands/merge.d.ts.map +1 -0
  16. package/dist/commands/merge.js +214 -0
  17. package/dist/commands/merge.js.map +1 -0
  18. package/dist/commands/resize.d.ts +3 -0
  19. package/dist/commands/resize.d.ts.map +1 -0
  20. package/dist/commands/resize.js +252 -0
  21. package/dist/commands/resize.js.map +1 -0
  22. package/dist/commands/transcode.d.ts +3 -0
  23. package/dist/commands/transcode.d.ts.map +1 -0
  24. package/dist/commands/transcode.js +108 -0
  25. package/dist/commands/transcode.js.map +1 -0
  26. package/dist/commands/trim.d.ts +3 -0
  27. package/dist/commands/trim.d.ts.map +1 -0
  28. package/dist/commands/trim.js +198 -0
  29. package/dist/commands/trim.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +2 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/register.d.ts +5 -0
  35. package/dist/register.d.ts.map +1 -0
  36. package/dist/register.js +18 -0
  37. package/dist/register.js.map +1 -0
  38. package/dist/types.d.ts +56 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/utils/ffmpeg-output.d.ts +9 -0
  43. package/dist/utils/ffmpeg-output.d.ts.map +1 -0
  44. package/dist/utils/ffmpeg-output.js +94 -0
  45. package/dist/utils/ffmpeg-output.js.map +1 -0
  46. package/dist/utils/ffmpeg.d.ts +46 -0
  47. package/dist/utils/ffmpeg.d.ts.map +1 -0
  48. package/dist/utils/ffmpeg.js +167 -0
  49. package/dist/utils/ffmpeg.js.map +1 -0
  50. package/dist/utils/ffmpegLogger.d.ts +16 -0
  51. package/dist/utils/ffmpegLogger.d.ts.map +1 -0
  52. package/dist/utils/ffmpegLogger.js +66 -0
  53. package/dist/utils/ffmpegLogger.js.map +1 -0
  54. package/dist/utils/helpFormatter.d.ts +51 -0
  55. package/dist/utils/helpFormatter.d.ts.map +1 -0
  56. package/dist/utils/helpFormatter.js +134 -0
  57. package/dist/utils/helpFormatter.js.map +1 -0
  58. package/dist/utils/pathValidator.d.ts +60 -0
  59. package/dist/utils/pathValidator.d.ts.map +1 -0
  60. package/dist/utils/pathValidator.js +207 -0
  61. package/dist/utils/pathValidator.js.map +1 -0
  62. package/package.json +12 -3
@@ -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;AAczC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAmNnD"}
@@ -0,0 +1,198 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { runFFmpeg, getVideoMetadata, checkFFmpeg, formatDuration, parseTimeToSeconds, } from '../utils/ffmpeg.js';
4
+ import { parseInputPaths, resolveOutputPaths } from '../utils/pathValidator.js';
5
+ import { logFFmpegOutput } from '../utils/ffmpegLogger.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ export function trimCommand(videoCmd) {
8
+ videoCmd
9
+ .command('trim [input]')
10
+ .description('Trim videos to specified time range with precision')
11
+ .option('-o, --output <path>', 'Output file or directory path')
12
+ .option('-s, --start <time>', 'Start time (HH:MM:SS or seconds) (default: 00:00:00)', '00:00:00')
13
+ .option('-e, --end <time>', 'End time (HH:MM:SS or seconds)')
14
+ .option('-d, --duration <duration>', 'Duration from start (HH:MM:SS or seconds)')
15
+ .option('--fast', 'Fast mode - stream copy (less accurate but faster)')
16
+ .option('--accurate', 'Accurate mode - re-encode for frame accuracy')
17
+ .option('-c, --codec <codec>', 'Video codec: h264, h265 (default: copy)', 'copy')
18
+ .option('--format <format>', 'Output format: mp4, mkv, webm')
19
+ .option('--fade-in <duration>', 'Add fade-in effect (seconds)', parseFloat)
20
+ .option('--fade-out <duration>', 'Add fade-out effect (seconds)', parseFloat)
21
+ .option('--speed <factor>', 'Adjust playback speed (0.5-2.0)', parseFloat)
22
+ .option('--volume <factor>', 'Adjust audio volume (0.0-2.0, default: 1.0)', parseFloat)
23
+ .option('--quality <crf>', 'CRF quality if re-encoding (default: 23)', parseInt, 23)
24
+ .option('--no-audio', 'Remove audio track from output')
25
+ .option('--dry-run', 'Preview command without executing')
26
+ .option('-v, --verbose', 'Show detailed FFmpeg output')
27
+ .option('-h, --help', 'Display help for trim command')
28
+ .action(async (input, options) => {
29
+ // Show help if requested
30
+ if (options.help || !input) {
31
+ createStandardHelp({
32
+ commandName: 'trim',
33
+ emoji: '✂️',
34
+ description: 'Trim videos to specific time ranges. Extract clips from longer videos with precision timing. Supports both fast stream copy mode and re-encoding mode. Can process single files or entire directories.',
35
+ usage: [
36
+ 'trim <input> --start <time> --end <time>',
37
+ 'trim video.mp4 -s 00:01:30 -e 00:05:45',
38
+ 'trim videos/ -s 10 -d 30 -o output/'
39
+ ],
40
+ options: [
41
+ { flag: '-o, --output <path>', description: 'Output file/directory (default: <input>-trimmed.<ext>)' },
42
+ { flag: '-s, --start <time>', description: 'Start time: HH:MM:SS or seconds (default: 00:00:00)' },
43
+ { flag: '-e, --end <time>', description: 'End time: HH:MM:SS or seconds' },
44
+ { flag: '-d, --duration <duration>', description: 'Duration from start: HH:MM:SS or seconds' },
45
+ { flag: '--fast', description: 'Fast mode - stream copy without re-encoding' },
46
+ { flag: '--accurate', description: 'Accurate mode - re-encode for frame accuracy' },
47
+ { flag: '-c, --codec <codec>', description: 'Video codec: h264, h265, copy (default: copy)' },
48
+ { flag: '--format <format>', description: 'Output format: mp4, mkv, webm' },
49
+ { flag: '--fade-in <duration>', description: 'Add fade-in effect (seconds)' },
50
+ { flag: '--fade-out <duration>', description: 'Add fade-out effect (seconds)' },
51
+ { flag: '--speed <factor>', description: 'Adjust playback speed (0.5-2.0)' },
52
+ { flag: '--volume <factor>', description: 'Adjust audio volume (0.0-2.0, default: 1.0)' },
53
+ { flag: '--quality <crf>', description: 'CRF quality if re-encoding (default: 23)' },
54
+ { flag: '--no-audio', description: 'Remove audio track from output' },
55
+ { flag: '--dry-run', description: 'Preview FFmpeg command without executing' },
56
+ { flag: '-v, --verbose', description: 'Show detailed FFmpeg output' }
57
+ ],
58
+ examples: [
59
+ { command: 'trim video.mp4 -s 00:01:30 -e 00:05:45', description: 'Trim from 1:30 to 5:45' },
60
+ { command: 'trim video.mp4 -s 10 -d 30', description: 'Extract 30 seconds starting at 10 seconds' },
61
+ { command: 'trim video.mp4 -s 60 -d 120 --fast', description: 'Fast trim using stream copy' },
62
+ { command: 'trim videos/ -s 5 -d 30 -o clips/', description: 'Trim all videos in folder' },
63
+ { command: 'trim long.mp4 -s 00:10:00 -e 00:15:00 -c h265', description: 'Trim and re-encode with H265' }
64
+ ],
65
+ additionalSections: [
66
+ {
67
+ title: 'Time Format',
68
+ items: [
69
+ 'Seconds: 90 (1 minute 30 seconds)',
70
+ 'MM:SS: 01:30 (1 minute 30 seconds)',
71
+ 'HH:MM:SS: 00:01:30 (1 minute 30 seconds)',
72
+ 'You must specify either --end or --duration (not both)'
73
+ ]
74
+ },
75
+ {
76
+ title: 'Fast Mode vs Re-encoding',
77
+ items: [
78
+ 'Fast (--fast): Stream copy, very quick, may not be frame-accurate',
79
+ 'Re-encode (default with codec): Slower but frame-accurate',
80
+ 'Stream copy (default): Fast and frame-accurate for most cases'
81
+ ]
82
+ }
83
+ ],
84
+ tips: [
85
+ 'Use --fast for quick previews or when exact frame accuracy is not critical',
86
+ 'For precise frame-accurate cuts, omit --fast (slight re-encoding)',
87
+ 'Specify --end for absolute time or --duration for relative time',
88
+ 'Use seconds for simpler time specifications (e.g., -s 90 -d 30)'
89
+ ]
90
+ });
91
+ process.exit(0);
92
+ }
93
+ const spinner = ora('Processing trim...').start();
94
+ try {
95
+ // Check ffmpeg
96
+ const ffmpegAvailable = await checkFFmpeg();
97
+ if (!ffmpegAvailable) {
98
+ spinner.fail(chalk.red('ffmpeg is not installed or not in PATH'));
99
+ process.exit(1);
100
+ }
101
+ // Parse input files
102
+ const inputFiles = parseInputPaths(input);
103
+ if (inputFiles.length === 0) {
104
+ spinner.fail(chalk.red('No valid video files found'));
105
+ process.exit(1);
106
+ }
107
+ spinner.text = `Found ${inputFiles.length} video file(s) to process`;
108
+ // Parse start time
109
+ const startSeconds = parseTimeToSeconds(options.start || '0');
110
+ // Validate time options
111
+ if (!options.end && !options.duration) {
112
+ spinner.fail(chalk.red('Either --end or --duration must be specified'));
113
+ process.exit(1);
114
+ }
115
+ // Resolve output paths
116
+ const outputPaths = resolveOutputPaths(inputFiles, options.output, {
117
+ suffix: '-trimmed',
118
+ newExtension: options.format ? `.${options.format}` : undefined
119
+ });
120
+ // Process each file
121
+ for (let i = 0; i < inputFiles.length; i++) {
122
+ const inputFile = inputFiles[i];
123
+ const outputFile = outputPaths.get(inputFile);
124
+ spinner.text = `Processing ${i + 1}/${inputFiles.length}: ${inputFile}`;
125
+ // Get metadata
126
+ const metadata = await getVideoMetadata(inputFile);
127
+ // Calculate end time
128
+ let endSeconds;
129
+ if (options.duration) {
130
+ endSeconds = startSeconds + parseTimeToSeconds(options.duration);
131
+ }
132
+ else {
133
+ endSeconds = parseTimeToSeconds(options.end);
134
+ }
135
+ // Validate times
136
+ if (startSeconds < 0 || startSeconds >= metadata.duration) {
137
+ spinner.warn(chalk.yellow(`Skipping ${inputFile}: Start time out of range`));
138
+ continue;
139
+ }
140
+ if (endSeconds > metadata.duration) {
141
+ endSeconds = metadata.duration;
142
+ }
143
+ if (endSeconds <= startSeconds) {
144
+ spinner.warn(chalk.yellow(`Skipping ${inputFile}: Invalid time range`));
145
+ continue;
146
+ }
147
+ const trimDuration = endSeconds - startSeconds;
148
+ // Build ffmpeg arguments
149
+ const args = ['-ss', startSeconds.toString(), '-i', inputFile];
150
+ if (options.duration) {
151
+ args.push('-t', trimDuration.toString());
152
+ }
153
+ else {
154
+ args.push('-to', endSeconds.toString());
155
+ }
156
+ // Codec settings
157
+ if (options.fast) {
158
+ args.push('-c', 'copy');
159
+ }
160
+ else if (options.codec && options.codec !== 'copy') {
161
+ const codecMap = {
162
+ 'h264': 'libx264',
163
+ 'h265': 'libx265',
164
+ 'hevc': 'libx265',
165
+ };
166
+ args.push('-c:v', codecMap[options.codec] || 'copy', '-c:a', 'aac');
167
+ }
168
+ else {
169
+ args.push('-c', 'copy');
170
+ }
171
+ args.push('-y', outputFile);
172
+ // Show command if dry-run
173
+ if (options.dryRun) {
174
+ console.log(chalk.cyan('\nFFmpeg command:'));
175
+ console.log(chalk.gray('ffmpeg ' + args.join(' ')));
176
+ console.log();
177
+ continue;
178
+ }
179
+ // Run trim
180
+ await runFFmpeg(args, options.verbose, (line) => {
181
+ if (options.verbose) {
182
+ logFFmpegOutput(line);
183
+ }
184
+ });
185
+ spinner.succeed(chalk.green(`✓ [${i + 1}/${inputFiles.length}] Trimmed ${formatDuration(startSeconds)} → ${formatDuration(endSeconds)} (${formatDuration(trimDuration)})\n` +
186
+ chalk.dim(` ${outputFile}`)));
187
+ }
188
+ if (!options.dryRun) {
189
+ console.log(chalk.green.bold(`\n✨ Successfully trimmed ${inputFiles.length} video(s)!`));
190
+ }
191
+ }
192
+ catch (error) {
193
+ spinner.fail(chalk.red(`Error: ${error.message}`));
194
+ process.exit(1);
195
+ }
196
+ });
197
+ }
198
+ //# sourceMappingURL=trim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/commands/trim.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,QAAiB;IAC3C,QAAQ;SACL,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;SAC9D,MAAM,CAAC,oBAAoB,EAAE,sDAAsD,EAAE,UAAU,CAAC;SAChG,MAAM,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;SAC5D,MAAM,CAAC,2BAA2B,EAAE,2CAA2C,CAAC;SAChF,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC;SACtE,MAAM,CAAC,YAAY,EAAE,8CAA8C,CAAC;SACpE,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,EAAE,MAAM,CAAC;SAChF,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;SAC5D,MAAM,CAAC,sBAAsB,EAAE,8BAA8B,EAAE,UAAU,CAAC;SAC1E,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,EAAE,UAAU,CAAC;SAC5E,MAAM,CAAC,kBAAkB,EAAE,iCAAiC,EAAE,UAAU,CAAC;SACzE,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,EAAE,UAAU,CAAC;SACtF,MAAM,CAAC,iBAAiB,EAAE,0CAA0C,EAAE,QAAQ,EAAE,EAAE,CAAC;SACnF,MAAM,CAAC,YAAY,EAAE,gCAAgC,CAAC;SACtD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,YAAY,EAAE,+BAA+B,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,OAAY,EAAE,EAAE;QACxD,yBAAyB;QACzB,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,kBAAkB,CAAC;gBACjB,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,wMAAwM;gBACrN,KAAK,EAAE;oBACL,0CAA0C;oBAC1C,wCAAwC;oBACxC,qCAAqC;iBACtC;gBACD,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,wDAAwD,EAAE;oBACtG,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,qDAAqD,EAAE;oBAClG,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,+BAA+B,EAAE;oBAC1E,EAAE,IAAI,EAAE,2BAA2B,EAAE,WAAW,EAAE,0CAA0C,EAAE;oBAC9F,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;oBAC9E,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,8CAA8C,EAAE;oBACnF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,+CAA+C,EAAE;oBAC7F,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,+BAA+B,EAAE;oBAC3E,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,8BAA8B,EAAE;oBAC7E,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,+BAA+B,EAAE;oBAC/E,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,iCAAiC,EAAE;oBAC5E,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,6CAA6C,EAAE;oBACzF,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,0CAA0C,EAAE;oBACpF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,gCAAgC,EAAE;oBACrE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,0CAA0C,EAAE;oBAC9E,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,6BAA6B,EAAE;iBACtE;gBACD,QAAQ,EAAE;oBACR,EAAE,OAAO,EAAE,wCAAwC,EAAE,WAAW,EAAE,wBAAwB,EAAE;oBAC5F,EAAE,OAAO,EAAE,4BAA4B,EAAE,WAAW,EAAE,2CAA2C,EAAE;oBACnG,EAAE,OAAO,EAAE,oCAAoC,EAAE,WAAW,EAAE,6BAA6B,EAAE;oBAC7F,EAAE,OAAO,EAAE,mCAAmC,EAAE,WAAW,EAAE,2BAA2B,EAAE;oBAC1F,EAAE,OAAO,EAAE,+CAA+C,EAAE,WAAW,EAAE,8BAA8B,EAAE;iBAC1G;gBACD,kBAAkB,EAAE;oBAClB;wBACE,KAAK,EAAE,aAAa;wBACpB,KAAK,EAAE;4BACL,mCAAmC;4BACnC,oCAAoC;4BACpC,0CAA0C;4BAC1C,wDAAwD;yBACzD;qBACF;oBACD;wBACE,KAAK,EAAE,0BAA0B;wBACjC,KAAK,EAAE;4BACL,mEAAmE;4BACnE,2DAA2D;4BAC3D,+DAA+D;yBAChE;qBACF;iBACF;gBACD,IAAI,EAAE;oBACJ,4EAA4E;oBAC5E,mEAAmE;oBACnE,iEAAiE;oBACjE,iEAAiE;iBAClE;aACF,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;QAElD,IAAI,CAAC;YACH,eAAe;YACf,MAAM,eAAe,GAAG,MAAM,WAAW,EAAE,CAAC;YAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,oBAAoB;YACpB,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAE1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,IAAI,GAAG,SAAS,UAAU,CAAC,MAAM,2BAA2B,CAAC;YAErE,mBAAmB;YACnB,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;YAE9D,wBAAwB;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,uBAAuB;YACvB,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;gBACjE,MAAM,EAAE,UAAU;gBAClB,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aAChE,CAAC,CAAC;YAEH,oBAAoB;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBAE/C,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAExE,eAAe;gBACf,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAEnD,qBAAqB;gBACrB,IAAI,UAAkB,CAAC;gBACvB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,UAAU,GAAG,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC/C,CAAC;gBAED,iBAAiB;gBACjB,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,SAAS,2BAA2B,CAAC,CAAC,CAAC;oBAC7E,SAAS;gBACX,CAAC;gBACD,IAAI,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACnC,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACjC,CAAC;gBACD,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,SAAS,sBAAsB,CAAC,CAAC,CAAC;oBACxE,SAAS;gBACX,CAAC;gBAED,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY,CAAC;gBAE/C,yBAAyB;gBACzB,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBAE/D,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC1C,CAAC;gBAED,iBAAiB;gBACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC1B,CAAC;qBAAM,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrD,MAAM,QAAQ,GAA2B;wBACvC,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,SAAS;qBAClB,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACtE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC1B,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAE5B,0BAA0B;gBAC1B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpD,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,SAAS;gBACX,CAAC;gBAED,WAAW;gBACX,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC9C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;wBACpB,eAAe,CAAC,IAAI,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,OAAO,CACb,KAAK,CAAC,KAAK,CACT,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,aAAa,cAAc,CAAC,YAAY,CAAC,MAAM,cAAc,CAAC,UAAU,CAAC,KAAK,cAAc,CAAC,YAAY,CAAC,KAAK;oBAC/I,KAAK,CAAC,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAC9B,CACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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,CAQ/C"}
@@ -0,0 +1,18 @@
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
+ // Register commands directly without 'video' subcommand
11
+ compressCommand(program);
12
+ transcodeCommand(program);
13
+ extractCommand(program);
14
+ trimCommand(program);
15
+ resizeCommand(program);
16
+ mergeCommand(program);
17
+ }
18
+ //# 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,wDAAwD;IACxD,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,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,9 @@
1
+ /**
2
+ * Parse and style FFmpeg output for better readability
3
+ */
4
+ export declare function styleFFmpegOutput(line: string): string;
5
+ /**
6
+ * Check if line should be displayed based on verbosity
7
+ */
8
+ export declare function shouldDisplayLine(line: string, verbose: boolean): boolean;
9
+ //# sourceMappingURL=ffmpeg-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg-output.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpeg-output.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CA+BzE"}
@@ -0,0 +1,94 @@
1
+ import chalk from 'chalk';
2
+ /**
3
+ * Parse and style FFmpeg output for better readability
4
+ */
5
+ export function styleFFmpegOutput(line) {
6
+ line = line.trim();
7
+ // Skip empty lines
8
+ if (!line)
9
+ return '';
10
+ // Error messages (red)
11
+ if (line.includes('Error') || line.includes('error') || line.includes('failed')) {
12
+ return chalk.red(line);
13
+ }
14
+ // Warning messages (yellow)
15
+ if (line.includes('Warning') || line.includes('warning')) {
16
+ return chalk.yellow(line);
17
+ }
18
+ // Progress information (cyan)
19
+ if (line.includes('frame=') || line.includes('fps=') || line.includes('time=') || line.includes('speed=')) {
20
+ // Parse progress line
21
+ const frameMatch = line.match(/frame=\s*(\d+)/);
22
+ const fpsMatch = line.match(/fps=\s*([\d.]+)/);
23
+ const timeMatch = line.match(/time=\s*([\d:\.]+)/);
24
+ const speedMatch = line.match(/speed=\s*([\d.]+x)/);
25
+ const sizeMatch = line.match(/size=\s*(\d+\w+)/);
26
+ const bitrateMatch = line.match(/bitrate=\s*([\d.]+\w+)/);
27
+ let output = chalk.cyan('⚡ Progress: ');
28
+ if (frameMatch)
29
+ output += chalk.white(`Frame ${frameMatch[1]} `);
30
+ if (fpsMatch)
31
+ output += chalk.gray(`• ${fpsMatch[1]} fps `);
32
+ if (timeMatch)
33
+ output += chalk.white(`• ${timeMatch[1]} `);
34
+ if (sizeMatch)
35
+ output += chalk.gray(`• ${sizeMatch[1]} `);
36
+ if (bitrateMatch)
37
+ output += chalk.gray(`• ${bitrateMatch[1]} `);
38
+ if (speedMatch)
39
+ output += chalk.green(`• ${speedMatch[1]}`);
40
+ return output;
41
+ }
42
+ // Input/Output file info (blue)
43
+ if (line.includes('Input #') || line.includes('Output #')) {
44
+ return chalk.blue.bold(line);
45
+ }
46
+ // Stream info (magenta)
47
+ if (line.includes('Stream #')) {
48
+ return chalk.magenta(line);
49
+ }
50
+ // Duration and metadata (green)
51
+ if (line.includes('Duration:') || line.includes('Metadata:')) {
52
+ return chalk.green(line);
53
+ }
54
+ // Configuration info (gray)
55
+ if (line.includes('configuration:') || line.includes('libav') || line.includes('built with')) {
56
+ return chalk.gray(line);
57
+ }
58
+ // Success messages (green)
59
+ if (line.includes('successfully') || line.includes('completed')) {
60
+ return chalk.green(line);
61
+ }
62
+ // Default: dim for general info
63
+ return chalk.dim(line);
64
+ }
65
+ /**
66
+ * Check if line should be displayed based on verbosity
67
+ */
68
+ export function shouldDisplayLine(line, verbose) {
69
+ line = line.trim();
70
+ if (!line)
71
+ return false;
72
+ // Always show errors and warnings
73
+ if (line.includes('Error') || line.includes('error') || line.includes('Warning') || line.includes('warning')) {
74
+ return true;
75
+ }
76
+ // Always show progress
77
+ if (line.includes('frame=') && line.includes('time=')) {
78
+ return true;
79
+ }
80
+ // Show important info
81
+ if (line.includes('Input #') || line.includes('Output #') || line.includes('Stream #')) {
82
+ return verbose;
83
+ }
84
+ // Show duration and metadata if verbose
85
+ if (line.includes('Duration:') || line.includes('Metadata:')) {
86
+ return verbose;
87
+ }
88
+ // Filter out configuration and build info unless very verbose
89
+ if (line.includes('configuration:') || line.includes('built with')) {
90
+ return false;
91
+ }
92
+ return verbose;
93
+ }
94
+ //# sourceMappingURL=ffmpeg-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg-output.js","sourceRoot":"","sources":["../../src/utils/ffmpeg-output.ts"],"names":[],"mappings":"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"}
@@ -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, onOutput?: (line: string) => void): 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":"AAIA,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,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,UAAQ,EACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,IAAI,CAAC,CAiCf;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"}