@remotion/renderer 4.0.0-fastlambda.8 → 4.0.0-lambda.3
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/cleanup-assets.d.ts +2 -0
- package/dist/assets/cleanup-assets.js +2 -0
- package/dist/assets/download-and-map-assets-to-file.d.ts +6 -0
- package/dist/assets/download-and-map-assets-to-file.js +46 -19
- package/dist/assets/ffmpeg-volume-expression.d.ts +2 -1
- package/dist/assets/ffmpeg-volume-expression.js +15 -12
- package/dist/assets/get-audio-channels.d.ts +5 -2
- package/dist/assets/get-audio-channels.js +15 -4
- package/dist/browser/Accessibility.d.ts +175 -0
- package/dist/browser/Accessibility.js +423 -0
- package/dist/browser/AriaQueryHandler.d.ts +20 -0
- package/dist/browser/AriaQueryHandler.js +108 -0
- package/dist/browser/Browser.d.ts +209 -0
- package/dist/browser/Browser.js +402 -0
- package/dist/browser/BrowserConnector.d.ts +26 -0
- package/dist/browser/BrowserConnector.js +49 -0
- package/dist/browser/BrowserFetcher.d.ts +89 -0
- package/dist/browser/BrowserFetcher.js +512 -0
- package/dist/browser/BrowserRunner.d.ts +39 -0
- package/dist/browser/BrowserRunner.js +308 -0
- package/dist/browser/Connection.d.ts +49 -0
- package/dist/browser/Connection.js +262 -0
- package/dist/browser/ConnectionTransport.d.ts +21 -0
- package/dist/browser/ConnectionTransport.js +17 -0
- package/dist/browser/ConsoleMessage.d.ts +55 -0
- package/dist/browser/ConsoleMessage.js +75 -0
- package/dist/browser/Coverage.d.ts +180 -0
- package/dist/browser/Coverage.js +371 -0
- package/dist/browser/DOMWorld.d.ts +50 -0
- package/dist/browser/DOMWorld.js +280 -0
- package/dist/browser/Debug.d.ts +19 -0
- package/dist/browser/Debug.js +42 -0
- package/dist/browser/DeviceDescriptors.d.ts +40 -0
- package/dist/browser/DeviceDescriptors.js +1407 -0
- package/dist/browser/EmulationManager.d.ts +7 -0
- package/dist/browser/EmulationManager.js +40 -0
- package/dist/browser/Errors.d.ts +25 -0
- package/dist/browser/Errors.js +35 -0
- package/dist/browser/EvalTypes.d.ts +27 -0
- package/dist/browser/EvalTypes.js +17 -0
- package/dist/browser/EventEmitter.d.ts +70 -0
- package/dist/browser/EventEmitter.js +102 -0
- package/dist/browser/ExecutionContext.d.ts +35 -0
- package/dist/browser/ExecutionContext.js +190 -0
- package/dist/browser/FileChooser.d.ts +56 -0
- package/dist/browser/FileChooser.js +86 -0
- package/dist/browser/FrameManager.d.ts +96 -0
- package/dist/browser/FrameManager.js +512 -0
- package/dist/browser/HTTPRequest.d.ts +42 -0
- package/dist/browser/HTTPRequest.js +82 -0
- package/dist/browser/HTTPResponse.d.ts +100 -0
- package/dist/browser/HTTPResponse.js +196 -0
- package/dist/browser/Input.d.ts +355 -0
- package/dist/browser/Input.js +592 -0
- package/dist/browser/JSHandle.d.ts +36 -0
- package/dist/browser/JSHandle.js +93 -0
- package/dist/browser/LaunchOptions.d.ts +117 -0
- package/dist/browser/LaunchOptions.js +17 -0
- package/dist/browser/Launcher.d.ts +9 -0
- package/dist/browser/Launcher.js +602 -0
- package/dist/browser/LifecycleWatcher.d.ts +29 -0
- package/dist/browser/LifecycleWatcher.js +193 -0
- package/dist/browser/NetworkConditions.d.ts +26 -0
- package/dist/browser/NetworkConditions.js +33 -0
- package/dist/browser/NetworkEventManager.d.ts +35 -0
- package/dist/browser/NetworkEventManager.js +128 -0
- package/dist/browser/NetworkManager.d.ts +36 -0
- package/dist/browser/NetworkManager.js +284 -0
- package/dist/browser/NodeWebSocketTransport.d.ts +11 -0
- package/dist/browser/NodeWebSocketTransport.js +90 -0
- package/dist/browser/PDFOptions.d.ts +165 -0
- package/dist/browser/PDFOptions.js +34 -0
- package/dist/browser/PipeTransport.d.ts +10 -0
- package/dist/browser/PipeTransport.js +86 -0
- package/dist/browser/Product.d.ts +16 -0
- package/dist/browser/Product.js +17 -0
- package/dist/browser/Puppeteer.d.ts +35 -0
- package/dist/browser/Puppeteer.js +17 -0
- package/dist/browser/PuppeteerNode.d.ts +92 -0
- package/dist/browser/PuppeteerNode.js +143 -0
- package/dist/browser/PuppeteerViewport.d.ts +5 -0
- package/dist/browser/PuppeteerViewport.js +2 -0
- package/dist/browser/QueryHandler.d.ts +64 -0
- package/dist/browser/QueryHandler.js +183 -0
- package/dist/browser/ScreenshotOptions.d.ts +14 -0
- package/dist/browser/ScreenshotOptions.js +2 -0
- package/dist/browser/SecurityDetails.d.ts +55 -0
- package/dist/browser/SecurityDetails.js +95 -0
- package/dist/browser/Target.d.ts +61 -0
- package/dist/browser/Target.js +146 -0
- package/dist/browser/TaskQueue.d.ts +20 -0
- package/dist/browser/TaskQueue.js +47 -0
- package/dist/browser/TimeoutSettings.d.ts +23 -0
- package/dist/browser/TimeoutSettings.js +62 -0
- package/dist/browser/Tracing.d.ts +45 -0
- package/dist/browser/Tracing.js +136 -0
- package/dist/browser/USKeyboardLayout.d.ts +39 -0
- package/dist/browser/USKeyboardLayout.js +406 -0
- package/dist/browser/WebWorker.d.ts +96 -0
- package/dist/browser/WebWorker.js +122 -0
- package/dist/browser/assert.d.ts +21 -0
- package/dist/browser/assert.js +29 -0
- package/dist/browser/compat.d.ts +2 -0
- package/dist/browser/compat.js +17 -0
- package/dist/browser/create-browser-fetcher.d.ts +17 -0
- package/dist/browser/create-browser-fetcher.js +140 -0
- package/dist/browser/dialog.d.ts +70 -0
- package/dist/browser/dialog.js +114 -0
- package/dist/browser/environment.d.ts +16 -0
- package/dist/browser/environment.js +19 -0
- package/dist/browser/fetch.d.ts +16 -0
- package/dist/browser/fetch.js +46 -0
- package/dist/browser/find-up.d.ts +4 -0
- package/dist/browser/find-up.js +85 -0
- package/dist/browser/get-download-destination.d.ts +1 -0
- package/dist/browser/get-download-destination.js +38 -0
- package/dist/browser/mitt/index.d.ts +22 -0
- package/dist/browser/mitt/index.js +49 -0
- package/dist/browser/node.d.ts +2 -0
- package/dist/browser/node.js +9 -0
- package/dist/browser/page.d.ts +78 -0
- package/dist/browser/page.js +277 -0
- package/dist/browser/pkg-dir.d.ts +3 -0
- package/dist/browser/pkg-dir.js +13 -0
- package/dist/browser/revisions.d.ts +21 -0
- package/dist/browser/revisions.js +22 -0
- package/dist/browser/util.d.ts +46 -0
- package/dist/browser/util.js +161 -0
- package/dist/calculate-ffmpeg-filters.js +2 -2
- package/dist/combine-videos.d.ts +2 -1
- package/dist/combine-videos.js +8 -1
- package/dist/cycle-browser-tabs.d.ts +2 -1
- package/dist/cycle-browser-tabs.js +9 -2
- package/dist/ensure-presentation-timestamp.d.ts +1 -0
- package/dist/ensure-presentation-timestamp.js +57 -0
- package/dist/extract-frame-from-video.d.ts +11 -0
- package/dist/extract-frame-from-video.js +197 -0
- package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
- package/dist/frame-to-ffmpeg-timestamp.js +8 -0
- package/dist/get-compositions.d.ts +5 -2
- package/dist/get-compositions.js +23 -5
- package/dist/get-duration-of-asset.d.ts +7 -0
- package/dist/get-duration-of-asset.js +36 -0
- package/dist/get-port.js +26 -24
- package/dist/index.d.ts +33 -9
- package/dist/index.js +14 -5
- package/dist/is-beyond-last-frame.d.ts +2 -0
- package/dist/is-beyond-last-frame.js +12 -0
- package/dist/last-frame-from-video-cache.d.ts +10 -0
- package/dist/last-frame-from-video-cache.js +50 -0
- package/dist/make-assets-download-dir.js +6 -1
- package/dist/make-cancel-signal.d.ts +7 -0
- package/dist/make-cancel-signal.js +25 -0
- package/dist/merge-audio-track.js +2 -2
- package/dist/offthread-video-server.d.ts +14 -0
- package/dist/offthread-video-server.js +67 -0
- package/dist/open-browser.d.ts +6 -6
- package/dist/open-browser.js +24 -20
- package/dist/prepare-server.d.ts +13 -2
- package/dist/prepare-server.js +35 -5
- package/dist/preprocess-audio-track.d.ts +1 -0
- package/dist/preprocess-audio-track.js +2 -2
- package/dist/prespawn-ffmpeg.d.ts +2 -0
- package/dist/prespawn-ffmpeg.js +10 -9
- package/dist/provide-screenshot.js +1 -1
- package/dist/puppeteer-screenshot.js +5 -1
- package/dist/render-frames.d.ts +6 -1
- package/dist/render-frames.js +96 -37
- package/dist/render-media.d.ts +12 -2
- package/dist/render-media.js +127 -54
- package/dist/render-still.d.ts +14 -4
- package/dist/render-still.js +58 -19
- package/dist/serve-handler/glob-slash.d.ts +1 -0
- package/dist/serve-handler/glob-slash.js +12 -0
- package/dist/serve-handler/index.d.ts +4 -0
- package/dist/serve-handler/index.js +205 -0
- package/dist/serve-handler/is-path-inside.d.ts +1 -0
- package/dist/serve-handler/is-path-inside.js +27 -0
- package/dist/serve-handler/range-parser.d.ts +13 -0
- package/dist/serve-handler/range-parser.js +57 -0
- package/dist/serve-static.d.ts +10 -3
- package/dist/serve-static.js +22 -4
- package/dist/set-props-and-env.d.ts +3 -1
- package/dist/set-props-and-env.js +28 -6
- package/dist/stitch-frames-to-video.d.ts +4 -1
- package/dist/stitch-frames-to-video.js +36 -15
- package/dist/stringify-ffmpeg-filter.js +3 -0
- package/dist/tmp-dir.js +5 -1
- package/dist/validate-fps-for-gif.d.ts +2 -0
- package/dist/validate-fps-for-gif.js +9 -0
- package/package.json +6 -7
package/dist/get-compositions.js
CHANGED
|
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getCompositions = void 0;
|
|
4
4
|
const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
|
|
5
5
|
const get_browser_instance_1 = require("./get-browser-instance");
|
|
6
|
+
const make_assets_download_dir_1 = require("./make-assets-download-dir");
|
|
6
7
|
const prepare_server_1 = require("./prepare-server");
|
|
7
8
|
const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
|
|
8
9
|
const set_props_and_env_1 = require("./set-props-and-env");
|
|
9
10
|
const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
|
|
10
|
-
const innerGetCompositions = async (serveUrl, page, config) => {
|
|
11
|
+
const innerGetCompositions = async (serveUrl, page, config, proxyPort) => {
|
|
11
12
|
if (config === null || config === void 0 ? void 0 : config.onBrowserLog) {
|
|
12
13
|
page.on('console', (log) => {
|
|
13
14
|
var _a;
|
|
@@ -26,6 +27,8 @@ const innerGetCompositions = async (serveUrl, page, config) => {
|
|
|
26
27
|
serveUrl,
|
|
27
28
|
initialFrame: 0,
|
|
28
29
|
timeoutInMilliseconds: config === null || config === void 0 ? void 0 : config.timeoutInMilliseconds,
|
|
30
|
+
proxyPort,
|
|
31
|
+
retriesRemaining: 2,
|
|
29
32
|
});
|
|
30
33
|
await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
|
|
31
34
|
page,
|
|
@@ -50,26 +53,41 @@ const innerGetCompositions = async (serveUrl, page, config) => {
|
|
|
50
53
|
};
|
|
51
54
|
const getCompositions = async (serveUrlOrWebpackUrl, config) => {
|
|
52
55
|
var _a, _b;
|
|
53
|
-
const
|
|
56
|
+
const downloadDir = (0, make_assets_download_dir_1.makeAssetsDownloadTmpDir)();
|
|
54
57
|
const { page, cleanup } = await (0, get_browser_instance_1.getPageAndCleanupFn)({
|
|
55
58
|
passedInInstance: config === null || config === void 0 ? void 0 : config.puppeteerInstance,
|
|
56
59
|
browserExecutable: (_a = config === null || config === void 0 ? void 0 : config.browserExecutable) !== null && _a !== void 0 ? _a : null,
|
|
57
60
|
chromiumOptions: (_b = config === null || config === void 0 ? void 0 : config.chromiumOptions) !== null && _b !== void 0 ? _b : {},
|
|
58
61
|
});
|
|
59
62
|
return new Promise((resolve, reject) => {
|
|
63
|
+
var _a, _b, _c;
|
|
64
|
+
const onError = (err) => reject(err);
|
|
60
65
|
const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
|
|
61
66
|
page,
|
|
62
67
|
frame: null,
|
|
63
|
-
onError
|
|
68
|
+
onError,
|
|
64
69
|
});
|
|
65
|
-
|
|
70
|
+
let close = null;
|
|
71
|
+
(0, prepare_server_1.prepareServer)({
|
|
72
|
+
webpackConfigOrServeUrl: serveUrlOrWebpackUrl,
|
|
73
|
+
downloadDir,
|
|
74
|
+
onDownload: () => undefined,
|
|
75
|
+
onError,
|
|
76
|
+
ffmpegExecutable: (_a = config === null || config === void 0 ? void 0 : config.ffmpegExecutable) !== null && _a !== void 0 ? _a : null,
|
|
77
|
+
ffprobeExecutable: (_b = config === null || config === void 0 ? void 0 : config.ffprobeExecutable) !== null && _b !== void 0 ? _b : null,
|
|
78
|
+
port: (_c = config === null || config === void 0 ? void 0 : config.port) !== null && _c !== void 0 ? _c : null,
|
|
79
|
+
})
|
|
80
|
+
.then(({ serveUrl, closeServer, offthreadPort }) => {
|
|
81
|
+
close = closeServer;
|
|
82
|
+
return innerGetCompositions(serveUrl, page, config !== null && config !== void 0 ? config : {}, offthreadPort);
|
|
83
|
+
})
|
|
66
84
|
.then((comp) => resolve(comp))
|
|
67
85
|
.catch((err) => {
|
|
68
86
|
reject(err);
|
|
69
87
|
})
|
|
70
88
|
.finally(() => {
|
|
71
89
|
cleanup();
|
|
72
|
-
|
|
90
|
+
close === null || close === void 0 ? void 0 : close();
|
|
73
91
|
cleanupPageError();
|
|
74
92
|
});
|
|
75
93
|
});
|
|
@@ -0,0 +1,36 @@
|
|
|
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.getDurationOfAsset = void 0;
|
|
7
|
+
const execa_1 = __importDefault(require("execa"));
|
|
8
|
+
const p_limit_1 = require("./p-limit");
|
|
9
|
+
const durationOfAssetCache = {};
|
|
10
|
+
const limit = (0, p_limit_1.pLimit)(1);
|
|
11
|
+
const getDurationOfAssetUnlimited = async ({ ffprobeExecutable, src, }) => {
|
|
12
|
+
if (durationOfAssetCache[src]) {
|
|
13
|
+
return durationOfAssetCache[src];
|
|
14
|
+
}
|
|
15
|
+
const durationCmd = await (0, execa_1.default)(ffprobeExecutable !== null && ffprobeExecutable !== void 0 ? ffprobeExecutable : 'ffprobe', [
|
|
16
|
+
'-v',
|
|
17
|
+
'error',
|
|
18
|
+
'-select_streams',
|
|
19
|
+
'v:0',
|
|
20
|
+
'-show_entries',
|
|
21
|
+
'stream=duration',
|
|
22
|
+
'-of',
|
|
23
|
+
'default=noprint_wrappers=1:nokey=1',
|
|
24
|
+
src,
|
|
25
|
+
]);
|
|
26
|
+
const duration = parseFloat(durationCmd.stdout);
|
|
27
|
+
if (Number.isNaN(duration)) {
|
|
28
|
+
throw new TypeError(`Could not get duration of ${src}: ${durationCmd.stdout}`);
|
|
29
|
+
}
|
|
30
|
+
durationOfAssetCache[src] = duration;
|
|
31
|
+
return duration;
|
|
32
|
+
};
|
|
33
|
+
const getDurationOfAsset = (options) => {
|
|
34
|
+
return limit(getDurationOfAssetUnlimited, options);
|
|
35
|
+
};
|
|
36
|
+
exports.getDurationOfAsset = getDurationOfAsset;
|
package/dist/get-port.js
CHANGED
|
@@ -5,16 +5,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getDesiredPort = void 0;
|
|
7
7
|
const net_1 = __importDefault(require("net"));
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
});
|
|
8
|
+
const p_limit_1 = require("./p-limit");
|
|
9
|
+
const getAvailablePort = (portToTry) => new Promise((resolve) => {
|
|
10
|
+
let status = 'unavailable';
|
|
11
|
+
const host = '127.0.0.1';
|
|
12
|
+
const socket = new net_1.default.Socket();
|
|
13
|
+
socket.on('connect', () => {
|
|
14
|
+
status = 'unavailable';
|
|
15
|
+
socket.destroy();
|
|
17
16
|
});
|
|
17
|
+
socket.setTimeout(1000);
|
|
18
|
+
socket.on('timeout', () => {
|
|
19
|
+
status = 'unavailable';
|
|
20
|
+
socket.destroy();
|
|
21
|
+
resolve(status);
|
|
22
|
+
});
|
|
23
|
+
socket.on('error', () => {
|
|
24
|
+
status = 'available';
|
|
25
|
+
});
|
|
26
|
+
socket.on('close', () => resolve(status));
|
|
27
|
+
socket.connect(portToTry, host);
|
|
18
28
|
});
|
|
19
29
|
const portCheckSequence = function* (ports) {
|
|
20
30
|
if (ports) {
|
|
@@ -22,30 +32,18 @@ const portCheckSequence = function* (ports) {
|
|
|
22
32
|
}
|
|
23
33
|
yield 0; // Fall back to 0 if anything else failed
|
|
24
34
|
};
|
|
25
|
-
const isPortAvailable = async (port) => {
|
|
26
|
-
try {
|
|
27
|
-
await getAvailablePort(port);
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
if (!['EADDRINUSE', 'EACCES'].includes(error.code)) {
|
|
32
|
-
throw error;
|
|
33
|
-
}
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
35
|
const getPort = async (from, to) => {
|
|
38
36
|
const ports = makeRange(from, to);
|
|
39
37
|
for (const port of portCheckSequence(ports)) {
|
|
40
|
-
if (await
|
|
38
|
+
if ((await getAvailablePort(port)) === 'available') {
|
|
41
39
|
return port;
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
throw new Error('No available ports found');
|
|
45
43
|
};
|
|
46
|
-
const
|
|
44
|
+
const getDesiredPortUnlimited = async (desiredPort, from, to) => {
|
|
47
45
|
if (typeof desiredPort !== 'undefined' &&
|
|
48
|
-
(await
|
|
46
|
+
(await getAvailablePort(desiredPort)) === 'available') {
|
|
49
47
|
return desiredPort;
|
|
50
48
|
}
|
|
51
49
|
const actualPort = await getPort(from, to);
|
|
@@ -55,6 +53,10 @@ const getDesiredPort = async (desiredPort, from, to) => {
|
|
|
55
53
|
}
|
|
56
54
|
return actualPort;
|
|
57
55
|
};
|
|
56
|
+
const limit = (0, p_limit_1.pLimit)(1);
|
|
57
|
+
const getDesiredPort = (desiredPort, from, to) => {
|
|
58
|
+
return limit(() => getDesiredPortUnlimited(desiredPort, from, to));
|
|
59
|
+
};
|
|
58
60
|
exports.getDesiredPort = getDesiredPort;
|
|
59
61
|
const makeRange = (from, to) => {
|
|
60
62
|
if (!Number.isInteger(from) || !Number.isInteger(to)) {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import execa from 'execa';
|
|
2
|
+
import mime from 'mime-types';
|
|
1
3
|
import { SymbolicateableError } from './error-handling/symbolicateable-error';
|
|
2
4
|
export type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
3
5
|
export { BrowserLog } from './browser-log';
|
|
@@ -5,6 +7,7 @@ export { combineVideos } from './combine-videos';
|
|
|
5
7
|
export { ErrorWithStackFrame } from './error-handling/handle-javascript-exception';
|
|
6
8
|
export { FfmpegVersion } from './ffmpeg-flags';
|
|
7
9
|
export { getCompositions } from './get-compositions';
|
|
10
|
+
export { CancelSignal, makeCancelSignal } from './make-cancel-signal';
|
|
8
11
|
export { openBrowser } from './open-browser';
|
|
9
12
|
export type { ChromiumOptions } from './open-browser';
|
|
10
13
|
export { renderFrames } from './render-frames';
|
|
@@ -29,9 +32,14 @@ export declare const RenderInternals: {
|
|
|
29
32
|
getFfmpegBuildInfo: (options: {
|
|
30
33
|
ffmpegExecutable: string | null;
|
|
31
34
|
}) => Promise<string>;
|
|
32
|
-
serveStatic: (path: string, options
|
|
33
|
-
port
|
|
34
|
-
|
|
35
|
+
serveStatic: (path: string | null, options: {
|
|
36
|
+
port: number | null;
|
|
37
|
+
ffmpegExecutable: import("remotion").FfmpegExecutable;
|
|
38
|
+
ffprobeExecutable: import("remotion").FfmpegExecutable;
|
|
39
|
+
downloadDir: string;
|
|
40
|
+
onDownload: import("./assets/download-and-map-assets-to-file").RenderMediaOnDownload;
|
|
41
|
+
onError: (err: Error) => void;
|
|
42
|
+
}) => Promise<{
|
|
35
43
|
port: number;
|
|
36
44
|
close: () => Promise<void>;
|
|
37
45
|
}>;
|
|
@@ -43,17 +51,12 @@ export declare const RenderInternals: {
|
|
|
43
51
|
}) => void;
|
|
44
52
|
normalizeServeUrl: (unnormalized: string) => string;
|
|
45
53
|
spawnFfmpeg: (options: import("./stitch-frames-to-video").StitcherOptions) => Promise<{
|
|
46
|
-
task: Promise<
|
|
54
|
+
task: Promise<void>;
|
|
47
55
|
getLogs: () => string;
|
|
48
56
|
}>;
|
|
49
57
|
getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv", type: "chunk" | "final") => "mp3" | "aac" | "wav" | "mp4" | "mkv" | "mov" | "webm";
|
|
50
|
-
makeAssetsDownloadTmpDir: () => string;
|
|
51
58
|
tmpDir: (str: string) => string;
|
|
52
59
|
deleteDirectory: (directory: string) => Promise<void>;
|
|
53
|
-
prepareServer: (webpackConfigOrServeUrl: string) => Promise<{
|
|
54
|
-
serveUrl: string;
|
|
55
|
-
closeServer: () => Promise<void>;
|
|
56
|
-
}>;
|
|
57
60
|
isServeUrl: (potentialUrl: string) => boolean;
|
|
58
61
|
ensureOutputDirectory: (outputLocation: string) => void;
|
|
59
62
|
getRealFrameRange: (durationInFrames: number, frameRange: import("remotion").FrameRange | null) => [number, number];
|
|
@@ -72,4 +75,25 @@ export declare const RenderInternals: {
|
|
|
72
75
|
SymbolicateableError: typeof SymbolicateableError;
|
|
73
76
|
getDurationFromFrameRange: (frameRange: import("remotion").FrameRange | null, durationInFrames: number) => number;
|
|
74
77
|
getExtensionOfFilename: (filename: string) => string | null;
|
|
78
|
+
getDesiredPort: (desiredPort: number | undefined, from: number, to: number) => Promise<number>;
|
|
79
|
+
mime: typeof mime;
|
|
80
|
+
isPathInside: (thePath: string, potentialParent: string) => boolean;
|
|
81
|
+
execa: {
|
|
82
|
+
(file: string, arguments?: readonly string[] | undefined, options?: execa.Options<string> | undefined): execa.ExecaChildProcess<string>;
|
|
83
|
+
(file: string, arguments?: readonly string[] | undefined, options?: execa.Options<null> | undefined): execa.ExecaChildProcess<Buffer>;
|
|
84
|
+
(file: string, options?: execa.Options<string> | undefined): execa.ExecaChildProcess<string>;
|
|
85
|
+
(file: string, options?: execa.Options<null> | undefined): execa.ExecaChildProcess<Buffer>;
|
|
86
|
+
sync(file: string, arguments?: readonly string[] | undefined, options?: execa.SyncOptions<string> | undefined): execa.ExecaSyncReturnValue<string>;
|
|
87
|
+
sync(file: string, arguments?: readonly string[] | undefined, options?: execa.SyncOptions<null> | undefined): execa.ExecaSyncReturnValue<Buffer>;
|
|
88
|
+
sync(file: string, options?: execa.SyncOptions<string> | undefined): execa.ExecaSyncReturnValue<string>;
|
|
89
|
+
sync(file: string, options?: execa.SyncOptions<null> | undefined): execa.ExecaSyncReturnValue<Buffer>;
|
|
90
|
+
command(command: string, options?: execa.Options<string> | undefined): execa.ExecaChildProcess<string>;
|
|
91
|
+
command(command: string, options?: execa.Options<null> | undefined): execa.ExecaChildProcess<Buffer>;
|
|
92
|
+
commandSync(command: string, options?: execa.SyncOptions<string> | undefined): execa.ExecaSyncReturnValue<string>;
|
|
93
|
+
commandSync(command: string, options?: execa.SyncOptions<null> | undefined): execa.ExecaSyncReturnValue<Buffer>;
|
|
94
|
+
node(scriptPath: string, arguments?: readonly string[] | undefined, options?: execa.NodeOptions<string> | undefined): execa.ExecaChildProcess<string>;
|
|
95
|
+
node(scriptPath: string, arguments?: readonly string[] | undefined, options?: execa.Options<null> | undefined): execa.ExecaChildProcess<Buffer>;
|
|
96
|
+
node(scriptPath: string, options?: execa.Options<string> | undefined): execa.ExecaChildProcess<string>;
|
|
97
|
+
node(scriptPath: string, options?: execa.Options<null> | undefined): execa.ExecaChildProcess<Buffer>;
|
|
98
|
+
};
|
|
75
99
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RenderInternals = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.getCompositions = exports.ErrorWithStackFrame = exports.combineVideos = void 0;
|
|
6
|
+
exports.RenderInternals = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.getCompositions = exports.ErrorWithStackFrame = exports.combineVideos = void 0;
|
|
7
|
+
const execa_1 = __importDefault(require("execa"));
|
|
8
|
+
const mime_types_1 = __importDefault(require("mime-types"));
|
|
4
9
|
const download_file_1 = require("./assets/download-file");
|
|
5
10
|
const delete_directory_1 = require("./delete-directory");
|
|
6
11
|
const ensure_output_directory_1 = require("./ensure-output-directory");
|
|
@@ -13,12 +18,12 @@ const get_extension_from_codec_1 = require("./get-extension-from-codec");
|
|
|
13
18
|
const get_extension_of_filename_1 = require("./get-extension-of-filename");
|
|
14
19
|
const get_frame_to_render_1 = require("./get-frame-to-render");
|
|
15
20
|
const get_local_browser_executable_1 = require("./get-local-browser-executable");
|
|
21
|
+
const get_port_1 = require("./get-port");
|
|
16
22
|
const is_serve_url_1 = require("./is-serve-url");
|
|
17
|
-
const make_assets_download_dir_1 = require("./make-assets-download-dir");
|
|
18
23
|
const normalize_serve_url_1 = require("./normalize-serve-url");
|
|
19
24
|
const open_browser_1 = require("./open-browser");
|
|
20
25
|
const parse_browser_error_stack_1 = require("./parse-browser-error-stack");
|
|
21
|
-
const
|
|
26
|
+
const is_path_inside_1 = require("./serve-handler/is-path-inside");
|
|
22
27
|
const serve_static_1 = require("./serve-static");
|
|
23
28
|
const stitch_frames_to_video_1 = require("./stitch-frames-to-video");
|
|
24
29
|
const tmp_dir_1 = require("./tmp-dir");
|
|
@@ -32,6 +37,8 @@ var handle_javascript_exception_1 = require("./error-handling/handle-javascript-
|
|
|
32
37
|
Object.defineProperty(exports, "ErrorWithStackFrame", { enumerable: true, get: function () { return handle_javascript_exception_1.ErrorWithStackFrame; } });
|
|
33
38
|
var get_compositions_1 = require("./get-compositions");
|
|
34
39
|
Object.defineProperty(exports, "getCompositions", { enumerable: true, get: function () { return get_compositions_1.getCompositions; } });
|
|
40
|
+
var make_cancel_signal_1 = require("./make-cancel-signal");
|
|
41
|
+
Object.defineProperty(exports, "makeCancelSignal", { enumerable: true, get: function () { return make_cancel_signal_1.makeCancelSignal; } });
|
|
35
42
|
var open_browser_2 = require("./open-browser");
|
|
36
43
|
Object.defineProperty(exports, "openBrowser", { enumerable: true, get: function () { return open_browser_2.openBrowser; } });
|
|
37
44
|
var render_frames_1 = require("./render-frames");
|
|
@@ -55,10 +62,8 @@ exports.RenderInternals = {
|
|
|
55
62
|
normalizeServeUrl: normalize_serve_url_1.normalizeServeUrl,
|
|
56
63
|
spawnFfmpeg: stitch_frames_to_video_1.spawnFfmpeg,
|
|
57
64
|
getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
|
|
58
|
-
makeAssetsDownloadTmpDir: make_assets_download_dir_1.makeAssetsDownloadTmpDir,
|
|
59
65
|
tmpDir: tmp_dir_1.tmpDir,
|
|
60
66
|
deleteDirectory: delete_directory_1.deleteDirectory,
|
|
61
|
-
prepareServer: prepare_server_1.prepareServer,
|
|
62
67
|
isServeUrl: is_serve_url_1.isServeUrl,
|
|
63
68
|
ensureOutputDirectory: ensure_output_directory_1.ensureOutputDirectory,
|
|
64
69
|
getRealFrameRange: get_frame_to_render_1.getRealFrameRange,
|
|
@@ -71,4 +76,8 @@ exports.RenderInternals = {
|
|
|
71
76
|
SymbolicateableError: symbolicateable_error_1.SymbolicateableError,
|
|
72
77
|
getDurationFromFrameRange: get_duration_from_frame_range_1.getDurationFromFrameRange,
|
|
73
78
|
getExtensionOfFilename: get_extension_of_filename_1.getExtensionOfFilename,
|
|
79
|
+
getDesiredPort: get_port_1.getDesiredPort,
|
|
80
|
+
mime: mime_types_1.default,
|
|
81
|
+
isPathInside: is_path_inside_1.isPathInside,
|
|
82
|
+
execa: execa_1.default,
|
|
74
83
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.markAsBeyondLastFrame = exports.isBeyondLastFrame = void 0;
|
|
4
|
+
const map = {};
|
|
5
|
+
const isBeyondLastFrame = (src, time) => {
|
|
6
|
+
return map[src] && time >= map[src];
|
|
7
|
+
};
|
|
8
|
+
exports.isBeyondLastFrame = isBeyondLastFrame;
|
|
9
|
+
const markAsBeyondLastFrame = (src, time) => {
|
|
10
|
+
map[src] = time;
|
|
11
|
+
};
|
|
12
|
+
exports.markAsBeyondLastFrame = markAsBeyondLastFrame;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FfmpegExecutable } from 'remotion';
|
|
2
|
+
export declare type LastFrameOptions = {
|
|
3
|
+
ffmpegExecutable: FfmpegExecutable;
|
|
4
|
+
ffprobeExecutable: FfmpegExecutable;
|
|
5
|
+
offset: number;
|
|
6
|
+
src: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const setLastFrameInCache: (options: LastFrameOptions, data: Buffer) => void;
|
|
9
|
+
export declare const getLastFrameFromCache: (options: LastFrameOptions) => Buffer | null;
|
|
10
|
+
export declare const clearLastFileCache: () => void;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// OffthreadVideo requires sometimes that the last frame of a video gets extracted, however, this can be slow. We allocate a cache for it but that can be garbage collected
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.clearLastFileCache = exports.getLastFrameFromCache = exports.setLastFrameInCache = void 0;
|
|
5
|
+
let map = {};
|
|
6
|
+
const MAX_CACHE_SIZE = 50 * 1024 * 1024; // 50MB
|
|
7
|
+
let bufferSize = 0;
|
|
8
|
+
const makeLastFrameCacheKey = (options) => {
|
|
9
|
+
return [options.ffmpegExecutable, options.offset, options.src].join('-');
|
|
10
|
+
};
|
|
11
|
+
const setLastFrameInCache = (options, data) => {
|
|
12
|
+
const key = makeLastFrameCacheKey(options);
|
|
13
|
+
if (map[key]) {
|
|
14
|
+
bufferSize -= map[key].data.byteLength;
|
|
15
|
+
}
|
|
16
|
+
map[key] = { data, lastAccessed: Date.now() };
|
|
17
|
+
bufferSize += data.byteLength;
|
|
18
|
+
ensureMaxSize();
|
|
19
|
+
};
|
|
20
|
+
exports.setLastFrameInCache = setLastFrameInCache;
|
|
21
|
+
const getLastFrameFromCache = (options) => {
|
|
22
|
+
var _a;
|
|
23
|
+
const key = makeLastFrameCacheKey(options);
|
|
24
|
+
if (!map[key]) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
map[key].lastAccessed = Date.now();
|
|
28
|
+
return (_a = map[key].data) !== null && _a !== void 0 ? _a : null;
|
|
29
|
+
};
|
|
30
|
+
exports.getLastFrameFromCache = getLastFrameFromCache;
|
|
31
|
+
const removedLastFrameFromCache = (key) => {
|
|
32
|
+
if (!map[key]) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
bufferSize -= map[key].data.byteLength;
|
|
36
|
+
delete map[key];
|
|
37
|
+
};
|
|
38
|
+
const ensureMaxSize = () => {
|
|
39
|
+
// eslint-disable-next-line no-unmodified-loop-condition
|
|
40
|
+
while (bufferSize > MAX_CACHE_SIZE) {
|
|
41
|
+
const earliest = Object.entries(map).sort((a, b) => {
|
|
42
|
+
return a[1].lastAccessed - b[1].lastAccessed;
|
|
43
|
+
})[0];
|
|
44
|
+
removedLastFrameFromCache(earliest[0]);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const clearLastFileCache = () => {
|
|
48
|
+
map = {};
|
|
49
|
+
};
|
|
50
|
+
exports.clearLastFileCache = clearLastFileCache;
|
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeAssetsDownloadTmpDir = void 0;
|
|
4
4
|
const tmp_dir_1 = require("./tmp-dir");
|
|
5
|
+
let dir = null;
|
|
5
6
|
const makeAssetsDownloadTmpDir = () => {
|
|
6
|
-
|
|
7
|
+
if (dir) {
|
|
8
|
+
return dir;
|
|
9
|
+
}
|
|
10
|
+
dir = (0, tmp_dir_1.tmpDir)('remotion-assets-dir');
|
|
11
|
+
return dir;
|
|
7
12
|
};
|
|
8
13
|
exports.makeAssetsDownloadTmpDir = makeAssetsDownloadTmpDir;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeCancelSignal = void 0;
|
|
4
|
+
const makeCancelSignal = () => {
|
|
5
|
+
const callbacks = [];
|
|
6
|
+
let cancelled = false;
|
|
7
|
+
return {
|
|
8
|
+
cancelSignal: (callback) => {
|
|
9
|
+
callbacks.push(callback);
|
|
10
|
+
if (cancelled) {
|
|
11
|
+
callback();
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
cancel: () => {
|
|
15
|
+
if (cancelled) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
callbacks.forEach((cb) => {
|
|
19
|
+
cb();
|
|
20
|
+
});
|
|
21
|
+
cancelled = true;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
exports.makeCancelSignal = makeCancelSignal;
|
|
@@ -30,8 +30,8 @@ const mergeAudioTrackUnlimited = async ({ ffmpegExecutable, outName, files, numb
|
|
|
30
30
|
});
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
// FFMPEG
|
|
34
|
-
if (files.length
|
|
33
|
+
// In FFMPEG, the total number of left and right tracks that can be merged at one time is limited to 64
|
|
34
|
+
if (files.length >= 32) {
|
|
35
35
|
const chunked = (0, chunk_1.chunk)(files, 10);
|
|
36
36
|
const tempPath = (0, tmp_dir_1.tmpDir)('remotion-large-audio-mixing');
|
|
37
37
|
const chunkNames = await Promise.all(chunked.map(async (chunkFiles, i) => {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RequestListener } from 'http';
|
|
2
|
+
import { FfmpegExecutable } from 'remotion';
|
|
3
|
+
import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
4
|
+
export declare const extractUrlAndSourceFromUrl: (url: string) => {
|
|
5
|
+
src: string;
|
|
6
|
+
time: number;
|
|
7
|
+
};
|
|
8
|
+
export declare const startOffthreadVideoServer: ({ ffmpegExecutable, ffprobeExecutable, downloadDir, onDownload, onError, }: {
|
|
9
|
+
ffmpegExecutable: FfmpegExecutable;
|
|
10
|
+
ffprobeExecutable: FfmpegExecutable;
|
|
11
|
+
downloadDir: string;
|
|
12
|
+
onDownload: RenderMediaOnDownload;
|
|
13
|
+
onError: (err: Error) => void;
|
|
14
|
+
}) => RequestListener;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startOffthreadVideoServer = exports.extractUrlAndSourceFromUrl = void 0;
|
|
4
|
+
const url_1 = require("url");
|
|
5
|
+
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
|
|
6
|
+
const extract_frame_from_video_1 = require("./extract-frame-from-video");
|
|
7
|
+
const extractUrlAndSourceFromUrl = (url) => {
|
|
8
|
+
const parsed = new URL(url, 'http://localhost');
|
|
9
|
+
const query = parsed.search;
|
|
10
|
+
if (!query.trim()) {
|
|
11
|
+
throw new Error('Expected query from ' + url);
|
|
12
|
+
}
|
|
13
|
+
const params = new url_1.URLSearchParams(query);
|
|
14
|
+
const src = params.get('src');
|
|
15
|
+
if (!src) {
|
|
16
|
+
throw new Error('Did not pass `src` parameter');
|
|
17
|
+
}
|
|
18
|
+
const time = params.get('time');
|
|
19
|
+
if (!time) {
|
|
20
|
+
throw new Error('Did not get `time` parameter');
|
|
21
|
+
}
|
|
22
|
+
return { src, time: parseFloat(time) };
|
|
23
|
+
};
|
|
24
|
+
exports.extractUrlAndSourceFromUrl = extractUrlAndSourceFromUrl;
|
|
25
|
+
const startOffthreadVideoServer = ({ ffmpegExecutable, ffprobeExecutable, downloadDir, onDownload, onError, }) => {
|
|
26
|
+
return (req, res) => {
|
|
27
|
+
if (!req.url) {
|
|
28
|
+
throw new Error('Request came in without URL');
|
|
29
|
+
}
|
|
30
|
+
if (!req.url.startsWith('/proxy')) {
|
|
31
|
+
res.writeHead(404);
|
|
32
|
+
res.end();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
res.setHeader('access-control-allow-origin', '*');
|
|
36
|
+
res.setHeader('content-type', 'image/jpg');
|
|
37
|
+
const { src, time } = (0, exports.extractUrlAndSourceFromUrl)(req.url);
|
|
38
|
+
const to = (0, download_and_map_assets_to_file_1.getSanitizedFilenameForAssetUrl)({ downloadDir, src });
|
|
39
|
+
(0, download_and_map_assets_to_file_1.startDownloadForSrc)({ src, downloadDir, onDownload }).catch((err) => {
|
|
40
|
+
onError(new Error(`Error while downloading asset: ${err.stack}`));
|
|
41
|
+
});
|
|
42
|
+
(0, download_and_map_assets_to_file_1.waitForAssetToBeDownloaded)(src, to)
|
|
43
|
+
.then(() => {
|
|
44
|
+
return (0, extract_frame_from_video_1.extractFrameFromVideo)({
|
|
45
|
+
time,
|
|
46
|
+
src: to,
|
|
47
|
+
ffmpegExecutable,
|
|
48
|
+
ffprobeExecutable,
|
|
49
|
+
});
|
|
50
|
+
})
|
|
51
|
+
.then((readable) => {
|
|
52
|
+
if (!readable) {
|
|
53
|
+
throw new Error('no readable from ffmpeg');
|
|
54
|
+
}
|
|
55
|
+
res.writeHead(200);
|
|
56
|
+
res.write(readable);
|
|
57
|
+
res.end();
|
|
58
|
+
})
|
|
59
|
+
.catch((err) => {
|
|
60
|
+
res.writeHead(500);
|
|
61
|
+
res.end();
|
|
62
|
+
onError(err);
|
|
63
|
+
console.log('Error occurred', err);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
exports.startOffthreadVideoServer = startOffthreadVideoServer;
|
package/dist/open-browser.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import puppeteer from 'puppeteer-core';
|
|
2
2
|
import { Browser } from 'remotion';
|
|
3
|
-
declare const validRenderers: readonly ["angle", "egl", "swiftshader"];
|
|
3
|
+
declare const validRenderers: readonly ["swangle", "angle", "egl", "swiftshader"];
|
|
4
4
|
declare type OpenGlRenderer = typeof validRenderers[number];
|
|
5
5
|
export declare type ChromiumOptions = {
|
|
6
6
|
ignoreCertificateErrors?: boolean;
|
|
@@ -10,9 +10,9 @@ export declare type ChromiumOptions = {
|
|
|
10
10
|
};
|
|
11
11
|
export declare const killAllBrowsers: () => Promise<void>;
|
|
12
12
|
export declare const openBrowser: (browser: Browser, options?: {
|
|
13
|
-
shouldDumpIo?: boolean
|
|
14
|
-
browserExecutable?: string | null
|
|
15
|
-
chromiumOptions?: ChromiumOptions
|
|
16
|
-
forceDeviceScaleFactor?: number
|
|
17
|
-
}
|
|
13
|
+
shouldDumpIo?: boolean;
|
|
14
|
+
browserExecutable?: string | null;
|
|
15
|
+
chromiumOptions?: ChromiumOptions;
|
|
16
|
+
forceDeviceScaleFactor?: number;
|
|
17
|
+
}) => Promise<puppeteer.Browser>;
|
|
18
18
|
export {};
|