@remotion/cli 3.3.17 → 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.
Files changed (103) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/config/index.d.ts +1 -0
  3. package/dist/config/index.js +3 -0
  4. package/dist/config/open-browser.d.ts +2 -0
  5. package/dist/config/open-browser.js +15 -0
  6. package/dist/convert-entry-point-to-serve-url.d.ts +1 -0
  7. package/dist/convert-entry-point-to-serve-url.js +15 -0
  8. package/dist/editor/components/CollapsableOptions.d.ts +6 -0
  9. package/dist/editor/components/CollapsableOptions.js +35 -0
  10. package/dist/editor/components/InlineAction.d.ts +5 -0
  11. package/dist/editor/components/InlineAction.js +32 -0
  12. package/dist/editor/components/RenderButton.d.ts +1 -1
  13. package/dist/editor/components/RenderButton.js +24 -34
  14. package/dist/editor/components/RenderModal/RenderErrorModal.d.ts +5 -0
  15. package/dist/editor/components/RenderModal/RenderErrorModal.js +64 -0
  16. package/dist/editor/components/RenderModal/RenderModal.d.ts +8 -2
  17. package/dist/editor/components/RenderModal/RenderModal.js +204 -32
  18. package/dist/editor/components/RenderQueue/CircularProgress.d.ts +5 -0
  19. package/dist/editor/components/RenderQueue/CircularProgress.js +18 -0
  20. package/dist/editor/components/RenderQueue/RenderQueueError.d.ts +5 -0
  21. package/dist/editor/components/RenderQueue/RenderQueueError.js +26 -0
  22. package/dist/editor/components/RenderQueue/RenderQueueItem.js +14 -1
  23. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +11 -3
  24. package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +12 -52
  25. package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.d.ts +5 -0
  26. package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.js +27 -0
  27. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +6 -40
  28. package/dist/editor/components/RenderQueue/RenderQueueRepeat.d.ts +5 -0
  29. package/dist/editor/components/RenderQueue/RenderQueueRepeat.js +22 -0
  30. package/dist/editor/components/RenderQueue/actions.d.ts +32 -0
  31. package/dist/editor/components/RenderQueue/actions.js +75 -0
  32. package/dist/editor/components/RenderQueue/context.d.ts +1 -0
  33. package/dist/editor/components/RenderQueue/context.js +6 -1
  34. package/dist/editor/components/RenderQueue/index.js +1 -1
  35. package/dist/editor/components/RenderQueue/item-style.d.ts +2 -0
  36. package/dist/editor/components/RenderQueue/item-style.js +21 -0
  37. package/dist/editor/components/RenderToolbarIcon.d.ts +2 -0
  38. package/dist/editor/components/RenderToolbarIcon.js +47 -0
  39. package/dist/editor/components/RendersTab.js +6 -2
  40. package/dist/editor/components/SegmentedControl.d.ts +15 -0
  41. package/dist/editor/components/SegmentedControl.js +46 -0
  42. package/dist/editor/components/SidebarContent.js +21 -4
  43. package/dist/editor/components/Tabs/index.js +3 -1
  44. package/dist/editor/components/Timeline/TimelineZoomControls.js +3 -1
  45. package/dist/editor/helpers/use-file-existence.d.ts +1 -0
  46. package/dist/editor/helpers/use-file-existence.js +57 -0
  47. package/dist/editor/helpers/use-menu-structure.js +15 -1
  48. package/dist/editor/icons/RenderStillIcon.d.ts +3 -0
  49. package/dist/editor/icons/RenderStillIcon.js +8 -0
  50. package/dist/editor/icons/render.d.ts +0 -1
  51. package/dist/editor/icons/render.js +1 -1
  52. package/dist/editor/icons/video.d.ts +5 -0
  53. package/dist/editor/icons/video.js +8 -0
  54. package/dist/file-watcher.d.ts +9 -0
  55. package/dist/file-watcher.js +35 -0
  56. package/dist/list-of-remotion-packages.js +1 -0
  57. package/dist/load-config.js +1 -10
  58. package/dist/parse-command-line.d.ts +1 -0
  59. package/dist/parse-command-line.js +1 -0
  60. package/dist/preview-server/actions.d.ts +0 -0
  61. package/dist/preview-server/actions.js +1 -0
  62. package/dist/preview-server/api-routes.d.ts +4 -0
  63. package/dist/preview-server/api-routes.js +15 -0
  64. package/dist/preview-server/api-types.d.ts +26 -0
  65. package/dist/preview-server/api-types.js +2 -0
  66. package/dist/preview-server/file-existence-watchers.d.ts +10 -0
  67. package/dist/preview-server/file-existence-watchers.js +46 -0
  68. package/dist/preview-server/get-file-existence.d.ts +2 -0
  69. package/dist/preview-server/get-file-existence.js +36 -0
  70. package/dist/preview-server/handler.d.ts +9 -0
  71. package/dist/preview-server/handler.js +34 -0
  72. package/dist/preview-server/render-queue/add-render.d.ts +3 -2
  73. package/dist/preview-server/render-queue/add-render.js +20 -25
  74. package/dist/preview-server/render-queue/index.d.ts +14 -3
  75. package/dist/preview-server/render-queue/index.js +51 -10
  76. package/dist/preview-server/render-queue/job.d.ts +56 -6
  77. package/dist/preview-server/render-queue/make-retry-payload.d.ts +3 -0
  78. package/dist/preview-server/render-queue/make-retry-payload.js +32 -0
  79. package/dist/preview-server/render-queue/open-directory-in-finder.js +7 -5
  80. package/dist/preview-server/render-queue/open-in-file-explorer.js +1 -0
  81. package/dist/preview-server/render-queue/process-still.d.ts +7 -0
  82. package/dist/preview-server/render-queue/process-still.js +49 -0
  83. package/dist/preview-server/render-queue/process-video.d.ts +7 -0
  84. package/dist/preview-server/render-queue/process-video.js +55 -0
  85. package/dist/preview-server/render-queue/queue.d.ts +19 -0
  86. package/dist/preview-server/render-queue/queue.js +150 -0
  87. package/dist/preview-server/render-queue/remove-render.js +3 -2
  88. package/dist/preview-server/routes/add-render.d.ts +3 -0
  89. package/dist/preview-server/routes/add-render.js +52 -0
  90. package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
  91. package/dist/preview-server/routes/open-in-file-explorer.js +14 -0
  92. package/dist/preview-server/routes/remove-render.d.ts +3 -0
  93. package/dist/preview-server/routes/remove-render.js +9 -0
  94. package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
  95. package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
  96. package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
  97. package/dist/preview-server/routes/unsubscribe-from-file-existence.js +9 -0
  98. package/dist/preview.js +25 -1
  99. package/dist/render-flows/render.d.ts +33 -0
  100. package/dist/render-flows/render.js +251 -0
  101. package/dist/render-flows/still.d.ts +30 -0
  102. package/dist/render-flows/still.js +170 -0
  103. 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,3 @@
1
+ import type { ApiHandler } from '../api-types';
2
+ import type { UnsubscribeFromFileExistenceRequest } from '../render-queue/job';
3
+ export declare const unsubscribeFromFileExistence: ApiHandler<UnsubscribeFromFileExistenceRequest, undefined>;
@@ -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
- (0, better_opn_1.default)(`http://localhost:${port}`);
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.17",
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.17",
26
- "@remotion/media-utils": "3.3.17",
27
- "@remotion/player": "3.3.17",
28
- "@remotion/renderer": "3.3.17",
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.17",
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": "0b80927c47c4216f84a4a34320d48b6f55488747"
75
+ "gitHead": "097ff40cd34ecba3c7ebbbc08b442827b0f4ad7d"
76
76
  }