@remotion/renderer 4.0.500 → 4.0.502
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/assets/calculate-asset-positions.d.ts +1 -1
- package/dist/assets/calculate-asset-positions.js +7 -1
- package/dist/browser/BrowserFetcher.js +61 -48
- package/dist/browser/browser-download-lock.d.ts +1 -0
- package/dist/browser/browser-download-lock.js +161 -0
- package/dist/client.d.ts +5 -5
- package/dist/combine-chunks.d.ts +2 -2
- package/dist/combine-chunks.js +1 -1
- package/dist/create-audio.js +1 -1
- package/dist/esm/client.mjs +138 -43
- package/dist/esm/index.mjs +412 -181
- package/dist/esm/pure.mjs +5 -4
- package/dist/frame-range.d.ts +10 -1
- package/dist/frame-range.js +60 -36
- package/dist/get-duration-from-frame-range.d.ts +2 -1
- package/dist/get-duration-from-frame-range.js +7 -4
- package/dist/get-frame-to-render.d.ts +2 -1
- package/dist/get-frame-to-render.js +21 -5
- package/dist/index.d.ts +10 -3
- package/dist/index.js +3 -0
- package/dist/open-browser.d.ts +3 -0
- package/dist/options/frames.d.ts +4 -4
- package/dist/options/frames.js +51 -8
- package/dist/options/index.d.ts +5 -5
- package/dist/options/rspack.d.ts +2 -2
- package/dist/options/rspack.js +3 -4
- package/dist/pure.d.ts +1 -1
- package/dist/render-frame-with-option-to-reject.js +2 -1
- package/dist/render-frames.d.ts +5 -1
- package/dist/render-frames.js +42 -7
- package/dist/render-media.js +11 -5
- package/dist/set-props-and-env.js +2 -2
- package/dist/validate-selected-frames.d.ts +4 -0
- package/dist/validate-selected-frames.js +34 -0
- package/package.json +14 -14
package/dist/esm/pure.mjs
CHANGED
|
@@ -63,11 +63,12 @@ var getFramesToRender = (frameRange, everyNthFrame) => {
|
|
|
63
63
|
if (everyNthFrame === 0) {
|
|
64
64
|
throw new Error("everyNthFrame cannot be 0");
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const ranges = Array.isArray(frameRange[0]) ? frameRange : [frameRange];
|
|
67
|
+
return ranges.flatMap((range) => new Array(range[1] - range[0] + 1).fill(true).map((_, index) => {
|
|
68
|
+
return index + range[0];
|
|
68
69
|
}).filter((frame) => {
|
|
69
|
-
return (frame -
|
|
70
|
-
});
|
|
70
|
+
return (frame - range[0]) % everyNthFrame === 0;
|
|
71
|
+
}));
|
|
71
72
|
};
|
|
72
73
|
|
|
73
74
|
// src/codec.ts
|
package/dist/frame-range.d.ts
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type ResolvedFrameRange = [number, number];
|
|
2
|
+
export type OpenEndedFrameRange = [number, null];
|
|
3
|
+
export type FrameRangeTuple = ResolvedFrameRange | OpenEndedFrameRange;
|
|
4
|
+
export type SingleFrameRange = number | FrameRangeTuple;
|
|
5
|
+
export type FrameRange = SingleFrameRange | FrameRangeTuple[];
|
|
6
|
+
export type FrameSelection = FrameRange | {
|
|
7
|
+
type: 'frames';
|
|
8
|
+
frames: number[];
|
|
9
|
+
} | null;
|
|
10
|
+
export declare const isMultipleFrameRanges: (frameRange: FrameRange) => frameRange is FrameRangeTuple[];
|
|
2
11
|
export declare const validateFrameRange: (frameRange: FrameRange | null) => void;
|
package/dist/frame-range.js
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateFrameRange = void 0;
|
|
3
|
+
exports.validateFrameRange = exports.isMultipleFrameRanges = void 0;
|
|
4
|
+
const isMultipleFrameRanges = (frameRange) => {
|
|
5
|
+
return Array.isArray(frameRange) && Array.isArray(frameRange[0]);
|
|
6
|
+
};
|
|
7
|
+
exports.isMultipleFrameRanges = isMultipleFrameRanges;
|
|
8
|
+
const validateFrameRangeTuple = (frameRange) => {
|
|
9
|
+
if (frameRange.length !== 2) {
|
|
10
|
+
throw new TypeError('Frame range must be a tuple, got an array with length ' +
|
|
11
|
+
frameRange.length);
|
|
12
|
+
}
|
|
13
|
+
const [first, second] = frameRange;
|
|
14
|
+
if (typeof first !== 'number') {
|
|
15
|
+
throw new Error(`The first value of frame range must be a number, but got ${typeof first} (${JSON.stringify(first)})`);
|
|
16
|
+
}
|
|
17
|
+
if (!Number.isFinite(first)) {
|
|
18
|
+
throw new TypeError('The first value of frame range must be finite, but got ' + first);
|
|
19
|
+
}
|
|
20
|
+
if (!Number.isInteger(first)) {
|
|
21
|
+
throw new Error(`The first value of frame range must be an integer, but got a float (${first})`);
|
|
22
|
+
}
|
|
23
|
+
if (first < 0) {
|
|
24
|
+
throw new Error(`The first value of frame range must be non-negative, but got ${first}`);
|
|
25
|
+
}
|
|
26
|
+
if (second === null) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (typeof second !== 'number') {
|
|
30
|
+
throw new Error(`The second value of frame range must be a number or null, but got ${typeof second} (${JSON.stringify(second)})`);
|
|
31
|
+
}
|
|
32
|
+
if (!Number.isFinite(second)) {
|
|
33
|
+
throw new TypeError('The second value of frame range must be finite, but got ' + second);
|
|
34
|
+
}
|
|
35
|
+
if (!Number.isInteger(second)) {
|
|
36
|
+
throw new Error(`The second value of frame range must be an integer, but got a float (${second})`);
|
|
37
|
+
}
|
|
38
|
+
if (second < 0) {
|
|
39
|
+
throw new Error(`The second value of frame range must be non-negative, but got ${second}`);
|
|
40
|
+
}
|
|
41
|
+
if (second < first) {
|
|
42
|
+
throw new Error('The second value of frame range must be not smaller than the first one, but got ' +
|
|
43
|
+
frameRange.join('-'));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
4
46
|
const validateFrameRange = (frameRange) => {
|
|
5
47
|
if (frameRange === null) {
|
|
6
48
|
return;
|
|
@@ -17,45 +59,27 @@ const validateFrameRange = (frameRange) => {
|
|
|
17
59
|
}
|
|
18
60
|
return;
|
|
19
61
|
}
|
|
20
|
-
if (
|
|
21
|
-
if (frameRange.length
|
|
22
|
-
throw new TypeError('
|
|
23
|
-
frameRange.length);
|
|
24
|
-
}
|
|
25
|
-
const [first, second] = frameRange;
|
|
26
|
-
if (typeof first !== 'number') {
|
|
27
|
-
throw new Error(`The first value of frame range must be a number, but got ${typeof first} (${JSON.stringify(first)})`);
|
|
28
|
-
}
|
|
29
|
-
if (!Number.isFinite(first)) {
|
|
30
|
-
throw new TypeError('The first value of frame range must be finite, but got ' + first);
|
|
31
|
-
}
|
|
32
|
-
if (!Number.isInteger(first)) {
|
|
33
|
-
throw new Error(`The first value of frame range must be an integer, but got a float (${first})`);
|
|
34
|
-
}
|
|
35
|
-
if (first < 0) {
|
|
36
|
-
throw new Error(`The first value of frame range must be non-negative, but got ${first}`);
|
|
37
|
-
}
|
|
38
|
-
if (second === null) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (typeof second !== 'number') {
|
|
42
|
-
throw new Error(`The second value of frame range must be a number or null, but got ${typeof second} (${JSON.stringify(second)})`);
|
|
62
|
+
if ((0, exports.isMultipleFrameRanges)(frameRange)) {
|
|
63
|
+
if (frameRange.length === 0) {
|
|
64
|
+
throw new TypeError('Multiple frame ranges must not be empty.');
|
|
43
65
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
throw new Error('The second value of frame range must be not smaller than the first one, but got ' +
|
|
55
|
-
frameRange.join('-'));
|
|
66
|
+
for (let index = 0; index < frameRange.length; index++) {
|
|
67
|
+
const range = frameRange[index];
|
|
68
|
+
validateFrameRangeTuple(range);
|
|
69
|
+
if (range[1] === null && index !== frameRange.length - 1) {
|
|
70
|
+
throw new Error('An open-ended frame range must be the last range.');
|
|
71
|
+
}
|
|
72
|
+
const previous = frameRange[index - 1];
|
|
73
|
+
if (previous && previous[1] !== null && range[0] <= previous[1]) {
|
|
74
|
+
throw new Error(`Frame ranges must be ordered and non-overlapping, but got ${previous.join('-')} followed by ${range.join('-')}.`);
|
|
75
|
+
}
|
|
56
76
|
}
|
|
57
77
|
return;
|
|
58
78
|
}
|
|
79
|
+
if (Array.isArray(frameRange)) {
|
|
80
|
+
validateFrameRangeTuple(frameRange);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
59
83
|
throw new TypeError('Frame range must be a number or a tuple of numbers, but got object of type ' +
|
|
60
84
|
typeof frameRange);
|
|
61
85
|
};
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { ResolvedFrameRange } from './frame-range';
|
|
2
|
+
export declare const getFramesToRender: (frameRange: ResolvedFrameRange[] | ResolvedFrameRange, everyNthFrame: number) => number[];
|
|
@@ -5,13 +5,16 @@ const getFramesToRender = (frameRange, everyNthFrame) => {
|
|
|
5
5
|
if (everyNthFrame === 0) {
|
|
6
6
|
throw new Error('everyNthFrame cannot be 0');
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
const ranges = Array.isArray(frameRange[0])
|
|
9
|
+
? frameRange
|
|
10
|
+
: [frameRange];
|
|
11
|
+
return ranges.flatMap((range) => new Array(range[1] - range[0] + 1)
|
|
9
12
|
.fill(true)
|
|
10
13
|
.map((_, index) => {
|
|
11
|
-
return index +
|
|
14
|
+
return index + range[0];
|
|
12
15
|
})
|
|
13
16
|
.filter((frame) => {
|
|
14
|
-
return (frame -
|
|
15
|
-
});
|
|
17
|
+
return (frame - range[0]) % everyNthFrame === 0;
|
|
18
|
+
}));
|
|
16
19
|
};
|
|
17
20
|
exports.getFramesToRender = getFramesToRender;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type FrameRange, type ResolvedFrameRange } from './frame-range';
|
|
2
|
+
export declare const getRealFrameRanges: (durationInFrames: number, frameRange: FrameRange | null) => ResolvedFrameRange[];
|
|
2
3
|
export declare const getRealFrameRange: (durationInFrames: number, frameRange: FrameRange | null) => [number, number];
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getRealFrameRange = void 0;
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
return [0, durationInFrames - 1];
|
|
7
|
-
}
|
|
3
|
+
exports.getRealFrameRange = exports.getRealFrameRanges = void 0;
|
|
4
|
+
const frame_range_1 = require("./frame-range");
|
|
5
|
+
const resolveFrameRange = (durationInFrames, frameRange) => {
|
|
8
6
|
if (typeof frameRange === 'number') {
|
|
9
7
|
if (frameRange < 0 || frameRange >= durationInFrames) {
|
|
10
8
|
throw new Error(`Frame number is out of range, must be between 0 and ${durationInFrames - 1} but got ${frameRange}`);
|
|
@@ -22,4 +20,22 @@ const getRealFrameRange = (durationInFrames, frameRange) => {
|
|
|
22
20
|
}
|
|
23
21
|
return resolved;
|
|
24
22
|
};
|
|
23
|
+
const getRealFrameRanges = (durationInFrames, frameRange) => {
|
|
24
|
+
if (frameRange === null) {
|
|
25
|
+
return [[0, durationInFrames - 1]];
|
|
26
|
+
}
|
|
27
|
+
(0, frame_range_1.validateFrameRange)(frameRange);
|
|
28
|
+
if ((0, frame_range_1.isMultipleFrameRanges)(frameRange)) {
|
|
29
|
+
return frameRange.map((range) => resolveFrameRange(durationInFrames, range));
|
|
30
|
+
}
|
|
31
|
+
return [resolveFrameRange(durationInFrames, frameRange)];
|
|
32
|
+
};
|
|
33
|
+
exports.getRealFrameRanges = getRealFrameRanges;
|
|
34
|
+
const getRealFrameRange = (durationInFrames, frameRange) => {
|
|
35
|
+
const ranges = (0, exports.getRealFrameRanges)(durationInFrames, frameRange);
|
|
36
|
+
if (ranges.length !== 1) {
|
|
37
|
+
throw new Error('Expected a single frame range, but received multiple frame ranges.');
|
|
38
|
+
}
|
|
39
|
+
return ranges[0];
|
|
40
|
+
};
|
|
25
41
|
exports.getRealFrameRange = getRealFrameRange;
|
package/dist/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export { ErrorWithStackFrame } from './error-handling/handle-javascript-exceptio
|
|
|
18
18
|
export { extractAudio } from './extract-audio';
|
|
19
19
|
export type { FfmpegOverrideFn } from './ffmpeg-override';
|
|
20
20
|
export { FileExtension } from './file-extensions';
|
|
21
|
-
export { FrameRange } from './frame-range';
|
|
21
|
+
export { FrameRange, FrameRangeTuple, FrameSelection, OpenEndedFrameRange, ResolvedFrameRange, SingleFrameRange, } from './frame-range';
|
|
22
22
|
export { GetCompositionsOptions, getCompositions, LegacyGetCompositionsOptions, } from './get-compositions';
|
|
23
23
|
export { SilentPart, getSilentParts } from './get-silent-parts';
|
|
24
24
|
export { VideoMetadata, getVideoMetadata } from './get-video-metadata';
|
|
@@ -86,6 +86,7 @@ export declare const RenderInternals: {
|
|
|
86
86
|
isServeUrl: (potentialUrl: string) => boolean;
|
|
87
87
|
ensureOutputDirectory: (outputLocation: string) => void;
|
|
88
88
|
getRealFrameRange: (durationInFrames: number, frameRange: import("./frame-range").FrameRange | null) => [number, number];
|
|
89
|
+
getRealFrameRanges: (durationInFrames: number, frameRange: import("./frame-range").FrameRange | null) => import("./frame-range").ResolvedFrameRange[];
|
|
89
90
|
validatePuppeteerTimeout: (timeoutInMilliseconds: unknown) => void;
|
|
90
91
|
downloadFile: (options: {
|
|
91
92
|
url: string;
|
|
@@ -108,7 +109,7 @@ export declare const RenderInternals: {
|
|
|
108
109
|
formatStackFrameCodeFrame: (frame: import("./symbolicate-stacktrace").SymbolicatedStackFrame) => string | null;
|
|
109
110
|
formatStackFrameLocationLine: (frame: import("./symbolicate-stacktrace").SymbolicatedStackFrame) => string | null;
|
|
110
111
|
SymbolicateableError: typeof SymbolicateableError;
|
|
111
|
-
getFramesToRender: (frameRange: [
|
|
112
|
+
getFramesToRender: (frameRange: import("./frame-range").ResolvedFrameRange[] | import("./frame-range").ResolvedFrameRange, everyNthFrame: number) => number[];
|
|
112
113
|
getExtensionOfFilename: (filename: string | null) => string | null;
|
|
113
114
|
getDesiredPort: ({ desiredPort, from, hostsToTry, to, onPortUnavailable, }: {
|
|
114
115
|
desiredPort: number | undefined;
|
|
@@ -157,6 +158,10 @@ export declare const RenderInternals: {
|
|
|
157
158
|
validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
|
|
158
159
|
DEFAULT_BROWSER: "chrome";
|
|
159
160
|
validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
|
|
161
|
+
validateSelectedFrames: ({ frames, durationInFrames, }: {
|
|
162
|
+
frames: unknown;
|
|
163
|
+
durationInFrames: number | null;
|
|
164
|
+
}) => number[];
|
|
160
165
|
DEFAULT_OPENGL_RENDERER: "angle" | "angle-egl" | "egl" | "swangle" | "swiftshader" | "vulkan" | null;
|
|
161
166
|
validateOpenGlRenderer: (option: unknown) => "angle" | "angle-egl" | "egl" | "swangle" | "swiftshader" | "vulkan" | null;
|
|
162
167
|
validCodecs: readonly ["h264", "h265", "vp8", "vp9", "av1", "mp3", "aac", "wav", "prores", "h264-mkv", "h264-ts", "gif"];
|
|
@@ -1033,6 +1038,8 @@ export declare const RenderInternals: {
|
|
|
1033
1038
|
imageFormat: "jpeg" | "none" | "png";
|
|
1034
1039
|
jpegQuality: number;
|
|
1035
1040
|
frameRange: import("./frame-range").FrameRange | null;
|
|
1041
|
+
frames: number[] | null;
|
|
1042
|
+
outputFramesInSequence: boolean;
|
|
1036
1043
|
everyNthFrame: number;
|
|
1037
1044
|
puppeteerInstance: HeadlessBrowser | undefined;
|
|
1038
1045
|
browserExecutable: import("./browser-executable").BrowserExecutable;
|
|
@@ -1372,7 +1379,7 @@ export declare const RenderInternals: {
|
|
|
1372
1379
|
audioCodec: "aac" | "mp3" | "opus" | "pcm-16" | null;
|
|
1373
1380
|
cancelSignal: import("./make-cancel-signal").CancelSignal | undefined;
|
|
1374
1381
|
metadata: Record<string, string> | null;
|
|
1375
|
-
frameRange: import("./frame-range").
|
|
1382
|
+
frameRange: import("./frame-range").SingleFrameRange | null;
|
|
1376
1383
|
everyNthFrame: number;
|
|
1377
1384
|
sampleRate: number;
|
|
1378
1385
|
} & {
|
package/dist/index.js
CHANGED
|
@@ -88,6 +88,7 @@ const test_gpu_1 = require("./test-gpu");
|
|
|
88
88
|
const tmp_dir_1 = require("./tmp-dir");
|
|
89
89
|
const validate_concurrency_1 = require("./validate-concurrency");
|
|
90
90
|
const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
|
|
91
|
+
const validate_selected_frames_1 = require("./validate-selected-frames");
|
|
91
92
|
const combine_chunks_1 = require("./combine-chunks");
|
|
92
93
|
Object.defineProperty(exports, "combineChunks", { enumerable: true, get: function () { return combine_chunks_1.combineChunks; } });
|
|
93
94
|
const ensure_browser_1 = require("./ensure-browser");
|
|
@@ -145,6 +146,7 @@ exports.RenderInternals = {
|
|
|
145
146
|
isServeUrl: is_serve_url_1.isServeUrl,
|
|
146
147
|
ensureOutputDirectory: ensure_output_directory_1.ensureOutputDirectory,
|
|
147
148
|
getRealFrameRange: get_frame_to_render_1.getRealFrameRange,
|
|
149
|
+
getRealFrameRanges: get_frame_to_render_1.getRealFrameRanges,
|
|
148
150
|
validatePuppeteerTimeout: validate_puppeteer_timeout_1.validatePuppeteerTimeout,
|
|
149
151
|
downloadFile: download_file_1.downloadFile,
|
|
150
152
|
parseStack: parse_browser_error_stack_1.parseStack,
|
|
@@ -167,6 +169,7 @@ exports.RenderInternals = {
|
|
|
167
169
|
validPixelFormats: pixel_format_1.validPixelFormats,
|
|
168
170
|
DEFAULT_BROWSER: browser_1.DEFAULT_BROWSER,
|
|
169
171
|
validateFrameRange: frame_range_1.validateFrameRange,
|
|
172
|
+
validateSelectedFrames: validate_selected_frames_1.validateSelectedFrames,
|
|
170
173
|
DEFAULT_OPENGL_RENDERER: gl_1.DEFAULT_OPENGL_RENDERER,
|
|
171
174
|
validateOpenGlRenderer: gl_1.validateOpenGlRenderer,
|
|
172
175
|
validCodecs: codec_1.validCodecs,
|
package/dist/open-browser.d.ts
CHANGED
|
@@ -33,6 +33,9 @@ type InternalOpenBrowserOptions = {
|
|
|
33
33
|
type LogOptions = typeof NoReactInternals.ENABLE_V5_BREAKING_CHANGES extends true ? {
|
|
34
34
|
logLevel?: LogLevel;
|
|
35
35
|
} : {
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated Use `logLevel` instead.
|
|
38
|
+
*/
|
|
36
39
|
shouldDumpIo?: boolean;
|
|
37
40
|
logLevel?: LogLevel;
|
|
38
41
|
};
|
package/dist/options/frames.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FrameSelection } from '../frame-range';
|
|
2
2
|
export declare const framesOption: {
|
|
3
3
|
name: string;
|
|
4
4
|
cliFlag: "frames";
|
|
5
5
|
description: () => import("react/jsx-runtime").JSX.Element;
|
|
6
6
|
ssrName: "frameRange";
|
|
7
7
|
docLink: string;
|
|
8
|
-
type:
|
|
8
|
+
type: FrameSelection;
|
|
9
9
|
getValue: ({ commandLine }: {
|
|
10
10
|
commandLine: Record<string, unknown>;
|
|
11
11
|
}) => {
|
|
12
12
|
source: string;
|
|
13
|
-
value:
|
|
13
|
+
value: FrameSelection;
|
|
14
14
|
};
|
|
15
|
-
setConfig: (value:
|
|
15
|
+
setConfig: (value: FrameSelection) => void;
|
|
16
16
|
id: "frames";
|
|
17
17
|
};
|
package/dist/options/frames.js
CHANGED
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.framesOption = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const frame_range_1 = require("../frame-range");
|
|
6
|
+
const validate_selected_frames_1 = require("../validate-selected-frames");
|
|
6
7
|
const cliFlag = 'frames';
|
|
7
|
-
let
|
|
8
|
+
let frameSelection = null;
|
|
8
9
|
const parseFrameRangeFromCli = (newFrameRange) => {
|
|
9
10
|
if (typeof newFrameRange === 'number') {
|
|
10
11
|
if (newFrameRange < 0) {
|
|
@@ -16,6 +17,37 @@ const parseFrameRangeFromCli = (newFrameRange) => {
|
|
|
16
17
|
if (newFrameRange.trim() === '') {
|
|
17
18
|
throw new Error('--frames flag must be a single number, or 2 numbers separated by `-`');
|
|
18
19
|
}
|
|
20
|
+
if (newFrameRange.includes(',')) {
|
|
21
|
+
const selectors = newFrameRange
|
|
22
|
+
.split(',')
|
|
23
|
+
.map((selector) => selector.trim());
|
|
24
|
+
if (selectors.some((selector) => selector === '')) {
|
|
25
|
+
throw new TypeError('--frames must contain a frame or frame range between commas.');
|
|
26
|
+
}
|
|
27
|
+
const onlyFrames = selectors.every((selector) => !selector.includes('-'));
|
|
28
|
+
if (onlyFrames) {
|
|
29
|
+
const frames = (0, validate_selected_frames_1.validateSelectedFrames)({
|
|
30
|
+
frames: selectors.map((frame) => Number(frame)),
|
|
31
|
+
durationInFrames: null,
|
|
32
|
+
});
|
|
33
|
+
return { type: 'frames', frames };
|
|
34
|
+
}
|
|
35
|
+
const ranges = selectors.map((selector) => {
|
|
36
|
+
if (!selector.includes('-')) {
|
|
37
|
+
const frame = Number(selector);
|
|
38
|
+
return [frame, frame];
|
|
39
|
+
}
|
|
40
|
+
const rangeParts = selector.split('-');
|
|
41
|
+
if (rangeParts.length !== 2 || rangeParts[0] === '') {
|
|
42
|
+
throw new Error(`Invalid frame selector "${selector}". Use a frame number, a range such as 0-9, or an open-ended range such as 100-.`);
|
|
43
|
+
}
|
|
44
|
+
const start = Number(rangeParts[0]);
|
|
45
|
+
const end = rangeParts[1] === '' ? null : Number(rangeParts[1]);
|
|
46
|
+
return [start, end];
|
|
47
|
+
});
|
|
48
|
+
(0, frame_range_1.validateFrameRange)(ranges);
|
|
49
|
+
return ranges;
|
|
50
|
+
}
|
|
19
51
|
const parts = newFrameRange.split('-');
|
|
20
52
|
if (parts.length > 2 || parts.length <= 0) {
|
|
21
53
|
throw new Error(`--frames flag must be a number or 2 numbers separated by '-', instead got ${parts.length} numbers`);
|
|
@@ -23,7 +55,7 @@ const parseFrameRangeFromCli = (newFrameRange) => {
|
|
|
23
55
|
if (parts.length === 1) {
|
|
24
56
|
const value = Number(parts[0]);
|
|
25
57
|
if (isNaN(value)) {
|
|
26
|
-
throw new Error('--frames flag must be a
|
|
58
|
+
throw new Error('--frames flag must be a frame number, range, or comma-separated selection');
|
|
27
59
|
}
|
|
28
60
|
return value;
|
|
29
61
|
}
|
|
@@ -31,7 +63,7 @@ const parseFrameRangeFromCli = (newFrameRange) => {
|
|
|
31
63
|
if (secondPart === '' && firstPart !== '') {
|
|
32
64
|
const start = Number(firstPart);
|
|
33
65
|
if (isNaN(start)) {
|
|
34
|
-
throw new Error('--frames flag must be a
|
|
66
|
+
throw new Error('--frames flag must be a frame number, range, or comma-separated selection');
|
|
35
67
|
}
|
|
36
68
|
return [start, null];
|
|
37
69
|
}
|
|
@@ -39,7 +71,7 @@ const parseFrameRangeFromCli = (newFrameRange) => {
|
|
|
39
71
|
const [first, second] = parsed;
|
|
40
72
|
for (const value of parsed) {
|
|
41
73
|
if (isNaN(value)) {
|
|
42
|
-
throw new Error('--frames flag must be a
|
|
74
|
+
throw new Error('--frames flag must be a frame number, range, or comma-separated selection');
|
|
43
75
|
}
|
|
44
76
|
}
|
|
45
77
|
if (second < first) {
|
|
@@ -62,7 +94,15 @@ exports.framesOption = {
|
|
|
62
94
|
getValue: ({ commandLine }) => {
|
|
63
95
|
if (commandLine[cliFlag] !== undefined) {
|
|
64
96
|
const value = parseFrameRangeFromCli(commandLine[cliFlag]);
|
|
65
|
-
(
|
|
97
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
98
|
+
(0, validate_selected_frames_1.validateSelectedFrames)({
|
|
99
|
+
frames: value.frames,
|
|
100
|
+
durationInFrames: null,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
(0, frame_range_1.validateFrameRange)(value);
|
|
105
|
+
}
|
|
66
106
|
return {
|
|
67
107
|
source: 'cli',
|
|
68
108
|
value,
|
|
@@ -70,14 +110,17 @@ exports.framesOption = {
|
|
|
70
110
|
}
|
|
71
111
|
return {
|
|
72
112
|
source: 'config',
|
|
73
|
-
value:
|
|
113
|
+
value: frameSelection,
|
|
74
114
|
};
|
|
75
115
|
},
|
|
76
116
|
setConfig: (value) => {
|
|
77
|
-
if (value !== null) {
|
|
117
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
118
|
+
(0, validate_selected_frames_1.validateSelectedFrames)({ frames: value.frames, durationInFrames: null });
|
|
119
|
+
}
|
|
120
|
+
else if (value !== null) {
|
|
78
121
|
(0, frame_range_1.validateFrameRange)(value);
|
|
79
122
|
}
|
|
80
|
-
|
|
123
|
+
frameSelection = value;
|
|
81
124
|
},
|
|
82
125
|
id: cliFlag,
|
|
83
126
|
};
|
package/dist/options/index.d.ts
CHANGED
|
@@ -1118,14 +1118,14 @@ export declare const allOptions: {
|
|
|
1118
1118
|
description: () => import("react/jsx-runtime").JSX.Element;
|
|
1119
1119
|
ssrName: "frameRange";
|
|
1120
1120
|
docLink: string;
|
|
1121
|
-
type: import("..").
|
|
1121
|
+
type: import("..").FrameSelection;
|
|
1122
1122
|
getValue: ({ commandLine }: {
|
|
1123
1123
|
commandLine: Record<string, unknown>;
|
|
1124
1124
|
}) => {
|
|
1125
1125
|
source: string;
|
|
1126
|
-
value: import("..").
|
|
1126
|
+
value: import("..").FrameSelection;
|
|
1127
1127
|
};
|
|
1128
|
-
setConfig: (value: import("..").
|
|
1128
|
+
setConfig: (value: import("..").FrameSelection) => void;
|
|
1129
1129
|
id: "frames";
|
|
1130
1130
|
};
|
|
1131
1131
|
forceNewStudioOption: {
|
|
@@ -1319,7 +1319,7 @@ export declare const allOptions: {
|
|
|
1319
1319
|
};
|
|
1320
1320
|
rspackOption: {
|
|
1321
1321
|
name: string;
|
|
1322
|
-
cliFlag: "
|
|
1322
|
+
cliFlag: "rspack";
|
|
1323
1323
|
description: () => import("react/jsx-runtime").JSX.Element;
|
|
1324
1324
|
ssrName: null;
|
|
1325
1325
|
docLink: null;
|
|
@@ -1331,7 +1331,7 @@ export declare const allOptions: {
|
|
|
1331
1331
|
source: string;
|
|
1332
1332
|
};
|
|
1333
1333
|
setConfig(value: boolean): void;
|
|
1334
|
-
id: "
|
|
1334
|
+
id: "rspack";
|
|
1335
1335
|
};
|
|
1336
1336
|
outDirOption: {
|
|
1337
1337
|
name: string;
|
package/dist/options/rspack.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const rspackOption: {
|
|
2
2
|
name: string;
|
|
3
|
-
cliFlag: "
|
|
3
|
+
cliFlag: "rspack";
|
|
4
4
|
description: () => import("react/jsx-runtime").JSX.Element;
|
|
5
5
|
ssrName: null;
|
|
6
6
|
docLink: null;
|
|
@@ -12,5 +12,5 @@ export declare const rspackOption: {
|
|
|
12
12
|
source: string;
|
|
13
13
|
};
|
|
14
14
|
setConfig(value: boolean): void;
|
|
15
|
-
id: "
|
|
15
|
+
id: "rspack";
|
|
16
16
|
};
|
package/dist/options/rspack.js
CHANGED
|
@@ -3,17 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.rspackOption = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
let rspackEnabled = false;
|
|
6
|
-
const cliFlag = '
|
|
6
|
+
const cliFlag = 'rspack';
|
|
7
7
|
exports.rspackOption = {
|
|
8
|
-
name: '
|
|
8
|
+
name: 'Rspack',
|
|
9
9
|
cliFlag,
|
|
10
10
|
description: () => (jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: "Uses Rspack instead of Webpack as the bundler for the Studio or bundle." })),
|
|
11
11
|
ssrName: null,
|
|
12
12
|
docLink: null,
|
|
13
13
|
type: false,
|
|
14
14
|
getValue: ({ commandLine }) => {
|
|
15
|
-
if (commandLine[cliFlag] !== undefined) {
|
|
16
|
-
rspackEnabled = true;
|
|
15
|
+
if (commandLine[cliFlag] !== undefined && commandLine[cliFlag] !== null) {
|
|
17
16
|
return {
|
|
18
17
|
value: commandLine[cliFlag],
|
|
19
18
|
source: 'cli',
|
package/dist/pure.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare const NoReactAPIs: {
|
|
|
8
8
|
preferLossless: boolean;
|
|
9
9
|
separateAudioTo: string | null;
|
|
10
10
|
}) => void;
|
|
11
|
-
getFramesToRender: (frameRange: [
|
|
11
|
+
getFramesToRender: (frameRange: import("./frame-range").ResolvedFrameRange[] | import("./frame-range").ResolvedFrameRange, everyNthFrame: number) => number[];
|
|
12
12
|
codecSupportsMedia: (codec: "aac" | "av1" | "gif" | "h264" | "h264-mkv" | "h264-ts" | "h265" | "mp3" | "prores" | "vp8" | "vp9" | "wav") => {
|
|
13
13
|
video: boolean;
|
|
14
14
|
audio: boolean;
|
|
@@ -109,6 +109,7 @@ const renderFrameWithOptionToReject = async ({ reject, width, height, compId, at
|
|
|
109
109
|
return (0, compress_assets_1.compressAsset)(previousAudioRenderAssets, asset);
|
|
110
110
|
});
|
|
111
111
|
const inlineAudioAssets = (0, filter_asset_types_1.onlyInlineAudio)(collectedAssets);
|
|
112
|
+
const outputFrame = allFramesAndExtraFrames[0] + allFramesAndExtraFrames.indexOf(frame);
|
|
112
113
|
assets.push({
|
|
113
114
|
audioAndVideoAssets: compressedAssets,
|
|
114
115
|
frame,
|
|
@@ -138,7 +139,7 @@ const renderFrameWithOptionToReject = async ({ reject, width, height, compId, at
|
|
|
138
139
|
}
|
|
139
140
|
for (const renderAsset of inlineAudioAssets) {
|
|
140
141
|
downloadMap.inlineAudioMixing.addAsset({
|
|
141
|
-
asset: renderAsset,
|
|
142
|
+
asset: { ...renderAsset, frame: outputFrame },
|
|
142
143
|
fps,
|
|
143
144
|
totalNumberOfFrames: allFramesAndExtraFrames.length,
|
|
144
145
|
firstFrame: allFramesAndExtraFrames[0],
|
package/dist/render-frames.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { BrowserExecutable } from './browser-executable';
|
|
|
4
4
|
import type { BrowserLog } from './browser-log';
|
|
5
5
|
import type { HeadlessBrowser } from './browser/Browser';
|
|
6
6
|
import type { OnLog } from './browser/BrowserPage';
|
|
7
|
-
import type
|
|
7
|
+
import { type FrameRange } from './frame-range';
|
|
8
8
|
import type { VideoImageFormat } from './image-format';
|
|
9
9
|
import type { CancelSignal } from './make-cancel-signal';
|
|
10
10
|
import type { ChromiumOptions } from './open-browser';
|
|
@@ -22,6 +22,8 @@ type InternalRenderFramesOptions = {
|
|
|
22
22
|
imageFormat: VideoImageFormat;
|
|
23
23
|
jpegQuality: number;
|
|
24
24
|
frameRange: FrameRange | null;
|
|
25
|
+
frames: number[] | null;
|
|
26
|
+
outputFramesInSequence: boolean;
|
|
25
27
|
everyNthFrame: number;
|
|
26
28
|
puppeteerInstance: HeadlessBrowser | undefined;
|
|
27
29
|
browserExecutable: BrowserExecutable | null;
|
|
@@ -70,6 +72,7 @@ export type RenderFramesOptions = Prettify<{
|
|
|
70
72
|
*/
|
|
71
73
|
quality?: never;
|
|
72
74
|
frameRange?: FrameRange | null;
|
|
75
|
+
frames?: number[];
|
|
73
76
|
everyNthFrame?: number;
|
|
74
77
|
/**
|
|
75
78
|
* @deprecated Use "logLevel": "verbose" instead
|
|
@@ -116,6 +119,7 @@ export declare const renderFrames: (options: {
|
|
|
116
119
|
imageFormat?: "jpeg" | "none" | "png" | undefined;
|
|
117
120
|
quality?: undefined;
|
|
118
121
|
frameRange?: FrameRange | null | undefined;
|
|
122
|
+
frames?: number[] | undefined;
|
|
119
123
|
everyNthFrame?: number | undefined;
|
|
120
124
|
dumpBrowserLogs?: boolean | undefined;
|
|
121
125
|
verbose?: boolean | undefined;
|