@remotion/cli 3.3.11 → 3.3.13
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/config/chromium-flags.d.ts +0 -2
- package/dist/config/chromium-flags.js +1 -8
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.js +0 -2
- package/dist/config/log.d.ts +1 -1
- package/dist/editor/components/RenderButton.d.ts +6 -0
- package/dist/editor/components/RenderButton.js +53 -0
- package/dist/editor/components/RenderModal/RenderModal.d.ts +5 -0
- package/dist/editor/components/RenderModal/RenderModal.js +90 -0
- package/dist/editor/components/RenderQueue/RenderQueueItem.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueItem.js +25 -0
- package/dist/editor/components/RenderQueue/RenderQueueItemStatus.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +19 -0
- package/dist/editor/components/RenderQueue/RenderQueueOutputName.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +70 -0
- package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +56 -0
- package/dist/editor/components/RenderQueue/context.d.ts +18 -0
- package/dist/editor/components/RenderQueue/context.js +49 -0
- package/dist/editor/components/RenderQueue/index.d.ts +2 -0
- package/dist/editor/components/RenderQueue/index.js +18 -0
- package/dist/editor/components/RendersTab.d.ts +6 -0
- package/dist/editor/components/RendersTab.js +40 -0
- package/dist/editor/components/SidebarContent.d.ts +5 -0
- package/dist/editor/components/SidebarContent.js +34 -0
- package/dist/editor/components/Tabs/index.d.ts +11 -0
- package/dist/editor/components/Tabs/index.js +49 -0
- package/dist/editor/icons/render.d.ts +6 -0
- package/dist/editor/icons/render.js +8 -0
- package/dist/find-closest-package-json.d.ts +2 -0
- package/dist/find-closest-package-json.js +35 -0
- package/dist/get-cli-options.d.ts +1 -1
- package/dist/get-cli-options.js +0 -1
- package/dist/get-default-out-name.d.ts +4 -0
- package/dist/get-default-out-name.js +8 -0
- package/dist/index.d.ts +1 -1
- package/dist/parse-command-line.d.ts +0 -1
- package/dist/parse-command-line.js +0 -3
- package/dist/preview-server/get-absolute-public-dir.d.ts +4 -0
- package/dist/preview-server/get-absolute-public-dir.js +14 -0
- package/dist/preview-server/get-files-in-public-folder.d.ts +2 -0
- package/dist/preview-server/get-files-in-public-folder.js +7 -0
- package/dist/preview-server/live-event-listener.d.ts +0 -0
- package/dist/preview-server/live-event-listener.js +1 -0
- package/dist/preview-server/parse-body.d.ts +2 -0
- package/dist/preview-server/parse-body.js +16 -0
- package/dist/preview-server/public-folder.d.ts +12 -0
- package/dist/preview-server/public-folder.js +39 -0
- package/dist/preview-server/render-queue/add-render.d.ts +2 -0
- package/dist/preview-server/render-queue/add-render.js +39 -0
- package/dist/preview-server/render-queue/index.d.ts +7 -0
- package/dist/preview-server/render-queue/index.js +105 -0
- package/dist/preview-server/render-queue/job.d.ts +29 -0
- package/dist/preview-server/render-queue/job.js +2 -0
- package/dist/preview-server/render-queue/open-directory-in-finder.d.ts +1 -0
- package/dist/preview-server/render-queue/open-directory-in-finder.js +32 -0
- package/dist/preview-server/render-queue/open-in-file-explorer.d.ts +2 -0
- package/dist/preview-server/render-queue/open-in-file-explorer.js +30 -0
- package/dist/preview-server/render-queue/remove-render.d.ts +2 -0
- package/dist/preview-server/render-queue/remove-render.js +28 -0
- package/dist/preview-server/write-files-definition-file.d.ts +2 -0
- package/dist/preview-server/write-files-definition-file.js +37 -0
- package/package.json +7 -7
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Tab = exports.Tabs = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const colors_1 = require("../../helpers/colors");
|
|
7
|
+
const tabsContainer = {
|
|
8
|
+
display: 'flex',
|
|
9
|
+
flexDirection: 'row',
|
|
10
|
+
};
|
|
11
|
+
const Tabs = ({ children, style }) => {
|
|
12
|
+
const definiteStyle = (0, react_1.useMemo)(() => {
|
|
13
|
+
return {
|
|
14
|
+
...tabsContainer,
|
|
15
|
+
...style,
|
|
16
|
+
};
|
|
17
|
+
}, [style]);
|
|
18
|
+
return (0, jsx_runtime_1.jsx)("div", { style: definiteStyle, children: children });
|
|
19
|
+
};
|
|
20
|
+
exports.Tabs = Tabs;
|
|
21
|
+
const selectorButton = {
|
|
22
|
+
border: 'none',
|
|
23
|
+
flex: 1,
|
|
24
|
+
padding: 8,
|
|
25
|
+
fontSize: 13,
|
|
26
|
+
};
|
|
27
|
+
const Tab = ({ children, onClick, style, selected }) => {
|
|
28
|
+
const [hovered, setHovered] = (0, react_1.useState)(false);
|
|
29
|
+
const onPointerEnter = (0, react_1.useCallback)(() => {
|
|
30
|
+
setHovered(true);
|
|
31
|
+
}, []);
|
|
32
|
+
const onPointerLeave = (0, react_1.useCallback)(() => {
|
|
33
|
+
setHovered(false);
|
|
34
|
+
}, []);
|
|
35
|
+
const definiteStyle = (0, react_1.useMemo)(() => {
|
|
36
|
+
return {
|
|
37
|
+
...selectorButton,
|
|
38
|
+
backgroundColor: selected
|
|
39
|
+
? colors_1.SELECTED_BACKGROUND
|
|
40
|
+
: hovered
|
|
41
|
+
? colors_1.CLEAR_HOVER
|
|
42
|
+
: 'transparent',
|
|
43
|
+
color: selected ? 'white' : colors_1.LIGHT_TEXT,
|
|
44
|
+
...style,
|
|
45
|
+
};
|
|
46
|
+
}, [hovered, selected, style]);
|
|
47
|
+
return ((0, jsx_runtime_1.jsx)("button", { style: definiteStyle, type: "button", onClick: onClick, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: children }));
|
|
48
|
+
};
|
|
49
|
+
exports.Tab = Tab;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RenderIcon = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const RenderIcon = (props) => {
|
|
6
|
+
return ((0, jsx_runtime_1.jsx)("svg", { ...props.svgProps, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", children: (0, jsx_runtime_1.jsx)("path", { fill: props.color, d: "M408 143.1C408 166.1 390.1 183.1 368 183.1C345.9 183.1 328 166.1 328 143.1C328 121.9 345.9 103.1 368 103.1C390.1 103.1 408 121.9 408 143.1zM384 312.1V394.2C384 419.7 370.6 443.2 348.7 456.2L260.2 508.6C252.8 513 243.6 513.1 236.1 508.9C228.6 504.6 224 496.6 224 488V373.3C224 350.6 215 328.1 199 312.1C183 296.1 161.4 288 138.7 288H24C15.38 288 7.414 283.4 3.146 275.9C-1.123 268.4-1.042 259.2 3.357 251.8L55.83 163.3C68.79 141.4 92.33 127.1 117.8 127.1H199.9C281.7-3.798 408.8-8.546 483.9 5.272C495.6 7.411 504.6 16.45 506.7 28.07C520.5 103.2 515.8 230.3 384 312.1V312.1zM197.9 253.9C210.8 260.2 222.6 268.7 232.1 279C243.3 289.4 251.8 301.2 258.1 314.1C363.9 284.1 414.8 234.5 439.7 188C464.7 141.3 466.1 90.47 461.7 50.33C421.5 45.02 370.7 47.34 323.1 72.33C277.5 97.16 227.9 148.1 197.9 253.9H197.9zM41.98 345.5C76.37 311.1 132.1 311.1 166.5 345.5C200.9 379.9 200.9 435.6 166.5 470C117 519.5 .4765 511.5 .4765 511.5C.4765 511.5-7.516 394.1 41.98 345.5V345.5zM64.58 447.4C64.58 447.4 103.3 450.1 119.8 433.6C131.2 422.2 131.2 403.6 119.8 392.2C108.3 380.8 89.81 380.8 78.38 392.2C61.92 408.7 64.58 447.4 64.58 447.4z" }) }));
|
|
7
|
+
};
|
|
8
|
+
exports.RenderIcon = RenderIcon;
|
|
@@ -0,0 +1,35 @@
|
|
|
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.findRemotionRoot = exports.findClosestPackageJson = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const log_1 = require("./log");
|
|
10
|
+
const recursionLimit = 5;
|
|
11
|
+
const findClosestPackageJson = () => {
|
|
12
|
+
let currentDir = process.cwd();
|
|
13
|
+
let possiblePackageJson = '';
|
|
14
|
+
for (let i = 0; i < recursionLimit; i++) {
|
|
15
|
+
possiblePackageJson = path_1.default.join(currentDir, 'package.json');
|
|
16
|
+
const exists = fs_1.default.existsSync(possiblePackageJson);
|
|
17
|
+
if (exists) {
|
|
18
|
+
return possiblePackageJson;
|
|
19
|
+
}
|
|
20
|
+
currentDir = path_1.default.dirname(currentDir);
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
};
|
|
24
|
+
exports.findClosestPackageJson = findClosestPackageJson;
|
|
25
|
+
const findRemotionRoot = () => {
|
|
26
|
+
const closestPackageJson = (0, exports.findClosestPackageJson)();
|
|
27
|
+
if (closestPackageJson === null) {
|
|
28
|
+
log_1.Log.error('Could not find a package.json in the current directory or any of the ' +
|
|
29
|
+
recursionLimit +
|
|
30
|
+
' parent directories. Is this a Remotion project?');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
return path_1.default.dirname(closestPackageJson);
|
|
34
|
+
};
|
|
35
|
+
exports.findRemotionRoot = findRemotionRoot;
|
|
@@ -30,7 +30,7 @@ export declare const getCliOptions: (options: {
|
|
|
30
30
|
browserExecutable: BrowserExecutable;
|
|
31
31
|
ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
|
|
32
32
|
ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
|
|
33
|
-
logLevel: "
|
|
33
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
34
34
|
scale: number;
|
|
35
35
|
chromiumOptions: ChromiumOptions;
|
|
36
36
|
overwrite: boolean;
|
package/dist/get-cli-options.js
CHANGED
|
@@ -131,7 +131,6 @@ const getCliOptions = async (options) => {
|
|
|
131
131
|
ignoreCertificateErrors: config_1.ConfigInternals.getIgnoreCertificateErrors(),
|
|
132
132
|
headless: config_1.ConfigInternals.getChromiumHeadlessMode(),
|
|
133
133
|
gl: (_a = config_1.ConfigInternals.getChromiumOpenGlRenderer()) !== null && _a !== void 0 ? _a : renderer_1.RenderInternals.DEFAULT_OPENGL_RENDERER,
|
|
134
|
-
enableExtensions: config_1.ConfigInternals.getChromiumEnableExtensions(),
|
|
135
134
|
};
|
|
136
135
|
const everyNthFrame = config_1.ConfigInternals.getEveryNthFrame();
|
|
137
136
|
const numberOfGifLoops = config_1.ConfigInternals.getNumberOfGifLoops();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultOutLocation = void 0;
|
|
4
|
+
const getDefaultOutLocation = ({ compositionName, defaultExtension, }) => {
|
|
5
|
+
const defaultName = `out/${compositionName}.${defaultExtension}`;
|
|
6
|
+
return defaultName;
|
|
7
|
+
};
|
|
8
|
+
exports.getDefaultOutLocation = getDefaultOutLocation;
|
package/dist/index.d.ts
CHANGED
|
@@ -88,7 +88,7 @@ export declare const CliInternals: {
|
|
|
88
88
|
browserExecutable: import("@remotion/renderer").BrowserExecutable;
|
|
89
89
|
ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
|
|
90
90
|
ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
|
|
91
|
-
logLevel: "
|
|
91
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
92
92
|
scale: number;
|
|
93
93
|
chromiumOptions: import("@remotion/renderer").ChromiumOptions;
|
|
94
94
|
overwrite: boolean;
|
|
@@ -65,9 +65,6 @@ const parseCommandLine = () => {
|
|
|
65
65
|
if (exports.parsedCli['disable-headless']) {
|
|
66
66
|
config_1.Config.Puppeteer.setChromiumHeadlessMode(false);
|
|
67
67
|
}
|
|
68
|
-
if (exports.parsedCli['enable-extensions']) {
|
|
69
|
-
config_1.Config.Puppeteer.setEnableChromiumExtensions(true);
|
|
70
|
-
}
|
|
71
68
|
if (exports.parsedCli.log) {
|
|
72
69
|
if (!renderer_1.RenderInternals.isValidLogLevel(exports.parsedCli.log)) {
|
|
73
70
|
log_1.Log.error('Invalid `--log` value passed.');
|
|
@@ -0,0 +1,14 @@
|
|
|
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.getAbsolutePublicDir = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const getAbsolutePublicDir = ({ userPassedPublicDir, remotionRoot, }) => {
|
|
9
|
+
const publicDir = userPassedPublicDir
|
|
10
|
+
? path_1.default.resolve(remotionRoot, userPassedPublicDir)
|
|
11
|
+
: path_1.default.join(remotionRoot, 'public');
|
|
12
|
+
return publicDir;
|
|
13
|
+
};
|
|
14
|
+
exports.getAbsolutePublicDir = getAbsolutePublicDir;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFilesInPublicFolder = void 0;
|
|
4
|
+
const getFilesInPublicFolder = (publicFolder) => {
|
|
5
|
+
return readRecursively({ folder: '.', startPath: publicFolder });
|
|
6
|
+
};
|
|
7
|
+
exports.getFilesInPublicFolder = getFilesInPublicFolder;
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseRequestBody = void 0;
|
|
4
|
+
const parseRequestBody = async (req) => {
|
|
5
|
+
const body = await new Promise((_resolve) => {
|
|
6
|
+
let data = '';
|
|
7
|
+
req.on('data', (chunk) => {
|
|
8
|
+
data += chunk;
|
|
9
|
+
});
|
|
10
|
+
req.on('end', () => {
|
|
11
|
+
_resolve(data.toString());
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
return JSON.parse(body);
|
|
15
|
+
};
|
|
16
|
+
exports.parseRequestBody = parseRequestBody;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StaticFile } from 'remotion';
|
|
2
|
+
export declare const initPublicFolderWatch: ({ publicDir, remotionRoot, onUpdate, }: {
|
|
3
|
+
publicDir: string;
|
|
4
|
+
remotionRoot: string;
|
|
5
|
+
onUpdate: () => void;
|
|
6
|
+
}) => void;
|
|
7
|
+
export declare const watchPublicFolder: ({ publicDir, remotionRoot, onUpdate, }: {
|
|
8
|
+
publicDir: string;
|
|
9
|
+
remotionRoot: string;
|
|
10
|
+
onUpdate: () => void;
|
|
11
|
+
}) => void;
|
|
12
|
+
export declare const getFiles: () => StaticFile[];
|
|
@@ -0,0 +1,39 @@
|
|
|
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.getFiles = exports.watchPublicFolder = exports.initPublicFolderWatch = void 0;
|
|
7
|
+
const bundler_1 = require("@remotion/bundler");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const write_files_definition_file_1 = require("./write-files-definition-file");
|
|
11
|
+
let files = [];
|
|
12
|
+
const initPublicFolderWatch = ({ publicDir, remotionRoot, onUpdate, }) => {
|
|
13
|
+
fetchFolder({ publicDir, remotionRoot });
|
|
14
|
+
(0, exports.watchPublicFolder)({ publicDir, remotionRoot, onUpdate });
|
|
15
|
+
};
|
|
16
|
+
exports.initPublicFolderWatch = initPublicFolderWatch;
|
|
17
|
+
const fetchFolder = ({ publicDir, remotionRoot, }) => {
|
|
18
|
+
files = bundler_1.BundlerInternals.readRecursively({
|
|
19
|
+
folder: '.',
|
|
20
|
+
startPath: publicDir,
|
|
21
|
+
}).map((f) => {
|
|
22
|
+
return {
|
|
23
|
+
...f,
|
|
24
|
+
path: f.path.split(path_1.default.sep).join('/'),
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
(0, write_files_definition_file_1.writeFilesDefinitionFile)(files, remotionRoot);
|
|
28
|
+
};
|
|
29
|
+
const watchPublicFolder = ({ publicDir, remotionRoot, onUpdate, }) => {
|
|
30
|
+
(0, fs_1.watch)(publicDir, { recursive: true }, () => {
|
|
31
|
+
fetchFolder({ publicDir, remotionRoot });
|
|
32
|
+
onUpdate();
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
exports.watchPublicFolder = watchPublicFolder;
|
|
36
|
+
const getFiles = () => {
|
|
37
|
+
return files;
|
|
38
|
+
};
|
|
39
|
+
exports.getFiles = getFiles;
|
|
@@ -0,0 +1,39 @@
|
|
|
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.handleAddRender = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const _1 = require(".");
|
|
9
|
+
const parse_body_1 = require("../parse-body");
|
|
10
|
+
const handleAddRender = async (remotionRoot, req, res, entryPoint) => {
|
|
11
|
+
if (req.method === 'OPTIONS') {
|
|
12
|
+
res.statusCode = 200;
|
|
13
|
+
res.end();
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const body = (await (0, parse_body_1.parseRequestBody)(req));
|
|
17
|
+
(0, _1.addJob)({
|
|
18
|
+
compositionId: body.compositionId,
|
|
19
|
+
id: String(Math.random()).replace('0.', ''),
|
|
20
|
+
startedAt: Date.now(),
|
|
21
|
+
type: 'still',
|
|
22
|
+
outputLocation: path_1.default.resolve(remotionRoot, body.outName),
|
|
23
|
+
status: 'idle',
|
|
24
|
+
}, entryPoint);
|
|
25
|
+
res.setHeader('content-type', 'application/json');
|
|
26
|
+
res.writeHead(200);
|
|
27
|
+
res.end(JSON.stringify({
|
|
28
|
+
success: true,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
res.setHeader('content-type', 'application/json');
|
|
33
|
+
res.writeHead(200);
|
|
34
|
+
res.end(JSON.stringify({
|
|
35
|
+
success: false,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.handleAddRender = handleAddRender;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RenderJob } from './job';
|
|
2
|
+
export declare const getRenderQueue: () => RenderJob[];
|
|
3
|
+
export declare const notifyClientsOfJobUpdate: () => void;
|
|
4
|
+
export declare const processJob: (job: RenderJob, entryPoint: string) => Promise<never>;
|
|
5
|
+
export declare const addJob: (job: RenderJob, entryPoint: string) => void;
|
|
6
|
+
export declare const removeJob: (jobId: string) => void;
|
|
7
|
+
export declare const processJobIfPossible: (entryPoint: string) => Promise<void>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processJobIfPossible = exports.removeJob = exports.addJob = exports.processJob = exports.notifyClientsOfJobUpdate = exports.getRenderQueue = void 0;
|
|
4
|
+
const bundler_1 = require("@remotion/bundler");
|
|
5
|
+
const renderer_1 = require("@remotion/renderer");
|
|
6
|
+
const live_events_1 = require("../live-events");
|
|
7
|
+
let jobQueue = [];
|
|
8
|
+
const updateJob = (id, updater) => {
|
|
9
|
+
jobQueue = jobQueue.map((j) => {
|
|
10
|
+
if (id === j.id) {
|
|
11
|
+
return updater(j);
|
|
12
|
+
}
|
|
13
|
+
return j;
|
|
14
|
+
});
|
|
15
|
+
(0, exports.notifyClientsOfJobUpdate)();
|
|
16
|
+
};
|
|
17
|
+
const getRenderQueue = () => {
|
|
18
|
+
return jobQueue;
|
|
19
|
+
};
|
|
20
|
+
exports.getRenderQueue = getRenderQueue;
|
|
21
|
+
const notifyClientsOfJobUpdate = () => {
|
|
22
|
+
(0, live_events_1.waitForLiveEventsListener)().then((listener) => {
|
|
23
|
+
listener.sendEventToClient({
|
|
24
|
+
type: 'render-queue-updated',
|
|
25
|
+
queue: jobQueue,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
exports.notifyClientsOfJobUpdate = notifyClientsOfJobUpdate;
|
|
30
|
+
const processJob = async (job, entryPoint) => {
|
|
31
|
+
if (job.type === 'still') {
|
|
32
|
+
const serveUrl = await (0, bundler_1.bundle)({
|
|
33
|
+
entryPoint,
|
|
34
|
+
// TODO: Accept CLI options
|
|
35
|
+
});
|
|
36
|
+
const compositions = await (0, renderer_1.getCompositions)(serveUrl, {
|
|
37
|
+
// TODO: Accept CLI option
|
|
38
|
+
});
|
|
39
|
+
const composition = compositions.find((c) => {
|
|
40
|
+
return c.id === job.compositionId;
|
|
41
|
+
});
|
|
42
|
+
if (!composition) {
|
|
43
|
+
throw new TypeError(`Composition ${job.compositionId} not found`);
|
|
44
|
+
}
|
|
45
|
+
await (0, renderer_1.renderStill)({
|
|
46
|
+
composition,
|
|
47
|
+
output: job.outputLocation,
|
|
48
|
+
serveUrl,
|
|
49
|
+
// TODO: Accept CLI options
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
throw new TypeError(`Could not process job of type ${job.type}`);
|
|
53
|
+
};
|
|
54
|
+
exports.processJob = processJob;
|
|
55
|
+
const addJob = (job, entryPoint) => {
|
|
56
|
+
jobQueue.push(job);
|
|
57
|
+
(0, exports.processJobIfPossible)(entryPoint);
|
|
58
|
+
(0, exports.notifyClientsOfJobUpdate)();
|
|
59
|
+
};
|
|
60
|
+
exports.addJob = addJob;
|
|
61
|
+
const removeJob = (jobId) => {
|
|
62
|
+
jobQueue = jobQueue.filter((job) => job.id !== jobId);
|
|
63
|
+
(0, exports.notifyClientsOfJobUpdate)();
|
|
64
|
+
};
|
|
65
|
+
exports.removeJob = removeJob;
|
|
66
|
+
const processJobIfPossible = async (entryPoint) => {
|
|
67
|
+
const nextJob = jobQueue.find((q) => {
|
|
68
|
+
return q.status === 'idle';
|
|
69
|
+
});
|
|
70
|
+
if (!nextJob) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
updateJob(nextJob.id, (job) => {
|
|
75
|
+
return {
|
|
76
|
+
...job,
|
|
77
|
+
status: 'running',
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
await (0, exports.processJob)(nextJob, entryPoint);
|
|
81
|
+
updateJob(nextJob.id, (job) => {
|
|
82
|
+
return {
|
|
83
|
+
...job,
|
|
84
|
+
status: 'done',
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
updateJob(nextJob.id, (job) => {
|
|
90
|
+
return {
|
|
91
|
+
...job,
|
|
92
|
+
status: 'failed',
|
|
93
|
+
error: err,
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
(0, live_events_1.waitForLiveEventsListener)().then((listener) => {
|
|
97
|
+
listener.sendEventToClient({
|
|
98
|
+
type: 'render-job-failed',
|
|
99
|
+
compositionId: nextJob.compositionId,
|
|
100
|
+
error: err,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
exports.processJobIfPossible = processJobIfPossible;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare type RenderJobDynamicStatus = {
|
|
2
|
+
status: 'done';
|
|
3
|
+
} | {
|
|
4
|
+
status: 'running';
|
|
5
|
+
} | {
|
|
6
|
+
status: 'idle';
|
|
7
|
+
} | {
|
|
8
|
+
status: 'failed';
|
|
9
|
+
error: Error;
|
|
10
|
+
};
|
|
11
|
+
export declare type RenderJob = {
|
|
12
|
+
startedAt: number;
|
|
13
|
+
compositionId: string;
|
|
14
|
+
type: 'still' | 'composition';
|
|
15
|
+
id: string;
|
|
16
|
+
outputLocation: string;
|
|
17
|
+
} & RenderJobDynamicStatus;
|
|
18
|
+
export declare type AddRenderRequest = {
|
|
19
|
+
compositionId: string;
|
|
20
|
+
type: 'still' | 'composition';
|
|
21
|
+
outName: string;
|
|
22
|
+
};
|
|
23
|
+
export declare type RemoveRenderRequest = {
|
|
24
|
+
jobId: string;
|
|
25
|
+
};
|
|
26
|
+
export declare type OpenInFileExplorerRequest = {
|
|
27
|
+
directory: string;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const openDirectoryInFinder: (dirToOpen: string) => Promise<void>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openDirectoryInFinder = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
const openDirectoryInFinder = (dirToOpen) => {
|
|
7
|
+
const command = (0, os_1.platform)() === 'darwin'
|
|
8
|
+
? 'open'
|
|
9
|
+
: (0, os_1.platform)() === 'linux'
|
|
10
|
+
? 'xdg-open'
|
|
11
|
+
: 'explorer';
|
|
12
|
+
// TODO: What if file was deleted in the meanwhile?
|
|
13
|
+
// TODO: '-R' only works on macOS
|
|
14
|
+
const p = (0, child_process_1.spawn)(command, ['-R', dirToOpen]);
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
p.on('exit', (code) => {
|
|
17
|
+
if (code === 0) {
|
|
18
|
+
resolve();
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
reject(new Error(`Exited with code ${code}`));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
p.on('error', (err) => {
|
|
25
|
+
p.kill();
|
|
26
|
+
if (err) {
|
|
27
|
+
reject(err);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
exports.openDirectoryInFinder = openDirectoryInFinder;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleOpenInFileExplorer = void 0;
|
|
4
|
+
const parse_body_1 = require("../parse-body");
|
|
5
|
+
const open_directory_in_finder_1 = require("./open-directory-in-finder");
|
|
6
|
+
const handleOpenInFileExplorer = async (req, res) => {
|
|
7
|
+
if (req.method === 'OPTIONS') {
|
|
8
|
+
res.statusCode = 200;
|
|
9
|
+
res.end();
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const body = (await (0, parse_body_1.parseRequestBody)(req));
|
|
13
|
+
// TODO: Disallow opening file that is not in Remotion CWD
|
|
14
|
+
await (0, open_directory_in_finder_1.openDirectoryInFinder)(body.directory);
|
|
15
|
+
res.setHeader('content-type', 'application/json');
|
|
16
|
+
res.writeHead(200);
|
|
17
|
+
res.end(JSON.stringify({
|
|
18
|
+
success: true,
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
res.setHeader('content-type', 'application/json');
|
|
23
|
+
res.writeHead(200);
|
|
24
|
+
res.end(JSON.stringify({
|
|
25
|
+
success: false,
|
|
26
|
+
error: err.message,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.handleOpenInFileExplorer = handleOpenInFileExplorer;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleRemoveRender = void 0;
|
|
4
|
+
const _1 = require(".");
|
|
5
|
+
const parse_body_1 = require("../parse-body");
|
|
6
|
+
const handleRemoveRender = async (req, res) => {
|
|
7
|
+
if (req.method === 'OPTIONS') {
|
|
8
|
+
res.statusCode = 200;
|
|
9
|
+
res.end();
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const body = (await (0, parse_body_1.parseRequestBody)(req));
|
|
13
|
+
(0, _1.removeJob)(body.jobId);
|
|
14
|
+
res.setHeader('content-type', 'application/json');
|
|
15
|
+
res.writeHead(200);
|
|
16
|
+
res.end(JSON.stringify({
|
|
17
|
+
success: true,
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
res.setHeader('content-type', 'application/json');
|
|
22
|
+
res.writeHead(200);
|
|
23
|
+
res.end(JSON.stringify({
|
|
24
|
+
success: false,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.handleRemoveRender = handleRemoveRender;
|
|
@@ -0,0 +1,37 @@
|
|
|
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.writeFilesDefinitionFile = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const writeFilesDefinitionFile = (files, remotionRoot) => {
|
|
10
|
+
const content = `
|
|
11
|
+
/*
|
|
12
|
+
This file will give you autocompletions for staticFile().
|
|
13
|
+
Enable autocompletion by adding "autocomplete.d.ts" to the "include" array in "tsconfig.json".
|
|
14
|
+
This file is auto-generated - do not edit this file!
|
|
15
|
+
You may add it to your \`.gitignore\`.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
declare global {
|
|
19
|
+
interface RemotionStaticPaths {
|
|
20
|
+
${files
|
|
21
|
+
.map((f) => {
|
|
22
|
+
// TODO: What if file contains '"'?
|
|
23
|
+
return ` ["${f.path}"]: unknown;`;
|
|
24
|
+
})
|
|
25
|
+
.join('\n')}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export {}
|
|
29
|
+
`.trimStart();
|
|
30
|
+
const folder = path_1.default.join(remotionRoot);
|
|
31
|
+
if (!(0, fs_1.existsSync)(folder)) {
|
|
32
|
+
(0, fs_1.mkdirSync)(folder);
|
|
33
|
+
}
|
|
34
|
+
// TODO: Create folder if exists
|
|
35
|
+
(0, fs_1.writeFileSync)(path_1.default.join(folder, 'autocomplete.d.ts'), content);
|
|
36
|
+
};
|
|
37
|
+
exports.writeFilesDefinitionFile = writeFilesDefinitionFile;
|