@remotion/renderer 3.3.33 → 3.3.34
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/browser/is-target-closed-err.d.ts +1 -0
- package/dist/browser/is-target-closed-err.js +9 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.js +7 -0
- package/dist/get-extension-from-codec.d.ts +1 -1
- package/dist/get-extension-from-codec.js +2 -8
- package/dist/index.d.ts +4 -5
- package/dist/render-frames.js +10 -3
- package/dist/render-media.d.ts +0 -1
- package/dist/render-media.js +1 -1
- package/dist/stitch-frames-to-video.js +1 -1
- package/package.json +10 -10
- package/dist/compositor/compositor.d.ts +0 -12
- package/dist/compositor/compositor.js +0 -111
- package/dist/determine-vcodec-ffmepg-flags.d.ts +0 -2
- package/dist/determine-vcodec-ffmepg-flags.js +0 -13
- package/dist/get-compositions-from-bundle.d.ts +0 -7
- package/dist/get-compositions-from-bundle.js +0 -55
- package/dist/get-compositions-from-markup.d.ts +0 -3
- package/dist/get-compositions-from-markup.js +0 -17
- package/dist/get-compositions-on-server.d.ts +0 -3
- package/dist/get-compositions-on-server.js +0 -18
- package/dist/get-video-signals.d.ts +0 -2
- package/dist/get-video-signals.js +0 -28
- package/dist/lock-port-selection.d.ts +0 -2
- package/dist/lock-port-selection.js +0 -11
- package/dist/make-comp-manager-context.d.ts +0 -2
- package/dist/make-comp-manager-context.js +0 -45
- package/dist/make-timeline-context-value.d.ts +0 -2
- package/dist/make-timeline-context-value.js +0 -20
- package/dist/render-on-server.d.ts +0 -3
- package/dist/render-on-server.js +0 -90
- package/dist/render-svg.d.ts +0 -8
- package/dist/render-svg.js +0 -13
- package/dist/render-video-layer.d.ts +0 -9
- package/dist/render-video-layer.js +0 -23
- package/dist/render-web-frame.d.ts +0 -74
- package/dist/render-web-frame.js +0 -259
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isTargetClosedErr: (error: Error | undefined) => boolean | undefined;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTargetClosedErr = void 0;
|
|
4
|
+
const isTargetClosedErr = (error) => {
|
|
5
|
+
var _a, _b;
|
|
6
|
+
return (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) ||
|
|
7
|
+
((_b = error === null || error === void 0 ? void 0 : error.message) === null || _b === void 0 ? void 0 : _b.includes('Session closed')));
|
|
8
|
+
};
|
|
9
|
+
exports.isTargetClosedErr = isTargetClosedErr;
|
package/dist/client.d.ts
ADDED
package/dist/client.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BrowserSafeApis = void 0;
|
|
4
|
+
const get_extension_from_codec_1 = require("./get-extension-from-codec");
|
|
5
|
+
exports.BrowserSafeApis = {
|
|
6
|
+
getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
|
|
7
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { Codec } from './codec';
|
|
2
|
-
export declare const getFileExtensionFromCodec: (codec: Codec
|
|
2
|
+
export declare const getFileExtensionFromCodec: (codec: Codec) => "mp3" | "aac" | "wav" | "gif" | "mp4" | "mkv" | "mov" | "webm";
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getFileExtensionFromCodec = void 0;
|
|
4
4
|
const codec_1 = require("./codec");
|
|
5
|
-
const getFileExtensionFromCodec = (codec
|
|
5
|
+
const getFileExtensionFromCodec = (codec) => {
|
|
6
6
|
if (!codec_1.validCodecs.includes(codec)) {
|
|
7
7
|
throw new Error(`Codec must be one of the following: ${codec_1.validCodecs.join(', ')}, but got ${codec}`);
|
|
8
8
|
}
|
|
@@ -13,10 +13,7 @@ const getFileExtensionFromCodec = (codec, type) => {
|
|
|
13
13
|
return 'mp4';
|
|
14
14
|
// The chunks will be rendered as mkv, but the final output will still be MP4
|
|
15
15
|
case 'h264-mkv':
|
|
16
|
-
|
|
17
|
-
return 'mkv';
|
|
18
|
-
}
|
|
19
|
-
return 'mp4';
|
|
16
|
+
return 'mkv';
|
|
20
17
|
case 'h265':
|
|
21
18
|
return 'mp4';
|
|
22
19
|
case 'mp3':
|
|
@@ -28,9 +25,6 @@ const getFileExtensionFromCodec = (codec, type) => {
|
|
|
28
25
|
case 'vp9':
|
|
29
26
|
return 'webm';
|
|
30
27
|
case 'gif':
|
|
31
|
-
if (type === 'chunk') {
|
|
32
|
-
return 'mkv';
|
|
33
|
-
}
|
|
34
28
|
return 'gif';
|
|
35
29
|
case 'wav':
|
|
36
30
|
return 'wav';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import execa from 'execa';
|
|
3
2
|
import { SymbolicateableError } from './error-handling/symbolicateable-error';
|
|
4
3
|
import { mimeContentType, mimeLookup } from './mime-types';
|
|
@@ -60,7 +59,7 @@ export declare const RenderInternals: {
|
|
|
60
59
|
scale: number;
|
|
61
60
|
codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
|
|
62
61
|
}) => void;
|
|
63
|
-
getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif"
|
|
62
|
+
getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => "mp3" | "aac" | "wav" | "gif" | "mp4" | "mkv" | "mov" | "webm";
|
|
64
63
|
tmpDir: (str: string) => string;
|
|
65
64
|
deleteDirectory: (directory: string) => Promise<void>;
|
|
66
65
|
isServeUrl: (potentialUrl: string) => boolean;
|
|
@@ -117,8 +116,8 @@ export declare const RenderInternals: {
|
|
|
117
116
|
validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
|
|
118
117
|
DEFAULT_BROWSER: import("./browser").Browser;
|
|
119
118
|
validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
|
|
120
|
-
DEFAULT_OPENGL_RENDERER: "
|
|
121
|
-
validateOpenGlRenderer: (option: "
|
|
119
|
+
DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
120
|
+
validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
122
121
|
validImageFormats: readonly ["png", "jpeg", "none"];
|
|
123
122
|
validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
|
|
124
123
|
DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
@@ -128,7 +127,7 @@ export declare const RenderInternals: {
|
|
|
128
127
|
DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
|
|
129
128
|
isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
|
|
130
129
|
logLevels: readonly ["verbose", "info", "warn", "error"];
|
|
131
|
-
isEqualOrBelowLogLevel: (currentLevel: "
|
|
130
|
+
isEqualOrBelowLogLevel: (currentLevel: "verbose" | "info" | "warn" | "error", level: "verbose" | "info" | "warn" | "error") => boolean;
|
|
132
131
|
isValidLogLevel: (level: string) => boolean;
|
|
133
132
|
perf: typeof perf;
|
|
134
133
|
makeDownloadMap: () => import("./assets/download-map").DownloadMap;
|
package/dist/render-frames.js
CHANGED
|
@@ -245,8 +245,11 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, qual
|
|
|
245
245
|
if ((0, make_cancel_signal_1.isUserCancelledRender)(err)) {
|
|
246
246
|
throw err;
|
|
247
247
|
}
|
|
248
|
+
if (stopped) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
248
251
|
if (retriesLeft === 0) {
|
|
249
|
-
console.warn(
|
|
252
|
+
console.warn(`The browser crashed ${attempt} times while rendering frame ${frame}. Not retrying anymore. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
|
|
250
253
|
throw err;
|
|
251
254
|
}
|
|
252
255
|
console.warn(`The browser crashed while rendering frame ${frame}, retrying ${retriesLeft} more times. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
|
|
@@ -370,7 +373,9 @@ const renderFrames = (options) => {
|
|
|
370
373
|
// If new browser was opened, then closing the browser as a cleanup.
|
|
371
374
|
if (options.puppeteerInstance) {
|
|
372
375
|
Promise.all(openedPages.map((p) => p.close())).catch((err) => {
|
|
373
|
-
|
|
376
|
+
if (!(err === null || err === void 0 ? void 0 : err.message.includes('Target closed'))) {
|
|
377
|
+
console.log('Unable to close browser tab', err);
|
|
378
|
+
}
|
|
374
379
|
});
|
|
375
380
|
}
|
|
376
381
|
else {
|
|
@@ -379,7 +384,9 @@ const renderFrames = (options) => {
|
|
|
379
384
|
return puppeteerInstance.close(true);
|
|
380
385
|
})
|
|
381
386
|
.catch((err) => {
|
|
382
|
-
|
|
387
|
+
if (!(err === null || err === void 0 ? void 0 : err.message.includes('Target closed'))) {
|
|
388
|
+
console.log('Unable to close browser', err);
|
|
389
|
+
}
|
|
383
390
|
});
|
|
384
391
|
}
|
|
385
392
|
cleanup.forEach((c) => {
|
package/dist/render-media.d.ts
CHANGED
package/dist/render-media.js
CHANGED
|
@@ -115,7 +115,7 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
|
|
|
115
115
|
const quality = imageFormat === 'jpeg' ? options.quality : undefined;
|
|
116
116
|
(0, image_format_1.validateSelectedPixelFormatAndImageFormatCombination)(pixelFormat, imageFormat);
|
|
117
117
|
const preEncodedFileLocation = parallelEncoding
|
|
118
|
-
? path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec
|
|
118
|
+
? path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec))
|
|
119
119
|
: null;
|
|
120
120
|
const outputDir = parallelEncoding
|
|
121
121
|
? null
|
|
@@ -134,7 +134,7 @@ const spawnFfmpeg = async (options, remotionRoot) => {
|
|
|
134
134
|
const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
|
|
135
135
|
const tempFile = options.outputLocation
|
|
136
136
|
? null
|
|
137
|
-
: path_1.default.join(options.assetsInfo.downloadMap.stitchFrames, `out.${(0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec
|
|
137
|
+
: path_1.default.join(options.assetsInfo.downloadMap.stitchFrames, `out.${(0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec)}`);
|
|
138
138
|
const shouldRenderAudio = mediaSupport.audio &&
|
|
139
139
|
(options.assetsInfo.assets.flat(1).length > 0 ||
|
|
140
140
|
options.enforceAudioTrack) &&
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/renderer",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.34",
|
|
4
4
|
"description": "Renderer for Remotion",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"execa": "5.1.1",
|
|
26
26
|
"extract-zip": "2.0.1",
|
|
27
|
-
"remotion": "3.3.
|
|
27
|
+
"remotion": "3.3.34",
|
|
28
28
|
"source-map": "^0.8.0-beta.0",
|
|
29
29
|
"ws": "8.7.0"
|
|
30
30
|
},
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
"vitest": "0.24.3"
|
|
50
50
|
},
|
|
51
51
|
"optionalDependencies": {
|
|
52
|
-
"@remotion/compositor-darwin-arm64": "3.3.
|
|
53
|
-
"@remotion/compositor-darwin-x64": "3.3.
|
|
54
|
-
"@remotion/compositor-linux-arm64-gnu": "3.3.
|
|
55
|
-
"@remotion/compositor-linux-arm64-musl": "3.3.
|
|
56
|
-
"@remotion/compositor-linux-x64-gnu": "3.3.
|
|
57
|
-
"@remotion/compositor-linux-x64-musl": "3.3.
|
|
58
|
-
"@remotion/compositor-win32-x64-msvc": "3.3.
|
|
52
|
+
"@remotion/compositor-darwin-arm64": "3.3.34",
|
|
53
|
+
"@remotion/compositor-darwin-x64": "3.3.34",
|
|
54
|
+
"@remotion/compositor-linux-arm64-gnu": "3.3.34",
|
|
55
|
+
"@remotion/compositor-linux-arm64-musl": "3.3.34",
|
|
56
|
+
"@remotion/compositor-linux-x64-gnu": "3.3.34",
|
|
57
|
+
"@remotion/compositor-linux-x64-musl": "3.3.34",
|
|
58
|
+
"@remotion/compositor-win32-x64-msvc": "3.3.34"
|
|
59
59
|
},
|
|
60
60
|
"keywords": [
|
|
61
61
|
"remotion",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"publishConfig": {
|
|
68
68
|
"access": "public"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "b078979b3e2f5cc4d240f112b827e7ef951aa318"
|
|
71
71
|
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { CompositorCommand, CompositorInitiatePayload } from './payloads';
|
|
2
|
-
export declare type Compositor = {
|
|
3
|
-
finishCommands: () => void;
|
|
4
|
-
executeCommand: (payload: Omit<CompositorCommand, 'nonce'>) => Promise<void>;
|
|
5
|
-
waitForDone: () => Promise<void>;
|
|
6
|
-
};
|
|
7
|
-
export declare const spawnCompositorOrReuse: ({ initiatePayload, renderId, }: {
|
|
8
|
-
initiatePayload: CompositorInitiatePayload;
|
|
9
|
-
renderId: string;
|
|
10
|
-
}) => Compositor;
|
|
11
|
-
export declare const releaseCompositorWithId: (renderId: string) => void;
|
|
12
|
-
export declare const waitForCompositorWithIdToQuit: (renderId: string) => Promise<void>;
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.waitForCompositorWithIdToQuit = exports.releaseCompositorWithId = exports.spawnCompositorOrReuse = void 0;
|
|
4
|
-
const child_process_1 = require("child_process");
|
|
5
|
-
const truthy_1 = require("../truthy");
|
|
6
|
-
const get_executable_path_1 = require("./get-executable-path");
|
|
7
|
-
const compositorMap = {};
|
|
8
|
-
const spawnCompositorOrReuse = ({ initiatePayload, renderId, }) => {
|
|
9
|
-
if (!compositorMap[renderId]) {
|
|
10
|
-
compositorMap[renderId] = startCompositor(initiatePayload);
|
|
11
|
-
}
|
|
12
|
-
return compositorMap[renderId];
|
|
13
|
-
};
|
|
14
|
-
exports.spawnCompositorOrReuse = spawnCompositorOrReuse;
|
|
15
|
-
const releaseCompositorWithId = (renderId) => {
|
|
16
|
-
if (compositorMap[renderId]) {
|
|
17
|
-
compositorMap[renderId].finishCommands();
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
exports.releaseCompositorWithId = releaseCompositorWithId;
|
|
21
|
-
const waitForCompositorWithIdToQuit = (renderId) => {
|
|
22
|
-
if (!compositorMap[renderId]) {
|
|
23
|
-
throw new TypeError('No compositor with that id');
|
|
24
|
-
}
|
|
25
|
-
return compositorMap[renderId].waitForDone();
|
|
26
|
-
};
|
|
27
|
-
exports.waitForCompositorWithIdToQuit = waitForCompositorWithIdToQuit;
|
|
28
|
-
const startCompositor = (compositorInitiatePayload) => {
|
|
29
|
-
const bin = (0, get_executable_path_1.getExecutablePath)();
|
|
30
|
-
const child = (0, child_process_1.spawn)(`${bin}`, [JSON.stringify(compositorInitiatePayload)]);
|
|
31
|
-
const stderrChunks = [];
|
|
32
|
-
let stdoutListeners = [];
|
|
33
|
-
let stderrListeners = [];
|
|
34
|
-
child.stderr.on('data', (d) => {
|
|
35
|
-
stderrChunks.push(d);
|
|
36
|
-
const str = d.toString('utf-8');
|
|
37
|
-
stderrListeners.forEach((s) => s(str));
|
|
38
|
-
});
|
|
39
|
-
child.stdout.on('data', (d) => {
|
|
40
|
-
const str = d.toString('utf-8');
|
|
41
|
-
stdoutListeners.forEach((s) => s(str));
|
|
42
|
-
});
|
|
43
|
-
let nonce = 0;
|
|
44
|
-
return {
|
|
45
|
-
waitForDone: () => {
|
|
46
|
-
return new Promise((resolve, reject) => {
|
|
47
|
-
child.on('exit', (code) => {
|
|
48
|
-
if (code === 0) {
|
|
49
|
-
resolve();
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
reject(Buffer.concat(stderrChunks).toString('utf-8'));
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
},
|
|
57
|
-
finishCommands: () => {
|
|
58
|
-
child.stdin.write('EOF\n');
|
|
59
|
-
},
|
|
60
|
-
executeCommand: (payload) => {
|
|
61
|
-
const actualPayload = {
|
|
62
|
-
...payload,
|
|
63
|
-
nonce,
|
|
64
|
-
};
|
|
65
|
-
nonce++;
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
child.stdin.write(JSON.stringify(actualPayload) + '\n');
|
|
68
|
-
const onStderr = (message) => {
|
|
69
|
-
let parsed = null;
|
|
70
|
-
try {
|
|
71
|
-
const content = JSON.parse(message);
|
|
72
|
-
if (content.msg_type === 'error') {
|
|
73
|
-
parsed = content;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
// TODO: Obviously bad, does not handle panics
|
|
78
|
-
console.log('Rust debug err:', message);
|
|
79
|
-
}
|
|
80
|
-
if (parsed) {
|
|
81
|
-
const err = new Error(parsed.error);
|
|
82
|
-
err.stack = parsed.error + '\n' + parsed.backtrace;
|
|
83
|
-
reject(err);
|
|
84
|
-
stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
|
|
85
|
-
stderrListeners = stderrListeners.filter((s) => s !== onStderr);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
const onStdout = (str) => {
|
|
89
|
-
const lineSplit = str.split('\n');
|
|
90
|
-
for (const line of lineSplit.filter(truthy_1.truthy)) {
|
|
91
|
-
let parsed = null;
|
|
92
|
-
try {
|
|
93
|
-
const p = JSON.parse(line);
|
|
94
|
-
if (p.msg_type === 'finish') {
|
|
95
|
-
parsed = p;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch (e) { }
|
|
99
|
-
if (parsed && parsed.nonce === actualPayload.nonce) {
|
|
100
|
-
resolve();
|
|
101
|
-
stdoutListeners = stdoutListeners.filter((s) => s !== onStdout);
|
|
102
|
-
stderrListeners = stderrListeners.filter((s) => s !== onStderr);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
stdoutListeners.push(onStdout);
|
|
107
|
-
stderrListeners.push(onStderr);
|
|
108
|
-
});
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.determineVcodecFfmepgFlags = void 0;
|
|
4
|
-
const truthy_1 = require("./truthy");
|
|
5
|
-
const determineVcodecFfmepgFlags = (vcodecFlag) => {
|
|
6
|
-
return [
|
|
7
|
-
vcodecFlag === 'vp9' ? '-vcodec' : null,
|
|
8
|
-
vcodecFlag === 'vp9' ? 'libvpx-vp9' : null,
|
|
9
|
-
vcodecFlag === 'vp8' ? '-vcodec' : null,
|
|
10
|
-
vcodecFlag === 'vp8' ? 'libvpx' : null,
|
|
11
|
-
].filter(truthy_1.truthy);
|
|
12
|
-
};
|
|
13
|
-
exports.determineVcodecFfmepgFlags = determineVcodecFfmepgFlags;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from 'react';
|
|
2
|
-
import type { TCompMetadata } from 'remotion';
|
|
3
|
-
import type { GetCompositionsConfig } from './get-compositions';
|
|
4
|
-
export declare const getCompositionsFromBundle: (bundle: string, options: GetCompositionsConfig) => {
|
|
5
|
-
compositions: TCompMetadata[];
|
|
6
|
-
root: ComponentType;
|
|
7
|
-
};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getCompositionsFromBundle = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const remotion_1 = require("remotion");
|
|
10
|
-
const vm_1 = __importDefault(require("vm"));
|
|
11
|
-
const is_serve_url_1 = require("./is-serve-url");
|
|
12
|
-
const getCompositionsFromBundle = (bundle, options) => {
|
|
13
|
-
const bundleFile = path_1.default.join(bundle, 'bundle.js');
|
|
14
|
-
if ((0, is_serve_url_1.isServeUrl)(bundle)) {
|
|
15
|
-
throw new Error('Can only use getCompositionFromBundle from a local file');
|
|
16
|
-
}
|
|
17
|
-
const content = fs_1.default.readFileSync(bundleFile, 'utf-8');
|
|
18
|
-
// @ts-éxpect-error
|
|
19
|
-
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
20
|
-
const context = {
|
|
21
|
-
window: {
|
|
22
|
-
remotion_envVariables: options.envVariables,
|
|
23
|
-
},
|
|
24
|
-
clearTimeout: () => {
|
|
25
|
-
console.trace('clearTimeout() called inside a server-side bundle. This is not supported.');
|
|
26
|
-
},
|
|
27
|
-
setTimeout: () => {
|
|
28
|
-
console.trace('setTimeout() called inside a server-side bundle. This is not supported.');
|
|
29
|
-
},
|
|
30
|
-
process: {
|
|
31
|
-
env: {
|
|
32
|
-
REMOTION_SERVER_RENDERING: true,
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
require,
|
|
36
|
-
Buffer,
|
|
37
|
-
console,
|
|
38
|
-
};
|
|
39
|
-
const vmContext = vm_1.default.createContext(context);
|
|
40
|
-
// TODO: Set props and env
|
|
41
|
-
const code = content;
|
|
42
|
-
vm_1.default.runInContext(code, vmContext, {
|
|
43
|
-
filename: bundleFile,
|
|
44
|
-
breakOnSigint: true,
|
|
45
|
-
});
|
|
46
|
-
const theRoot = remotion_1.Internals.getRoot();
|
|
47
|
-
if (!theRoot) {
|
|
48
|
-
throw new Error('Did not call getRoot() in the bundle. Delaying the calling of getRoot() is not supported in server-side-rendering.');
|
|
49
|
-
}
|
|
50
|
-
const Comp = theRoot;
|
|
51
|
-
const comps = (0, remotion_1.getCompositionsFromMarkup)(Comp);
|
|
52
|
-
remotion_1.Internals.clearRoot();
|
|
53
|
-
return { compositions: comps, root: Comp };
|
|
54
|
-
};
|
|
55
|
-
exports.getCompositionsFromBundle = getCompositionsFromBundle;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getCompositionsFromMarkup = void 0;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const server_1 = require("react-dom/server");
|
|
6
|
-
const getCompositionsFromMarkup = (Comp) => {
|
|
7
|
-
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
8
|
-
const str = (0, server_1.renderToString)((0, jsx_runtime_1.jsx)(Comp, {}));
|
|
9
|
-
const matches = str.matchAll(/<div>(.*?)<\/div>/g);
|
|
10
|
-
const metadata = [];
|
|
11
|
-
for (const match of matches) {
|
|
12
|
-
const json = JSON.parse(match[1]);
|
|
13
|
-
metadata.push(json);
|
|
14
|
-
}
|
|
15
|
-
return metadata;
|
|
16
|
-
};
|
|
17
|
-
exports.getCompositionsFromMarkup = getCompositionsFromMarkup;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getCompositionsFromMarkup = void 0;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const server_1 = require("react-dom/server");
|
|
6
|
-
const getCompositionsFromMarkup = (Comp) => {
|
|
7
|
-
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
8
|
-
const str = (0, server_1.renderToString)((0, jsx_runtime_1.jsx)(Comp, {}));
|
|
9
|
-
console.log({ str }, (0, jsx_runtime_1.jsx)(Comp, {}));
|
|
10
|
-
const matches = str.matchAll(/<div>(.*?)<\/div>/g);
|
|
11
|
-
const metadata = [];
|
|
12
|
-
for (const match of matches) {
|
|
13
|
-
const json = JSON.parse(match[1]);
|
|
14
|
-
metadata.push(json);
|
|
15
|
-
}
|
|
16
|
-
return metadata;
|
|
17
|
-
};
|
|
18
|
-
exports.getCompositionsFromMarkup = getCompositionsFromMarkup;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getNativeVideoSignals = void 0;
|
|
4
|
-
const getNativeVideoSignals = (layers) => {
|
|
5
|
-
const videoSignals = layers
|
|
6
|
-
.filter((l) => {
|
|
7
|
-
return l.type === 'VideoFrame';
|
|
8
|
-
})
|
|
9
|
-
.map((l) => {
|
|
10
|
-
if (l.type !== 'VideoFrame') {
|
|
11
|
-
throw new Error('Expected VideoFrame');
|
|
12
|
-
}
|
|
13
|
-
return { frame: l.params.frame, src: l.params.src };
|
|
14
|
-
});
|
|
15
|
-
const map = {};
|
|
16
|
-
// Return a map for each video source and the number of times each frame is expected to be used
|
|
17
|
-
for (const { src, frame } of videoSignals) {
|
|
18
|
-
if (!map[src]) {
|
|
19
|
-
map[src] = {};
|
|
20
|
-
}
|
|
21
|
-
if (!map[src][frame]) {
|
|
22
|
-
map[src][frame] = 0;
|
|
23
|
-
}
|
|
24
|
-
map[src][frame]++;
|
|
25
|
-
}
|
|
26
|
-
return map;
|
|
27
|
-
};
|
|
28
|
-
exports.getNativeVideoSignals = getNativeVideoSignals;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.unlockPortSelection = exports.lockPortSelection = void 0;
|
|
4
|
-
const locks = [];
|
|
5
|
-
const waitForPortSelection = () => { };
|
|
6
|
-
const lockPortSelection = () => {
|
|
7
|
-
locks.push();
|
|
8
|
-
};
|
|
9
|
-
exports.lockPortSelection = lockPortSelection;
|
|
10
|
-
const unlockPortSelection = () => { };
|
|
11
|
-
exports.unlockPortSelection = unlockPortSelection;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeCompManagerContext = void 0;
|
|
4
|
-
const makeCompManagerContext = (composition) => {
|
|
5
|
-
const memo = {
|
|
6
|
-
assets: [],
|
|
7
|
-
compositions: [composition],
|
|
8
|
-
currentComposition: composition.id,
|
|
9
|
-
currentCompositionMetadata: composition,
|
|
10
|
-
folders: [],
|
|
11
|
-
registerAsset: () => {
|
|
12
|
-
throw new Error('Not implemented');
|
|
13
|
-
},
|
|
14
|
-
registerComposition: () => {
|
|
15
|
-
throw new Error('Not implemented');
|
|
16
|
-
},
|
|
17
|
-
registerFolder: () => {
|
|
18
|
-
throw new Error('Not implemented');
|
|
19
|
-
},
|
|
20
|
-
setCurrentComposition: () => {
|
|
21
|
-
throw new Error('Not implemented');
|
|
22
|
-
},
|
|
23
|
-
registerSequence() {
|
|
24
|
-
throw new Error('Not implemented');
|
|
25
|
-
},
|
|
26
|
-
sequences: [],
|
|
27
|
-
setCurrentCompositionMetadata: () => {
|
|
28
|
-
throw new Error('Not implemented');
|
|
29
|
-
},
|
|
30
|
-
unregisterAsset: () => {
|
|
31
|
-
throw new Error('Not implemented');
|
|
32
|
-
},
|
|
33
|
-
unregisterComposition: () => {
|
|
34
|
-
throw new Error('Not implemented');
|
|
35
|
-
},
|
|
36
|
-
unregisterFolder: () => {
|
|
37
|
-
throw new Error('Not implemented');
|
|
38
|
-
},
|
|
39
|
-
unregisterSequence: () => {
|
|
40
|
-
throw new Error('Not implemented');
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
return memo;
|
|
44
|
-
};
|
|
45
|
-
exports.makeCompManagerContext = makeCompManagerContext;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeTimelineContextValue = void 0;
|
|
4
|
-
const makeTimelineContextValue = (composition, frame) => {
|
|
5
|
-
const value = {
|
|
6
|
-
audioAndVideoTags: { current: [] },
|
|
7
|
-
rootId: composition.id,
|
|
8
|
-
playing: false,
|
|
9
|
-
playbackRate: 1,
|
|
10
|
-
imperativePlaying: {
|
|
11
|
-
current: false,
|
|
12
|
-
},
|
|
13
|
-
frame,
|
|
14
|
-
setPlaybackRate: () => {
|
|
15
|
-
throw new Error('Not implemented');
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
return value;
|
|
19
|
-
};
|
|
20
|
-
exports.makeTimelineContextValue = makeTimelineContextValue;
|
package/dist/render-on-server.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.renderOnServer = void 0;
|
|
7
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
-
const execa_1 = __importDefault(require("execa"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const server_1 = require("react-dom/server");
|
|
11
|
-
const remotion_1 = require("remotion");
|
|
12
|
-
const download_map_1 = require("./assets/download-map");
|
|
13
|
-
const compose_1 = require("./compositor/compose");
|
|
14
|
-
const compositor_1 = require("./compositor/compositor");
|
|
15
|
-
const get_frame_padded_index_1 = require("./get-frame-padded-index");
|
|
16
|
-
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
17
|
-
const pool_1 = require("./pool");
|
|
18
|
-
const renderOnServer = async (Comp, composition) => {
|
|
19
|
-
console.time('total');
|
|
20
|
-
console.time('frames');
|
|
21
|
-
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
22
|
-
// eslint-disable-next-line react/jsx-no-constructed-context-values
|
|
23
|
-
const memo = (0, make_comp_manager_context_1.makeCompManagerContext)(composition);
|
|
24
|
-
const pool = new pool_1.Pool(new Array(4).fill(true).map((_, i) => i));
|
|
25
|
-
const downloadMap = (0, download_map_1.makeDownloadMap)();
|
|
26
|
-
const renderId = 'abc';
|
|
27
|
-
await Promise.all(new Array(composition.durationInFrames).fill(true).map(async (_, i) => {
|
|
28
|
-
const frame = await pool.acquire();
|
|
29
|
-
// eslint-disable-next-line react/jsx-no-constructed-context-values
|
|
30
|
-
const value = {
|
|
31
|
-
audioAndVideoTags: { current: [] },
|
|
32
|
-
rootId: composition.id,
|
|
33
|
-
playing: false,
|
|
34
|
-
playbackRate: 1,
|
|
35
|
-
imperativePlaying: {
|
|
36
|
-
current: false,
|
|
37
|
-
},
|
|
38
|
-
frame: i,
|
|
39
|
-
setPlaybackRate: () => {
|
|
40
|
-
throw new Error('Not implemented');
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
const svg = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: 0, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: value, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: memo, children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
|
|
44
|
-
const out = path_1.default.join(downloadMap.compositingDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
45
|
-
frame: i,
|
|
46
|
-
imageFormat: 'tiff',
|
|
47
|
-
index: i,
|
|
48
|
-
countType: 'from-zero',
|
|
49
|
-
lastFrame: composition.durationInFrames - 1,
|
|
50
|
-
totalFrames: composition.durationInFrames,
|
|
51
|
-
}));
|
|
52
|
-
await (0, compose_1.compose)({
|
|
53
|
-
height: composition.height,
|
|
54
|
-
width: composition.width,
|
|
55
|
-
downloadMap,
|
|
56
|
-
imageFormat: 'AddToH264',
|
|
57
|
-
layers: [
|
|
58
|
-
{
|
|
59
|
-
type: 'SvgImage',
|
|
60
|
-
params: {
|
|
61
|
-
height: composition.height,
|
|
62
|
-
width: composition.width,
|
|
63
|
-
markup: svg,
|
|
64
|
-
x: 0,
|
|
65
|
-
y: 0,
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
output: out,
|
|
70
|
-
renderId,
|
|
71
|
-
compositorInitiatePayload: {
|
|
72
|
-
create_h264_queue: true,
|
|
73
|
-
duration_in_frames: 300,
|
|
74
|
-
fps: 30,
|
|
75
|
-
video_signals: {},
|
|
76
|
-
height: composition.height,
|
|
77
|
-
width: composition.width,
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
pool.release(frame);
|
|
81
|
-
}));
|
|
82
|
-
(0, compositor_1.releaseCompositorWithId)(renderId);
|
|
83
|
-
console.timeEnd('frames');
|
|
84
|
-
await (0, compositor_1.waitForCompositorWithIdToQuit)(renderId);
|
|
85
|
-
console.time('convert');
|
|
86
|
-
await (0, execa_1.default)('ffmpeg', ['-i', 'fade.h264', '-c', 'copy', 'fade.mp4', '-y']);
|
|
87
|
-
console.timeEnd('convert');
|
|
88
|
-
console.timeEnd('total');
|
|
89
|
-
};
|
|
90
|
-
exports.renderOnServer = renderOnServer;
|
package/dist/render-svg.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from 'react';
|
|
2
|
-
import type { TCompMetadata } from 'remotion';
|
|
3
|
-
export declare const renderSvg: ({ composition, Comp, frame, layer, }: {
|
|
4
|
-
composition: TCompMetadata;
|
|
5
|
-
Comp: ComponentType;
|
|
6
|
-
frame: number;
|
|
7
|
-
layer: number;
|
|
8
|
-
}) => string;
|
package/dist/render-svg.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.renderSvg = void 0;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const server_1 = require("react-dom/server");
|
|
6
|
-
const remotion_1 = require("remotion");
|
|
7
|
-
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
8
|
-
const make_timeline_context_value_1 = require("./make-timeline-context-value");
|
|
9
|
-
const renderSvg = ({ composition, Comp, frame, layer, }) => {
|
|
10
|
-
const svg = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: layer, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: (0, make_timeline_context_value_1.makeTimelineContextValue)(composition, frame), children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: (0, make_comp_manager_context_1.makeCompManagerContext)(composition), children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
|
|
11
|
-
return svg;
|
|
12
|
-
};
|
|
13
|
-
exports.renderSvg = renderSvg;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from 'react';
|
|
2
|
-
import type { TCompMetadata } from 'remotion';
|
|
3
|
-
import type { NativeVideoLayerInfo } from 'remotion/src/video/NativeVideoForRendering';
|
|
4
|
-
export declare const renderVideoLayer: ({ composition, Comp, frame, layer, }: {
|
|
5
|
-
composition: TCompMetadata;
|
|
6
|
-
Comp: ComponentType;
|
|
7
|
-
frame: number;
|
|
8
|
-
layer: number;
|
|
9
|
-
}) => NativeVideoLayerInfo | null;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.renderVideoLayer = void 0;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const server_1 = require("react-dom/server");
|
|
6
|
-
const remotion_1 = require("remotion");
|
|
7
|
-
const make_comp_manager_context_1 = require("./make-comp-manager-context");
|
|
8
|
-
const make_timeline_context_value_1 = require("./make-timeline-context-value");
|
|
9
|
-
const renderVideoLayer = ({ composition, Comp, frame, layer, }) => {
|
|
10
|
-
process.env.REMOTION_SERVER_RENDERING = 'true';
|
|
11
|
-
const markup = (0, server_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(remotion_1.Internals.SelectCompositionMode, { layer: layer, id: composition.id, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: (0, make_timeline_context_value_1.makeTimelineContextValue)(composition, frame), children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: (0, make_comp_manager_context_1.makeCompManagerContext)(composition), children: (0, jsx_runtime_1.jsx)(Comp, {}) }) }) }));
|
|
12
|
-
const matches = markup.matchAll(/<div>(.*?)<\/div>/g);
|
|
13
|
-
let parsed = null;
|
|
14
|
-
for (const match of matches) {
|
|
15
|
-
if (parsed) {
|
|
16
|
-
throw new Error('cannot have more than one video layer');
|
|
17
|
-
}
|
|
18
|
-
const json = JSON.parse(match[1]);
|
|
19
|
-
parsed = json;
|
|
20
|
-
}
|
|
21
|
-
return parsed;
|
|
22
|
-
};
|
|
23
|
-
exports.renderVideoLayer = renderVideoLayer;
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import type { SmallTCompMetadata, TAsset } from 'remotion';
|
|
3
|
-
import type { DownloadMap } from './assets/download-map';
|
|
4
|
-
import type { BrowserExecutable } from './browser-executable';
|
|
5
|
-
import type { BrowserLog } from './browser-log';
|
|
6
|
-
import type { Page } from './browser/BrowserPage';
|
|
7
|
-
import type { CompositorLayer } from './compositor/payloads';
|
|
8
|
-
import type { CountType } from './get-frame-padded-index';
|
|
9
|
-
import type { ServeUrl } from './legacy-webpack-config';
|
|
10
|
-
import type { ChromiumOptions } from './open-browser';
|
|
11
|
-
import type { Pool } from './pool';
|
|
12
|
-
import type { BrowserReplacer } from './replace-browser';
|
|
13
|
-
export declare const renderWebFrameAndRetryTargetClose: ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, outputDir, stopState, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, }: {
|
|
14
|
-
frame: number;
|
|
15
|
-
index: number;
|
|
16
|
-
retriesLeft: number;
|
|
17
|
-
attempt: number;
|
|
18
|
-
actualConcurrency: number;
|
|
19
|
-
browserReplacer: BrowserReplacer | null;
|
|
20
|
-
poolPromise: Promise<Pool<Page>>;
|
|
21
|
-
composition: SmallTCompMetadata;
|
|
22
|
-
downloadMap: DownloadMap;
|
|
23
|
-
imageFormat: 'png' | 'jpeg' | 'none';
|
|
24
|
-
onFrameBuffer: ((buffer: Buffer, frame: number) => void) | undefined;
|
|
25
|
-
outputDir: string | null;
|
|
26
|
-
stopState: {
|
|
27
|
-
isStopped: boolean;
|
|
28
|
-
};
|
|
29
|
-
countType: CountType;
|
|
30
|
-
scale: number;
|
|
31
|
-
quality: number | undefined;
|
|
32
|
-
framesToRender: number[];
|
|
33
|
-
lastFrame: number;
|
|
34
|
-
framesRendered: {
|
|
35
|
-
frames: number;
|
|
36
|
-
};
|
|
37
|
-
browserExecutable?: BrowserExecutable | undefined;
|
|
38
|
-
chromiumOptions?: ChromiumOptions | undefined;
|
|
39
|
-
dumpBrowserLogs?: boolean | undefined;
|
|
40
|
-
pagesArray: Page[];
|
|
41
|
-
onBrowserLog?: ((log: BrowserLog) => void) | undefined;
|
|
42
|
-
inputProps: unknown;
|
|
43
|
-
envVariables?: Record<string, string> | undefined;
|
|
44
|
-
muted: boolean;
|
|
45
|
-
proxyPort: number;
|
|
46
|
-
realFrameRange: [number, number];
|
|
47
|
-
serveUrl: ServeUrl;
|
|
48
|
-
timeoutInMilliseconds: number;
|
|
49
|
-
}) => Promise<{
|
|
50
|
-
layer: CompositorLayer | null;
|
|
51
|
-
buffer: Buffer | null;
|
|
52
|
-
assets: TAsset[];
|
|
53
|
-
}>;
|
|
54
|
-
export declare const makePage: ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }: {
|
|
55
|
-
browserReplacer: BrowserReplacer;
|
|
56
|
-
pagesArray: Page[];
|
|
57
|
-
composition: SmallTCompMetadata;
|
|
58
|
-
scale?: number | undefined;
|
|
59
|
-
onBrowserLog?: ((log: BrowserLog) => void) | undefined;
|
|
60
|
-
inputProps: unknown;
|
|
61
|
-
envVariables?: Record<string, string> | undefined;
|
|
62
|
-
serveUrl: ServeUrl;
|
|
63
|
-
realFrameRange: [number, number];
|
|
64
|
-
timeoutInMilliseconds: number | undefined;
|
|
65
|
-
proxyPort: number;
|
|
66
|
-
imageFormat: 'png' | 'jpeg' | 'none';
|
|
67
|
-
muted: boolean;
|
|
68
|
-
}) => Promise<Page>;
|
|
69
|
-
export declare const makeBrowser: ({ dumpBrowserLogs, browserExecutable, chromiumOptions, scale, }: {
|
|
70
|
-
dumpBrowserLogs?: boolean | undefined;
|
|
71
|
-
browserExecutable?: BrowserExecutable | undefined;
|
|
72
|
-
chromiumOptions?: ChromiumOptions | undefined;
|
|
73
|
-
scale?: number | undefined;
|
|
74
|
-
}) => Promise<import("./browser/Browser").Browser>;
|
package/dist/render-web-frame.js
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.makeBrowser = exports.makePage = exports.renderWebFrameAndRetryTargetClose = void 0;
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const browser_1 = require("./browser");
|
|
9
|
-
const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
|
|
10
|
-
const make_cancel_signal_1 = require("./make-cancel-signal");
|
|
11
|
-
const open_browser_1 = require("./open-browser");
|
|
12
|
-
const perf_1 = require("./perf");
|
|
13
|
-
const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
|
|
14
|
-
const seek_to_frame_1 = require("./seek-to-frame");
|
|
15
|
-
const set_props_and_env_1 = require("./set-props-and-env");
|
|
16
|
-
const take_frame_and_compose_1 = require("./take-frame-and-compose");
|
|
17
|
-
const renderFrameWithOptionToReject = async ({ frame, index, reject, width, height, poolPromise, stopState, imageFormat, downloadMap, scale, quality, }) => {
|
|
18
|
-
const pool = await poolPromise;
|
|
19
|
-
const freePage = await pool.acquire();
|
|
20
|
-
if (stopState.isStopped) {
|
|
21
|
-
reject(new Error('Render was stopped'));
|
|
22
|
-
throw new Error('stopped');
|
|
23
|
-
}
|
|
24
|
-
const errorCallbackOnFrame = (err) => {
|
|
25
|
-
reject(err);
|
|
26
|
-
};
|
|
27
|
-
const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
|
|
28
|
-
page: freePage,
|
|
29
|
-
onError: errorCallbackOnFrame,
|
|
30
|
-
frame,
|
|
31
|
-
});
|
|
32
|
-
freePage.on('error', errorCallbackOnFrame);
|
|
33
|
-
await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
|
|
34
|
-
const id = (0, perf_1.startPerfMeasure)('save');
|
|
35
|
-
const output = path_1.default.join(downloadMap.compositingDir, `preframe-${index}.${imageFormat}`);
|
|
36
|
-
const { buffer, collectedAssets, clipRegion } = await (0, take_frame_and_compose_1.takeFrame)({
|
|
37
|
-
frame,
|
|
38
|
-
freePage,
|
|
39
|
-
height,
|
|
40
|
-
imageFormat,
|
|
41
|
-
quality,
|
|
42
|
-
width,
|
|
43
|
-
});
|
|
44
|
-
const needsComposing = clipRegion === null
|
|
45
|
-
? null
|
|
46
|
-
: {
|
|
47
|
-
tmpFile: path_1.default.join(downloadMap.compositingDir, `${frame}.${imageFormat}`),
|
|
48
|
-
finalOutfie: output !== null && output !== void 0 ? output : path_1.default.join(downloadMap.compositingDir, `${frame}-final.${imageFormat}`),
|
|
49
|
-
clipRegion: clipRegion,
|
|
50
|
-
};
|
|
51
|
-
const compositionLayer = !needsComposing || needsComposing.clipRegion === 'hide'
|
|
52
|
-
? null
|
|
53
|
-
: {
|
|
54
|
-
type: imageFormat === 'jpeg'
|
|
55
|
-
? 'JpgImage'
|
|
56
|
-
: 'PngImage',
|
|
57
|
-
params: {
|
|
58
|
-
height: needsComposing.clipRegion.height * scale,
|
|
59
|
-
width: needsComposing.clipRegion.width * scale,
|
|
60
|
-
src: needsComposing.tmpFile,
|
|
61
|
-
x: needsComposing.clipRegion.x * scale,
|
|
62
|
-
y: needsComposing.clipRegion.y * scale,
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
// TODO: Always return buffer
|
|
66
|
-
(0, perf_1.stopPerfMeasure)(id);
|
|
67
|
-
cleanupPageError();
|
|
68
|
-
freePage.off('error', errorCallbackOnFrame);
|
|
69
|
-
pool.release(freePage);
|
|
70
|
-
return { layer: compositionLayer, buffer, assets: collectedAssets };
|
|
71
|
-
};
|
|
72
|
-
const renderWebFrame = ({ frame, index, downloadMap, imageFormat, poolPromise, stopState, composition, scale, quality, }) => {
|
|
73
|
-
return new Promise((resolve, reject) => {
|
|
74
|
-
renderFrameWithOptionToReject({
|
|
75
|
-
frame,
|
|
76
|
-
index,
|
|
77
|
-
reject,
|
|
78
|
-
width: composition.width,
|
|
79
|
-
height: composition.height,
|
|
80
|
-
downloadMap,
|
|
81
|
-
imageFormat,
|
|
82
|
-
poolPromise,
|
|
83
|
-
stopState,
|
|
84
|
-
scale,
|
|
85
|
-
quality,
|
|
86
|
-
})
|
|
87
|
-
.then((res) => {
|
|
88
|
-
resolve(res);
|
|
89
|
-
})
|
|
90
|
-
.catch((err) => {
|
|
91
|
-
reject(err);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
};
|
|
95
|
-
const renderWebFrameAndRetryTargetClose = async ({ frame, index, retriesLeft, attempt, actualConcurrency, browserReplacer, poolPromise, composition, downloadMap, imageFormat, onFrameBuffer, outputDir, stopState, countType, scale, quality, framesToRender, lastFrame, framesRendered, browserExecutable, chromiumOptions, dumpBrowserLogs, pagesArray, onBrowserLog, inputProps, envVariables, muted, proxyPort, realFrameRange, serveUrl, timeoutInMilliseconds, }) => {
|
|
96
|
-
var _a, _b;
|
|
97
|
-
try {
|
|
98
|
-
const returnval = await renderWebFrame({
|
|
99
|
-
frame,
|
|
100
|
-
index,
|
|
101
|
-
poolPromise,
|
|
102
|
-
composition,
|
|
103
|
-
downloadMap,
|
|
104
|
-
imageFormat,
|
|
105
|
-
stopState,
|
|
106
|
-
scale,
|
|
107
|
-
quality,
|
|
108
|
-
});
|
|
109
|
-
return returnval;
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
if (!((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) &&
|
|
113
|
-
!((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Session closed'))) {
|
|
114
|
-
throw err;
|
|
115
|
-
}
|
|
116
|
-
if ((0, make_cancel_signal_1.isUserCancelledRender)(err)) {
|
|
117
|
-
throw err;
|
|
118
|
-
}
|
|
119
|
-
if (retriesLeft === 0) {
|
|
120
|
-
console.warn(err, `The browser crashed ${attempt} times while rendering frame ${frame}. Not retrying anymore. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
|
|
121
|
-
throw err;
|
|
122
|
-
}
|
|
123
|
-
console.warn(`The browser crashed while rendering frame ${frame}, retrying ${retriesLeft} more times. Learn more about this error under https://www.remotion.dev/docs/target-closed`);
|
|
124
|
-
if (!browserReplacer) {
|
|
125
|
-
throw new Error('Did not have browser replacer for web frame');
|
|
126
|
-
}
|
|
127
|
-
await browserReplacer.replaceBrowser(() => (0, exports.makeBrowser)({
|
|
128
|
-
browserExecutable,
|
|
129
|
-
chromiumOptions,
|
|
130
|
-
dumpBrowserLogs,
|
|
131
|
-
scale,
|
|
132
|
-
}), async () => {
|
|
133
|
-
const pages = new Array(actualConcurrency).fill(true).map(() => (0, exports.makePage)({
|
|
134
|
-
browserReplacer,
|
|
135
|
-
composition,
|
|
136
|
-
pagesArray,
|
|
137
|
-
onBrowserLog,
|
|
138
|
-
scale,
|
|
139
|
-
inputProps,
|
|
140
|
-
envVariables,
|
|
141
|
-
imageFormat,
|
|
142
|
-
muted,
|
|
143
|
-
proxyPort,
|
|
144
|
-
realFrameRange,
|
|
145
|
-
serveUrl,
|
|
146
|
-
timeoutInMilliseconds,
|
|
147
|
-
}));
|
|
148
|
-
const puppeteerPages = await Promise.all(pages);
|
|
149
|
-
const pool = await poolPromise;
|
|
150
|
-
for (const newPage of puppeteerPages) {
|
|
151
|
-
pool.release(newPage);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
const fram = await (0, exports.renderWebFrameAndRetryTargetClose)({
|
|
155
|
-
frame,
|
|
156
|
-
index,
|
|
157
|
-
retriesLeft: retriesLeft - 1,
|
|
158
|
-
attempt: attempt + 1,
|
|
159
|
-
actualConcurrency,
|
|
160
|
-
browserReplacer,
|
|
161
|
-
composition,
|
|
162
|
-
downloadMap,
|
|
163
|
-
imageFormat,
|
|
164
|
-
onFrameBuffer,
|
|
165
|
-
outputDir,
|
|
166
|
-
poolPromise,
|
|
167
|
-
stopState,
|
|
168
|
-
countType,
|
|
169
|
-
scale,
|
|
170
|
-
quality,
|
|
171
|
-
framesToRender,
|
|
172
|
-
lastFrame,
|
|
173
|
-
framesRendered,
|
|
174
|
-
inputProps,
|
|
175
|
-
pagesArray,
|
|
176
|
-
browserExecutable,
|
|
177
|
-
chromiumOptions,
|
|
178
|
-
dumpBrowserLogs,
|
|
179
|
-
envVariables,
|
|
180
|
-
muted,
|
|
181
|
-
onBrowserLog,
|
|
182
|
-
proxyPort,
|
|
183
|
-
realFrameRange,
|
|
184
|
-
serveUrl,
|
|
185
|
-
timeoutInMilliseconds,
|
|
186
|
-
});
|
|
187
|
-
return fram;
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
exports.renderWebFrameAndRetryTargetClose = renderWebFrameAndRetryTargetClose;
|
|
191
|
-
const makePage = async ({ browserReplacer, pagesArray, composition, scale, onBrowserLog, inputProps, envVariables, serveUrl, realFrameRange, timeoutInMilliseconds, proxyPort, imageFormat, muted, }) => {
|
|
192
|
-
if (!browserReplacer) {
|
|
193
|
-
throw new Error('canonot make page without browser replacer');
|
|
194
|
-
}
|
|
195
|
-
const page = await browserReplacer.getBrowser().newPage();
|
|
196
|
-
pagesArray.push(page);
|
|
197
|
-
await page.setViewport({
|
|
198
|
-
width: composition.width,
|
|
199
|
-
height: composition.height,
|
|
200
|
-
deviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
|
|
201
|
-
});
|
|
202
|
-
const logCallback = (log) => {
|
|
203
|
-
onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
|
|
204
|
-
stackTrace: log.stackTrace(),
|
|
205
|
-
text: log.text,
|
|
206
|
-
type: log.type,
|
|
207
|
-
});
|
|
208
|
-
};
|
|
209
|
-
if (onBrowserLog) {
|
|
210
|
-
page.on('console', logCallback);
|
|
211
|
-
}
|
|
212
|
-
const initialFrame = realFrameRange[0];
|
|
213
|
-
await (0, set_props_and_env_1.setPropsAndEnv)({
|
|
214
|
-
inputProps,
|
|
215
|
-
envVariables,
|
|
216
|
-
page,
|
|
217
|
-
serveUrl,
|
|
218
|
-
initialFrame,
|
|
219
|
-
timeoutInMilliseconds,
|
|
220
|
-
proxyPort,
|
|
221
|
-
retriesRemaining: 2,
|
|
222
|
-
audioEnabled: !muted,
|
|
223
|
-
videoEnabled: imageFormat !== 'none',
|
|
224
|
-
});
|
|
225
|
-
await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
|
|
226
|
-
// eslint-disable-next-line max-params
|
|
227
|
-
pageFunction: (id, defaultProps, durationInFrames, fps, height, width) => {
|
|
228
|
-
window.setBundleMode({
|
|
229
|
-
type: 'composition',
|
|
230
|
-
compositionName: id,
|
|
231
|
-
compositionDefaultProps: defaultProps,
|
|
232
|
-
compositionDurationInFrames: durationInFrames,
|
|
233
|
-
compositionFps: fps,
|
|
234
|
-
compositionHeight: height,
|
|
235
|
-
compositionWidth: width,
|
|
236
|
-
});
|
|
237
|
-
},
|
|
238
|
-
args: [
|
|
239
|
-
composition.id,
|
|
240
|
-
composition.defaultProps,
|
|
241
|
-
composition.durationInFrames,
|
|
242
|
-
composition.fps,
|
|
243
|
-
composition.height,
|
|
244
|
-
composition.width,
|
|
245
|
-
],
|
|
246
|
-
frame: null,
|
|
247
|
-
page,
|
|
248
|
-
});
|
|
249
|
-
page.off('console', logCallback);
|
|
250
|
-
return page;
|
|
251
|
-
};
|
|
252
|
-
exports.makePage = makePage;
|
|
253
|
-
const makeBrowser = ({ dumpBrowserLogs, browserExecutable, chromiumOptions, scale, }) => (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
|
|
254
|
-
shouldDumpIo: dumpBrowserLogs,
|
|
255
|
-
browserExecutable,
|
|
256
|
-
chromiumOptions,
|
|
257
|
-
forceDeviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
|
|
258
|
-
});
|
|
259
|
-
exports.makeBrowser = makeBrowser;
|