@remotion/renderer 4.0.413 → 4.0.415
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/BrowserFetcher.d.ts +2 -0
- package/dist/browser/BrowserFetcher.js +38 -7
- package/dist/browser/parse-browser-log-message.d.ts +14 -0
- package/dist/browser/parse-browser-log-message.js +38 -0
- package/dist/browser/should-log-message.d.ts +0 -13
- package/dist/browser/should-log-message.js +3 -34
- package/dist/ensure-browser.d.ts +3 -0
- package/dist/ensure-browser.js +13 -2
- package/dist/esm/index.mjs +96 -58
- package/dist/get-local-browser-executable.js +1 -1
- package/dist/open-browser.js +1 -1
- package/dist/options/private-license-key.d.ts +15 -0
- package/dist/options/private-license-key.js +35 -0
- package/package.json +13 -13
|
@@ -14,12 +14,14 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import type { DownloadBrowserProgressFn } from '../options/on-browser-download';
|
|
17
|
+
export declare const TESTED_VERSION = "144.0.7559.20";
|
|
17
18
|
interface BrowserFetcherRevisionInfo {
|
|
18
19
|
folderPath: string;
|
|
19
20
|
executablePath: string;
|
|
20
21
|
url: string;
|
|
21
22
|
local: boolean;
|
|
22
23
|
}
|
|
24
|
+
export declare const readVersionFile: (chromeMode: "chrome-for-testing" | "headless-shell") => string | null;
|
|
23
25
|
export declare const downloadBrowser: ({ logLevel, indent, onProgress, version, chromeMode, }: {
|
|
24
26
|
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
|
|
25
27
|
indent: boolean;
|
|
@@ -51,7 +51,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
51
51
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
52
52
|
};
|
|
53
53
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
-
exports.getRevisionInfo = exports.downloadBrowser = void 0;
|
|
54
|
+
exports.getRevisionInfo = exports.downloadBrowser = exports.readVersionFile = exports.TESTED_VERSION = void 0;
|
|
55
55
|
const fs = __importStar(require("node:fs"));
|
|
56
56
|
const os = __importStar(require("node:os"));
|
|
57
57
|
const path = __importStar(require("node:path"));
|
|
@@ -60,10 +60,10 @@ const node_util_1 = require("node:util");
|
|
|
60
60
|
const download_file_1 = require("../assets/download-file");
|
|
61
61
|
const make_file_executable_1 = require("../compositor/make-file-executable");
|
|
62
62
|
const get_download_destination_1 = require("./get-download-destination");
|
|
63
|
-
|
|
64
|
-
// https://github.com/microsoft/playwright/
|
|
63
|
+
exports.TESTED_VERSION = '144.0.7559.20';
|
|
64
|
+
// https://github.com/microsoft/playwright/blame/e76ca6cba40c26bf22c19cf37398d2b9da9ed465/packages/playwright-core/browsers.json
|
|
65
65
|
// packages/playwright-core/browsers.json
|
|
66
|
-
const PLAYWRIGHT_VERSION = '
|
|
66
|
+
const PLAYWRIGHT_VERSION = '1207'; // 144.0.7559.20
|
|
67
67
|
function getChromeDownloadUrl({ platform, version, chromeMode, }) {
|
|
68
68
|
if (platform === 'linux-arm64') {
|
|
69
69
|
if (chromeMode === 'chrome-for-testing') {
|
|
@@ -72,9 +72,9 @@ function getChromeDownloadUrl({ platform, version, chromeMode, }) {
|
|
|
72
72
|
return `https://playwright.azureedge.net/builds/chromium/${version !== null && version !== void 0 ? version : PLAYWRIGHT_VERSION}/chromium-headless-shell-linux-arm64.zip`;
|
|
73
73
|
}
|
|
74
74
|
if (chromeMode === 'headless-shell') {
|
|
75
|
-
return `https://storage.googleapis.com/chrome-for-testing-public/${version !== null && version !== void 0 ? version : TESTED_VERSION}/${platform}/chrome-headless-shell-${platform}.zip`;
|
|
75
|
+
return `https://storage.googleapis.com/chrome-for-testing-public/${version !== null && version !== void 0 ? version : exports.TESTED_VERSION}/${platform}/chrome-headless-shell-${platform}.zip`;
|
|
76
76
|
}
|
|
77
|
-
return `https://storage.googleapis.com/chrome-for-testing-public/${version !== null && version !== void 0 ? version : TESTED_VERSION}/${platform}/chrome-${platform}.zip`;
|
|
77
|
+
return `https://storage.googleapis.com/chrome-for-testing-public/${version !== null && version !== void 0 ? version : exports.TESTED_VERSION}/${platform}/chrome-${platform}.zip`;
|
|
78
78
|
}
|
|
79
79
|
const mkdirAsync = fs.promises.mkdir;
|
|
80
80
|
const unlinkAsync = (0, node_util_1.promisify)(fs.unlink.bind(fs));
|
|
@@ -104,6 +104,30 @@ const getDownloadsFolder = (chromeMode) => {
|
|
|
104
104
|
: 'chrome-for-testing';
|
|
105
105
|
return path.join((0, get_download_destination_1.getDownloadsCacheDir)(), destination);
|
|
106
106
|
};
|
|
107
|
+
const getVersionFilePath = (chromeMode) => {
|
|
108
|
+
const downloadsFolder = getDownloadsFolder(chromeMode);
|
|
109
|
+
return path.join(downloadsFolder, 'VERSION');
|
|
110
|
+
};
|
|
111
|
+
const getExpectedVersion = (version, _chromeMode) => {
|
|
112
|
+
if (version) {
|
|
113
|
+
return version;
|
|
114
|
+
}
|
|
115
|
+
return exports.TESTED_VERSION;
|
|
116
|
+
};
|
|
117
|
+
const readVersionFile = (chromeMode) => {
|
|
118
|
+
const versionFilePath = getVersionFilePath(chromeMode);
|
|
119
|
+
try {
|
|
120
|
+
return fs.readFileSync(versionFilePath, 'utf-8').trim();
|
|
121
|
+
}
|
|
122
|
+
catch (_a) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
exports.readVersionFile = readVersionFile;
|
|
127
|
+
const writeVersionFile = (chromeMode, version) => {
|
|
128
|
+
const versionFilePath = getVersionFilePath(chromeMode);
|
|
129
|
+
fs.writeFileSync(versionFilePath, version);
|
|
130
|
+
};
|
|
107
131
|
const downloadBrowser = async ({ logLevel, indent, onProgress, version, chromeMode, }) => {
|
|
108
132
|
const platform = getPlatform();
|
|
109
133
|
const downloadURL = getChromeDownloadUrl({ platform, version, chromeMode });
|
|
@@ -114,8 +138,14 @@ const downloadBrowser = async ({ logLevel, indent, onProgress, version, chromeMo
|
|
|
114
138
|
const downloadsFolder = getDownloadsFolder(chromeMode);
|
|
115
139
|
const archivePath = path.join(downloadsFolder, fileName);
|
|
116
140
|
const outputPath = getFolderPath(downloadsFolder, platform);
|
|
141
|
+
const expectedVersion = getExpectedVersion(version, chromeMode);
|
|
117
142
|
if (await existsAsync(outputPath)) {
|
|
118
|
-
|
|
143
|
+
const installedVersion = (0, exports.readVersionFile)(chromeMode);
|
|
144
|
+
if (installedVersion === expectedVersion) {
|
|
145
|
+
return (0, exports.getRevisionInfo)(chromeMode);
|
|
146
|
+
}
|
|
147
|
+
// VERSION file missing or mismatched - delete and re-download
|
|
148
|
+
fs.rmSync(outputPath, { recursive: true, force: true });
|
|
119
149
|
}
|
|
120
150
|
if (!(await existsAsync(downloadsFolder))) {
|
|
121
151
|
await mkdirAsync(downloadsFolder, {
|
|
@@ -167,6 +197,7 @@ const downloadBrowser = async ({ logLevel, indent, onProgress, version, chromeMo
|
|
|
167
197
|
await unlinkAsync(archivePath);
|
|
168
198
|
}
|
|
169
199
|
}
|
|
200
|
+
writeVersionFile(chromeMode, expectedVersion);
|
|
170
201
|
const revisionInfo = (0, exports.getRevisionInfo)(chromeMode);
|
|
171
202
|
(0, make_file_executable_1.makeFileExecutableIfItIsNot)(revisionInfo.executablePath);
|
|
172
203
|
return revisionInfo;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type ParsedBrowserLogMessage = {
|
|
2
|
+
day: number;
|
|
3
|
+
month: number;
|
|
4
|
+
hour: number;
|
|
5
|
+
minute: number;
|
|
6
|
+
seconds: number;
|
|
7
|
+
microseconds: number;
|
|
8
|
+
level: string;
|
|
9
|
+
location: string;
|
|
10
|
+
lineNumber: number;
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const parseBrowserLogMessage: (input: string) => ParsedBrowserLogMessage | null;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseBrowserLogMessage = void 0;
|
|
4
|
+
const parseBrowserLogMessage = (input) => {
|
|
5
|
+
var _a;
|
|
6
|
+
// Chrome <144: [MMDD/HHMMSS.UUUUUU:LEVEL:LOCATION(LINE)] message
|
|
7
|
+
// Chrome 144+: [MMDD/HHMMSS.UUUUUU:LEVEL:LOCATION:LINE] message
|
|
8
|
+
const format = /^\[([0-9]{4})\/([0-9]{6})\.([0-9]{6}):([A-Z]+):(.*?)(?:\(([0-9]+)\)|:([0-9]+))\](.*)/;
|
|
9
|
+
const match = input.match(format);
|
|
10
|
+
if (!match) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const date = match[1];
|
|
14
|
+
const day = parseInt(date.slice(0, 2), 10);
|
|
15
|
+
const month = parseInt(date.slice(2, 4), 10);
|
|
16
|
+
const time = match[2];
|
|
17
|
+
const hour = parseInt(time.slice(0, 2), 10);
|
|
18
|
+
const minute = parseInt(time.slice(2, 4), 10);
|
|
19
|
+
const seconds = parseInt(time.slice(4, 6), 10);
|
|
20
|
+
const microseconds = parseInt(match[3], 10);
|
|
21
|
+
const level = match[4];
|
|
22
|
+
const location = match[5];
|
|
23
|
+
const lineNumber = parseInt((_a = match[6]) !== null && _a !== void 0 ? _a : match[7], 10);
|
|
24
|
+
const message = match[8].trim();
|
|
25
|
+
return {
|
|
26
|
+
day,
|
|
27
|
+
month,
|
|
28
|
+
hour,
|
|
29
|
+
minute,
|
|
30
|
+
seconds,
|
|
31
|
+
microseconds,
|
|
32
|
+
level,
|
|
33
|
+
location,
|
|
34
|
+
lineNumber,
|
|
35
|
+
message,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
exports.parseBrowserLogMessage = parseBrowserLogMessage;
|
|
@@ -1,17 +1,4 @@
|
|
|
1
1
|
export declare const shouldLogBrowserMessage: (message: string) => boolean;
|
|
2
|
-
type ParsedBrowserLogMessage = {
|
|
3
|
-
day: number;
|
|
4
|
-
month: number;
|
|
5
|
-
hour: number;
|
|
6
|
-
minute: number;
|
|
7
|
-
seconds: number;
|
|
8
|
-
microseconds: number;
|
|
9
|
-
level: string;
|
|
10
|
-
location: string;
|
|
11
|
-
lineNumber: number;
|
|
12
|
-
message: string;
|
|
13
|
-
};
|
|
14
|
-
export declare const parseBrowserLogMessage: (input: string) => ParsedBrowserLogMessage | null;
|
|
15
2
|
export declare const formatChromeMessage: (input: string) => {
|
|
16
3
|
output: string;
|
|
17
4
|
tag: string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseChromeLogLocation = exports.formatChromeMessage = exports.
|
|
3
|
+
exports.parseChromeLogLocation = exports.formatChromeMessage = exports.shouldLogBrowserMessage = void 0;
|
|
4
|
+
const parse_browser_log_message_1 = require("./parse-browser-log-message");
|
|
4
5
|
const shouldLogBrowserMessage = (message) => {
|
|
5
6
|
// Not relevant for the user
|
|
6
7
|
if (message.startsWith('DevTools listening on')) {
|
|
@@ -45,40 +46,8 @@ const shouldLogBrowserMessage = (message) => {
|
|
|
45
46
|
return true;
|
|
46
47
|
};
|
|
47
48
|
exports.shouldLogBrowserMessage = shouldLogBrowserMessage;
|
|
48
|
-
const parseBrowserLogMessage = (input) => {
|
|
49
|
-
const format = /^\[([0-9]{4})\/([0-9]{6})\.([0-9]{6}):([A-Z]+):(.*)\(([0-9]+)\)\](.*)/;
|
|
50
|
-
const match = input.match(format);
|
|
51
|
-
if (!match) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
const date = match[1];
|
|
55
|
-
const day = parseInt(date.slice(0, 2), 10);
|
|
56
|
-
const month = parseInt(date.slice(2, 4), 10);
|
|
57
|
-
const time = match[2];
|
|
58
|
-
const hour = parseInt(time.slice(0, 2), 10);
|
|
59
|
-
const minute = parseInt(time.slice(2, 4), 10);
|
|
60
|
-
const seconds = parseInt(time.slice(4, 6), 10);
|
|
61
|
-
const microseconds = parseInt(match[3], 10);
|
|
62
|
-
const level = match[4];
|
|
63
|
-
const location = match[5];
|
|
64
|
-
const lineNumber = parseInt(match[6], 10);
|
|
65
|
-
const message = match[7].trim();
|
|
66
|
-
return {
|
|
67
|
-
day,
|
|
68
|
-
month,
|
|
69
|
-
hour,
|
|
70
|
-
minute,
|
|
71
|
-
seconds,
|
|
72
|
-
microseconds,
|
|
73
|
-
level,
|
|
74
|
-
location,
|
|
75
|
-
lineNumber,
|
|
76
|
-
message,
|
|
77
|
-
};
|
|
78
|
-
};
|
|
79
|
-
exports.parseBrowserLogMessage = parseBrowserLogMessage;
|
|
80
49
|
const formatChromeMessage = (input) => {
|
|
81
|
-
const parsed = (0,
|
|
50
|
+
const parsed = (0, parse_browser_log_message_1.parseBrowserLogMessage)(input);
|
|
82
51
|
if (!parsed) {
|
|
83
52
|
return { output: input, tag: 'chrome' };
|
|
84
53
|
}
|
package/dist/ensure-browser.d.ts
CHANGED
package/dist/ensure-browser.js
CHANGED
|
@@ -7,10 +7,17 @@ exports.ensureBrowser = exports.internalEnsureBrowser = void 0;
|
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const BrowserFetcher_1 = require("./browser/BrowserFetcher");
|
|
9
9
|
const browser_download_progress_bar_1 = require("./browser/browser-download-progress-bar");
|
|
10
|
+
const logger_1 = require("./logger");
|
|
10
11
|
let currentEnsureBrowserOperation = Promise.resolve();
|
|
11
12
|
const internalEnsureBrowserUncapped = async ({ indent, logLevel, browserExecutable, onBrowserDownload, chromeMode, }) => {
|
|
12
13
|
const status = getBrowserStatus({ browserExecutable, chromeMode });
|
|
13
|
-
if (status.type === '
|
|
14
|
+
if (status.type === 'version-mismatch') {
|
|
15
|
+
const versionInfo = status.actualVersion
|
|
16
|
+
? ` (installed: ${status.actualVersion})`
|
|
17
|
+
: '';
|
|
18
|
+
logger_1.Log.info({ indent, logLevel }, `This version of Remotion uses Chrome version ${BrowserFetcher_1.TESTED_VERSION}, but the installed one differs${versionInfo}. Re-downloading.`);
|
|
19
|
+
}
|
|
20
|
+
if (status.type === 'no-browser' || status.type === 'version-mismatch') {
|
|
14
21
|
const { onProgress, version } = onBrowserDownload({ chromeMode });
|
|
15
22
|
await (0, BrowserFetcher_1.downloadBrowser)({ indent, logLevel, onProgress, version, chromeMode });
|
|
16
23
|
}
|
|
@@ -31,7 +38,11 @@ const getBrowserStatus = ({ browserExecutable, chromeMode, }) => {
|
|
|
31
38
|
}
|
|
32
39
|
const revision = (0, BrowserFetcher_1.getRevisionInfo)(chromeMode);
|
|
33
40
|
if (revision.local && fs_1.default.existsSync(revision.executablePath)) {
|
|
34
|
-
|
|
41
|
+
const actualVersion = (0, BrowserFetcher_1.readVersionFile)(chromeMode);
|
|
42
|
+
if (actualVersion === BrowserFetcher_1.TESTED_VERSION) {
|
|
43
|
+
return { path: revision.executablePath, type: 'local-puppeteer-browser' };
|
|
44
|
+
}
|
|
45
|
+
return { type: 'version-mismatch', actualVersion };
|
|
35
46
|
}
|
|
36
47
|
return { type: 'no-browser' };
|
|
37
48
|
};
|
package/dist/esm/index.mjs
CHANGED
|
@@ -3206,6 +3206,39 @@ class NodeWebSocketTransport {
|
|
|
3206
3206
|
}
|
|
3207
3207
|
}
|
|
3208
3208
|
|
|
3209
|
+
// src/browser/parse-browser-log-message.ts
|
|
3210
|
+
var parseBrowserLogMessage = (input) => {
|
|
3211
|
+
const format2 = /^\[([0-9]{4})\/([0-9]{6})\.([0-9]{6}):([A-Z]+):(.*?)(?:\(([0-9]+)\)|:([0-9]+))\](.*)/;
|
|
3212
|
+
const match = input.match(format2);
|
|
3213
|
+
if (!match) {
|
|
3214
|
+
return null;
|
|
3215
|
+
}
|
|
3216
|
+
const date = match[1];
|
|
3217
|
+
const day = parseInt(date.slice(0, 2), 10);
|
|
3218
|
+
const month = parseInt(date.slice(2, 4), 10);
|
|
3219
|
+
const time = match[2];
|
|
3220
|
+
const hour = parseInt(time.slice(0, 2), 10);
|
|
3221
|
+
const minute = parseInt(time.slice(2, 4), 10);
|
|
3222
|
+
const seconds = parseInt(time.slice(4, 6), 10);
|
|
3223
|
+
const microseconds = parseInt(match[3], 10);
|
|
3224
|
+
const level = match[4];
|
|
3225
|
+
const location = match[5];
|
|
3226
|
+
const lineNumber = parseInt(match[6] ?? match[7], 10);
|
|
3227
|
+
const message = match[8].trim();
|
|
3228
|
+
return {
|
|
3229
|
+
day,
|
|
3230
|
+
month,
|
|
3231
|
+
hour,
|
|
3232
|
+
minute,
|
|
3233
|
+
seconds,
|
|
3234
|
+
microseconds,
|
|
3235
|
+
level,
|
|
3236
|
+
location,
|
|
3237
|
+
lineNumber,
|
|
3238
|
+
message
|
|
3239
|
+
};
|
|
3240
|
+
};
|
|
3241
|
+
|
|
3209
3242
|
// src/browser/should-log-message.ts
|
|
3210
3243
|
var shouldLogBrowserMessage = (message) => {
|
|
3211
3244
|
if (message.startsWith("DevTools listening on")) {
|
|
@@ -3246,37 +3279,6 @@ var shouldLogBrowserMessage = (message) => {
|
|
|
3246
3279
|
}
|
|
3247
3280
|
return true;
|
|
3248
3281
|
};
|
|
3249
|
-
var parseBrowserLogMessage = (input) => {
|
|
3250
|
-
const format2 = /^\[([0-9]{4})\/([0-9]{6})\.([0-9]{6}):([A-Z]+):(.*)\(([0-9]+)\)\](.*)/;
|
|
3251
|
-
const match = input.match(format2);
|
|
3252
|
-
if (!match) {
|
|
3253
|
-
return null;
|
|
3254
|
-
}
|
|
3255
|
-
const date = match[1];
|
|
3256
|
-
const day = parseInt(date.slice(0, 2), 10);
|
|
3257
|
-
const month = parseInt(date.slice(2, 4), 10);
|
|
3258
|
-
const time = match[2];
|
|
3259
|
-
const hour = parseInt(time.slice(0, 2), 10);
|
|
3260
|
-
const minute = parseInt(time.slice(2, 4), 10);
|
|
3261
|
-
const seconds = parseInt(time.slice(4, 6), 10);
|
|
3262
|
-
const microseconds = parseInt(match[3], 10);
|
|
3263
|
-
const level = match[4];
|
|
3264
|
-
const location = match[5];
|
|
3265
|
-
const lineNumber = parseInt(match[6], 10);
|
|
3266
|
-
const message = match[7].trim();
|
|
3267
|
-
return {
|
|
3268
|
-
day,
|
|
3269
|
-
month,
|
|
3270
|
-
hour,
|
|
3271
|
-
minute,
|
|
3272
|
-
seconds,
|
|
3273
|
-
microseconds,
|
|
3274
|
-
level,
|
|
3275
|
-
location,
|
|
3276
|
-
lineNumber,
|
|
3277
|
-
message
|
|
3278
|
-
};
|
|
3279
|
-
};
|
|
3280
3282
|
var formatChromeMessage = (input) => {
|
|
3281
3283
|
const parsed = parseBrowserLogMessage(input);
|
|
3282
3284
|
if (!parsed) {
|
|
@@ -4785,8 +4787,8 @@ var getDownloadsCacheDir = () => {
|
|
|
4785
4787
|
};
|
|
4786
4788
|
|
|
4787
4789
|
// src/browser/BrowserFetcher.ts
|
|
4788
|
-
var TESTED_VERSION = "
|
|
4789
|
-
var PLAYWRIGHT_VERSION = "
|
|
4790
|
+
var TESTED_VERSION = "144.0.7559.20";
|
|
4791
|
+
var PLAYWRIGHT_VERSION = "1207";
|
|
4790
4792
|
function getChromeDownloadUrl({
|
|
4791
4793
|
platform: platform2,
|
|
4792
4794
|
version,
|
|
@@ -4829,6 +4831,28 @@ var getDownloadsFolder = (chromeMode) => {
|
|
|
4829
4831
|
const destination = chromeMode === "headless-shell" ? "chrome-headless-shell" : "chrome-for-testing";
|
|
4830
4832
|
return path8.join(getDownloadsCacheDir(), destination);
|
|
4831
4833
|
};
|
|
4834
|
+
var getVersionFilePath = (chromeMode) => {
|
|
4835
|
+
const downloadsFolder = getDownloadsFolder(chromeMode);
|
|
4836
|
+
return path8.join(downloadsFolder, "VERSION");
|
|
4837
|
+
};
|
|
4838
|
+
var getExpectedVersion = (version, _chromeMode) => {
|
|
4839
|
+
if (version) {
|
|
4840
|
+
return version;
|
|
4841
|
+
}
|
|
4842
|
+
return TESTED_VERSION;
|
|
4843
|
+
};
|
|
4844
|
+
var readVersionFile = (chromeMode) => {
|
|
4845
|
+
const versionFilePath = getVersionFilePath(chromeMode);
|
|
4846
|
+
try {
|
|
4847
|
+
return fs6.readFileSync(versionFilePath, "utf-8").trim();
|
|
4848
|
+
} catch {
|
|
4849
|
+
return null;
|
|
4850
|
+
}
|
|
4851
|
+
};
|
|
4852
|
+
var writeVersionFile = (chromeMode, version) => {
|
|
4853
|
+
const versionFilePath = getVersionFilePath(chromeMode);
|
|
4854
|
+
fs6.writeFileSync(versionFilePath, version);
|
|
4855
|
+
};
|
|
4832
4856
|
var downloadBrowser = async ({
|
|
4833
4857
|
logLevel,
|
|
4834
4858
|
indent,
|
|
@@ -4845,8 +4869,13 @@ var downloadBrowser = async ({
|
|
|
4845
4869
|
const downloadsFolder = getDownloadsFolder(chromeMode);
|
|
4846
4870
|
const archivePath = path8.join(downloadsFolder, fileName);
|
|
4847
4871
|
const outputPath = getFolderPath(downloadsFolder, platform2);
|
|
4872
|
+
const expectedVersion = getExpectedVersion(version, chromeMode);
|
|
4848
4873
|
if (await existsAsync(outputPath)) {
|
|
4849
|
-
|
|
4874
|
+
const installedVersion = readVersionFile(chromeMode);
|
|
4875
|
+
if (installedVersion === expectedVersion) {
|
|
4876
|
+
return getRevisionInfo(chromeMode);
|
|
4877
|
+
}
|
|
4878
|
+
fs6.rmSync(outputPath, { recursive: true, force: true });
|
|
4850
4879
|
}
|
|
4851
4880
|
if (!await existsAsync(downloadsFolder)) {
|
|
4852
4881
|
await mkdirAsync(downloadsFolder, {
|
|
@@ -4895,6 +4924,7 @@ var downloadBrowser = async ({
|
|
|
4895
4924
|
await unlinkAsync(archivePath);
|
|
4896
4925
|
}
|
|
4897
4926
|
}
|
|
4927
|
+
writeVersionFile(chromeMode, expectedVersion);
|
|
4898
4928
|
const revisionInfo = getRevisionInfo(chromeMode);
|
|
4899
4929
|
makeFileExecutableIfItIsNot(revisionInfo.executablePath);
|
|
4900
4930
|
return revisionInfo;
|
|
@@ -4948,7 +4978,11 @@ var internalEnsureBrowserUncapped = async ({
|
|
|
4948
4978
|
chromeMode
|
|
4949
4979
|
}) => {
|
|
4950
4980
|
const status = getBrowserStatus({ browserExecutable, chromeMode });
|
|
4951
|
-
if (status.type === "
|
|
4981
|
+
if (status.type === "version-mismatch") {
|
|
4982
|
+
const versionInfo = status.actualVersion ? ` (installed: ${status.actualVersion})` : "";
|
|
4983
|
+
Log.info({ indent, logLevel }, `This version of Remotion uses Chrome version ${TESTED_VERSION}, but the installed one differs${versionInfo}. Re-downloading.`);
|
|
4984
|
+
}
|
|
4985
|
+
if (status.type === "no-browser" || status.type === "version-mismatch") {
|
|
4952
4986
|
const { onProgress, version } = onBrowserDownload({ chromeMode });
|
|
4953
4987
|
await downloadBrowser({ indent, logLevel, onProgress, version, chromeMode });
|
|
4954
4988
|
}
|
|
@@ -4971,7 +5005,11 @@ var getBrowserStatus = ({
|
|
|
4971
5005
|
}
|
|
4972
5006
|
const revision = getRevisionInfo(chromeMode);
|
|
4973
5007
|
if (revision.local && fs7.existsSync(revision.executablePath)) {
|
|
4974
|
-
|
|
5008
|
+
const actualVersion = readVersionFile(chromeMode);
|
|
5009
|
+
if (actualVersion === TESTED_VERSION) {
|
|
5010
|
+
return { path: revision.executablePath, type: "local-puppeteer-browser" };
|
|
5011
|
+
}
|
|
5012
|
+
return { type: "version-mismatch", actualVersion };
|
|
4975
5013
|
}
|
|
4976
5014
|
return { type: "no-browser" };
|
|
4977
5015
|
};
|
|
@@ -5023,7 +5061,7 @@ var getLocalBrowserExecutable = ({
|
|
|
5023
5061
|
logLevel,
|
|
5024
5062
|
chromeMode
|
|
5025
5063
|
});
|
|
5026
|
-
if (status.type === "no-browser") {
|
|
5064
|
+
if (status.type === "no-browser" || status.type === "version-mismatch") {
|
|
5027
5065
|
throw new TypeError("No browser found for rendering frames! Please open a GitHub issue and describe " + "how you reached this error: https://remotion.dev/issue");
|
|
5028
5066
|
}
|
|
5029
5067
|
return status.path;
|
|
@@ -5058,10 +5096,10 @@ var getCpuCount = () => {
|
|
|
5058
5096
|
import { freemem } from "node:os";
|
|
5059
5097
|
|
|
5060
5098
|
// src/memory/from-docker-cgroup.ts
|
|
5061
|
-
import { readFileSync as
|
|
5099
|
+
import { readFileSync as readFileSync3 } from "node:fs";
|
|
5062
5100
|
var getMaxMemoryFromCgroupV2 = () => {
|
|
5063
5101
|
try {
|
|
5064
|
-
const data =
|
|
5102
|
+
const data = readFileSync3("/sys/fs/cgroup/memory.max", "utf-8");
|
|
5065
5103
|
if (data.trim() === "max") {
|
|
5066
5104
|
return Infinity;
|
|
5067
5105
|
}
|
|
@@ -5072,7 +5110,7 @@ var getMaxMemoryFromCgroupV2 = () => {
|
|
|
5072
5110
|
};
|
|
5073
5111
|
var getAvailableMemoryFromCgroupV2 = () => {
|
|
5074
5112
|
try {
|
|
5075
|
-
const data =
|
|
5113
|
+
const data = readFileSync3("/sys/fs/cgroup/memory.current", "utf-8");
|
|
5076
5114
|
return parseInt(data, 10);
|
|
5077
5115
|
} catch {
|
|
5078
5116
|
return null;
|
|
@@ -5080,7 +5118,7 @@ var getAvailableMemoryFromCgroupV2 = () => {
|
|
|
5080
5118
|
};
|
|
5081
5119
|
var getMaxMemoryFromCgroupV1 = () => {
|
|
5082
5120
|
try {
|
|
5083
|
-
const data =
|
|
5121
|
+
const data = readFileSync3("/sys/fs/cgroup/memory/memory.limit_in_bytes", "utf-8");
|
|
5084
5122
|
if (data.trim() === "max") {
|
|
5085
5123
|
return Infinity;
|
|
5086
5124
|
}
|
|
@@ -5091,7 +5129,7 @@ var getMaxMemoryFromCgroupV1 = () => {
|
|
|
5091
5129
|
};
|
|
5092
5130
|
var getAvailableMemoryFromCgroupV1 = () => {
|
|
5093
5131
|
try {
|
|
5094
|
-
const data =
|
|
5132
|
+
const data = readFileSync3("/sys/fs/cgroup/memory/memory.usage_in_bytes", "utf-8");
|
|
5095
5133
|
return parseInt(data, 10);
|
|
5096
5134
|
} catch {
|
|
5097
5135
|
return null;
|
|
@@ -5124,13 +5162,13 @@ var getMaxLambdaMemory = () => {
|
|
|
5124
5162
|
};
|
|
5125
5163
|
|
|
5126
5164
|
// src/memory/from-proc-meminfo.ts
|
|
5127
|
-
import { existsSync as existsSync3, readFileSync as
|
|
5165
|
+
import { existsSync as existsSync3, readFileSync as readFileSync4 } from "node:fs";
|
|
5128
5166
|
var getFreeMemoryFromProcMeminfo = (logLevel) => {
|
|
5129
5167
|
if (!existsSync3("/proc/meminfo")) {
|
|
5130
5168
|
return null;
|
|
5131
5169
|
}
|
|
5132
5170
|
try {
|
|
5133
|
-
const data =
|
|
5171
|
+
const data = readFileSync4("/proc/meminfo", "utf-8");
|
|
5134
5172
|
const lines = data.split(`
|
|
5135
5173
|
`);
|
|
5136
5174
|
const memAvailableLine = lines.find((line) => line.startsWith("MemAvailable"));
|
|
@@ -5345,7 +5383,7 @@ var internalOpenBrowser = async ({
|
|
|
5345
5383
|
"--allow-running-insecure-content",
|
|
5346
5384
|
"--disable-component-update",
|
|
5347
5385
|
"--disable-domain-reliability",
|
|
5348
|
-
"--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process,Translate,BackForwardCache,AvoidUnnecessaryBeforeUnloadCheckSync,IntensiveWakeUpThrottling",
|
|
5386
|
+
"--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process,Translate,BackForwardCache,AvoidUnnecessaryBeforeUnloadCheckSync,IntensiveWakeUpThrottling,LocalNetworkAccessChecks,BlockInsecurePrivateNetworkRequests,PrivateNetworkAccessSendPreflights,PrivateNetworkAccessRespectPreflightResults",
|
|
5349
5387
|
"--disable-print-preview",
|
|
5350
5388
|
"--disable-site-isolation-trials",
|
|
5351
5389
|
"--disk-cache-size=268435456",
|
|
@@ -17392,7 +17430,7 @@ var cycleBrowserTabs = ({
|
|
|
17392
17430
|
};
|
|
17393
17431
|
|
|
17394
17432
|
// src/combine-audio.ts
|
|
17395
|
-
import { rmSync as
|
|
17433
|
+
import { rmSync as rmSync3, writeFileSync as writeFileSync2 } from "fs";
|
|
17396
17434
|
import { join as join3 } from "path";
|
|
17397
17435
|
import { VERSION as VERSION4 } from "remotion/version";
|
|
17398
17436
|
|
|
@@ -17643,7 +17681,7 @@ var encodeAudio = async ({
|
|
|
17643
17681
|
const fileList = files.map((p) => `file '${p}'`).join(`
|
|
17644
17682
|
`);
|
|
17645
17683
|
const fileListTxt = join3(filelistDir, "audio-files.txt");
|
|
17646
|
-
|
|
17684
|
+
writeFileSync2(fileListTxt, fileList);
|
|
17647
17685
|
const startCombining = Date.now();
|
|
17648
17686
|
const command = [
|
|
17649
17687
|
"-hide_banner",
|
|
@@ -17689,7 +17727,7 @@ var encodeAudio = async ({
|
|
|
17689
17727
|
Log.verbose({ indent, logLevel }, `Encoded audio in ${Date.now() - startCombining}ms`);
|
|
17690
17728
|
return output;
|
|
17691
17729
|
} catch (e) {
|
|
17692
|
-
|
|
17730
|
+
rmSync3(fileListTxt, { recursive: true });
|
|
17693
17731
|
throw e;
|
|
17694
17732
|
}
|
|
17695
17733
|
};
|
|
@@ -17724,7 +17762,7 @@ var combineAudioSeamlessly = async ({
|
|
|
17724
17762
|
}).join(`
|
|
17725
17763
|
`);
|
|
17726
17764
|
const fileListTxt = join3(filelistDir, "audio-files.txt");
|
|
17727
|
-
|
|
17765
|
+
writeFileSync2(fileListTxt, fileList);
|
|
17728
17766
|
const command = [
|
|
17729
17767
|
"-hide_banner",
|
|
17730
17768
|
"-f",
|
|
@@ -17763,7 +17801,7 @@ var combineAudioSeamlessly = async ({
|
|
|
17763
17801
|
Log.verbose({ indent, logLevel }, `Combined audio seamlessly in ${Date.now() - startConcatenating}ms`);
|
|
17764
17802
|
return output;
|
|
17765
17803
|
} catch (e) {
|
|
17766
|
-
|
|
17804
|
+
rmSync3(fileListTxt, { recursive: true });
|
|
17767
17805
|
Log.error({ indent, logLevel }, e);
|
|
17768
17806
|
throw e;
|
|
17769
17807
|
}
|
|
@@ -20011,7 +20049,7 @@ var validateSelectedCodecAndProResCombination = ({
|
|
|
20011
20049
|
};
|
|
20012
20050
|
|
|
20013
20051
|
// src/stitch-frames-to-video.ts
|
|
20014
|
-
import { cpSync as cpSync2, promises as promises3, rmSync as
|
|
20052
|
+
import { cpSync as cpSync2, promises as promises3, rmSync as rmSync4 } from "node:fs";
|
|
20015
20053
|
import path25 from "node:path";
|
|
20016
20054
|
|
|
20017
20055
|
// src/convert-number-of-gif-loops-to-ffmpeg.ts
|
|
@@ -21221,7 +21259,7 @@ var innerStitchFramesToVideo = async ({
|
|
|
21221
21259
|
}
|
|
21222
21260
|
const finalDestination = path25.resolve(remotionRoot, separateAudioTo);
|
|
21223
21261
|
cpSync2(audio, finalDestination);
|
|
21224
|
-
|
|
21262
|
+
rmSync4(audio);
|
|
21225
21263
|
}
|
|
21226
21264
|
const result = await new Promise((resolve2, reject) => {
|
|
21227
21265
|
task.once("close", (code, signal) => {
|
|
@@ -22817,7 +22855,7 @@ var getMaxConcurrency = () => {
|
|
|
22817
22855
|
var getMinConcurrency = () => 1;
|
|
22818
22856
|
|
|
22819
22857
|
// src/combine-chunks.ts
|
|
22820
|
-
import { rmSync as
|
|
22858
|
+
import { rmSync as rmSync6 } from "node:fs";
|
|
22821
22859
|
import { join as join5 } from "node:path";
|
|
22822
22860
|
|
|
22823
22861
|
// src/can-concat-seamlessly.ts
|
|
@@ -22832,7 +22870,7 @@ var canConcatVideoSeamlessly = (codec) => {
|
|
|
22832
22870
|
};
|
|
22833
22871
|
|
|
22834
22872
|
// src/combine-video-streams.ts
|
|
22835
|
-
import { rmSync as
|
|
22873
|
+
import { rmSync as rmSync5, writeFileSync as writeFileSync3 } from "fs";
|
|
22836
22874
|
import { join as join4 } from "path";
|
|
22837
22875
|
import { VERSION as VERSION6 } from "remotion/version";
|
|
22838
22876
|
var combineVideoStreams = async ({
|
|
@@ -22852,7 +22890,7 @@ var combineVideoStreams = async ({
|
|
|
22852
22890
|
const fileList = files.map((p) => `file '${p}'`).join(`
|
|
22853
22891
|
`);
|
|
22854
22892
|
const fileListTxt = join4(filelistDir, "video-files.txt");
|
|
22855
|
-
|
|
22893
|
+
writeFileSync3(fileListTxt, fileList);
|
|
22856
22894
|
const encoder = codec === "gif" ? "gif" : "copy";
|
|
22857
22895
|
const command = [
|
|
22858
22896
|
"-hide_banner",
|
|
@@ -22903,7 +22941,7 @@ var combineVideoStreams = async ({
|
|
|
22903
22941
|
Log.verbose({ indent, logLevel }, `Finished combining video in ${Date.now() - startTime}ms`);
|
|
22904
22942
|
return output;
|
|
22905
22943
|
} catch (e) {
|
|
22906
|
-
|
|
22944
|
+
rmSync5(fileListTxt, { recursive: true });
|
|
22907
22945
|
throw e;
|
|
22908
22946
|
}
|
|
22909
22947
|
};
|
|
@@ -23091,9 +23129,9 @@ var internalCombineChunks = async ({
|
|
|
23091
23129
|
metadata
|
|
23092
23130
|
});
|
|
23093
23131
|
onProgress({ totalProgress: 1, frames: numberOfFrames });
|
|
23094
|
-
|
|
23132
|
+
rmSync6(filelistDir, { recursive: true });
|
|
23095
23133
|
} catch (err) {
|
|
23096
|
-
|
|
23134
|
+
rmSync6(filelistDir, { recursive: true });
|
|
23097
23135
|
throw err;
|
|
23098
23136
|
}
|
|
23099
23137
|
};
|
|
@@ -27,7 +27,7 @@ const getLocalBrowserExecutable = ({ preferredBrowserExecutable, logLevel, inden
|
|
|
27
27
|
logLevel,
|
|
28
28
|
chromeMode,
|
|
29
29
|
});
|
|
30
|
-
if (status.type === 'no-browser') {
|
|
30
|
+
if (status.type === 'no-browser' || status.type === 'version-mismatch') {
|
|
31
31
|
throw new TypeError('No browser found for rendering frames! Please open a GitHub issue and describe ' +
|
|
32
32
|
'how you reached this error: https://remotion.dev/issue');
|
|
33
33
|
}
|
package/dist/open-browser.js
CHANGED
|
@@ -136,7 +136,7 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
|
|
|
136
136
|
'--allow-running-insecure-content', // https://source.chromium.org/search?q=lang:cpp+symbol:kAllowRunningInsecureContent&ss=chromium
|
|
137
137
|
'--disable-component-update', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableComponentUpdate&ss=chromium
|
|
138
138
|
'--disable-domain-reliability', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableDomainReliability&ss=chromium
|
|
139
|
-
'--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process,Translate,BackForwardCache,AvoidUnnecessaryBeforeUnloadCheckSync,IntensiveWakeUpThrottling', // https://source.chromium.org/search?q=file:content_features.cc&ss=chromium
|
|
139
|
+
'--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process,Translate,BackForwardCache,AvoidUnnecessaryBeforeUnloadCheckSync,IntensiveWakeUpThrottling,LocalNetworkAccessChecks,BlockInsecurePrivateNetworkRequests,PrivateNetworkAccessSendPreflights,PrivateNetworkAccessRespectPreflightResults', // https://source.chromium.org/search?q=file:content_features.cc&ss=chromium
|
|
140
140
|
'--disable-print-preview', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisablePrintPreview&ss=chromium
|
|
141
141
|
'--disable-site-isolation-trials', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableSiteIsolation&ss=chromium
|
|
142
142
|
'--disk-cache-size=268435456', // https://source.chromium.org/search?q=lang:cpp+symbol:kDiskCacheSize&ss=chromium
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const privateLicenseKeyOption: {
|
|
2
|
+
name: string;
|
|
3
|
+
cliFlag: "private-license-key";
|
|
4
|
+
description: () => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
ssrName: "privateLicenseKey";
|
|
6
|
+
docLink: string;
|
|
7
|
+
getValue: ({ commandLine }: {
|
|
8
|
+
commandLine: Record<string, unknown>;
|
|
9
|
+
}) => {
|
|
10
|
+
source: string;
|
|
11
|
+
value: string | null;
|
|
12
|
+
};
|
|
13
|
+
setConfig: (value: string | null) => void;
|
|
14
|
+
type: string | null;
|
|
15
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.privateLicenseKeyOption = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const cliFlag = 'private-license-key';
|
|
6
|
+
let currentPrivateLicenseKey = null;
|
|
7
|
+
exports.privateLicenseKeyOption = {
|
|
8
|
+
name: 'Private License Key',
|
|
9
|
+
cliFlag,
|
|
10
|
+
description: () => ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["The private license key for your company license, obtained from the \"Usage\" tab on ", (0, jsx_runtime_1.jsx)("a", { href: "https://remotion.pro/dashboard", children: "remotion.pro" }), ". If you are eligible for the free license, pass \"free-license\"."] })),
|
|
11
|
+
ssrName: 'privateLicenseKey',
|
|
12
|
+
docLink: 'https://www.remotion.dev/docs/licensing',
|
|
13
|
+
getValue: ({ commandLine }) => {
|
|
14
|
+
if (commandLine[cliFlag] !== undefined) {
|
|
15
|
+
return {
|
|
16
|
+
source: 'cli',
|
|
17
|
+
value: commandLine[cliFlag],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (currentPrivateLicenseKey !== null) {
|
|
21
|
+
return {
|
|
22
|
+
source: 'config',
|
|
23
|
+
value: currentPrivateLicenseKey,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
source: 'default',
|
|
28
|
+
value: null,
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
setConfig: (value) => {
|
|
32
|
+
currentPrivateLicenseKey = value;
|
|
33
|
+
},
|
|
34
|
+
type: null,
|
|
35
|
+
};
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/renderer"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/renderer",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.415",
|
|
7
7
|
"description": "Render Remotion videos using Node.js or Bun",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"execa": "5.1.1",
|
|
25
25
|
"extract-zip": "2.0.1",
|
|
26
|
-
"remotion": "4.0.
|
|
27
|
-
"@remotion/streaming": "4.0.
|
|
26
|
+
"remotion": "4.0.414",
|
|
27
|
+
"@remotion/streaming": "4.0.414",
|
|
28
28
|
"source-map": "^0.8.0-beta.0",
|
|
29
29
|
"ws": "8.17.1",
|
|
30
|
-
"@remotion/licensing": "4.0.
|
|
30
|
+
"@remotion/licensing": "4.0.414"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"react": ">=16.8.0",
|
|
@@ -41,19 +41,19 @@
|
|
|
41
41
|
"react-dom": "19.2.3",
|
|
42
42
|
"@typescript/native-preview": "7.0.0-dev.20260105.1",
|
|
43
43
|
"@types/ws": "8.5.10",
|
|
44
|
-
"@remotion/example-videos": "4.0.
|
|
45
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
44
|
+
"@remotion/example-videos": "4.0.414",
|
|
45
|
+
"@remotion/eslint-config-internal": "4.0.414",
|
|
46
46
|
"eslint": "9.19.0",
|
|
47
47
|
"@types/node": "20.12.14"
|
|
48
48
|
},
|
|
49
49
|
"optionalDependencies": {
|
|
50
|
-
"@remotion/compositor-darwin-arm64": "4.0.
|
|
51
|
-
"@remotion/compositor-darwin-x64": "4.0.
|
|
52
|
-
"@remotion/compositor-linux-arm64-gnu": "4.0.
|
|
53
|
-
"@remotion/compositor-linux-arm64-musl": "4.0.
|
|
54
|
-
"@remotion/compositor-linux-x64-gnu": "4.0.
|
|
55
|
-
"@remotion/compositor-linux-x64-musl": "4.0.
|
|
56
|
-
"@remotion/compositor-win32-x64-msvc": "4.0.
|
|
50
|
+
"@remotion/compositor-darwin-arm64": "4.0.414",
|
|
51
|
+
"@remotion/compositor-darwin-x64": "4.0.414",
|
|
52
|
+
"@remotion/compositor-linux-arm64-gnu": "4.0.414",
|
|
53
|
+
"@remotion/compositor-linux-arm64-musl": "4.0.414",
|
|
54
|
+
"@remotion/compositor-linux-x64-gnu": "4.0.414",
|
|
55
|
+
"@remotion/compositor-linux-x64-musl": "4.0.414",
|
|
56
|
+
"@remotion/compositor-win32-x64-msvc": "4.0.414"
|
|
57
57
|
},
|
|
58
58
|
"keywords": [
|
|
59
59
|
"remotion",
|