@remotion/studio 4.0.433 → 4.0.434

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.
@@ -208,7 +208,7 @@ var renderContent = (Root) => {
208
208
  renderToDOM(/* @__PURE__ */ jsx("div", {
209
209
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
210
210
  }));
211
- import("./chunk-bd1bkakk.js").then(({ StudioInternals }) => {
211
+ import("./chunk-t3wtt582.js").then(({ StudioInternals }) => {
212
212
  window.remotion_isStudio = true;
213
213
  window.remotion_isReadOnlyStudio = true;
214
214
  window.remotion_inputProps = "{}";
@@ -0,0 +1,51 @@
1
+ import type { RenderFramesOptions, RenderMediaOptions, RenderStillOptions } from '@remotion/renderer';
2
+ import type { RenderDefaults } from '@remotion/studio-shared';
3
+ import type { renderMediaOnWeb } from '@remotion/web-renderer';
4
+ type RenderMode = 'still' | 'video' | 'audio' | 'sequence';
5
+ export declare const getNpmRemotionCommandPrefix: (version: string) => string;
6
+ export declare const normalizeServeUrlForRenderCommand: ({ locationHref, compositionId, }: {
7
+ locationHref: string;
8
+ compositionId: string;
9
+ }) => string;
10
+ type StrictRequired<T> = {
11
+ [K in keyof T]-?: Exclude<T[K], undefined>;
12
+ };
13
+ type RenderMediaCommandOptions = Omit<StrictRequired<Pick<RenderMediaOptions, 'codec' | 'crf' | 'concurrency' | 'disallowParallelEncoding' | 'muted' | 'enforceAudioTrack' | 'everyNthFrame' | 'numberOfGifLoops' | 'colorSpace' | 'scale' | 'logLevel' | 'repro' | 'metadata' | 'jpegQuality' | 'pixelFormat' | 'proResProfile' | 'x264Preset' | 'audioCodec' | 'forSeamlessAacConcatenation' | 'separateAudioTo' | 'hardwareAcceleration' | 'chromeMode' | 'offthreadVideoCacheSizeInBytes' | 'offthreadVideoThreads' | 'mediaCacheSizeInBytes' | 'audioBitrate' | 'videoBitrate' | 'encodingMaxRate' | 'encodingBufferSize'>>, 'audioBitrate' | 'videoBitrate' | 'encodingMaxRate' | 'encodingBufferSize' | 'jpegQuality' | 'proResProfile'> & {
14
+ audioBitrate: string | null;
15
+ videoBitrate: string | null;
16
+ encodingMaxRate: string | null;
17
+ encodingBufferSize: string | null;
18
+ jpegQuality: Exclude<RenderMediaOptions['jpegQuality'], undefined> | null;
19
+ proResProfile: Exclude<RenderMediaOptions['proResProfile'], undefined> | null;
20
+ };
21
+ type RenderStillCommandOptions = StrictRequired<Pick<RenderStillOptions, 'frame'>>;
22
+ type RenderFramesSharedOptions = StrictRequired<Pick<RenderFramesOptions, 'concurrency' | 'everyNthFrame' | 'scale' | 'logLevel'>>;
23
+ type RenderMediaOnWebInput = Parameters<typeof renderMediaOnWeb>[0];
24
+ type CrossRendererOptions = StrictRequired<Pick<RenderMediaOnWebInput, 'muted' | 'scale' | 'logLevel'>>;
25
+ type ReadOnlyStudioRenderCommandInput = RenderMediaCommandOptions & RenderStillCommandOptions & RenderFramesSharedOptions & CrossRendererOptions & {
26
+ remotionVersion: string;
27
+ locationHref: string;
28
+ compositionId: string;
29
+ outName: string;
30
+ renderMode: RenderMode;
31
+ renderDefaults: RenderDefaults;
32
+ durationInFrames: number;
33
+ startFrame: number;
34
+ endFrame: number;
35
+ stillImageFormat: RenderDefaults['stillImageFormat'];
36
+ sequenceImageFormat: RenderDefaults['videoImageFormat'];
37
+ videoImageFormat: RenderDefaults['videoImageFormat'];
38
+ delayRenderTimeout: number;
39
+ headless: boolean;
40
+ disableWebSecurity: boolean;
41
+ ignoreCertificateErrors: boolean;
42
+ gl: RenderDefaults['openGlRenderer'];
43
+ userAgent: string | null;
44
+ multiProcessOnLinux: boolean;
45
+ darkMode: boolean;
46
+ beepOnFinish: boolean;
47
+ envVariables: Record<string, string>;
48
+ inputProps: Record<string, unknown>;
49
+ };
50
+ export declare const makeReadOnlyStudioRenderCommand: ({ remotionVersion, locationHref, compositionId, outName, renderMode, renderDefaults, durationInFrames, concurrency, frame, startFrame, endFrame, stillImageFormat, sequenceImageFormat, videoImageFormat, jpegQuality, codec, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, crf, videoBitrate, audioBitrate, audioCodec, everyNthFrame, numberOfGifLoops, disallowParallelEncoding, encodingBufferSize, encodingMaxRate, forSeamlessAacConcatenation, separateAudioTo, colorSpace, scale, logLevel, delayRenderTimeout, hardwareAcceleration, chromeMode, headless, disableWebSecurity, ignoreCertificateErrors, gl, userAgent, multiProcessOnLinux, darkMode, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, mediaCacheSizeInBytes, beepOnFinish, repro, metadata, envVariables, inputProps, }: ReadOnlyStudioRenderCommandInput) => string;
51
+ export {};
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeReadOnlyStudioRenderCommand = exports.normalizeServeUrlForRenderCommand = exports.getNpmRemotionCommandPrefix = void 0;
4
+ const client_1 = require("@remotion/renderer/client");
5
+ const shellQuote = (value) => {
6
+ return `'${value.replace(/'/g, "'\\''")}'`;
7
+ };
8
+ const addFlagWithValue = (flags, flag, value) => {
9
+ if (value === null || value === undefined) {
10
+ return;
11
+ }
12
+ flags.push(`--${flag}=${shellQuote(String(value))}`);
13
+ };
14
+ const addBooleanFlag = (flags, flag, value) => {
15
+ if (value) {
16
+ flags.push(`--${flag}`);
17
+ }
18
+ };
19
+ const valueFlag = (flag, value, defaultValue) => {
20
+ return { flag, value, defaultValue };
21
+ };
22
+ const booleanFlag = (flag, value, defaultValue) => {
23
+ return { flag, value, defaultValue };
24
+ };
25
+ const addValueFlagsIfChanged = (flags, mappings) => {
26
+ for (const mapping of mappings) {
27
+ if (mapping.value !== mapping.defaultValue) {
28
+ addFlagWithValue(flags, mapping.flag, mapping.value);
29
+ }
30
+ }
31
+ };
32
+ const addTrueBooleanFlagsIfChanged = (flags, mappings) => {
33
+ for (const mapping of mappings) {
34
+ if (mapping.value && mapping.value !== mapping.defaultValue) {
35
+ addBooleanFlag(flags, mapping.flag, true);
36
+ }
37
+ }
38
+ };
39
+ const getNpmRemotionCommandPrefix = (version) => {
40
+ return version.trim() === ''
41
+ ? 'npx --yes --location=global -p @remotion/cli remotion'
42
+ : `npx --yes --location=global -p @remotion/cli@${version} remotion`;
43
+ };
44
+ exports.getNpmRemotionCommandPrefix = getNpmRemotionCommandPrefix;
45
+ const normalizeServeUrlForRenderCommand = ({ locationHref, compositionId, }) => {
46
+ const parsed = new URL(locationHref);
47
+ parsed.hash = '';
48
+ parsed.search = '';
49
+ const suffix = `/${compositionId}`;
50
+ if (parsed.pathname === suffix) {
51
+ parsed.pathname = '/';
52
+ }
53
+ else if (parsed.pathname.endsWith(suffix)) {
54
+ const basePath = parsed.pathname.slice(0, -suffix.length);
55
+ parsed.pathname = basePath === '' ? '/' : basePath;
56
+ }
57
+ if (parsed.pathname !== '/' && parsed.pathname.endsWith('/')) {
58
+ parsed.pathname = parsed.pathname.slice(0, -1);
59
+ }
60
+ return `${parsed.origin}${parsed.pathname === '/' ? '' : parsed.pathname}`;
61
+ };
62
+ exports.normalizeServeUrlForRenderCommand = normalizeServeUrlForRenderCommand;
63
+ const trimDefaultOutPrefix = (outName) => {
64
+ if (outName.startsWith('out/')) {
65
+ const trimmed = outName.slice('out/'.length);
66
+ return trimmed.length === 0 ? outName : trimmed;
67
+ }
68
+ if (outName.startsWith('./out/')) {
69
+ const trimmed = outName.slice('./out/'.length);
70
+ return trimmed.length === 0 ? outName : trimmed;
71
+ }
72
+ return outName;
73
+ };
74
+ const getRenderMediaFlag = (option) => {
75
+ return client_1.BrowserSafeApis.optionsMap.renderMedia[option].cliFlag;
76
+ };
77
+ const renderMediaValueFlag = (option, value, defaultValue) => {
78
+ return valueFlag(getRenderMediaFlag(option), value, defaultValue);
79
+ };
80
+ const renderMediaBooleanFlag = (option, value, defaultValue) => {
81
+ return booleanFlag(getRenderMediaFlag(option), value, defaultValue);
82
+ };
83
+ const makeReadOnlyStudioRenderCommand = ({ remotionVersion, locationHref, compositionId, outName, renderMode, renderDefaults, durationInFrames, concurrency, frame, startFrame, endFrame, stillImageFormat, sequenceImageFormat, videoImageFormat, jpegQuality, codec, muted, enforceAudioTrack, proResProfile, x264Preset, pixelFormat, crf, videoBitrate, audioBitrate, audioCodec, everyNthFrame, numberOfGifLoops, disallowParallelEncoding, encodingBufferSize, encodingMaxRate, forSeamlessAacConcatenation, separateAudioTo, colorSpace, scale, logLevel, delayRenderTimeout, hardwareAcceleration, chromeMode, headless, disableWebSecurity, ignoreCertificateErrors, gl, userAgent, multiProcessOnLinux, darkMode, offthreadVideoCacheSizeInBytes, offthreadVideoThreads, mediaCacheSizeInBytes, beepOnFinish, repro, metadata, envVariables, inputProps, }) => {
84
+ var _a;
85
+ const serveUrl = (0, exports.normalizeServeUrlForRenderCommand)({
86
+ locationHref,
87
+ compositionId,
88
+ });
89
+ const isStillRender = renderMode === 'still';
90
+ const isSequenceRender = renderMode === 'sequence';
91
+ const hasCodecSpecificOptions = !isSequenceRender;
92
+ const commandType = isStillRender ? 'still' : 'render';
93
+ const command = (0, exports.getNpmRemotionCommandPrefix)(remotionVersion);
94
+ const { options } = client_1.BrowserSafeApis;
95
+ const flags = [];
96
+ addValueFlagsIfChanged(flags, [
97
+ valueFlag(options.scaleOption.cliFlag, scale, renderDefaults.scale),
98
+ renderMediaValueFlag('logLevel', logLevel, renderDefaults.logLevel),
99
+ renderMediaValueFlag('timeoutInMilliseconds', delayRenderTimeout, renderDefaults.delayRenderTimeout),
100
+ renderMediaValueFlag('chromeMode', chromeMode, renderDefaults.chromeMode),
101
+ valueFlag(options.glOption.cliFlag, gl, renderDefaults.openGlRenderer),
102
+ valueFlag(options.userAgentOption.cliFlag, userAgent, renderDefaults.userAgent),
103
+ renderMediaValueFlag('offthreadVideoCacheSizeInBytes', offthreadVideoCacheSizeInBytes, renderDefaults.offthreadVideoCacheSizeInBytes),
104
+ renderMediaValueFlag('offthreadVideoThreads', offthreadVideoThreads, renderDefaults.offthreadVideoThreads),
105
+ renderMediaValueFlag('mediaCacheSizeInBytes', mediaCacheSizeInBytes, renderDefaults.mediaCacheSizeInBytes),
106
+ ]);
107
+ if (headless !== renderDefaults.headless) {
108
+ addFlagWithValue(flags, options.headlessOption.cliFlag, !headless);
109
+ }
110
+ addTrueBooleanFlagsIfChanged(flags, [
111
+ booleanFlag(options.disableWebSecurityOption.cliFlag, disableWebSecurity, renderDefaults.disableWebSecurity),
112
+ booleanFlag(options.ignoreCertificateErrorsOption.cliFlag, ignoreCertificateErrors, renderDefaults.ignoreCertificateErrors),
113
+ booleanFlag(options.enableMultiprocessOnLinuxOption.cliFlag, multiProcessOnLinux, renderDefaults.multiProcessOnLinux),
114
+ booleanFlag(options.darkModeOption.cliFlag, darkMode, renderDefaults.darkMode),
115
+ booleanFlag(options.beepOnFinishOption.cliFlag, beepOnFinish, renderDefaults.beepOnFinish),
116
+ ]);
117
+ if (isStillRender) {
118
+ addValueFlagsIfChanged(flags, [
119
+ valueFlag(options.stillFrameOption.cliFlag, frame, 0),
120
+ valueFlag(options.stillImageFormatOption.cliFlag, stillImageFormat, renderDefaults.stillImageFormat),
121
+ valueFlag(options.jpegQualityOption.cliFlag, jpegQuality, renderDefaults.jpegQuality),
122
+ ]);
123
+ }
124
+ else {
125
+ addValueFlagsIfChanged(flags, [
126
+ valueFlag(options.concurrencyOption.cliFlag, concurrency, renderDefaults.concurrency),
127
+ ]);
128
+ if (isSequenceRender) {
129
+ addBooleanFlag(flags, options.imageSequenceOption.cliFlag, true);
130
+ if (sequenceImageFormat !== 'jpeg') {
131
+ addFlagWithValue(flags, options.videoImageFormatOption.cliFlag, sequenceImageFormat);
132
+ }
133
+ }
134
+ else {
135
+ addValueFlagsIfChanged(flags, [
136
+ valueFlag(options.videoImageFormatOption.cliFlag, videoImageFormat, renderDefaults.videoImageFormat),
137
+ renderMediaValueFlag('hardwareAcceleration', hardwareAcceleration, renderDefaults.hardwareAcceleration),
138
+ ]);
139
+ }
140
+ if (hasCodecSpecificOptions && codec !== renderDefaults.codec) {
141
+ addFlagWithValue(flags, getRenderMediaFlag('codec'), codec);
142
+ }
143
+ if (startFrame !== 0 || endFrame !== durationInFrames - 1) {
144
+ addFlagWithValue(flags, options.framesOption.cliFlag, `${startFrame}-${endFrame}`);
145
+ }
146
+ if (hasCodecSpecificOptions) {
147
+ addTrueBooleanFlagsIfChanged(flags, [
148
+ renderMediaBooleanFlag('muted', muted, renderDefaults.muted),
149
+ booleanFlag(options.enforceAudioOption.cliFlag, enforceAudioTrack, renderDefaults.enforceAudioTrack),
150
+ renderMediaBooleanFlag('forSeamlessAacConcatenation', forSeamlessAacConcatenation, renderDefaults.forSeamlessAacConcatenation),
151
+ ]);
152
+ addValueFlagsIfChanged(flags, [
153
+ valueFlag(options.pixelFormatOption.cliFlag, pixelFormat, renderDefaults.pixelFormat),
154
+ renderMediaValueFlag('colorSpace', colorSpace, renderDefaults.colorSpace),
155
+ valueFlag(options.proResProfileOption.cliFlag, proResProfile, renderDefaults.proResProfile),
156
+ renderMediaValueFlag('x264Preset', x264Preset, renderDefaults.x264Preset),
157
+ valueFlag(options.crfOption.cliFlag, crf, null),
158
+ valueFlag(options.jpegQualityOption.cliFlag, jpegQuality, renderDefaults.jpegQuality),
159
+ renderMediaValueFlag('videoBitrate', videoBitrate, renderDefaults.videoBitrate),
160
+ renderMediaValueFlag('audioBitrate', audioBitrate, renderDefaults.audioBitrate),
161
+ valueFlag(options.everyNthFrameOption.cliFlag, everyNthFrame, renderDefaults.everyNthFrame),
162
+ renderMediaValueFlag('numberOfGifLoops', numberOfGifLoops, renderDefaults.numberOfGifLoops),
163
+ renderMediaValueFlag('encodingBufferSize', encodingBufferSize, renderDefaults.encodingBufferSize),
164
+ renderMediaValueFlag('encodingMaxRate', encodingMaxRate, renderDefaults.encodingMaxRate),
165
+ renderMediaValueFlag('separateAudioTo', separateAudioTo, null),
166
+ ]);
167
+ const defaultAudioCodec = (_a = client_1.BrowserSafeApis.defaultAudioCodecs[codec]) === null || _a === void 0 ? void 0 : _a.compressed;
168
+ if (audioCodec !== defaultAudioCodec) {
169
+ addFlagWithValue(flags, getRenderMediaFlag('audioCodec'), audioCodec);
170
+ }
171
+ }
172
+ addTrueBooleanFlagsIfChanged(flags, [
173
+ renderMediaBooleanFlag('disallowParallelEncoding', disallowParallelEncoding, false),
174
+ renderMediaBooleanFlag('repro', repro, renderDefaults.repro),
175
+ ]);
176
+ }
177
+ if (metadata) {
178
+ for (const [key, value] of Object.entries(metadata)) {
179
+ addFlagWithValue(flags, options.metadataOption.cliFlag, `${key}=${value}`);
180
+ }
181
+ }
182
+ if (Object.keys(inputProps).length > 0) {
183
+ addFlagWithValue(flags, options.propsOption.cliFlag, JSON.stringify(inputProps));
184
+ }
185
+ const envArgs = Object.entries(envVariables)
186
+ .sort(([a], [b]) => a.localeCompare(b))
187
+ .map(([key, value]) => shellQuote(`${key}=${value}`));
188
+ const renderCommand = [
189
+ command,
190
+ commandType,
191
+ shellQuote(serveUrl),
192
+ shellQuote(compositionId),
193
+ shellQuote(trimDefaultOutPrefix(outName)),
194
+ ...flags,
195
+ ].join(' ');
196
+ if (envArgs.length === 0) {
197
+ return renderCommand;
198
+ }
199
+ return ['env', ...envArgs, renderCommand].join(' ');
200
+ };
201
+ exports.makeReadOnlyStudioRenderCommand = makeReadOnlyStudioRenderCommand;
@@ -58,6 +58,7 @@ const makeRetryPayload = (job) => {
58
58
  initialChromeMode: job.chromeMode,
59
59
  initialMediaCacheSizeInBytes: job.mediaCacheSizeInBytes,
60
60
  renderDefaults: defaults,
61
+ readOnlyStudio: false,
61
62
  };
62
63
  }
63
64
  if (job.type === 'sequence') {
@@ -110,6 +111,7 @@ const makeRetryPayload = (job) => {
110
111
  initialChromeMode: job.chromeMode,
111
112
  initialMediaCacheSizeInBytes: job.mediaCacheSizeInBytes,
112
113
  renderDefaults: defaults,
114
+ readOnlyStudio: false,
113
115
  };
114
116
  }
115
117
  if (job.type === 'video') {
@@ -162,6 +164,7 @@ const makeRetryPayload = (job) => {
162
164
  initialChromeMode: job.chromeMode,
163
165
  initialMediaCacheSizeInBytes: job.mediaCacheSizeInBytes,
164
166
  renderDefaults: defaults,
167
+ readOnlyStudio: false,
165
168
  };
166
169
  }
167
170
  throw new Error(`Job ${JSON.stringify(job)} Not implemented`);
@@ -34,6 +34,7 @@ export type WebRenderModalState = {
34
34
  };
35
35
  export type RenderModalState = {
36
36
  type: 'server-render';
37
+ readOnlyStudio: boolean;
37
38
  compositionId: string;
38
39
  initialFrame: number;
39
40
  initialStillImageFormat: StillImageFormat;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.433",
6
+ "version": "4.0.434",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "sideEffects": false,
@@ -26,13 +26,13 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "semver": "7.5.3",
29
- "remotion": "4.0.433",
30
- "@remotion/player": "4.0.433",
31
- "@remotion/media-utils": "4.0.433",
32
- "@remotion/renderer": "4.0.433",
33
- "@remotion/web-renderer": "4.0.433",
34
- "@remotion/studio-shared": "4.0.433",
35
- "@remotion/zod-types": "4.0.433",
29
+ "remotion": "4.0.434",
30
+ "@remotion/player": "4.0.434",
31
+ "@remotion/media-utils": "4.0.434",
32
+ "@remotion/renderer": "4.0.434",
33
+ "@remotion/web-renderer": "4.0.434",
34
+ "@remotion/studio-shared": "4.0.434",
35
+ "@remotion/zod-types": "4.0.434",
36
36
  "mediabunny": "1.37.0",
37
37
  "memfs": "3.4.3",
38
38
  "source-map": "0.7.3",
@@ -43,7 +43,7 @@
43
43
  "react": "19.2.3",
44
44
  "react-dom": "19.2.3",
45
45
  "@types/semver": "^7.3.4",
46
- "@remotion/eslint-config-internal": "4.0.433",
46
+ "@remotion/eslint-config-internal": "4.0.434",
47
47
  "eslint": "9.19.0",
48
48
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
49
49
  },
@@ -1 +0,0 @@
1
- export declare const shouldShowRenderButton: (readOnlyStudio: boolean) => boolean;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.shouldShowRenderButton = void 0;
4
- const show_browser_rendering_1 = require("./show-browser-rendering");
5
- const shouldShowRenderButton = (readOnlyStudio) => {
6
- if (readOnlyStudio) {
7
- return show_browser_rendering_1.SHOW_BROWSER_RENDERING;
8
- }
9
- return true;
10
- };
11
- exports.shouldShowRenderButton = shouldShowRenderButton;