@remotion/cli 4.0.506 → 4.0.508

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.
@@ -34,11 +34,26 @@ const defaultBrowserDownloadProgress = ({ indent, logLevel, quiet, onProgress, }
34
34
  const productName = chromeMode === 'chrome-for-testing'
35
35
  ? 'Chrome for Testing'
36
36
  : 'Headless Shell';
37
+ const startedAt = Date.now();
38
+ let doneIn = null;
39
+ // Must fire in both logger modes - the Studio UI relies on it to display
40
+ // the download progress (https://github.com/remotion-dev/remotion/issues/10228).
41
+ const updateDownloadState = (progress) => {
42
+ if (progress.percent === 1) {
43
+ doneIn = Date.now() - startedAt;
44
+ }
45
+ onProgress({
46
+ alreadyAvailable: progress.alreadyAvailable,
47
+ progress: progress.percent,
48
+ doneIn,
49
+ });
50
+ };
37
51
  if (updatesDontOverwrite) {
38
52
  let lastProgress = 0;
39
53
  return {
40
54
  version: null,
41
55
  onProgress: (progress) => {
56
+ updateDownloadState(progress);
42
57
  if (progress.downloadedBytes > lastProgress + 10000000) {
43
58
  lastProgress = progress.downloadedBytes;
44
59
  log_1.Log.info({ indent, logLevel }, `Getting ${productName} - ${renderer_1.RenderInternals.toMegabytes(progress.downloadedBytes)}/${renderer_1.RenderInternals.toMegabytes(progress.totalSizeInBytes)}`);
@@ -56,19 +71,10 @@ const defaultBrowserDownloadProgress = ({ indent, logLevel, quiet, onProgress, }
56
71
  updatesDontOverwrite,
57
72
  logLevel,
58
73
  });
59
- const startedAt = Date.now();
60
- let doneIn = null;
61
74
  return {
62
75
  version: null,
63
76
  onProgress: (progress) => {
64
- if (progress.percent === 1) {
65
- doneIn = Date.now() - startedAt;
66
- }
67
- onProgress({
68
- alreadyAvailable: progress.alreadyAvailable,
69
- progress: progress.percent,
70
- doneIn,
71
- });
77
+ updateDownloadState(progress);
72
78
  cliOutput.update(makeDownloadProgress({
73
79
  doneIn,
74
80
  bytesDownloaded: progress.downloadedBytes,
@@ -1,4 +1,4 @@
1
- import type { ConfigFileChangeType } from '@remotion/studio-shared';
1
+ import { type ConfigFileChangeType } from '@remotion/studio-shared';
2
2
  export type ConfigFileFingerprints = {
3
3
  reload: string;
4
4
  restart: string;
@@ -2,101 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.classifyConfigFileChange = exports.makeConfigFileFingerprints = void 0;
4
4
  const parser_1 = require("@babel/parser");
5
+ const studio_shared_1 = require("@remotion/studio-shared");
6
+ const validateConfigMethodLifecycles = (lifecycles) => lifecycles;
5
7
  // Keep this exhaustive so every new Config method must declare its Studio lifecycle.
6
- const configMethodLifecycles = {
7
- overrideBundlerConfig: 'restart',
8
- overrideDuration: 'runtime',
9
- overrideFfmpegCommand: 'runtime',
10
- overrideFps: 'runtime',
11
- overrideHeight: 'runtime',
12
- overrideRspackConfig: 'restart',
13
- overrideWebpackConfig: 'restart',
14
- overrideWidth: 'runtime',
15
- setAllowHtmlInCanvasEnabled: 'runtime',
16
- setAskAIEnabled: 'runtime',
17
- setAudioBitrate: 'runtime',
18
- setAudioCodec: 'runtime',
19
- setAudioLatencyHint: 'reload',
20
- setBeepOnFinish: 'runtime',
21
- setBenchmarkConcurrencies: 'runtime',
22
- setBenchmarkRuns: 'runtime',
23
- setBinariesDirectory: 'restart',
24
- setBrowserExecutable: 'runtime',
25
- setBufferStateDelayInMilliseconds: 'runtime',
26
- setBundleOutDir: 'runtime',
27
- setCachingEnabled: 'runtime',
28
- setChromeMode: 'runtime',
29
- setChromiumDarkMode: 'runtime',
30
- setChromiumDisableWebSecurity: 'runtime',
31
- setChromiumHeadlessMode: 'runtime',
32
- setChromiumIgnoreCertificateErrors: 'runtime',
33
- setChromiumMultiProcessOnLinux: 'runtime',
34
- setChromiumOpenGlRenderer: 'runtime',
35
- setChromiumUserAgent: 'runtime',
36
- setCodec: 'runtime',
37
- setColorSpace: 'runtime',
38
- setConcurrency: 'runtime',
39
- setCrf: 'runtime',
40
- setDefaultCodingAgent: 'runtime',
41
- setDefaultEditor: 'runtime',
42
- setDelayRenderTimeoutInMilliseconds: 'runtime',
43
- setDeleteAfter: 'runtime',
44
- setDisallowParallelEncoding: 'runtime',
45
- setDotEnvLocation: 'restart',
46
- setEnableCrossSiteIsolation: 'restart',
47
- setEnableFolderExpiry: 'runtime',
48
- setEncodingBufferSize: 'runtime',
49
- setEncodingMaxRate: 'runtime',
50
- setEnforceAudioTrack: 'runtime',
51
- setEntryPoint: 'restart',
52
- setEveryNthFrame: 'runtime',
53
- setExperimentalRspackEnabled: 'restart',
54
- setForSeamlessAacConcatenation: 'runtime',
55
- setForceNewStudioEnabled: 'restart',
56
- setFrameRange: 'runtime',
57
- setGopSize: 'runtime',
58
- setHardwareAcceleration: 'runtime',
59
- setIPv4: 'restart',
60
- setImageFormat: 'runtime',
61
- setImageSequence: 'runtime',
62
- setImageSequencePattern: 'runtime',
63
- setInteractivityEnabled: 'runtime',
64
- setJpegQuality: 'runtime',
65
- setKeyboardShortcutsEnabled: 'runtime',
66
- setLambdaInsights: 'runtime',
67
- setLevel: 'restart',
68
- setLogLevel: 'restart',
69
- setMaxTimelineTracks: 'runtime',
70
- setMetadata: 'runtime',
71
- setMuted: 'runtime',
72
- setNumberOfGifLoops: 'runtime',
73
- setNumberOfSharedAudioTags: 'reload',
74
- setOffthreadVideoCacheSizeInBytes: 'runtime',
75
- setOutputLocation: 'runtime',
76
- setOverwriteOutput: 'runtime',
77
- setPixelFormat: 'runtime',
78
- setPort: 'restart',
79
- setPreferLosslessAudio: 'runtime',
80
- setPreviewSampleRate: 'reload',
81
- setProResProfile: 'runtime',
82
- setPublicDir: 'restart',
83
- setPublicLicenseKey: 'runtime',
84
- setPublicPath: 'runtime',
85
- setQuality: 'runtime',
86
- setRendererPort: 'restart',
87
- setRepro: 'runtime',
88
- setRspack: 'restart',
89
- setSampleRate: 'runtime',
90
- setScale: 'runtime',
91
- setShouldOpenBrowser: 'restart',
92
- setStillImageFormat: 'runtime',
93
- setStudioPort: 'restart',
94
- setTimeoutInMilliseconds: 'runtime',
95
- setVideoBitrate: 'runtime',
96
- setVideoImageFormat: 'runtime',
97
- setWebpackPollingInMilliseconds: 'restart',
98
- setX264Preset: 'runtime',
99
- };
8
+ const configMethodLifecycles = validateConfigMethodLifecycles(studio_shared_1.configMethodLifecycles);
100
9
  const getConfigMethodsWithLifecycle = (lifecycle) => {
101
10
  return new Set(Object.entries(configMethodLifecycles)
102
11
  .filter(([, value]) => value === lifecycle)
@@ -99,6 +99,7 @@ exports.listOfRemotionPackages = [
99
99
  '@remotion/design',
100
100
  '@remotion/studio-protocol',
101
101
  '@remotion/light-leaks',
102
+ '@remotion/mac-cursors',
102
103
  '@remotion/rough-notation',
103
104
  '@remotion/starburst',
104
105
  '@remotion/vercel',
@@ -357,14 +357,14 @@ declare const benchmarkConcurrenciesOption: {
357
357
  description: () => import("react/jsx-runtime").JSX.Element;
358
358
  ssrName: null;
359
359
  docLink: string;
360
- type: "claude-code" | "codex" | "cursor" | "github-copilot" | null;
360
+ type: "claude-code" | "codex" | "copilot" | "cursor" | null;
361
361
  getValue: ({ commandLine }: {
362
362
  commandLine: Record<string, unknown>;
363
363
  }) => {
364
- value: "claude-code" | "codex" | "cursor" | "github-copilot" | null;
364
+ value: "claude-code" | "codex" | "copilot" | "cursor" | null;
365
365
  source: string;
366
366
  };
367
- setConfig(value: "claude-code" | "codex" | "cursor" | "github-copilot" | null): void;
367
+ setConfig(value: "claude-code" | "codex" | "copilot" | "cursor" | null): void;
368
368
  id: "coding-agent";
369
369
  }, defaultEditorOption: {
370
370
  name: string;
@@ -28,6 +28,7 @@ export declare const makeRenderingAndStitchingProgress: ({ prog, isUsingParallel
28
28
  progress: number;
29
29
  message: string;
30
30
  };
31
+ export declare const getGuiProgressSubtitle: (progress: AggregateRenderProgress) => string;
31
32
  export declare const printFact: (printLevel: "error" | "info" | "trace" | "verbose" | "warn") => ({ indent, logLevel, left, right, color, link, }: {
32
33
  indent: boolean;
33
34
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.printFact = exports.makeRenderingAndStitchingProgress = exports.getRightLabelWidth = exports.makeBundlingAndCopyProgress = exports.createOverwriteableCliOutput = exports.LABEL_WIDTH = void 0;
3
+ exports.printFact = exports.getGuiProgressSubtitle = exports.makeRenderingAndStitchingProgress = exports.getRightLabelWidth = exports.makeBundlingAndCopyProgress = exports.createOverwriteableCliOutput = exports.LABEL_WIDTH = void 0;
4
4
  const renderer_1 = require("@remotion/renderer");
5
5
  const pure_1 = require("@remotion/renderer/pure");
6
6
  const studio_server_1 = require("@remotion/studio-server");
@@ -234,11 +234,17 @@ const makeRenderingAndStitchingProgress = ({ prog, isUsingParallelEncoding, }) =
234
234
  const progress = ((_b = bundling === null || bundling === void 0 ? void 0 : bundling.progress) !== null && _b !== void 0 ? _b : 0) * 0.3 +
235
235
  renderProgress * 0.6 +
236
236
  stitchingProgress * 0.1;
237
- return { output, progress, message: getGuiProgressSubtitle(prog) };
237
+ return { output, progress, message: (0, exports.getGuiProgressSubtitle)(prog) };
238
238
  };
239
239
  exports.makeRenderingAndStitchingProgress = makeRenderingAndStitchingProgress;
240
240
  const getGuiProgressSubtitle = (progress) => {
241
241
  var _a, _b;
242
+ if (progress.browser.error) {
243
+ return 'Failed to download browser';
244
+ }
245
+ if (!progress.browser.alreadyAvailable && progress.browser.doneIn === null) {
246
+ return `Downloading browser ${Math.round(progress.browser.progress * 100)}%`;
247
+ }
242
248
  // Handle floating point inaccuracies
243
249
  const bundlingProgress = ((_a = progress.bundling) === null || _a === void 0 ? void 0 : _a.progress) || 0;
244
250
  if (bundlingProgress < 0.99999) {
@@ -270,6 +276,7 @@ const getGuiProgressSubtitle = (progress) => {
270
276
  }
271
277
  return `Encoded ${progress.stitching.frames}/${progress.stitching.totalFrames}`;
272
278
  };
279
+ exports.getGuiProgressSubtitle = getGuiProgressSubtitle;
273
280
  const printFact = (printLevel) => ({ indent, logLevel, left, right, color, link, }) => {
274
281
  const fn = (str) => {
275
282
  if (color === 'gray') {
@@ -1,7 +1,7 @@
1
1
  import type { BundlerOverrideFn, RspackOverrideFn, WebpackOverrideFn } from '@remotion/bundler';
2
2
  import type { BrowserExecutable, CancelSignal, ChromiumOptions, Crf, FfmpegOverrideFn, FrameRange, NumberOfGifLoops } from '@remotion/renderer';
3
3
  import type { JobProgressCallback } from '@remotion/studio-server';
4
- export declare const renderVideoFlow: ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, selectedFrames, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, }: {
4
+ export declare const renderVideoFlow: ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, selectedFrames, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, licenseKey, }: {
5
5
  remotionRoot: string;
6
6
  fullEntryPoint: string;
7
7
  entryPointReason: string;
@@ -73,4 +73,5 @@ export declare const renderVideoFlow: ({ remotionRoot, fullEntryPoint, indent, l
73
73
  bundlerOverride: BundlerOverrideFn | null;
74
74
  rspackOverride: RspackOverrideFn | null;
75
75
  webpackOverride: WebpackOverrideFn | null;
76
+ licenseKey: string | null;
76
77
  }) => Promise<void>;
@@ -61,7 +61,7 @@ const should_use_non_overlaying_logger_1 = require("../should-use-non-overlaying
61
61
  const truthy_1 = require("../truthy");
62
62
  const user_passed_output_location_1 = require("../user-passed-output-location");
63
63
  const add_log_to_aggregate_progress_1 = require("./add-log-to-aggregate-progress");
64
- const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, selectedFrames, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, }) => {
64
+ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel, browserExecutable, browser, chromiumOptions, scale, shouldOutputImageSequence, publicDir, envVariables, puppeteerTimeout, port, height, width, fps, durationInFrames, remainingArgs, compositionIdFromUi, entryPointReason, overwrite, quiet, concurrency, frameRange, selectedFrames, everyNthFrame, outputLocationFromUI, jpegQuality, onProgress, addCleanupCallback, cancelSignal, crf, gopSize, uiCodec, uiImageFormat, ffmpegOverride, audioBitrate, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, videoBitrate, encodingMaxRate, encodingBufferSize, numberOfGifLoops, audioCodec, serializedInputPropsWithCustomSchema, disallowParallelEncoding, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, colorSpace, repro, binariesDirectory, forSeamlessAacConcatenation, separateAudioTo, publicPath, metadata, hardwareAcceleration, chromeMode, audioLatencyHint, imageSequencePattern, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, sampleRate, bundlerOverride, rspackOverride, webpackOverride, licenseKey, }) => {
65
65
  var _a;
66
66
  renderer_1.RenderInternals.validateConcurrency({
67
67
  value: concurrency,
@@ -99,13 +99,24 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
99
99
  logLevel,
100
100
  quiet: (0, parsed_cli_1.quietFlagProvided)(),
101
101
  });
102
- await renderer_1.RenderInternals.internalEnsureBrowser({
103
- browserExecutable,
104
- indent,
105
- logLevel,
106
- onBrowserDownload,
107
- chromeMode,
108
- });
102
+ try {
103
+ await renderer_1.RenderInternals.internalEnsureBrowser({
104
+ browserExecutable,
105
+ indent,
106
+ logLevel,
107
+ onBrowserDownload,
108
+ chromeMode,
109
+ });
110
+ }
111
+ catch (err) {
112
+ updateBrowserProgress({
113
+ progress: browserState.progress,
114
+ doneIn: null,
115
+ alreadyAvailable: false,
116
+ error: true,
117
+ });
118
+ throw err;
119
+ }
109
120
  const browserInstance = renderer_1.RenderInternals.internalOpenBrowser({
110
121
  browser,
111
122
  browserExecutable,
@@ -139,7 +150,9 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
139
150
  logs: logsProgress,
140
151
  };
141
152
  onProgress({
142
- message: `Downloading ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'} ${Math.round(progress.progress * 100)}%`,
153
+ message: progress.error
154
+ ? `Failed to download ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'}`
155
+ : `Downloading ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'} ${Math.round(progress.progress * 100)}%`,
143
156
  value: 0,
144
157
  ...aggregateRenderProgress,
145
158
  });
@@ -533,7 +546,7 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
533
546
  chromeMode,
534
547
  mediaCacheSizeInBytes,
535
548
  onLog,
536
- licenseKey: null,
549
+ licenseKey,
537
550
  isProduction: null,
538
551
  sampleRate: resolvedSampleRate,
539
552
  });
@@ -1,7 +1,7 @@
1
1
  import type { BundlerOverrideFn, RspackOverrideFn, WebpackOverrideFn } from '@remotion/bundler';
2
2
  import type { BrowserExecutable, CancelSignal, ChromiumOptions } from '@remotion/renderer';
3
3
  import type { JobProgressCallback } from '@remotion/studio-server';
4
- export declare const renderStillFlow: ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, height, width, fps, durationInFrames, serializedInputPropsWithCustomSchema, overwrite, port, publicDir, puppeteerTimeout, jpegQuality, scale, stillFrame, compositionIdFromUi, imageFormatFromUi, logLevel, onProgress, indent, addCleanupCallback, cancelSignal, outputLocationFromUi, offthreadVideoCacheSizeInBytes, binariesDirectory, publicPath, chromeMode, offthreadVideoThreads, audioLatencyHint, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, bundlerOverride, rspackOverride, webpackOverride, }: {
4
+ export declare const renderStillFlow: ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, height, width, fps, durationInFrames, serializedInputPropsWithCustomSchema, overwrite, port, publicDir, puppeteerTimeout, jpegQuality, scale, stillFrame, compositionIdFromUi, imageFormatFromUi, logLevel, onProgress, indent, addCleanupCallback, cancelSignal, outputLocationFromUi, offthreadVideoCacheSizeInBytes, binariesDirectory, publicPath, chromeMode, offthreadVideoThreads, audioLatencyHint, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, bundlerOverride, rspackOverride, webpackOverride, licenseKey, }: {
5
5
  remotionRoot: string;
6
6
  fullEntryPoint: string;
7
7
  entryPointReason: string;
@@ -44,4 +44,5 @@ export declare const renderStillFlow: ({ remotionRoot, fullEntryPoint, entryPoin
44
44
  bundlerOverride: BundlerOverrideFn | null;
45
45
  rspackOverride: RspackOverrideFn | null;
46
46
  webpackOverride: WebpackOverrideFn | null;
47
+ licenseKey: string | null;
47
48
  }) => Promise<void>;
@@ -28,7 +28,7 @@ const should_use_non_overlaying_logger_1 = require("../should-use-non-overlaying
28
28
  const truthy_1 = require("../truthy");
29
29
  const user_passed_output_location_1 = require("../user-passed-output-location");
30
30
  const add_log_to_aggregate_progress_1 = require("./add-log-to-aggregate-progress");
31
- const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, height, width, fps, durationInFrames, serializedInputPropsWithCustomSchema, overwrite, port, publicDir, puppeteerTimeout, jpegQuality, scale, stillFrame, compositionIdFromUi, imageFormatFromUi, logLevel, onProgress, indent, addCleanupCallback, cancelSignal, outputLocationFromUi, offthreadVideoCacheSizeInBytes, binariesDirectory, publicPath, chromeMode, offthreadVideoThreads, audioLatencyHint, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, bundlerOverride, rspackOverride, webpackOverride, }) => {
31
+ const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, height, width, fps, durationInFrames, serializedInputPropsWithCustomSchema, overwrite, port, publicDir, puppeteerTimeout, jpegQuality, scale, stillFrame, compositionIdFromUi, imageFormatFromUi, logLevel, onProgress, indent, addCleanupCallback, cancelSignal, outputLocationFromUi, offthreadVideoCacheSizeInBytes, binariesDirectory, publicPath, chromeMode, offthreadVideoThreads, audioLatencyHint, mediaCacheSizeInBytes, rspack, askAIEnabled, keyboardShortcutsEnabled, shouldCache, bundlerOverride, rspackOverride, webpackOverride, licenseKey, }) => {
32
32
  const isVerbose = renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose');
33
33
  log_1.Log.verbose({ indent, logLevel }, chalk_1.chalk.gray(`Entry point = ${fullEntryPoint} (${entryPointReason})`));
34
34
  const aggregate = (0, progress_types_1.initialAggregateRenderProgress)();
@@ -53,7 +53,9 @@ const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason,
53
53
  function updateBrowserProgress(progress) {
54
54
  aggregate.browser = progress;
55
55
  onProgress({
56
- message: `Downloading ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'} ${Math.round(progress.progress * 100)}%`,
56
+ message: progress.error
57
+ ? `Failed to download ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'}`
58
+ : `Downloading ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'} ${Math.round(progress.progress * 100)}%`,
57
59
  value: 0,
58
60
  ...aggregate,
59
61
  });
@@ -64,13 +66,24 @@ const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason,
64
66
  logLevel,
65
67
  onProgress: updateBrowserProgress,
66
68
  });
67
- await renderer_1.RenderInternals.internalEnsureBrowser({
68
- browserExecutable,
69
- indent,
70
- logLevel,
71
- onBrowserDownload,
72
- chromeMode,
73
- });
69
+ try {
70
+ await renderer_1.RenderInternals.internalEnsureBrowser({
71
+ browserExecutable,
72
+ indent,
73
+ logLevel,
74
+ onBrowserDownload,
75
+ chromeMode,
76
+ });
77
+ }
78
+ catch (err) {
79
+ updateBrowserProgress({
80
+ progress: aggregate.browser.progress,
81
+ doneIn: null,
82
+ alreadyAvailable: false,
83
+ error: true,
84
+ });
85
+ throw err;
86
+ }
74
87
  const browserInstance = renderer_1.RenderInternals.internalOpenBrowser({
75
88
  browser,
76
89
  browserExecutable,
@@ -284,7 +297,7 @@ const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason,
284
297
  printToConsole: true,
285
298
  });
286
299
  },
287
- licenseKey: null,
300
+ licenseKey,
288
301
  isProduction: null,
289
302
  });
290
303
  aggregate.rendering = {
@@ -64,6 +64,7 @@ const processStill = async ({ job, remotionRoot, entryPoint, onProgress, addClea
64
64
  bundlerOverride: fixedConfig.bundlerOverride,
65
65
  rspackOverride: fixedConfig.rspackOverride,
66
66
  webpackOverride: fixedConfig.webpackOverride,
67
+ licenseKey: job.licenseKey,
67
68
  });
68
69
  };
69
70
  exports.processStill = processStill;
@@ -103,6 +103,7 @@ const processVideoJob = async ({ job, remotionRoot, entryPoint, onProgress, addC
103
103
  bundlerOverride: fixedConfig.bundlerOverride,
104
104
  rspackOverride: fixedConfig.rspackOverride,
105
105
  webpackOverride: fixedConfig.webpackOverride,
106
+ licenseKey: job.type === 'video' ? job.licenseKey : null,
106
107
  });
107
108
  };
108
109
  exports.processVideoJob = processVideoJob;
package/dist/render.js CHANGED
@@ -11,7 +11,7 @@ const get_cli_options_1 = require("./get-cli-options");
11
11
  const log_1 = require("./log");
12
12
  const parsed_cli_1 = require("./parsed-cli");
13
13
  const render_1 = require("./render-flows/render");
14
- const { x264Option, audioBitrateOption, offthreadVideoCacheSizeInBytesOption, scaleOption, crfOption, gopSizeOption, jpegQualityOption, videoBitrateOption, enforceAudioOption, mutedOption, colorSpaceOption, disallowParallelEncodingOption, enableMultiprocessOnLinuxOption, glOption, numberOfGifLoopsOption, encodingMaxRateOption, encodingBufferSizeOption, reproOption, delayRenderTimeoutInMillisecondsOption, headlessOption, overwriteOption, binariesDirectoryOption, forSeamlessAacConcatenationOption, separateAudioOption, audioCodecOption, publicPathOption, publicDirOption, metadataOption, hardwareAccelerationOption, chromeModeOption, offthreadVideoThreadsOption, audioLatencyHintOption, imageSequencePatternOption, mediaCacheSizeInBytesOption, darkModeOption, askAIOption, keyboardShortcutsOption, rspackOption, browserExecutableOption, everyNthFrameOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, concurrencyOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, bundleCacheOption, sampleRateOption, stillFrameOption, } = client_1.BrowserSafeApis.options;
14
+ const { x264Option, audioBitrateOption, offthreadVideoCacheSizeInBytesOption, scaleOption, crfOption, gopSizeOption, jpegQualityOption, videoBitrateOption, enforceAudioOption, mutedOption, colorSpaceOption, disallowParallelEncodingOption, enableMultiprocessOnLinuxOption, glOption, numberOfGifLoopsOption, encodingMaxRateOption, encodingBufferSizeOption, reproOption, delayRenderTimeoutInMillisecondsOption, headlessOption, overwriteOption, binariesDirectoryOption, forSeamlessAacConcatenationOption, separateAudioOption, audioCodecOption, publicPathOption, publicDirOption, metadataOption, hardwareAccelerationOption, chromeModeOption, offthreadVideoThreadsOption, audioLatencyHintOption, imageSequencePatternOption, mediaCacheSizeInBytesOption, darkModeOption, askAIOption, keyboardShortcutsOption, rspackOption, browserExecutableOption, everyNthFrameOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, concurrencyOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, bundleCacheOption, sampleRateOption, stillFrameOption, publicLicenseKeyOption, } = client_1.BrowserSafeApis.options;
15
15
  const render = async (remotionRoot, args, logLevel) => {
16
16
  const { file, remainingArgs, reason: entryPointReason, } = (0, entry_point_1.findEntryPoint)({ args, remotionRoot, logLevel, allowDirectory: true });
17
17
  if (!file) {
@@ -238,6 +238,7 @@ const render = async (remotionRoot, args, logLevel) => {
238
238
  bundlerOverride: null,
239
239
  rspackOverride: null,
240
240
  webpackOverride: null,
241
+ licenseKey: publicLicenseKeyOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value,
241
242
  });
242
243
  };
243
244
  exports.render = render;
package/dist/still.js CHANGED
@@ -11,7 +11,7 @@ const get_cli_options_1 = require("./get-cli-options");
11
11
  const log_1 = require("./log");
12
12
  const parsed_cli_1 = require("./parsed-cli");
13
13
  const still_1 = require("./render-flows/still");
14
- const { offthreadVideoCacheSizeInBytesOption, scaleOption, jpegQualityOption, enableMultiprocessOnLinuxOption, glOption, delayRenderTimeoutInMillisecondsOption, headlessOption, overwriteOption, binariesDirectoryOption, publicPathOption, publicDirOption, chromeModeOption, offthreadVideoThreadsOption, audioLatencyHintOption, mediaCacheSizeInBytesOption, darkModeOption, askAIOption, keyboardShortcutsOption, rspackOption, browserExecutableOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, bundleCacheOption, framesOption, } = client_1.BrowserSafeApis.options;
14
+ const { offthreadVideoCacheSizeInBytesOption, scaleOption, jpegQualityOption, enableMultiprocessOnLinuxOption, glOption, delayRenderTimeoutInMillisecondsOption, headlessOption, overwriteOption, binariesDirectoryOption, publicPathOption, publicDirOption, chromeModeOption, offthreadVideoThreadsOption, audioLatencyHintOption, mediaCacheSizeInBytesOption, darkModeOption, askAIOption, keyboardShortcutsOption, rspackOption, browserExecutableOption, userAgentOption, disableWebSecurityOption, ignoreCertificateErrorsOption, overrideHeightOption, overrideWidthOption, overrideFpsOption, overrideDurationOption, bundleCacheOption, framesOption, publicLicenseKeyOption, } = client_1.BrowserSafeApis.options;
15
15
  const still = async (remotionRoot, args, logLevel) => {
16
16
  const { file, remainingArgs, reason: entryPointReason, } = (0, entry_point_1.findEntryPoint)({ args, remotionRoot, logLevel, allowDirectory: true });
17
17
  if (!file) {
@@ -158,6 +158,7 @@ const still = async (remotionRoot, args, logLevel) => {
158
158
  bundlerOverride: null,
159
159
  rspackOverride: null,
160
160
  webpackOverride: null,
161
+ licenseKey: publicLicenseKeyOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value,
161
162
  });
162
163
  };
163
164
  exports.still = still;
package/dist/studio.js CHANGED
@@ -17,7 +17,7 @@ const get_render_defaults_1 = require("./get-render-defaults");
17
17
  const log_1 = require("./log");
18
18
  const parsed_cli_1 = require("./parsed-cli");
19
19
  const queue_1 = require("./render-queue/queue");
20
- const { binariesDirectoryOption, publicDirOption, disableGitSourceOption, enableCrossSiteIsolationOption, askAIOption, interactivityOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, audioLatencyHintOption, ipv4Option, rspackOption, webpackPollOption, noOpenOption, portOption, browserOption, previewSampleRateOption, defaultCodingAgentOption, defaultEditorOption, } = client_1.BrowserSafeApis.options;
20
+ const { binariesDirectoryOption, publicDirOption, disableGitSourceOption, enableCrossSiteIsolationOption, askAIOption, interactivityOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, audioLatencyHintOption, ipv4Option, rspackOption, webpackPollOption, noOpenOption, portOption, browserOption, previewSampleRateOption, defaultCodingAgentOption, defaultEditorOption, publicLicenseKeyOption, } = client_1.BrowserSafeApis.options;
21
21
  const studioCommand = async (remotionRoot, args, logLevel) => {
22
22
  var _a, _b, _c;
23
23
  const { file, reason } = (0, entry_point_1.findEntryPoint)({
@@ -74,19 +74,31 @@ const studioCommand = async (remotionRoot, args, logLevel) => {
74
74
  const rspackOverride = config_1.ConfigInternals.getRspackOverrideFn();
75
75
  const webpackOverride = config_1.ConfigInternals.getWebpackOverrideFn();
76
76
  log_1.Log.verbose({ indent: false, logLevel }, `Using ${useRspack ? 'Rspack' : 'Webpack'} bundler.`);
77
- const getStudioRuntimeConfig = () => ({
78
- maxTimelineTracks: config_1.ConfigInternals.getMaxTimelineTracks(),
79
- askAIEnabled: askAIOption.getValue({
77
+ const getStudioRuntimeConfig = () => {
78
+ const configuredEditor = defaultEditorOption.getValue({
80
79
  commandLine: parsed_cli_1.parsedCli,
81
- }).value,
82
- interactivityEnabled: interactivityOption.getValue({
83
- commandLine: parsed_cli_1.parsedCli,
84
- }).value,
85
- keyboardShortcutsEnabled: keyboardShortcutsOption.getValue({
86
- commandLine: parsed_cli_1.parsedCli,
87
- }).value,
88
- bufferStateDelayInMilliseconds: config_1.ConfigInternals.getBufferStateDelayInMilliseconds(),
89
- });
80
+ }).value;
81
+ return {
82
+ maxTimelineTracks: config_1.ConfigInternals.getMaxTimelineTracks(),
83
+ askAIEnabled: askAIOption.getValue({
84
+ commandLine: parsed_cli_1.parsedCli,
85
+ }).value,
86
+ interactivityEnabled: interactivityOption.getValue({
87
+ commandLine: parsed_cli_1.parsedCli,
88
+ }).value,
89
+ keyboardShortcutsEnabled: keyboardShortcutsOption.getValue({
90
+ commandLine: parsed_cli_1.parsedCli,
91
+ }).value,
92
+ bufferStateDelayInMilliseconds: config_1.ConfigInternals.getBufferStateDelayInMilliseconds(),
93
+ defaultCodingAgent: defaultCodingAgentOption.getValue({
94
+ commandLine: parsed_cli_1.parsedCli,
95
+ }).value,
96
+ defaultEditor: typeof configuredEditor === 'object' ? 'custom' : configuredEditor,
97
+ publicLicenseKey: publicLicenseKeyOption.getValue({
98
+ commandLine: parsed_cli_1.parsedCli,
99
+ }).value,
100
+ };
101
+ };
90
102
  const getNumberOfAudioTags = () => numberOfSharedAudioTagsOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
91
103
  const getAudioLatencyHint = () => audioLatencyHintOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
92
104
  const getPreviewSampleRate = () => previewSampleRateOption.getValue({ commandLine: parsed_cli_1.parsedCli }).value;
@@ -107,7 +119,7 @@ const studioCommand = async (remotionRoot, args, logLevel) => {
107
119
  studio_server_1.StudioServerInternals.installFileWatcher({
108
120
  file: configFile,
109
121
  existenceOnly: false,
110
- onChange: async () => {
122
+ onChange: async (event) => {
111
123
  if (isReloadingConfig) {
112
124
  return;
113
125
  }
@@ -143,9 +155,13 @@ const studioCommand = async (remotionRoot, args, logLevel) => {
143
155
  const message = (0, studio_shared_1.getConfigFileChangeMessage)(changeType);
144
156
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue(message));
145
157
  studio_server_1.StudioServerInternals.waitForLiveEventsListener().then((listener) => {
158
+ var _a;
146
159
  listener.sendEventToClient({
147
160
  type: 'config-file-changed',
148
161
  changeType,
162
+ originatorClientId: event.type === 'deleted'
163
+ ? null
164
+ : ((_a = event.originatorClientId) !== null && _a !== void 0 ? _a : null),
149
165
  renderDefaults,
150
166
  studioRuntimeConfig,
151
167
  editorName,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cli"
4
4
  },
5
5
  "name": "@remotion/cli",
6
- "version": "4.0.506",
6
+ "version": "4.0.508",
7
7
  "description": "Control Remotion features using the `npx remotion` command",
8
8
  "main": "dist/index.js",
9
9
  "bin": {
@@ -37,18 +37,18 @@
37
37
  "license": "SEE LICENSE IN LICENSE.md",
38
38
  "dependencies": {
39
39
  "@babel/parser": "7.24.1",
40
- "@remotion/bundler": "4.0.506",
41
- "@remotion/media-utils": "4.0.506",
42
- "@remotion/player": "4.0.506",
43
- "@remotion/renderer": "4.0.506",
44
- "@remotion/studio-shared": "4.0.506",
45
- "@remotion/studio-server": "4.0.506",
46
- "@remotion/studio": "4.0.506",
40
+ "@remotion/bundler": "4.0.508",
41
+ "@remotion/media-utils": "4.0.508",
42
+ "@remotion/player": "4.0.508",
43
+ "@remotion/renderer": "4.0.508",
44
+ "@remotion/studio-shared": "4.0.508",
45
+ "@remotion/studio-server": "4.0.508",
46
+ "@remotion/studio": "4.0.508",
47
47
  "dotenv": "17.3.1",
48
48
  "minimist": "1.2.6",
49
49
  "prompts": "2.4.2",
50
50
  "semver": "7.5.3",
51
- "remotion": "4.0.506"
51
+ "remotion": "4.0.508"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "react": ">=16.8.0",
@@ -60,14 +60,14 @@
60
60
  "@types/prettier": "2.7.2",
61
61
  "@types/semver": "7.5.3",
62
62
  "@types/node": "20.12.14",
63
- "@remotion/zod-types": "4.0.506",
64
- "@remotion/tailwind-v4": "4.0.506",
65
- "@remotion/enable-scss": "4.0.506",
66
- "@remotion/skia": "4.0.506",
63
+ "@remotion/zod-types": "4.0.508",
64
+ "@remotion/tailwind-v4": "4.0.508",
65
+ "@remotion/enable-scss": "4.0.508",
66
+ "@remotion/skia": "4.0.508",
67
67
  "react": "19.2.3",
68
68
  "react-dom": "19.2.3",
69
69
  "zod": "4.4.3",
70
- "@remotion/eslint-config-internal": "4.0.506",
70
+ "@remotion/eslint-config-internal": "4.0.508",
71
71
  "eslint": "9.19.0",
72
72
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
73
73
  },
@@ -1,4 +0,0 @@
1
- export declare const getVideoImageFormat: ({ codec, uiImageFormat, }: {
2
- codec: import("@remotion/renderer").CodecOrUndefined;
3
- uiImageFormat: "jpeg" | "none" | "png" | null;
4
- }) => "jpeg" | "none" | "png";
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getVideoImageFormat = void 0;
4
- const client_1 = require("@remotion/renderer/client");
5
- const pure_1 = require("@remotion/renderer/pure");
6
- const parsed_cli_1 = require("./parsed-cli");
7
- const getVideoImageFormat = ({ codec, uiImageFormat, }) => {
8
- if (uiImageFormat !== null) {
9
- return uiImageFormat;
10
- }
11
- const configured = client_1.BrowserSafeApis.options.videoImageFormatOption.getValue({
12
- commandLine: parsed_cli_1.parsedCli,
13
- }).value;
14
- if (configured !== null) {
15
- return configured;
16
- }
17
- if (pure_1.NoReactAPIs.isAudioCodec(codec)) {
18
- return 'none';
19
- }
20
- if (codec === 'h264' ||
21
- codec === 'h264-mkv' ||
22
- codec === 'h264-ts' ||
23
- codec === 'h265' ||
24
- codec === 'av1' ||
25
- codec === 'vp8' ||
26
- codec === 'vp9' ||
27
- codec === 'prores' ||
28
- codec === 'gif') {
29
- return 'jpeg';
30
- }
31
- if (codec === undefined) {
32
- return 'png';
33
- }
34
- throw new Error('Unrecognized codec ' + codec);
35
- };
36
- exports.getVideoImageFormat = getVideoImageFormat;