remotion 4.0.74 → 4.0.76

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.
@@ -16,6 +16,7 @@ const IFrameRefForwarding = ({ onLoad, onError, ...props }, ref) => {
16
16
  onError(e);
17
17
  }
18
18
  else {
19
+ // eslint-disable-next-line no-console
19
20
  console.error('Error loading iframe:', e, 'Handle the event using the onError() prop to make this message disappear.');
20
21
  }
21
22
  }, [handle, onError]);
package/dist/cjs/Img.js CHANGED
@@ -53,6 +53,7 @@ const ImgRefForwarding = ({ onError, maxRetries = 2, src, ...props }, ref) => {
53
53
  }
54
54
  if (((_g = errors.current[(_f = imageRef.current) === null || _f === void 0 ? void 0 : _f.src]) !== null && _g !== void 0 ? _g : 0) <= maxRetries) {
55
55
  const backoff = exponentialBackoff((_j = errors.current[(_h = imageRef.current) === null || _h === void 0 ? void 0 : _h.src]) !== null && _j !== void 0 ? _j : 0);
56
+ // eslint-disable-next-line no-console
56
57
  console.warn(`Could not load image with source ${(_k = imageRef.current) === null || _k === void 0 ? void 0 : _k.src}, retrying again in ${backoff}ms`);
57
58
  retryIn(backoff);
58
59
  return;
@@ -71,6 +72,7 @@ const ImgRefForwarding = ({ onError, maxRetries = 2, src, ...props }, ref) => {
71
72
  var _a, _b, _c, _d;
72
73
  if (((_b = errors.current[(_a = imageRef.current) === null || _a === void 0 ? void 0 : _a.src]) !== null && _b !== void 0 ? _b : 0) > 0) {
73
74
  delete errors.current[(_c = imageRef.current) === null || _c === void 0 ? void 0 : _c.src];
75
+ // eslint-disable-next-line no-console
74
76
  console.info(`Retry successful - ${(_d = imageRef.current) === null || _d === void 0 ? void 0 : _d.src} is now loaded`);
75
77
  }
76
78
  (0, delay_render_js_1.continueRender)(newHandle);
@@ -8,6 +8,9 @@ const input_props_js_1 = require("./config/input-props.js");
8
8
  const EditorProps_js_1 = require("./EditorProps.js");
9
9
  const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
10
10
  const resolve_video_config_js_1 = require("./resolve-video-config.js");
11
+ const validate_dimensions_js_1 = require("./validation/validate-dimensions.js");
12
+ const validate_duration_in_frames_js_1 = require("./validation/validate-duration-in-frames.js");
13
+ const validate_fps_js_1 = require("./validation/validate-fps.js");
11
14
  exports.ResolveCompositionContext = (0, react_1.createContext)(null);
12
15
  exports.resolveCompositionsRef = (0, react_1.createRef)();
13
16
  const needsResolution = (composition) => {
@@ -182,6 +185,13 @@ const useResolvedVideoConfig = (preferredCompositionId) => {
182
185
  };
183
186
  }
184
187
  if (!(0, exports.needsResolution)(composition)) {
188
+ (0, validate_duration_in_frames_js_1.validateDurationInFrames)(composition.durationInFrames, {
189
+ allowFloats: false,
190
+ component: `in <Composition id="${composition.id}">`,
191
+ });
192
+ (0, validate_fps_js_1.validateFps)(composition.fps, `in <Composition id="${composition.id}">`, false);
193
+ (0, validate_dimensions_js_1.validateDimension)(composition.width, 'width', `in <Composition id="${composition.id}">`);
194
+ (0, validate_dimensions_js_1.validateDimension)(composition.height, 'height', `in <Composition id="${composition.id}">`);
185
195
  return {
186
196
  type: 'success',
187
197
  result: {
@@ -13,4 +13,4 @@ export declare const Audio: React.ForwardRefExoticComponent<Pick<Omit<React.Deta
13
13
  _remotionInternalNeedsDurationCalculation?: boolean | undefined;
14
14
  _remotionInternalNativeLoopPassed?: boolean | undefined;
15
15
  toneFrequency?: number | undefined;
16
- } & RemotionMainAudioProps, "id" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "placeholder" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "volume" | "allowAmplificationDuringRender" | "controlsList" | "crossOrigin" | "loop" | "mediaGroup" | "muted" | "playsInline" | "preload" | "src" | "name" | "playbackRate" | "acceptableTimeShiftInSeconds" | "_remotionInternalNeedsDurationCalculation" | "_remotionInternalNativeLoopPassed" | "toneFrequency" | keyof RemotionMainAudioProps> & React.RefAttributes<HTMLAudioElement>>;
16
+ } & RemotionMainAudioProps, "id" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "placeholder" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "muted" | "volume" | "allowAmplificationDuringRender" | "controlsList" | "crossOrigin" | "loop" | "mediaGroup" | "playsInline" | "preload" | "src" | "name" | "playbackRate" | "acceptableTimeShiftInSeconds" | "_remotionInternalNeedsDurationCalculation" | "_remotionInternalNativeLoopPassed" | "toneFrequency" | keyof RemotionMainAudioProps> & React.RefAttributes<HTMLAudioElement>>;
@@ -31,6 +31,7 @@ const AudioRefForwardingFunction = (props, ref) => {
31
31
  }
32
32
  const preloadedSrc = (0, prefetch_js_1.usePreload)(props.src);
33
33
  const onError = (0, react_1.useCallback)((e) => {
34
+ // eslint-disable-next-line no-console
34
35
  console.log(e.currentTarget.error);
35
36
  // If there is no `loop` property, we don't need to get the duration
36
37
  // and this does not need to be a fatal error
@@ -39,6 +40,7 @@ const AudioRefForwardingFunction = (props, ref) => {
39
40
  (0, cancel_render_js_1.cancelRender)(new Error(errMessage));
40
41
  }
41
42
  else {
43
+ // eslint-disable-next-line no-console
42
44
  console.warn(errMessage);
43
45
  }
44
46
  }, [loop, preloadedSrc]);
@@ -30,7 +30,7 @@ const AudioForRenderingRefForwardingFunction = (props, ref) => {
30
30
  sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom,
31
31
  sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames,
32
32
  ]);
33
- const { volume: volumeProp, playbackRate, allowAmplificationDuringRender, onDuration, toneFrequency, _remotionInternalNeedsDurationCalculation, _remotionInternalNativeLoopPassed, acceptableTimeShiftInSeconds, name, ...nativeProps } = props;
33
+ const { volume: volumeProp, playbackRate, allowAmplificationDuringRender, onDuration, toneFrequency, _remotionInternalNeedsDurationCalculation, _remotionInternalNativeLoopPassed, acceptableTimeShiftInSeconds, name, onError, ...nativeProps } = props;
34
34
  const volume = (0, volume_prop_js_1.evaluateVolume)({
35
35
  volume: volumeProp,
36
36
  frame: volumePropFrame,
@@ -26,6 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.useSharedAudio = exports.SharedAudioContextProvider = exports.SharedAudioContext = void 0;
27
27
  const jsx_runtime_1 = require("react/jsx-runtime");
28
28
  const react_1 = __importStar(require("react"));
29
+ const play_and_handle_not_allowed_error_js_1 = require("../play-and-handle-not-allowed-error.js");
29
30
  const EMPTY_AUDIO = 'data:audio/mp3;base64,/+MYxAAJcAV8AAgAABn//////+/gQ5BAMA+D4Pg+BAQBAEAwD4Pg+D4EBAEAQDAPg++hYBH///hUFQVBUFREDQNHmf///////+MYxBUGkAGIMAAAAP/29Xt6lUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxDUAAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV';
30
31
  const compareProps = (obj1, obj2) => {
31
32
  const keysA = Object.keys(obj1).sort();
@@ -157,8 +158,7 @@ const SharedAudioContextProvider = ({ children, numberOfAudioTags, component })
157
158
  }, [rerenderAudios]);
158
159
  const playAllAudios = (0, react_1.useCallback)(() => {
159
160
  refs.forEach((ref) => {
160
- var _a;
161
- (_a = ref.ref.current) === null || _a === void 0 ? void 0 : _a.play();
161
+ (0, play_and_handle_not_allowed_error_js_1.playAndHandleNotAllowedError)(ref.ref, 'audio');
162
162
  });
163
163
  }, [refs]);
164
164
  const value = (0, react_1.useMemo)(() => {
@@ -9,8 +9,11 @@ const warnOnceSSRImport = () => {
9
9
  return;
10
10
  }
11
11
  didWarnSSRImport = true;
12
+ // eslint-disable-next-line no-console
12
13
  console.warn('Called `getInputProps()` on the server. This function is not available server-side and has returned an empty object.');
14
+ // eslint-disable-next-line no-console
13
15
  console.warn("To hide this warning, don't call this function on the server:");
16
+ // eslint-disable-next-line no-console
14
17
  console.warn(" typeof window === 'undefined' ? {} : getInputProps()");
15
18
  };
16
19
  const getInputProps = () => {
@@ -8,6 +8,7 @@ const warnServerOnce = () => {
8
8
  return;
9
9
  }
10
10
  warnedServer = true;
11
+ // eslint-disable-next-line no-console
11
12
  console.warn('Called getStaticFiles() on the server. The API is only available in the browser. An empty array was returned.');
12
13
  };
13
14
  const warnPlayerOnce = () => {
@@ -15,6 +16,7 @@ const warnPlayerOnce = () => {
15
16
  return;
16
17
  }
17
18
  warnedPlayer = true;
19
+ // eslint-disable-next-line no-console
18
20
  console.warn('Called getStaticFiles() while using the Remotion Player. The API is only available while using the Remotion Studio. An empty array was returned.');
19
21
  };
20
22
  /**
package/dist/cjs/index.js CHANGED
@@ -94,6 +94,7 @@ exports.Config = new Proxy(proxyObj, {
94
94
  return exports.Config;
95
95
  }
96
96
  return () => {
97
+ /* eslint-disable no-console */
97
98
  console.warn('⚠️ The CLI configuration has been extracted from Remotion Core.');
98
99
  console.warn('Update the import from the config file:');
99
100
  console.warn();
@@ -103,6 +104,7 @@ exports.Config = new Proxy(proxyObj, {
103
104
  console.warn('import {Config} from "@remotion/cli/config";');
104
105
  console.warn();
105
106
  console.warn('For more information, see https://www.remotion.dev/docs/4-0-migration.');
107
+ /* eslint-enable no-console */
106
108
  process.exit(1);
107
109
  };
108
110
  },
@@ -32,8 +32,10 @@ const playAndHandleNotAllowedError = (mediaRef, mediaType) => {
32
32
  if (err.message.includes('because the media was removed from the document')) {
33
33
  return;
34
34
  }
35
+ // eslint-disable-next-line no-console
35
36
  console.log(`Could not play ${mediaType} due to following error: `, err);
36
37
  if (!current.muted) {
38
+ // eslint-disable-next-line no-console
37
39
  console.log(`The video will be muted and we'll retry playing it.`, err);
38
40
  current.muted = true;
39
41
  current.play();
@@ -66,6 +66,7 @@ const prefetch = (src, options) => {
66
66
  if (!buf.type.startsWith('video/') &&
67
67
  !buf.type.startsWith('audio/') &&
68
68
  !(options === null || options === void 0 ? void 0 : options.contentType)) {
69
+ // eslint-disable-next-line no-console
69
70
  console.warn(`Called prefetch() on ${src} which returned a "Content-Type" of ${buf.type}. Prefetched content should have a proper content type (video/... or audio/...) or a contentType passed the options of prefetch(). Otherwise, prefetching will not work properly in all browsers.`);
70
71
  }
71
72
  const actualBlob = (options === null || options === void 0 ? void 0 : options.contentType)
@@ -25,6 +25,7 @@ const warnOnce = (message) => {
25
25
  if (didWarn[message]) {
26
26
  return;
27
27
  }
28
+ // eslint-disable-next-line no-console
28
29
  console.warn(message);
29
30
  didWarn[message] = true;
30
31
  };
@@ -17,6 +17,7 @@ const warnOnce = (message) => {
17
17
  if (didWarn[message]) {
18
18
  return;
19
19
  }
20
+ // eslint-disable-next-line no-console
20
21
  console.warn(message);
21
22
  didWarn[message] = true;
22
23
  };
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.74";
1
+ export declare const VERSION = "4.0.76";
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // Automatically generated on publish
5
- exports.VERSION = '4.0.74';
5
+ exports.VERSION = '4.0.76';
@@ -75,6 +75,7 @@ const VideoForDevelopmentRefForwardingFunction = (props, ref) => {
75
75
  const errorHandler = () => {
76
76
  var _a;
77
77
  if (current === null || current === void 0 ? void 0 : current.error) {
78
+ // eslint-disable-next-line no-console
78
79
  console.error('Error occurred in video', current === null || current === void 0 ? void 0 : current.error);
79
80
  // If user is handling the error, we don't cause an unhandled exception
80
81
  if (props.onError) {
@@ -147,6 +147,7 @@ const VideoForRenderingForwardFunction = ({ onError, volume: volumeProp, allowAm
147
147
  const errorHandler = () => {
148
148
  var _a;
149
149
  if (current === null || current === void 0 ? void 0 : current.error) {
150
+ // eslint-disable-next-line no-console
150
151
  console.error('Error occurred in video', current === null || current === void 0 ? void 0 : current.error);
151
152
  // If user is handling the error, we don't cause an unhandled exception
152
153
  if (onError) {
@@ -0,0 +1,8 @@
1
+ export declare const seekToTime: (element: HTMLVideoElement, desiredTime: number) => {
2
+ wait: Promise<number>;
3
+ cancel: () => void;
4
+ };
5
+ export declare const seekToTimeMultipleUntilRight: (element: HTMLVideoElement, desiredTime: number, fps: number) => {
6
+ prom: Promise<void>;
7
+ cancel: () => void;
8
+ };
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.seekToTimeMultipleUntilRight = exports.seekToTime = void 0;
4
+ const seekToTime = (element, desiredTime) => {
5
+ element.currentTime = desiredTime;
6
+ let cancel;
7
+ const prom = new Promise((resolve) => {
8
+ cancel = element.requestVideoFrameCallback((_cb, metadata) => {
9
+ resolve(metadata.mediaTime);
10
+ });
11
+ });
12
+ return {
13
+ wait: prom,
14
+ cancel: () => {
15
+ element.cancelVideoFrameCallback(cancel);
16
+ },
17
+ };
18
+ };
19
+ exports.seekToTime = seekToTime;
20
+ const seekToTimeMultipleUntilRight = (element, desiredTime, fps) => {
21
+ const threshold = 1 / fps / 2;
22
+ let currentCancel = () => undefined;
23
+ const prom = new Promise((resolve, reject) => {
24
+ const firstSeek = (0, exports.seekToTime)(element, desiredTime + threshold);
25
+ firstSeek.wait.then((seekedTo) => {
26
+ const difference = Math.abs(desiredTime - seekedTo);
27
+ const ident = Math.random();
28
+ if (difference < threshold) {
29
+ return resolve();
30
+ }
31
+ const sign = desiredTime > seekedTo ? 1 : -1;
32
+ const newSeek = (0, exports.seekToTime)(element, seekedTo + threshold * sign);
33
+ currentCancel = newSeek.cancel;
34
+ newSeek.wait
35
+ .then((newTime) => {
36
+ const newDifference = Math.abs(desiredTime - newTime);
37
+ console.log(ident, 'before', seekedTo, 'after', newTime, 'desired', desiredTime);
38
+ if (newDifference < threshold) {
39
+ return resolve();
40
+ }
41
+ const thirdSeek = (0, exports.seekToTime)(element, desiredTime);
42
+ currentCancel = thirdSeek.cancel;
43
+ thirdSeek.wait.then(() => {
44
+ resolve();
45
+ });
46
+ })
47
+ .catch((err) => {
48
+ reject(err);
49
+ });
50
+ });
51
+ currentCancel = firstSeek.cancel;
52
+ });
53
+ return {
54
+ prom,
55
+ cancel: () => {
56
+ currentCancel();
57
+ },
58
+ };
59
+ };
60
+ exports.seekToTimeMultipleUntilRight = seekToTimeMultipleUntilRight;
@@ -20,9 +20,11 @@ const warnAboutNonSeekableMedia = (ref, type) => {
20
20
  if (range.start === 0 && range.end === 0) {
21
21
  const msg = `The media ${ref.src} cannot be seeked. This could be one of two reasons: 1) The media resource was replaced while the video is playing but it was not loaded yet. 2) The media does not support seeking. Please see https://remotion.dev/docs/non-seekable-media for assistance.`;
22
22
  if (type === 'console-error') {
23
+ // eslint-disable-next-line no-console
23
24
  console.error(msg);
24
25
  }
25
26
  else if (type === 'console-warning') {
27
+ // eslint-disable-next-line no-console
26
28
  console.warn(`The media ${ref.src} does not support seeking. The video will render fine, but may not play correctly in the Remotion Studio and in the <Player>. See https://remotion.dev/docs/non-seekable-media for an explanation.`);
27
29
  }
28
30
  else {
@@ -13,6 +13,7 @@ exports.WATCH_REMOTION_STATIC_FILES = 'remotion_staticFilesChanged';
13
13
  const watchStaticFile = (fileName, callback) => {
14
14
  // Check if function is called in Remotion Studio
15
15
  if (!(0, get_remotion_environment_1.getRemotionEnvironment)().isStudio) {
16
+ // eslint-disable-next-line no-console
16
17
  console.warn('The API is only available while using the Remotion Studio.');
17
18
  return { cancel: () => undefined };
18
19
  }
@@ -59,7 +59,7 @@ function truthy(value) {
59
59
  }
60
60
 
61
61
  // Automatically generated on publish
62
- const VERSION = '4.0.74';
62
+ const VERSION = '4.0.76';
63
63
 
64
64
  const checkMultipleRemotionVersions = () => {
65
65
  if (typeof globalThis === 'undefined') {
@@ -352,6 +352,7 @@ const warnOnce$1 = (message) => {
352
352
  if (didWarn$1[message]) {
353
353
  return;
354
354
  }
355
+ // eslint-disable-next-line no-console
355
356
  console.warn(message);
356
357
  didWarn$1[message] = true;
357
358
  };
@@ -444,8 +445,11 @@ const warnOnceSSRImport = () => {
444
445
  return;
445
446
  }
446
447
  didWarnSSRImport = true;
448
+ // eslint-disable-next-line no-console
447
449
  console.warn('Called `getInputProps()` on the server. This function is not available server-side and has returned an empty object.');
450
+ // eslint-disable-next-line no-console
448
451
  console.warn("To hide this warning, don't call this function on the server:");
452
+ // eslint-disable-next-line no-console
449
453
  console.warn(" typeof window === 'undefined' ? {} : getInputProps()");
450
454
  };
451
455
  const getInputProps = () => {
@@ -820,6 +824,13 @@ const useResolvedVideoConfig = (preferredCompositionId) => {
820
824
  };
821
825
  }
822
826
  if (!needsResolution(composition)) {
827
+ validateDurationInFrames(composition.durationInFrames, {
828
+ allowFloats: false,
829
+ component: `in <Composition id="${composition.id}">`,
830
+ });
831
+ validateFps(composition.fps, `in <Composition id="${composition.id}">`, false);
832
+ validateDimension(composition.width, 'width', `in <Composition id="${composition.id}">`);
833
+ validateDimension(composition.height, 'height', `in <Composition id="${composition.id}">`);
823
834
  return {
824
835
  type: 'success',
825
836
  result: {
@@ -1259,6 +1270,7 @@ const prefetch = (src, options) => {
1259
1270
  if (!buf.type.startsWith('video/') &&
1260
1271
  !buf.type.startsWith('audio/') &&
1261
1272
  !(options === null || options === void 0 ? void 0 : options.contentType)) {
1273
+ // eslint-disable-next-line no-console
1262
1274
  console.warn(`Called prefetch() on ${src} which returned a "Content-Type" of ${buf.type}. Prefetched content should have a proper content type (video/... or audio/...) or a contentType passed the options of prefetch(). Otherwise, prefetching will not work properly in all browsers.`);
1263
1275
  }
1264
1276
  const actualBlob = (options === null || options === void 0 ? void 0 : options.contentType)
@@ -1484,8 +1496,10 @@ const playAndHandleNotAllowedError = (mediaRef, mediaType) => {
1484
1496
  if (err.message.includes('because the media was removed from the document')) {
1485
1497
  return;
1486
1498
  }
1499
+ // eslint-disable-next-line no-console
1487
1500
  console.log(`Could not play ${mediaType} due to following error: `, err);
1488
1501
  if (!current.muted) {
1502
+ // eslint-disable-next-line no-console
1489
1503
  console.log(`The video will be muted and we'll retry playing it.`, err);
1490
1504
  current.muted = true;
1491
1505
  current.play();
@@ -1520,6 +1534,7 @@ const warnOnce = (message) => {
1520
1534
  if (didWarn[message]) {
1521
1535
  return;
1522
1536
  }
1537
+ // eslint-disable-next-line no-console
1523
1538
  console.warn(message);
1524
1539
  didWarn[message] = true;
1525
1540
  };
@@ -1846,9 +1861,11 @@ const warnAboutNonSeekableMedia = (ref, type) => {
1846
1861
  if (range.start === 0 && range.end === 0) {
1847
1862
  const msg = `The media ${ref.src} cannot be seeked. This could be one of two reasons: 1) The media resource was replaced while the video is playing but it was not loaded yet. 2) The media does not support seeking. Please see https://remotion.dev/docs/non-seekable-media for assistance.`;
1848
1863
  if (type === 'console-error') {
1864
+ // eslint-disable-next-line no-console
1849
1865
  console.error(msg);
1850
1866
  }
1851
1867
  else if (type === 'console-warning') {
1868
+ // eslint-disable-next-line no-console
1852
1869
  console.warn(`The media ${ref.src} does not support seeking. The video will render fine, but may not play correctly in the Remotion Studio and in the <Player>. See https://remotion.dev/docs/non-seekable-media for an explanation.`);
1853
1870
  }
1854
1871
  else {
@@ -1912,18 +1929,6 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
1912
1929
  startFrom: -mediaStartsAt,
1913
1930
  mediaType,
1914
1931
  });
1915
- console.log({
1916
- desiredUnclampedTime,
1917
- cur: mediaRef.current.currentTime,
1918
- paused: mediaRef.current.paused,
1919
- ended: mediaRef.current.ended,
1920
- loadedStart: mediaRef.current.seekable.length > 0
1921
- ? mediaRef.current.seekable.start(0)
1922
- : null,
1923
- loadedEnd: mediaRef.current.seekable.length > 0
1924
- ? mediaRef.current.seekable.end(0)
1925
- : null,
1926
- });
1927
1932
  const { duration } = mediaRef.current;
1928
1933
  const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration)
1929
1934
  ? Math.min(duration, desiredUnclampedTime)
@@ -2178,8 +2183,7 @@ const SharedAudioContextProvider = ({ children, numberOfAudioTags, component })
2178
2183
  }, [rerenderAudios]);
2179
2184
  const playAllAudios = useCallback(() => {
2180
2185
  refs.forEach((ref) => {
2181
- var _a;
2182
- (_a = ref.ref.current) === null || _a === void 0 ? void 0 : _a.play();
2186
+ playAndHandleNotAllowedError(ref.ref, 'audio');
2183
2187
  });
2184
2188
  }, [refs]);
2185
2189
  const value = useMemo(() => {
@@ -2491,7 +2495,7 @@ const AudioForRenderingRefForwardingFunction = (props, ref) => {
2491
2495
  sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom,
2492
2496
  sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames,
2493
2497
  ]);
2494
- const { volume: volumeProp, playbackRate, allowAmplificationDuringRender, onDuration, toneFrequency, _remotionInternalNeedsDurationCalculation, _remotionInternalNativeLoopPassed, acceptableTimeShiftInSeconds, name, ...nativeProps } = props;
2498
+ const { volume: volumeProp, playbackRate, allowAmplificationDuringRender, onDuration, toneFrequency, _remotionInternalNeedsDurationCalculation, _remotionInternalNativeLoopPassed, acceptableTimeShiftInSeconds, name, onError, ...nativeProps } = props;
2495
2499
  const volume = evaluateVolume({
2496
2500
  volume: volumeProp,
2497
2501
  frame: volumePropFrame,
@@ -2595,6 +2599,7 @@ const AudioRefForwardingFunction = (props, ref) => {
2595
2599
  }
2596
2600
  const preloadedSrc = usePreload(props.src);
2597
2601
  const onError = useCallback((e) => {
2602
+ // eslint-disable-next-line no-console
2598
2603
  console.log(e.currentTarget.error);
2599
2604
  // If there is no `loop` property, we don't need to get the duration
2600
2605
  // and this does not need to be a fatal error
@@ -2603,6 +2608,7 @@ const AudioRefForwardingFunction = (props, ref) => {
2603
2608
  cancelRender(new Error(errMessage));
2604
2609
  }
2605
2610
  else {
2611
+ // eslint-disable-next-line no-console
2606
2612
  console.warn(errMessage);
2607
2613
  }
2608
2614
  }, [loop, preloadedSrc]);
@@ -3101,6 +3107,7 @@ const warnServerOnce = () => {
3101
3107
  return;
3102
3108
  }
3103
3109
  warnedServer = true;
3110
+ // eslint-disable-next-line no-console
3104
3111
  console.warn('Called getStaticFiles() on the server. The API is only available in the browser. An empty array was returned.');
3105
3112
  };
3106
3113
  const warnPlayerOnce = () => {
@@ -3108,6 +3115,7 @@ const warnPlayerOnce = () => {
3108
3115
  return;
3109
3116
  }
3110
3117
  warnedPlayer = true;
3118
+ // eslint-disable-next-line no-console
3111
3119
  console.warn('Called getStaticFiles() while using the Remotion Player. The API is only available while using the Remotion Studio. An empty array was returned.');
3112
3120
  };
3113
3121
  /**
@@ -3138,6 +3146,7 @@ const IFrameRefForwarding = ({ onLoad, onError, ...props }, ref) => {
3138
3146
  onError(e);
3139
3147
  }
3140
3148
  else {
3149
+ // eslint-disable-next-line no-console
3141
3150
  console.error('Error loading iframe:', e, 'Handle the event using the onError() prop to make this message disappear.');
3142
3151
  }
3143
3152
  }, [handle, onError]);
@@ -3196,6 +3205,7 @@ const ImgRefForwarding = ({ onError, maxRetries = 2, src, ...props }, ref) => {
3196
3205
  }
3197
3206
  if (((_g = errors.current[(_f = imageRef.current) === null || _f === void 0 ? void 0 : _f.src]) !== null && _g !== void 0 ? _g : 0) <= maxRetries) {
3198
3207
  const backoff = exponentialBackoff((_j = errors.current[(_h = imageRef.current) === null || _h === void 0 ? void 0 : _h.src]) !== null && _j !== void 0 ? _j : 0);
3208
+ // eslint-disable-next-line no-console
3199
3209
  console.warn(`Could not load image with source ${(_k = imageRef.current) === null || _k === void 0 ? void 0 : _k.src}, retrying again in ${backoff}ms`);
3200
3210
  retryIn(backoff);
3201
3211
  return;
@@ -3214,6 +3224,7 @@ const ImgRefForwarding = ({ onError, maxRetries = 2, src, ...props }, ref) => {
3214
3224
  var _a, _b, _c, _d;
3215
3225
  if (((_b = errors.current[(_a = imageRef.current) === null || _a === void 0 ? void 0 : _a.src]) !== null && _b !== void 0 ? _b : 0) > 0) {
3216
3226
  delete errors.current[(_c = imageRef.current) === null || _c === void 0 ? void 0 : _c.src];
3227
+ // eslint-disable-next-line no-console
3217
3228
  console.info(`Retry successful - ${(_d = imageRef.current) === null || _d === void 0 ? void 0 : _d.src} is now loaded`);
3218
3229
  }
3219
3230
  continueRender(newHandle);
@@ -3519,6 +3530,7 @@ const WATCH_REMOTION_STATIC_FILES = 'remotion_staticFilesChanged';
3519
3530
  const watchStaticFile = (fileName, callback) => {
3520
3531
  // Check if function is called in Remotion Studio
3521
3532
  if (!getRemotionEnvironment().isStudio) {
3533
+ // eslint-disable-next-line no-console
3522
3534
  console.warn('The API is only available while using the Remotion Studio.');
3523
3535
  return { cancel: () => undefined };
3524
3536
  }
@@ -4568,6 +4580,7 @@ const VideoForDevelopmentRefForwardingFunction = (props, ref) => {
4568
4580
  const errorHandler = () => {
4569
4581
  var _a;
4570
4582
  if (current === null || current === void 0 ? void 0 : current.error) {
4583
+ // eslint-disable-next-line no-console
4571
4584
  console.error('Error occurred in video', current === null || current === void 0 ? void 0 : current.error);
4572
4585
  // If user is handling the error, we don't cause an unhandled exception
4573
4586
  if (props.onError) {
@@ -4787,6 +4800,7 @@ const VideoForRenderingForwardFunction = ({ onError, volume: volumeProp, allowAm
4787
4800
  const errorHandler = () => {
4788
4801
  var _a;
4789
4802
  if (current === null || current === void 0 ? void 0 : current.error) {
4803
+ // eslint-disable-next-line no-console
4790
4804
  console.error('Error occurred in video', current === null || current === void 0 ? void 0 : current.error);
4791
4805
  // If user is handling the error, we don't cause an unhandled exception
4792
4806
  if (onError) {
@@ -4919,6 +4933,7 @@ const Config = new Proxy(proxyObj, {
4919
4933
  return Config;
4920
4934
  }
4921
4935
  return () => {
4936
+ /* eslint-disable no-console */
4922
4937
  console.warn('⚠️ The CLI configuration has been extracted from Remotion Core.');
4923
4938
  console.warn('Update the import from the config file:');
4924
4939
  console.warn();
@@ -4928,6 +4943,7 @@ const Config = new Proxy(proxyObj, {
4928
4943
  console.warn('import {Config} from "@remotion/cli/config";');
4929
4944
  console.warn();
4930
4945
  console.warn('For more information, see https://www.remotion.dev/docs/4-0-migration.');
4946
+ /* eslint-enable no-console */
4931
4947
  process.exit(1);
4932
4948
  };
4933
4949
  },
@@ -186,6 +186,7 @@ const warnOnce = (message) => {
186
186
  if (didWarn[message]) {
187
187
  return;
188
188
  }
189
+ // eslint-disable-next-line no-console
189
190
  console.warn(message);
190
191
  didWarn[message] = true;
191
192
  };
@@ -1,4 +1,4 @@
1
1
  // Automatically generated on publish
2
- const VERSION = '4.0.74';
2
+ const VERSION = '4.0.76';
3
3
 
4
4
  export { VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remotion",
3
- "version": "4.0.74",
3
+ "version": "4.0.76",
4
4
  "description": "Render videos in React",
5
5
  "main": "dist/cjs/index.js",
6
6
  "types": "dist/cjs/index.d.ts",