@remotion/cli 3.3.18 → 3.3.19
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/LICENSE.md +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/open-browser.d.ts +2 -0
- package/dist/config/open-browser.js +15 -0
- package/dist/convert-entry-point-to-serve-url.d.ts +1 -0
- package/dist/convert-entry-point-to-serve-url.js +15 -0
- package/dist/editor/components/CollapsableOptions.d.ts +6 -0
- package/dist/editor/components/CollapsableOptions.js +35 -0
- package/dist/editor/components/InlineAction.d.ts +5 -0
- package/dist/editor/components/InlineAction.js +32 -0
- package/dist/editor/components/RenderButton.d.ts +1 -1
- package/dist/editor/components/RenderButton.js +24 -34
- package/dist/editor/components/RenderModal/RenderErrorModal.d.ts +5 -0
- package/dist/editor/components/RenderModal/RenderErrorModal.js +64 -0
- package/dist/editor/components/RenderModal/RenderModal.d.ts +8 -2
- package/dist/editor/components/RenderModal/RenderModal.js +204 -32
- package/dist/editor/components/RenderQueue/CircularProgress.d.ts +5 -0
- package/dist/editor/components/RenderQueue/CircularProgress.js +18 -0
- package/dist/editor/components/RenderQueue/RenderQueueError.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueError.js +26 -0
- package/dist/editor/components/RenderQueue/RenderQueueItem.js +14 -1
- package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +11 -3
- package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +12 -52
- package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.js +27 -0
- package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +6 -40
- package/dist/editor/components/RenderQueue/RenderQueueRepeat.d.ts +5 -0
- package/dist/editor/components/RenderQueue/RenderQueueRepeat.js +22 -0
- package/dist/editor/components/RenderQueue/actions.d.ts +32 -0
- package/dist/editor/components/RenderQueue/actions.js +75 -0
- package/dist/editor/components/RenderQueue/context.d.ts +1 -0
- package/dist/editor/components/RenderQueue/context.js +6 -1
- package/dist/editor/components/RenderQueue/index.js +1 -1
- package/dist/editor/components/RenderQueue/item-style.d.ts +2 -0
- package/dist/editor/components/RenderQueue/item-style.js +21 -0
- package/dist/editor/components/RenderToolbarIcon.d.ts +2 -0
- package/dist/editor/components/RenderToolbarIcon.js +47 -0
- package/dist/editor/components/RendersTab.js +6 -2
- package/dist/editor/components/SegmentedControl.d.ts +15 -0
- package/dist/editor/components/SegmentedControl.js +46 -0
- package/dist/editor/components/SidebarContent.js +21 -4
- package/dist/editor/components/Tabs/index.js +3 -1
- package/dist/editor/components/Timeline/TimelineZoomControls.js +3 -1
- package/dist/editor/helpers/use-file-existence.d.ts +1 -0
- package/dist/editor/helpers/use-file-existence.js +57 -0
- package/dist/editor/helpers/use-menu-structure.js +15 -1
- package/dist/editor/icons/RenderStillIcon.d.ts +3 -0
- package/dist/editor/icons/RenderStillIcon.js +8 -0
- package/dist/editor/icons/render.d.ts +0 -1
- package/dist/editor/icons/render.js +1 -1
- package/dist/editor/icons/video.d.ts +5 -0
- package/dist/editor/icons/video.js +8 -0
- package/dist/file-watcher.d.ts +9 -0
- package/dist/file-watcher.js +35 -0
- package/dist/list-of-remotion-packages.js +1 -0
- package/dist/load-config.js +1 -10
- package/dist/parse-command-line.d.ts +1 -0
- package/dist/parse-command-line.js +1 -0
- package/dist/preview-server/actions.d.ts +0 -0
- package/dist/preview-server/actions.js +1 -0
- package/dist/preview-server/api-routes.d.ts +4 -0
- package/dist/preview-server/api-routes.js +15 -0
- package/dist/preview-server/api-types.d.ts +26 -0
- package/dist/preview-server/api-types.js +2 -0
- package/dist/preview-server/file-existence-watchers.d.ts +10 -0
- package/dist/preview-server/file-existence-watchers.js +46 -0
- package/dist/preview-server/get-file-existence.d.ts +2 -0
- package/dist/preview-server/get-file-existence.js +36 -0
- package/dist/preview-server/handler.d.ts +9 -0
- package/dist/preview-server/handler.js +34 -0
- package/dist/preview-server/render-queue/add-render.d.ts +3 -2
- package/dist/preview-server/render-queue/add-render.js +20 -25
- package/dist/preview-server/render-queue/index.d.ts +14 -3
- package/dist/preview-server/render-queue/index.js +51 -10
- package/dist/preview-server/render-queue/job.d.ts +56 -6
- package/dist/preview-server/render-queue/make-retry-payload.d.ts +3 -0
- package/dist/preview-server/render-queue/make-retry-payload.js +32 -0
- package/dist/preview-server/render-queue/open-directory-in-finder.js +7 -5
- package/dist/preview-server/render-queue/open-in-file-explorer.js +1 -0
- package/dist/preview-server/render-queue/process-still.d.ts +7 -0
- package/dist/preview-server/render-queue/process-still.js +49 -0
- package/dist/preview-server/render-queue/process-video.d.ts +7 -0
- package/dist/preview-server/render-queue/process-video.js +55 -0
- package/dist/preview-server/render-queue/queue.d.ts +19 -0
- package/dist/preview-server/render-queue/queue.js +150 -0
- package/dist/preview-server/render-queue/remove-render.js +3 -2
- package/dist/preview-server/routes/add-render.d.ts +3 -0
- package/dist/preview-server/routes/add-render.js +52 -0
- package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
- package/dist/preview-server/routes/open-in-file-explorer.js +14 -0
- package/dist/preview-server/routes/remove-render.d.ts +3 -0
- package/dist/preview-server/routes/remove-render.js +9 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.js +9 -0
- package/dist/preview.js +25 -1
- package/dist/render-flows/render.d.ts +33 -0
- package/dist/render-flows/render.js +251 -0
- package/dist/render-flows/still.d.ts +30 -0
- package/dist/render-flows/still.js +170 -0
- package/package.json +7 -7
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleRemoveRender = void 0;
|
|
4
|
+
const queue_1 = require("../render-queue/queue");
|
|
5
|
+
const handleRemoveRender = ({ input: { jobId }, }) => {
|
|
6
|
+
(0, queue_1.removeJob)(jobId);
|
|
7
|
+
return Promise.resolve(undefined);
|
|
8
|
+
};
|
|
9
|
+
exports.handleRemoveRender = handleRemoveRender;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ApiHandler } from '../api-types';
|
|
2
|
+
import type { SubscribeToFileExistenceRequest, SubscribeToFileExistenceResponse } from '../render-queue/job';
|
|
3
|
+
export declare const subscribeToFileExistence: ApiHandler<SubscribeToFileExistenceRequest, SubscribeToFileExistenceResponse>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.subscribeToFileExistence = void 0;
|
|
4
|
+
const file_existence_watchers_1 = require("../file-existence-watchers");
|
|
5
|
+
const subscribeToFileExistence = ({ input: { file }, remotionRoot }) => {
|
|
6
|
+
// TODO: What if the user reloads the page? The file watcher doesn't get cleared
|
|
7
|
+
const { exists } = (0, file_existence_watchers_1.subscribeToFileExistenceWatchers)({
|
|
8
|
+
file,
|
|
9
|
+
remotionRoot,
|
|
10
|
+
});
|
|
11
|
+
return Promise.resolve({ exists });
|
|
12
|
+
};
|
|
13
|
+
exports.subscribeToFileExistence = subscribeToFileExistence;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unsubscribeFromFileExistence = void 0;
|
|
4
|
+
const file_existence_watchers_1 = require("../file-existence-watchers");
|
|
5
|
+
const unsubscribeFromFileExistence = ({ input, remotionRoot }) => {
|
|
6
|
+
(0, file_existence_watchers_1.unsubscribeFromFileExistenceWatchers)({ file: input.file, remotionRoot });
|
|
7
|
+
return Promise.resolve(undefined);
|
|
8
|
+
};
|
|
9
|
+
exports.unsubscribeFromFileExistence = unsubscribeFromFileExistence;
|
package/dist/preview.js
CHANGED
|
@@ -32,6 +32,24 @@ const waitForLiveEventsListener = () => {
|
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
};
|
|
35
|
+
const getShouldOpenBrowser = () => {
|
|
36
|
+
if (parse_command_line_1.parsedCli['no-open']) {
|
|
37
|
+
return {
|
|
38
|
+
shouldOpenBrowser: false,
|
|
39
|
+
reasonForBrowserDecision: '--no-open specified',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (process.env.BROWSER === 'none') {
|
|
43
|
+
return {
|
|
44
|
+
shouldOpenBrowser: false,
|
|
45
|
+
reasonForBrowserDecision: 'env BROWSER=none was set',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (config_1.ConfigInternals.getShouldOpenBrowser() === false) {
|
|
49
|
+
return { shouldOpenBrowser: false, reasonForBrowserDecision: 'Config file' };
|
|
50
|
+
}
|
|
51
|
+
return { shouldOpenBrowser: true, reasonForBrowserDecision: 'default' };
|
|
52
|
+
};
|
|
35
53
|
const previewCommand = async (remotionRoot, args) => {
|
|
36
54
|
const { file, reason } = (0, entry_point_1.findEntryPoint)(args, remotionRoot);
|
|
37
55
|
log_1.Log.verbose('Entry point:', file, 'reason:', reason);
|
|
@@ -80,7 +98,13 @@ const previewCommand = async (remotionRoot, args) => {
|
|
|
80
98
|
else {
|
|
81
99
|
log_1.Log.info(`Running on http://localhost:${port}`);
|
|
82
100
|
}
|
|
83
|
-
|
|
101
|
+
const { reasonForBrowserDecision, shouldOpenBrowser } = getShouldOpenBrowser();
|
|
102
|
+
if (shouldOpenBrowser) {
|
|
103
|
+
(0, better_opn_1.default)(`http://localhost:${port}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
log_1.Log.verbose(`Not opening browser, reason: ${reasonForBrowserDecision}`);
|
|
107
|
+
}
|
|
84
108
|
await new Promise(noop);
|
|
85
109
|
};
|
|
86
110
|
exports.previewCommand = previewCommand;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Browser, BrowserExecutable, ChromiumOptions, FfmpegExecutable, FrameRange, ImageFormat, LogLevel } from '@remotion/renderer';
|
|
2
|
+
import type { JobProgressCallback } from '../preview-server/render-queue/job';
|
|
3
|
+
export declare const renderCompFlow: ({ remotionRoot, fullEntryPoint, ffmpegExecutable, ffprobeExecutable, indentOutput, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, inputProps, envVariables, puppeteerTimeout, port, height, width, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, everyNthFrame, configFileImageFormat, quality, onProgress, }: {
|
|
4
|
+
remotionRoot: string;
|
|
5
|
+
fullEntryPoint: string;
|
|
6
|
+
entryPointReason: string;
|
|
7
|
+
browserExecutable: BrowserExecutable;
|
|
8
|
+
chromiumOptions: ChromiumOptions;
|
|
9
|
+
ffmpegExecutable: FfmpegExecutable;
|
|
10
|
+
ffprobeExecutable: FfmpegExecutable;
|
|
11
|
+
logLevel: LogLevel;
|
|
12
|
+
browser: Browser;
|
|
13
|
+
scale: number;
|
|
14
|
+
indentOutput: boolean;
|
|
15
|
+
shouldOutputImageSequence: boolean;
|
|
16
|
+
publicDir: string | null;
|
|
17
|
+
inputProps: object;
|
|
18
|
+
envVariables: Record<string, string>;
|
|
19
|
+
puppeteerTimeout: number;
|
|
20
|
+
port: number | null;
|
|
21
|
+
height: number | null;
|
|
22
|
+
width: number | null;
|
|
23
|
+
remainingArgs: string[];
|
|
24
|
+
compositionIdFromUi: string | null;
|
|
25
|
+
overwrite: boolean;
|
|
26
|
+
quiet: boolean;
|
|
27
|
+
concurrency: number | null;
|
|
28
|
+
frameRange: FrameRange | null;
|
|
29
|
+
everyNthFrame: number;
|
|
30
|
+
configFileImageFormat: ImageFormat | undefined;
|
|
31
|
+
quality: number | undefined;
|
|
32
|
+
onProgress: JobProgressCallback;
|
|
33
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,251 @@
|
|
|
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.renderCompFlow = void 0;
|
|
7
|
+
const renderer_1 = require("@remotion/renderer");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const chalk_1 = require("../chalk");
|
|
12
|
+
const get_cli_options_1 = require("../get-cli-options");
|
|
13
|
+
const get_composition_with_dimension_override_1 = require("../get-composition-with-dimension-override");
|
|
14
|
+
const get_filename_1 = require("../get-filename");
|
|
15
|
+
const get_render_media_options_1 = require("../get-render-media-options");
|
|
16
|
+
const image_formats_1 = require("../image-formats");
|
|
17
|
+
const log_1 = require("../log");
|
|
18
|
+
const progress_bar_1 = require("../progress-bar");
|
|
19
|
+
const setup_cache_1 = require("../setup-cache");
|
|
20
|
+
const truthy_1 = require("../truthy");
|
|
21
|
+
const user_passed_output_location_1 = require("../user-passed-output-location");
|
|
22
|
+
const renderCompFlow = async ({ remotionRoot, fullEntryPoint, ffmpegExecutable, ffprobeExecutable, indentOutput, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, inputProps, envVariables, puppeteerTimeout, port, height, width, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, everyNthFrame, configFileImageFormat, quality, onProgress, }) => {
|
|
23
|
+
const downloads = [];
|
|
24
|
+
const downloadMap = renderer_1.RenderInternals.makeDownloadMap();
|
|
25
|
+
const ffmpegVersion = await renderer_1.RenderInternals.getFfmpegVersion({
|
|
26
|
+
ffmpegExecutable,
|
|
27
|
+
remotionRoot,
|
|
28
|
+
});
|
|
29
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'FFMPEG Version:', ffmpegVersion ? ffmpegVersion.join('.') : 'Built from source');
|
|
30
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'Browser executable: ', browserExecutable);
|
|
31
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'Asset dirs', downloadMap.assetDir);
|
|
32
|
+
const browserInstance = (0, renderer_1.openBrowser)(browser, {
|
|
33
|
+
browserExecutable,
|
|
34
|
+
shouldDumpIo: renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose'),
|
|
35
|
+
chromiumOptions,
|
|
36
|
+
forceDeviceScaleFactor: scale,
|
|
37
|
+
indentationString: indentOutput ? log_1.INDENT_TOKEN + ' ' : '',
|
|
38
|
+
});
|
|
39
|
+
const steps = [
|
|
40
|
+
renderer_1.RenderInternals.isServeUrl(fullEntryPoint) ? null : 'bundling',
|
|
41
|
+
'rendering',
|
|
42
|
+
shouldOutputImageSequence ? null : 'stitching',
|
|
43
|
+
].filter(truthy_1.truthy);
|
|
44
|
+
const { urlOrBundle, cleanup: cleanupBundle } = await (0, setup_cache_1.bundleOnCliOrTakeServeUrl)({
|
|
45
|
+
fullPath: fullEntryPoint,
|
|
46
|
+
remotionRoot,
|
|
47
|
+
steps,
|
|
48
|
+
publicDir,
|
|
49
|
+
// TODO: Implement onProgress
|
|
50
|
+
onProgress: () => undefined,
|
|
51
|
+
indentOutput,
|
|
52
|
+
logLevel,
|
|
53
|
+
});
|
|
54
|
+
const onDownload = (src) => {
|
|
55
|
+
const id = Math.random();
|
|
56
|
+
const download = {
|
|
57
|
+
id,
|
|
58
|
+
name: src,
|
|
59
|
+
progress: 0,
|
|
60
|
+
downloaded: 0,
|
|
61
|
+
totalBytes: null,
|
|
62
|
+
};
|
|
63
|
+
downloads.push(download);
|
|
64
|
+
updateRenderProgress();
|
|
65
|
+
return ({ percent, downloaded, totalSize }) => {
|
|
66
|
+
download.progress = percent;
|
|
67
|
+
download.totalBytes = totalSize;
|
|
68
|
+
download.downloaded = downloaded;
|
|
69
|
+
updateRenderProgress();
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
const puppeteerInstance = await browserInstance;
|
|
73
|
+
const comps = await (0, renderer_1.getCompositions)(urlOrBundle, {
|
|
74
|
+
inputProps,
|
|
75
|
+
puppeteerInstance,
|
|
76
|
+
envVariables,
|
|
77
|
+
timeoutInMilliseconds: puppeteerTimeout,
|
|
78
|
+
chromiumOptions,
|
|
79
|
+
browserExecutable,
|
|
80
|
+
downloadMap,
|
|
81
|
+
port,
|
|
82
|
+
});
|
|
83
|
+
const { compositionId, config, reason, argsAfterComposition } = await (0, get_composition_with_dimension_override_1.getCompositionWithDimensionOverride)({
|
|
84
|
+
validCompositions: comps,
|
|
85
|
+
height,
|
|
86
|
+
width,
|
|
87
|
+
args: remainingArgs,
|
|
88
|
+
compositionIdFromUi,
|
|
89
|
+
});
|
|
90
|
+
// TODO: Should use codec from UI if explicitly specified
|
|
91
|
+
const { codec, reason: codecReason } = (0, get_cli_options_1.getFinalCodec)({
|
|
92
|
+
downloadName: null,
|
|
93
|
+
outName: (0, user_passed_output_location_1.getUserPassedOutputLocation)(argsAfterComposition),
|
|
94
|
+
});
|
|
95
|
+
(0, get_cli_options_1.validateFfmepgCanUseCodec)(codec, remotionRoot);
|
|
96
|
+
renderer_1.RenderInternals.validateEvenDimensionsWithCodec({
|
|
97
|
+
width: config.width,
|
|
98
|
+
height: config.height,
|
|
99
|
+
codec,
|
|
100
|
+
scale,
|
|
101
|
+
});
|
|
102
|
+
// TODO: Should use output location from UI if explicitly specified
|
|
103
|
+
const relativeOutputLocation = (0, get_filename_1.getOutputFilename)({
|
|
104
|
+
codec,
|
|
105
|
+
imageSequence: shouldOutputImageSequence,
|
|
106
|
+
compositionName: compositionId,
|
|
107
|
+
defaultExtension: renderer_1.RenderInternals.getFileExtensionFromCodec(codec, 'final'),
|
|
108
|
+
args: argsAfterComposition,
|
|
109
|
+
});
|
|
110
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.gray(`Entry point = ${fullEntryPoint} (${entryPointReason}), Composition = ${compositionId} (${reason}), Codec = ${codec} (${codecReason}), Output = ${relativeOutputLocation}`));
|
|
111
|
+
const absoluteOutputFile = (0, get_cli_options_1.getAndValidateAbsoluteOutputFile)(relativeOutputLocation, overwrite);
|
|
112
|
+
const outputDir = shouldOutputImageSequence
|
|
113
|
+
? absoluteOutputFile
|
|
114
|
+
: await fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
|
|
115
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'Output dir', outputDir);
|
|
116
|
+
const renderProgress = (0, progress_bar_1.createOverwriteableCliOutput)({
|
|
117
|
+
quiet,
|
|
118
|
+
});
|
|
119
|
+
const realFrameRange = renderer_1.RenderInternals.getRealFrameRange(config.durationInFrames, frameRange);
|
|
120
|
+
const totalFrames = renderer_1.RenderInternals.getFramesToRender(realFrameRange, everyNthFrame);
|
|
121
|
+
let encodedFrames = 0;
|
|
122
|
+
let renderedFrames = 0;
|
|
123
|
+
let encodedDoneIn = null;
|
|
124
|
+
let renderedDoneIn = null;
|
|
125
|
+
let stitchStage = 'encoding';
|
|
126
|
+
const updateRenderProgress = () => {
|
|
127
|
+
if (totalFrames.length === 0) {
|
|
128
|
+
throw new Error('totalFrames should not be 0');
|
|
129
|
+
}
|
|
130
|
+
const { output, message, progress } = (0, progress_bar_1.makeRenderingAndStitchingProgress)({
|
|
131
|
+
rendering: {
|
|
132
|
+
frames: renderedFrames,
|
|
133
|
+
totalFrames: totalFrames.length,
|
|
134
|
+
concurrency: renderer_1.RenderInternals.getActualConcurrency(concurrency),
|
|
135
|
+
doneIn: renderedDoneIn,
|
|
136
|
+
steps,
|
|
137
|
+
},
|
|
138
|
+
stitching: shouldOutputImageSequence
|
|
139
|
+
? null
|
|
140
|
+
: {
|
|
141
|
+
doneIn: encodedDoneIn,
|
|
142
|
+
frames: encodedFrames,
|
|
143
|
+
stage: stitchStage,
|
|
144
|
+
steps,
|
|
145
|
+
totalFrames: totalFrames.length,
|
|
146
|
+
codec,
|
|
147
|
+
},
|
|
148
|
+
downloads,
|
|
149
|
+
bundling: {
|
|
150
|
+
message: 'Bundled',
|
|
151
|
+
progress: 1,
|
|
152
|
+
},
|
|
153
|
+
}, indentOutput);
|
|
154
|
+
onProgress({ progress, message });
|
|
155
|
+
return renderProgress.update(output);
|
|
156
|
+
};
|
|
157
|
+
// TODO: Should take the one from the UI instead
|
|
158
|
+
const imageFormat = (0, image_formats_1.getImageFormat)(shouldOutputImageSequence ? undefined : codec, configFileImageFormat);
|
|
159
|
+
if (shouldOutputImageSequence) {
|
|
160
|
+
fs_1.default.mkdirSync(absoluteOutputFile, {
|
|
161
|
+
recursive: true,
|
|
162
|
+
});
|
|
163
|
+
if (imageFormat === 'none') {
|
|
164
|
+
throw new Error(`Cannot render an image sequence with a codec that renders no images. codec = ${codec}, imageFormat = ${imageFormat}`);
|
|
165
|
+
}
|
|
166
|
+
await (0, renderer_1.renderFrames)({
|
|
167
|
+
config,
|
|
168
|
+
imageFormat,
|
|
169
|
+
inputProps,
|
|
170
|
+
onFrameUpdate: (rendered) => {
|
|
171
|
+
renderedFrames = rendered;
|
|
172
|
+
updateRenderProgress();
|
|
173
|
+
},
|
|
174
|
+
onStart: () => undefined,
|
|
175
|
+
onDownload: (src) => {
|
|
176
|
+
if (src.startsWith('data:')) {
|
|
177
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, '\nWriting Data URL to file: ', src.substring(0, 30) + '...');
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, '\nDownloading asset... ', src);
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
outputDir,
|
|
184
|
+
serveUrl: urlOrBundle,
|
|
185
|
+
dumpBrowserLogs: renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose'),
|
|
186
|
+
everyNthFrame,
|
|
187
|
+
envVariables,
|
|
188
|
+
frameRange,
|
|
189
|
+
concurrency,
|
|
190
|
+
puppeteerInstance,
|
|
191
|
+
quality,
|
|
192
|
+
timeoutInMilliseconds: puppeteerTimeout,
|
|
193
|
+
chromiumOptions,
|
|
194
|
+
scale,
|
|
195
|
+
ffmpegExecutable,
|
|
196
|
+
ffprobeExecutable,
|
|
197
|
+
browserExecutable,
|
|
198
|
+
port,
|
|
199
|
+
downloadMap,
|
|
200
|
+
});
|
|
201
|
+
updateRenderProgress();
|
|
202
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel });
|
|
203
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.cyan(`▶ ${absoluteOutputFile}`));
|
|
204
|
+
}
|
|
205
|
+
const options = await (0, get_render_media_options_1.getRenderMediaOptions)({
|
|
206
|
+
config,
|
|
207
|
+
outputLocation: absoluteOutputFile,
|
|
208
|
+
serveUrl: urlOrBundle,
|
|
209
|
+
codec,
|
|
210
|
+
remotionRoot,
|
|
211
|
+
});
|
|
212
|
+
await (0, renderer_1.renderMedia)({
|
|
213
|
+
...options,
|
|
214
|
+
onProgress: (update) => {
|
|
215
|
+
encodedDoneIn = update.encodedDoneIn;
|
|
216
|
+
encodedFrames = update.encodedFrames;
|
|
217
|
+
renderedDoneIn = update.renderedDoneIn;
|
|
218
|
+
stitchStage = update.stitchStage;
|
|
219
|
+
renderedFrames = update.renderedFrames;
|
|
220
|
+
updateRenderProgress();
|
|
221
|
+
},
|
|
222
|
+
puppeteerInstance,
|
|
223
|
+
onDownload,
|
|
224
|
+
downloadMap,
|
|
225
|
+
onSlowestFrames: (slowestFrames) => {
|
|
226
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel });
|
|
227
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, `Slowest frames:`);
|
|
228
|
+
slowestFrames.forEach(({ frame, time }) => {
|
|
229
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, `Frame ${frame} (${time.toFixed(3)}ms)`);
|
|
230
|
+
});
|
|
231
|
+
},
|
|
232
|
+
printLog: (...str) => log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, ...str),
|
|
233
|
+
});
|
|
234
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel });
|
|
235
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.cyan(`▶ ${absoluteOutputFile}`));
|
|
236
|
+
try {
|
|
237
|
+
await cleanupBundle();
|
|
238
|
+
await renderer_1.RenderInternals.cleanDownloadMap(downloadMap);
|
|
239
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'Cleaned up', downloadMap.assetDir);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
log_1.Log.warnAdvanced({ indent: indentOutput, logLevel }, 'Could not clean up directory.');
|
|
243
|
+
log_1.Log.warnAdvanced({ indent: indentOutput, logLevel }, err);
|
|
244
|
+
log_1.Log.warnAdvanced({ indent: indentOutput, logLevel }, 'Do you have minimum required Node.js version?');
|
|
245
|
+
}
|
|
246
|
+
// TODO: This will not indent
|
|
247
|
+
if (renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose')) {
|
|
248
|
+
renderer_1.RenderInternals.perf.logPerf();
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
exports.renderCompFlow = renderCompFlow;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Browser, BrowserExecutable, ChromiumOptions, FfmpegExecutable, ImageFormat, LogLevel, StillImageFormat } from '@remotion/renderer';
|
|
2
|
+
import type { JobProgressCallback } from '../preview-server/render-queue/job';
|
|
3
|
+
export declare const renderStillFlow: ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, ffmpegExecutable, ffprobeExecutable, height, inputProps, overwrite, port, publicDir, puppeteerTimeout, quality, scale, stillFrame, width, compositionIdFromUi, imageFormatFromUi, logLevel, configFileImageFormat, onProgress, indentOutput, }: {
|
|
4
|
+
remotionRoot: string;
|
|
5
|
+
fullEntryPoint: string;
|
|
6
|
+
entryPointReason: string;
|
|
7
|
+
remainingArgs: string[];
|
|
8
|
+
inputProps: object;
|
|
9
|
+
envVariables: Record<string, string>;
|
|
10
|
+
quality: number | undefined;
|
|
11
|
+
browser: Browser;
|
|
12
|
+
stillFrame: number;
|
|
13
|
+
browserExecutable: BrowserExecutable;
|
|
14
|
+
chromiumOptions: ChromiumOptions;
|
|
15
|
+
scale: number;
|
|
16
|
+
ffmpegExecutable: FfmpegExecutable;
|
|
17
|
+
ffprobeExecutable: FfmpegExecutable;
|
|
18
|
+
overwrite: boolean;
|
|
19
|
+
puppeteerTimeout: number;
|
|
20
|
+
port: number | null;
|
|
21
|
+
publicDir: string | null;
|
|
22
|
+
height: number | null;
|
|
23
|
+
width: number | null;
|
|
24
|
+
compositionIdFromUi: string | null;
|
|
25
|
+
imageFormatFromUi: StillImageFormat | null;
|
|
26
|
+
logLevel: LogLevel;
|
|
27
|
+
configFileImageFormat: ImageFormat | undefined;
|
|
28
|
+
onProgress: JobProgressCallback;
|
|
29
|
+
indentOutput: boolean;
|
|
30
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Prints to CLI and also reports back to browser
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.renderStillFlow = void 0;
|
|
8
|
+
const renderer_1 = require("@remotion/renderer");
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const chalk_1 = require("../chalk");
|
|
12
|
+
const determine_image_format_1 = require("../determine-image-format");
|
|
13
|
+
const get_cli_options_1 = require("../get-cli-options");
|
|
14
|
+
const get_composition_with_dimension_override_1 = require("../get-composition-with-dimension-override");
|
|
15
|
+
const log_1 = require("../log");
|
|
16
|
+
const parse_command_line_1 = require("../parse-command-line");
|
|
17
|
+
const progress_bar_1 = require("../progress-bar");
|
|
18
|
+
const setup_cache_1 = require("../setup-cache");
|
|
19
|
+
const truthy_1 = require("../truthy");
|
|
20
|
+
const user_passed_output_location_1 = require("../user-passed-output-location");
|
|
21
|
+
const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, ffmpegExecutable, ffprobeExecutable, height, inputProps, overwrite, port, publicDir, puppeteerTimeout, quality, scale, stillFrame, width, compositionIdFromUi, imageFormatFromUi, logLevel, configFileImageFormat, onProgress, indentOutput, }) => {
|
|
22
|
+
var _a;
|
|
23
|
+
const downloads = [];
|
|
24
|
+
const aggregate = {
|
|
25
|
+
rendering: null,
|
|
26
|
+
downloads,
|
|
27
|
+
stitching: null,
|
|
28
|
+
bundling: {
|
|
29
|
+
message: null,
|
|
30
|
+
progress: 0,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
let renderProgress = null;
|
|
34
|
+
const updateProgress = () => {
|
|
35
|
+
const { output, progress, message } = (0, progress_bar_1.makeRenderingAndStitchingProgress)(aggregate, indentOutput);
|
|
36
|
+
if (renderProgress) {
|
|
37
|
+
renderProgress.update(output);
|
|
38
|
+
}
|
|
39
|
+
onProgress({ progress, message });
|
|
40
|
+
};
|
|
41
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'Browser executable: ', browserExecutable);
|
|
42
|
+
const shouldDumpIo = renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose');
|
|
43
|
+
const browserInstance = (0, renderer_1.openBrowser)(browser, {
|
|
44
|
+
browserExecutable,
|
|
45
|
+
chromiumOptions,
|
|
46
|
+
shouldDumpIo,
|
|
47
|
+
forceDeviceScaleFactor: scale,
|
|
48
|
+
indentationString: indentOutput ? log_1.INDENT_TOKEN + ' ' : '',
|
|
49
|
+
});
|
|
50
|
+
const steps = [
|
|
51
|
+
renderer_1.RenderInternals.isServeUrl(fullEntryPoint) ? null : 'bundling',
|
|
52
|
+
'rendering',
|
|
53
|
+
].filter(truthy_1.truthy);
|
|
54
|
+
const { cleanup: cleanupBundle, urlOrBundle } = await (0, setup_cache_1.bundleOnCliOrTakeServeUrl)({
|
|
55
|
+
fullPath: fullEntryPoint,
|
|
56
|
+
remotionRoot,
|
|
57
|
+
steps,
|
|
58
|
+
publicDir,
|
|
59
|
+
onProgress: (progress) => {
|
|
60
|
+
aggregate.bundling = progress;
|
|
61
|
+
updateProgress();
|
|
62
|
+
},
|
|
63
|
+
indentOutput,
|
|
64
|
+
logLevel,
|
|
65
|
+
});
|
|
66
|
+
const puppeteerInstance = await browserInstance;
|
|
67
|
+
const downloadMap = renderer_1.RenderInternals.makeDownloadMap();
|
|
68
|
+
const comps = await (0, renderer_1.getCompositions)(urlOrBundle, {
|
|
69
|
+
inputProps,
|
|
70
|
+
puppeteerInstance,
|
|
71
|
+
envVariables,
|
|
72
|
+
timeoutInMilliseconds: puppeteerTimeout,
|
|
73
|
+
chromiumOptions,
|
|
74
|
+
port,
|
|
75
|
+
browserExecutable,
|
|
76
|
+
ffmpegExecutable,
|
|
77
|
+
ffprobeExecutable,
|
|
78
|
+
downloadMap,
|
|
79
|
+
});
|
|
80
|
+
const { compositionId, config, reason, argsAfterComposition } = await (0, get_composition_with_dimension_override_1.getCompositionWithDimensionOverride)({
|
|
81
|
+
validCompositions: comps,
|
|
82
|
+
height,
|
|
83
|
+
width,
|
|
84
|
+
args: remainingArgs,
|
|
85
|
+
compositionIdFromUi,
|
|
86
|
+
});
|
|
87
|
+
const { format: imageFormat, source } = (0, determine_image_format_1.determineFinalImageFormat)({
|
|
88
|
+
cliFlag: (_a = parse_command_line_1.parsedCli['image-format']) !== null && _a !== void 0 ? _a : null,
|
|
89
|
+
configImageFormat: configFileImageFormat !== null && configFileImageFormat !== void 0 ? configFileImageFormat : null,
|
|
90
|
+
downloadName: null,
|
|
91
|
+
outName: (0, user_passed_output_location_1.getUserPassedOutputLocation)(argsAfterComposition),
|
|
92
|
+
isLambda: false,
|
|
93
|
+
fromUi: imageFormatFromUi,
|
|
94
|
+
});
|
|
95
|
+
const relativeOutputLocation = (0, user_passed_output_location_1.getOutputLocation)({
|
|
96
|
+
compositionId,
|
|
97
|
+
defaultExtension: imageFormat,
|
|
98
|
+
args: argsAfterComposition,
|
|
99
|
+
});
|
|
100
|
+
const absoluteOutputLocation = (0, get_cli_options_1.getAndValidateAbsoluteOutputFile)(relativeOutputLocation, overwrite);
|
|
101
|
+
(0, fs_1.mkdirSync)(path_1.default.join(absoluteOutputLocation, '..'), {
|
|
102
|
+
recursive: true,
|
|
103
|
+
});
|
|
104
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.gray(`Entry point = ${fullEntryPoint} (${entryPointReason}), Output = ${relativeOutputLocation}, Format = ${imageFormat} (${source}), Composition = ${compositionId} (${reason})`));
|
|
105
|
+
renderProgress = (0, progress_bar_1.createOverwriteableCliOutput)({
|
|
106
|
+
quiet: (0, parse_command_line_1.quietFlagProvided)(),
|
|
107
|
+
});
|
|
108
|
+
const renderStart = Date.now();
|
|
109
|
+
aggregate.rendering = {
|
|
110
|
+
frames: 0,
|
|
111
|
+
concurrency: 1,
|
|
112
|
+
doneIn: null,
|
|
113
|
+
steps,
|
|
114
|
+
totalFrames: 1,
|
|
115
|
+
};
|
|
116
|
+
updateProgress();
|
|
117
|
+
const onDownload = (src) => {
|
|
118
|
+
const id = Math.random();
|
|
119
|
+
const download = {
|
|
120
|
+
id,
|
|
121
|
+
name: src,
|
|
122
|
+
progress: 0,
|
|
123
|
+
downloaded: 0,
|
|
124
|
+
totalBytes: null,
|
|
125
|
+
};
|
|
126
|
+
downloads.push(download);
|
|
127
|
+
updateProgress();
|
|
128
|
+
return ({ percent }) => {
|
|
129
|
+
download.progress = percent;
|
|
130
|
+
updateProgress();
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
await (0, renderer_1.renderStill)({
|
|
134
|
+
composition: config,
|
|
135
|
+
frame: stillFrame,
|
|
136
|
+
output: absoluteOutputLocation,
|
|
137
|
+
serveUrl: urlOrBundle,
|
|
138
|
+
quality,
|
|
139
|
+
dumpBrowserLogs: shouldDumpIo,
|
|
140
|
+
envVariables,
|
|
141
|
+
imageFormat,
|
|
142
|
+
inputProps,
|
|
143
|
+
chromiumOptions,
|
|
144
|
+
timeoutInMilliseconds: puppeteerTimeout,
|
|
145
|
+
scale,
|
|
146
|
+
ffmpegExecutable,
|
|
147
|
+
browserExecutable,
|
|
148
|
+
overwrite,
|
|
149
|
+
onDownload,
|
|
150
|
+
port,
|
|
151
|
+
downloadMap,
|
|
152
|
+
puppeteerInstance,
|
|
153
|
+
});
|
|
154
|
+
aggregate.rendering = {
|
|
155
|
+
frames: 1,
|
|
156
|
+
concurrency: 1,
|
|
157
|
+
doneIn: Date.now() - renderStart,
|
|
158
|
+
steps,
|
|
159
|
+
totalFrames: 1,
|
|
160
|
+
};
|
|
161
|
+
updateProgress();
|
|
162
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel });
|
|
163
|
+
const closeBrowserPromise = puppeteerInstance.close(false);
|
|
164
|
+
log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.cyan(`▶️ ${absoluteOutputLocation}`));
|
|
165
|
+
await closeBrowserPromise;
|
|
166
|
+
await renderer_1.RenderInternals.cleanDownloadMap(downloadMap);
|
|
167
|
+
await cleanupBundle();
|
|
168
|
+
log_1.Log.verboseAdvanced({ indent: indentOutput, logLevel }, 'Cleaned up', downloadMap.assetDir);
|
|
169
|
+
};
|
|
170
|
+
exports.renderStillFlow = renderStillFlow;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/cli",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.19",
|
|
4
4
|
"description": "CLI for Remotion",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -22,16 +22,16 @@
|
|
|
22
22
|
"author": "Jonny Burger <jonny@remotion.dev>",
|
|
23
23
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@remotion/bundler": "3.3.
|
|
26
|
-
"@remotion/media-utils": "3.3.
|
|
27
|
-
"@remotion/player": "3.3.
|
|
28
|
-
"@remotion/renderer": "3.3.
|
|
25
|
+
"@remotion/bundler": "3.3.19",
|
|
26
|
+
"@remotion/media-utils": "3.3.19",
|
|
27
|
+
"@remotion/player": "3.3.19",
|
|
28
|
+
"@remotion/renderer": "3.3.19",
|
|
29
29
|
"better-opn": "2.1.1",
|
|
30
30
|
"dotenv": "9.0.2",
|
|
31
31
|
"memfs": "3.4.3",
|
|
32
32
|
"minimist": "1.2.6",
|
|
33
33
|
"prompts": "2.4.1",
|
|
34
|
-
"remotion": "3.3.
|
|
34
|
+
"remotion": "3.3.19",
|
|
35
35
|
"semver": "7.3.5",
|
|
36
36
|
"source-map": "0.6.1"
|
|
37
37
|
},
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"publishConfig": {
|
|
73
73
|
"access": "public"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "097ff40cd34ecba3c7ebbbc08b442827b0f4ad7d"
|
|
76
76
|
}
|