@remotion/cli 3.3.33 → 3.3.34

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 (105) hide show
  1. package/dist/convert-entry-point-to-serve-url.d.ts +1 -0
  2. package/dist/convert-entry-point-to-serve-url.js +15 -0
  3. package/dist/editor/components/CollapsableOptions.d.ts +6 -0
  4. package/dist/editor/components/CollapsableOptions.js +35 -0
  5. package/dist/editor/components/InlineAction.d.ts +5 -0
  6. package/dist/editor/components/InlineAction.js +34 -0
  7. package/dist/editor/components/Modals.d.ts +2 -0
  8. package/dist/editor/components/Modals.js +23 -0
  9. package/dist/editor/components/RenderButton.d.ts +6 -0
  10. package/dist/editor/components/RenderButton.js +46 -0
  11. package/dist/editor/components/RenderModal/RenderErrorModal.d.ts +5 -0
  12. package/dist/editor/components/RenderModal/RenderErrorModal.js +64 -0
  13. package/dist/editor/components/RenderModal/RenderModal.d.ts +14 -0
  14. package/dist/editor/components/RenderModal/RenderModal.js +377 -0
  15. package/dist/editor/components/RenderQueue/CircularProgress.d.ts +5 -0
  16. package/dist/editor/components/RenderQueue/CircularProgress.js +18 -0
  17. package/dist/editor/components/RenderQueue/RenderQueueError.d.ts +5 -0
  18. package/dist/editor/components/RenderQueue/RenderQueueError.js +26 -0
  19. package/dist/editor/components/RenderQueue/RenderQueueItem.d.ts +5 -0
  20. package/dist/editor/components/RenderQueue/RenderQueueItem.js +39 -0
  21. package/dist/editor/components/RenderQueue/RenderQueueItemCancelButton.d.ts +5 -0
  22. package/dist/editor/components/RenderQueue/RenderQueueItemCancelButton.js +22 -0
  23. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.d.ts +5 -0
  24. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +27 -0
  25. package/dist/editor/components/RenderQueue/RenderQueueOutputName.d.ts +5 -0
  26. package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +24 -0
  27. package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.d.ts +5 -0
  28. package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.js +27 -0
  29. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.d.ts +5 -0
  30. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +22 -0
  31. package/dist/editor/components/RenderQueue/RenderQueueRepeat.d.ts +5 -0
  32. package/dist/editor/components/RenderQueue/RenderQueueRepeat.js +22 -0
  33. package/dist/editor/components/RenderQueue/actions.d.ts +35 -0
  34. package/dist/editor/components/RenderQueue/actions.js +84 -0
  35. package/dist/editor/components/RenderQueue/context.d.ts +19 -0
  36. package/dist/editor/components/RenderQueue/context.js +56 -0
  37. package/dist/editor/components/RenderQueue/index.d.ts +2 -0
  38. package/dist/editor/components/RenderQueue/index.js +18 -0
  39. package/dist/editor/components/RenderQueue/item-style.d.ts +2 -0
  40. package/dist/editor/components/RenderQueue/item-style.js +21 -0
  41. package/dist/editor/components/RenderToolbarIcon.d.ts +2 -0
  42. package/dist/editor/components/RenderToolbarIcon.js +56 -0
  43. package/dist/editor/components/RendersTab.d.ts +6 -0
  44. package/dist/editor/components/RendersTab.js +43 -0
  45. package/dist/editor/components/SegmentedControl.d.ts +16 -0
  46. package/dist/editor/components/SegmentedControl.js +63 -0
  47. package/dist/editor/components/SidebarContent.d.ts +5 -0
  48. package/dist/editor/components/SidebarContent.js +51 -0
  49. package/dist/editor/components/Tabs/index.d.ts +11 -0
  50. package/dist/editor/components/Tabs/index.js +51 -0
  51. package/dist/editor/components/Timeline/Timeline.js +11 -5
  52. package/dist/editor/helpers/client-id.d.ts +17 -0
  53. package/dist/editor/helpers/client-id.js +46 -0
  54. package/dist/editor/helpers/use-file-existence.d.ts +1 -0
  55. package/dist/editor/helpers/use-file-existence.js +66 -0
  56. package/dist/editor/icons/RenderStillIcon.d.ts +3 -0
  57. package/dist/editor/icons/RenderStillIcon.js +8 -0
  58. package/dist/editor/icons/render.d.ts +5 -0
  59. package/dist/editor/icons/render.js +8 -0
  60. package/dist/editor/icons/video.d.ts +5 -0
  61. package/dist/editor/icons/video.js +8 -0
  62. package/dist/file-watcher.d.ts +9 -0
  63. package/dist/file-watcher.js +35 -0
  64. package/dist/get-default-out-name.d.ts +5 -0
  65. package/dist/get-default-out-name.js +10 -0
  66. package/dist/preview-server/api-routes.d.ts +4 -0
  67. package/dist/preview-server/api-routes.js +17 -0
  68. package/dist/preview-server/api-types.d.ts +27 -0
  69. package/dist/preview-server/api-types.js +2 -0
  70. package/dist/preview-server/file-existence-watchers.d.ts +13 -0
  71. package/dist/preview-server/file-existence-watchers.js +62 -0
  72. package/dist/preview-server/handler.d.ts +9 -0
  73. package/dist/preview-server/handler.js +34 -0
  74. package/dist/preview-server/parse-body.d.ts +2 -0
  75. package/dist/preview-server/parse-body.js +16 -0
  76. package/dist/preview-server/render-queue/job.d.ts +86 -0
  77. package/dist/preview-server/render-queue/job.js +2 -0
  78. package/dist/preview-server/render-queue/make-retry-payload.d.ts +3 -0
  79. package/dist/preview-server/render-queue/make-retry-payload.js +37 -0
  80. package/dist/preview-server/render-queue/open-directory-in-finder.d.ts +1 -0
  81. package/dist/preview-server/render-queue/open-directory-in-finder.js +34 -0
  82. package/dist/preview-server/render-queue/process-still.d.ts +8 -0
  83. package/dist/preview-server/render-queue/process-still.js +50 -0
  84. package/dist/preview-server/render-queue/process-video.d.ts +8 -0
  85. package/dist/preview-server/render-queue/process-video.js +59 -0
  86. package/dist/preview-server/render-queue/queue.d.ts +21 -0
  87. package/dist/preview-server/render-queue/queue.js +185 -0
  88. package/dist/preview-server/routes/add-render.d.ts +3 -0
  89. package/dist/preview-server/routes/add-render.js +54 -0
  90. package/dist/preview-server/routes/cancel-render.d.ts +3 -0
  91. package/dist/preview-server/routes/cancel-render.js +9 -0
  92. package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
  93. package/dist/preview-server/routes/open-in-file-explorer.js +14 -0
  94. package/dist/preview-server/routes/remove-render.d.ts +3 -0
  95. package/dist/preview-server/routes/remove-render.js +9 -0
  96. package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
  97. package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
  98. package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
  99. package/dist/preview-server/routes/unsubscribe-from-file-existence.js +13 -0
  100. package/dist/render-flows/render.d.ts +38 -0
  101. package/dist/render-flows/render.js +256 -0
  102. package/dist/render-flows/still.d.ts +32 -0
  103. package/dist/render-flows/still.js +170 -0
  104. package/dist/render.js +1 -1
  105. package/package.json +7 -7
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleAddRender = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const queue_1 = require("../render-queue/queue");
6
+ const handleAddRender = ({ input, entryPoint, remotionRoot, }) => {
7
+ const id = String(Math.random()).replace('0.', '');
8
+ if (input.type === 'video') {
9
+ (0, queue_1.addJob)({
10
+ entryPoint,
11
+ remotionRoot,
12
+ job: {
13
+ cleanup: [],
14
+ codec: input.codec,
15
+ compositionId: input.compositionId,
16
+ deletedOutputLocation: false,
17
+ type: 'video',
18
+ status: 'idle',
19
+ id,
20
+ imageFormat: input.imageFormat,
21
+ outName: input.outName,
22
+ quality: input.quality,
23
+ scale: input.scale,
24
+ startedAt: Date.now(),
25
+ verbose: input.verbose,
26
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
27
+ },
28
+ });
29
+ }
30
+ if (input.type === 'still') {
31
+ (0, queue_1.addJob)({
32
+ job: {
33
+ compositionId: input.compositionId,
34
+ id: String(Math.random()).replace('0.', ''),
35
+ startedAt: Date.now(),
36
+ type: 'still',
37
+ outName: input.outName,
38
+ status: 'idle',
39
+ imageFormat: input.imageFormat,
40
+ quality: input.quality,
41
+ frame: input.frame,
42
+ scale: input.scale,
43
+ cleanup: [],
44
+ deletedOutputLocation: false,
45
+ verbose: input.verbose,
46
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
47
+ },
48
+ entryPoint,
49
+ remotionRoot,
50
+ });
51
+ }
52
+ return Promise.resolve(undefined);
53
+ };
54
+ exports.handleAddRender = handleAddRender;
@@ -0,0 +1,3 @@
1
+ import type { ApiHandler } from '../api-types';
2
+ import type { CancelRenderRequest, CancelRenderResponse } from '../render-queue/job';
3
+ export declare const handleCancelRender: ApiHandler<CancelRenderRequest, CancelRenderResponse>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleCancelRender = void 0;
4
+ const queue_1 = require("../render-queue/queue");
5
+ const handleCancelRender = ({ input: { jobId } }) => {
6
+ (0, queue_1.cancelJob)(jobId);
7
+ return Promise.resolve({});
8
+ };
9
+ exports.handleCancelRender = handleCancelRender;
@@ -0,0 +1,3 @@
1
+ import type { ApiHandler } from '../api-types';
2
+ import type { OpenInFileExplorerRequest } from '../render-queue/job';
3
+ export declare const handleOpenInFileExplorer: ApiHandler<OpenInFileExplorerRequest, void>;
@@ -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.handleOpenInFileExplorer = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const open_directory_in_finder_1 = require("../render-queue/open-directory-in-finder");
9
+ const handleOpenInFileExplorer = ({ input: { directory }, remotionRoot }) => {
10
+ const actualDirectory = path_1.default.resolve(remotionRoot, directory);
11
+ // TODO: Disallow opening file that is not in Remotion CWD
12
+ return (0, open_directory_in_finder_1.openDirectoryInFinder)(actualDirectory);
13
+ };
14
+ exports.handleOpenInFileExplorer = handleOpenInFileExplorer;
@@ -0,0 +1,3 @@
1
+ import type { ApiHandler } from '../api-types';
2
+ import type { RemoveRenderRequest } from '../render-queue/job';
3
+ export declare const handleRemoveRender: ApiHandler<RemoveRenderRequest, undefined>;
@@ -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, clientId }, remotionRoot }) => {
6
+ const { exists } = (0, file_existence_watchers_1.subscribeToFileExistenceWatchers)({
7
+ file,
8
+ remotionRoot,
9
+ clientId,
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,13 @@
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)({
7
+ file: input.file,
8
+ clientId: input.clientId,
9
+ remotionRoot,
10
+ });
11
+ return Promise.resolve(undefined);
12
+ };
13
+ exports.unsubscribeFromFileExistence = unsubscribeFromFileExistence;
@@ -0,0 +1,38 @@
1
+ import type { Browser, BrowserExecutable, CancelSignal, ChromiumOptions, Codec, 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, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, inputProps, envVariables, puppeteerTimeout, port, height, width, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, everyNthFrame, configFileImageFormat, outputLocationFromUI, quality, onProgress, addCleanupCallback, uiCodec, uiImageFormat, cancelSignal, }: {
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
+ indent: 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
+ outputLocationFromUI: string | null;
26
+ overwrite: boolean;
27
+ quiet: boolean;
28
+ concurrency: number | string | null;
29
+ frameRange: FrameRange | null;
30
+ everyNthFrame: number;
31
+ configFileImageFormat: ImageFormat | undefined;
32
+ quality: number | undefined;
33
+ onProgress: JobProgressCallback;
34
+ addCleanupCallback: (cb: () => Promise<void>) => void;
35
+ uiCodec: Codec | null;
36
+ uiImageFormat: ImageFormat | null;
37
+ cancelSignal: CancelSignal | null;
38
+ }) => Promise<void>;
@@ -0,0 +1,256 @@
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 config_1 = require("../config");
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 get_filename_1 = require("../get-filename");
16
+ const get_final_output_codec_1 = require("../get-final-output-codec");
17
+ const get_render_media_options_1 = require("../get-render-media-options");
18
+ const image_formats_1 = require("../image-formats");
19
+ const log_1 = require("../log");
20
+ const parse_command_line_1 = require("../parse-command-line");
21
+ const progress_bar_1 = require("../progress-bar");
22
+ const setup_cache_1 = require("../setup-cache");
23
+ const truthy_1 = require("../truthy");
24
+ const user_passed_output_location_1 = require("../user-passed-output-location");
25
+ const renderCompFlow = async ({ remotionRoot, fullEntryPoint, ffmpegExecutable, ffprobeExecutable, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, inputProps, envVariables, puppeteerTimeout, port, height, width, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, everyNthFrame, configFileImageFormat, outputLocationFromUI, quality, onProgress, addCleanupCallback, uiCodec, uiImageFormat, cancelSignal, }) => {
26
+ var _a;
27
+ const downloads = [];
28
+ const downloadMap = renderer_1.RenderInternals.makeDownloadMap();
29
+ addCleanupCallback(() => renderer_1.RenderInternals.cleanDownloadMap(downloadMap));
30
+ const ffmpegVersion = await renderer_1.RenderInternals.getFfmpegVersion({
31
+ ffmpegExecutable,
32
+ remotionRoot,
33
+ });
34
+ log_1.Log.verboseAdvanced({ indent, logLevel }, 'FFMPEG Version:', ffmpegVersion ? ffmpegVersion.join('.') : 'Built from source');
35
+ log_1.Log.verboseAdvanced({ indent, logLevel }, 'Browser executable: ', browserExecutable);
36
+ log_1.Log.verboseAdvanced({ indent, logLevel }, 'Asset dirs', downloadMap.assetDir);
37
+ const browserInstance = (0, renderer_1.openBrowser)(browser, {
38
+ browserExecutable,
39
+ shouldDumpIo: renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose'),
40
+ chromiumOptions,
41
+ forceDeviceScaleFactor: scale,
42
+ indentationString: indent ? log_1.INDENT_TOKEN + ' ' : '',
43
+ });
44
+ const steps = [
45
+ renderer_1.RenderInternals.isServeUrl(fullEntryPoint) ? null : 'bundling',
46
+ 'rendering',
47
+ shouldOutputImageSequence ? null : 'stitching',
48
+ ].filter(truthy_1.truthy);
49
+ const { urlOrBundle, cleanup: cleanupBundle } = await (0, setup_cache_1.bundleOnCliOrTakeServeUrl)({
50
+ fullPath: fullEntryPoint,
51
+ remotionRoot,
52
+ steps,
53
+ publicDir,
54
+ // TODO: Implement onProgress
55
+ onProgress: () => undefined,
56
+ indentOutput: indent,
57
+ logLevel,
58
+ });
59
+ addCleanupCallback(cleanupBundle);
60
+ const onDownload = (src) => {
61
+ const id = Math.random();
62
+ const download = {
63
+ id,
64
+ name: src,
65
+ progress: 0,
66
+ downloaded: 0,
67
+ totalBytes: null,
68
+ };
69
+ downloads.push(download);
70
+ updateRenderProgress();
71
+ return ({ percent, downloaded, totalSize }) => {
72
+ download.progress = percent;
73
+ download.totalBytes = totalSize;
74
+ download.downloaded = downloaded;
75
+ updateRenderProgress();
76
+ };
77
+ };
78
+ const puppeteerInstance = await browserInstance;
79
+ addCleanupCallback(() => puppeteerInstance.close(false));
80
+ const comps = await (0, renderer_1.getCompositions)(urlOrBundle, {
81
+ inputProps,
82
+ puppeteerInstance,
83
+ envVariables,
84
+ timeoutInMilliseconds: puppeteerTimeout,
85
+ chromiumOptions,
86
+ browserExecutable,
87
+ downloadMap,
88
+ port,
89
+ });
90
+ const { compositionId, config, reason, argsAfterComposition } = await (0, get_composition_with_dimension_override_1.getCompositionWithDimensionOverride)({
91
+ validCompositions: comps,
92
+ height,
93
+ width,
94
+ args: remainingArgs,
95
+ compositionIdFromUi,
96
+ });
97
+ const { codec, reason: codecReason } = (0, get_final_output_codec_1.getFinalOutputCodec)({
98
+ cliFlag: parse_command_line_1.parsedCli.codec,
99
+ configFile: (_a = config_1.ConfigInternals.getOutputCodecOrUndefined()) !== null && _a !== void 0 ? _a : null,
100
+ downloadName: null,
101
+ outName: (0, user_passed_output_location_1.getUserPassedOutputLocation)(argsAfterComposition),
102
+ uiCodec,
103
+ });
104
+ (0, get_cli_options_1.validateFfmpegCanUseCodec)(codec, remotionRoot);
105
+ renderer_1.RenderInternals.validateEvenDimensionsWithCodec({
106
+ width: config.width,
107
+ height: config.height,
108
+ codec,
109
+ scale,
110
+ });
111
+ const relativeOutputLocation = (0, get_filename_1.getOutputFilename)({
112
+ codec,
113
+ imageSequence: shouldOutputImageSequence,
114
+ compositionName: compositionId,
115
+ defaultExtension: renderer_1.RenderInternals.getFileExtensionFromCodec(codec, 'final'),
116
+ args: argsAfterComposition,
117
+ indent,
118
+ fromUi: outputLocationFromUI,
119
+ logLevel,
120
+ });
121
+ log_1.Log.infoAdvanced({ indent, logLevel }, chalk_1.chalk.gray(`Entry point = ${fullEntryPoint} (${entryPointReason}), Composition = ${compositionId} (${reason}), Codec = ${codec} (${codecReason}), Output = ${relativeOutputLocation}`));
122
+ const absoluteOutputFile = (0, get_cli_options_1.getAndValidateAbsoluteOutputFile)(relativeOutputLocation, overwrite);
123
+ const outputDir = shouldOutputImageSequence
124
+ ? absoluteOutputFile
125
+ : await fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
126
+ log_1.Log.verboseAdvanced({ indent, logLevel }, 'Output dir', outputDir);
127
+ const renderProgress = (0, progress_bar_1.createOverwriteableCliOutput)({
128
+ quiet,
129
+ cancelSignal,
130
+ });
131
+ const realFrameRange = renderer_1.RenderInternals.getRealFrameRange(config.durationInFrames, frameRange);
132
+ const totalFrames = renderer_1.RenderInternals.getFramesToRender(realFrameRange, everyNthFrame);
133
+ let encodedFrames = 0;
134
+ let renderedFrames = 0;
135
+ let encodedDoneIn = null;
136
+ let renderedDoneIn = null;
137
+ let stitchStage = 'encoding';
138
+ const updateRenderProgress = () => {
139
+ if (totalFrames.length === 0) {
140
+ throw new Error('totalFrames should not be 0');
141
+ }
142
+ const { output, message, progress } = (0, progress_bar_1.makeRenderingAndStitchingProgress)({
143
+ rendering: {
144
+ frames: renderedFrames,
145
+ totalFrames: totalFrames.length,
146
+ concurrency: renderer_1.RenderInternals.getActualConcurrency(concurrency),
147
+ doneIn: renderedDoneIn,
148
+ steps,
149
+ },
150
+ stitching: shouldOutputImageSequence
151
+ ? null
152
+ : {
153
+ doneIn: encodedDoneIn,
154
+ frames: encodedFrames,
155
+ stage: stitchStage,
156
+ steps,
157
+ totalFrames: totalFrames.length,
158
+ codec,
159
+ },
160
+ downloads,
161
+ bundling: {
162
+ message: 'Bundled',
163
+ progress: 1,
164
+ },
165
+ }, indent);
166
+ onProgress({ progress, message });
167
+ return renderProgress.update(output);
168
+ };
169
+ const imageFormat = (0, image_formats_1.getImageFormat)({
170
+ codec: shouldOutputImageSequence ? undefined : codec,
171
+ configFileImageFormat,
172
+ uiImageFormat,
173
+ });
174
+ if (shouldOutputImageSequence) {
175
+ fs_1.default.mkdirSync(absoluteOutputFile, {
176
+ recursive: true,
177
+ });
178
+ if (imageFormat === 'none') {
179
+ throw new Error(`Cannot render an image sequence with a codec that renders no images. codec = ${codec}, imageFormat = ${imageFormat}`);
180
+ }
181
+ await (0, renderer_1.renderFrames)({
182
+ config,
183
+ imageFormat,
184
+ inputProps,
185
+ onFrameUpdate: (rendered) => {
186
+ renderedFrames = rendered;
187
+ updateRenderProgress();
188
+ },
189
+ onStart: () => undefined,
190
+ onDownload: (src) => {
191
+ if (src.startsWith('data:')) {
192
+ log_1.Log.infoAdvanced({ indent, logLevel }, '\nWriting Data URL to file: ', src.substring(0, 30) + '...');
193
+ }
194
+ else {
195
+ log_1.Log.infoAdvanced({ indent, logLevel }, '\nDownloading asset... ', src);
196
+ }
197
+ },
198
+ cancelSignal: cancelSignal !== null && cancelSignal !== void 0 ? cancelSignal : undefined,
199
+ outputDir,
200
+ serveUrl: urlOrBundle,
201
+ dumpBrowserLogs: renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose'),
202
+ everyNthFrame,
203
+ envVariables,
204
+ frameRange,
205
+ concurrency,
206
+ puppeteerInstance,
207
+ quality,
208
+ timeoutInMilliseconds: puppeteerTimeout,
209
+ chromiumOptions,
210
+ scale,
211
+ ffmpegExecutable,
212
+ ffprobeExecutable,
213
+ browserExecutable,
214
+ port,
215
+ downloadMap,
216
+ });
217
+ updateRenderProgress();
218
+ log_1.Log.infoAdvanced({ indent, logLevel }, chalk_1.chalk.cyan(`▶ ${absoluteOutputFile}`));
219
+ }
220
+ const options = await (0, get_render_media_options_1.getRenderMediaOptions)({
221
+ config,
222
+ outputLocation: absoluteOutputFile,
223
+ serveUrl: urlOrBundle,
224
+ codec,
225
+ remotionRoot,
226
+ });
227
+ await (0, renderer_1.renderMedia)({
228
+ ...options,
229
+ onProgress: (update) => {
230
+ encodedDoneIn = update.encodedDoneIn;
231
+ encodedFrames = update.encodedFrames;
232
+ renderedDoneIn = update.renderedDoneIn;
233
+ stitchStage = update.stitchStage;
234
+ renderedFrames = update.renderedFrames;
235
+ updateRenderProgress();
236
+ },
237
+ puppeteerInstance,
238
+ onDownload,
239
+ downloadMap,
240
+ cancelSignal: cancelSignal !== null && cancelSignal !== void 0 ? cancelSignal : undefined,
241
+ onSlowestFrames: (slowestFrames) => {
242
+ log_1.Log.verboseAdvanced({ indent, logLevel });
243
+ log_1.Log.verboseAdvanced({ indent, logLevel }, `Slowest frames:`);
244
+ slowestFrames.forEach(({ frame, time }) => {
245
+ log_1.Log.verboseAdvanced({ indent, logLevel }, `Frame ${frame} (${time.toFixed(3)}ms)`);
246
+ });
247
+ },
248
+ printLog: (...str) => log_1.Log.verboseAdvanced({ indent, logLevel }, ...str),
249
+ });
250
+ log_1.Log.infoAdvanced({ indent, logLevel });
251
+ log_1.Log.infoAdvanced({ indent, logLevel }, chalk_1.chalk.cyan(`▶ ${absoluteOutputFile}`));
252
+ for (const line of renderer_1.RenderInternals.perf.getPerf()) {
253
+ log_1.Log.verboseAdvanced({ indent, logLevel }, line);
254
+ }
255
+ };
256
+ exports.renderCompFlow = renderCompFlow;
@@ -0,0 +1,32 @@
1
+ import type { Browser, BrowserExecutable, CancelSignal, 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, addCleanupCallback, cancelSignal, }: {
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
+ addCleanupCallback: (cb: () => Promise<void>) => void;
31
+ cancelSignal: CancelSignal | null;
32
+ }) => 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, addCleanupCallback, cancelSignal, }) => {
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
+ addCleanupCallback(cleanupBundle);
67
+ const puppeteerInstance = await browserInstance;
68
+ addCleanupCallback(() => puppeteerInstance.close(false));
69
+ const downloadMap = renderer_1.RenderInternals.makeDownloadMap();
70
+ addCleanupCallback(() => renderer_1.RenderInternals.cleanDownloadMap(downloadMap));
71
+ const comps = await (0, renderer_1.getCompositions)(urlOrBundle, {
72
+ inputProps,
73
+ puppeteerInstance,
74
+ envVariables,
75
+ timeoutInMilliseconds: puppeteerTimeout,
76
+ chromiumOptions,
77
+ port,
78
+ browserExecutable,
79
+ ffmpegExecutable,
80
+ ffprobeExecutable,
81
+ downloadMap,
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
+ const { format: imageFormat, source } = (0, determine_image_format_1.determineFinalImageFormat)({
91
+ cliFlag: (_a = parse_command_line_1.parsedCli['image-format']) !== null && _a !== void 0 ? _a : null,
92
+ configImageFormat: configFileImageFormat !== null && configFileImageFormat !== void 0 ? configFileImageFormat : null,
93
+ downloadName: null,
94
+ outName: (0, user_passed_output_location_1.getUserPassedOutputLocation)(argsAfterComposition),
95
+ isLambda: false,
96
+ fromUi: imageFormatFromUi,
97
+ });
98
+ const relativeOutputLocation = (0, user_passed_output_location_1.getOutputLocation)({
99
+ compositionId,
100
+ defaultExtension: imageFormat,
101
+ args: argsAfterComposition,
102
+ type: 'asset',
103
+ });
104
+ const absoluteOutputLocation = (0, get_cli_options_1.getAndValidateAbsoluteOutputFile)(relativeOutputLocation, overwrite);
105
+ (0, fs_1.mkdirSync)(path_1.default.join(absoluteOutputLocation, '..'), {
106
+ recursive: true,
107
+ });
108
+ log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.gray(`Entry point = ${fullEntryPoint} (${entryPointReason}), Output = ${relativeOutputLocation}, Format = ${imageFormat} (${source}), Composition = ${compositionId} (${reason})`));
109
+ renderProgress = (0, progress_bar_1.createOverwriteableCliOutput)({
110
+ quiet: (0, parse_command_line_1.quietFlagProvided)(),
111
+ cancelSignal,
112
+ });
113
+ const renderStart = Date.now();
114
+ aggregate.rendering = {
115
+ frames: 0,
116
+ concurrency: 1,
117
+ doneIn: null,
118
+ steps,
119
+ totalFrames: 1,
120
+ };
121
+ updateProgress();
122
+ const onDownload = (src) => {
123
+ const id = Math.random();
124
+ const download = {
125
+ id,
126
+ name: src,
127
+ progress: 0,
128
+ downloaded: 0,
129
+ totalBytes: null,
130
+ };
131
+ downloads.push(download);
132
+ updateProgress();
133
+ return ({ percent }) => {
134
+ download.progress = percent;
135
+ updateProgress();
136
+ };
137
+ };
138
+ await (0, renderer_1.renderStill)({
139
+ composition: config,
140
+ frame: stillFrame,
141
+ output: absoluteOutputLocation,
142
+ serveUrl: urlOrBundle,
143
+ quality,
144
+ dumpBrowserLogs: shouldDumpIo,
145
+ envVariables,
146
+ imageFormat,
147
+ inputProps,
148
+ chromiumOptions,
149
+ timeoutInMilliseconds: puppeteerTimeout,
150
+ scale,
151
+ ffmpegExecutable,
152
+ browserExecutable,
153
+ overwrite,
154
+ onDownload,
155
+ port,
156
+ downloadMap,
157
+ puppeteerInstance,
158
+ });
159
+ aggregate.rendering = {
160
+ frames: 1,
161
+ concurrency: 1,
162
+ doneIn: Date.now() - renderStart,
163
+ steps,
164
+ totalFrames: 1,
165
+ };
166
+ updateProgress();
167
+ log_1.Log.infoAdvanced({ indent: indentOutput, logLevel });
168
+ log_1.Log.infoAdvanced({ indent: indentOutput, logLevel }, chalk_1.chalk.cyan(`▶️ ${absoluteOutputLocation}`));
169
+ };
170
+ exports.renderStillFlow = renderStillFlow;
package/dist/render.js CHANGED
@@ -119,7 +119,7 @@ const render = async (remotionRoot, args) => {
119
119
  codec,
120
120
  imageSequence: shouldOutputImageSequence,
121
121
  compositionName: compositionId,
122
- defaultExtension: renderer_1.RenderInternals.getFileExtensionFromCodec(codec, 'final'),
122
+ defaultExtension: renderer_1.RenderInternals.getFileExtensionFromCodec(codec),
123
123
  args: argsAfterComposition,
124
124
  });
125
125
  log_1.Log.info(chalk_1.chalk.gray(`Entry point = ${file} (${entryPointReason}), Composition = ${compositionId} (${reason}), Codec = ${codec} (${codecReason}), Output = ${relativeOutputLocation}`));