remotion 4.0.180 → 4.0.182

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.
@@ -3,4 +3,4 @@
3
3
  * @see [Documentation](https://remotion.dev/docs/version)
4
4
  * @returns {string} The current version of the remotion package
5
5
  */
6
- export declare const VERSION = "4.0.180";
6
+ export declare const VERSION = "4.0.182";
@@ -7,4 +7,4 @@ exports.VERSION = void 0;
7
7
  * @see [Documentation](https://remotion.dev/docs/version)
8
8
  * @returns {string} The current version of the remotion package
9
9
  */
10
- exports.VERSION = '4.0.180';
10
+ exports.VERSION = '4.0.182';
@@ -10,6 +10,7 @@ const absolute_src_js_1 = require("../absolute-src.js");
10
10
  const use_audio_frame_js_1 = require("../audio/use-audio-frame.js");
11
11
  const cancel_render_js_1 = require("../cancel-render.js");
12
12
  const default_css_js_1 = require("../default-css.js");
13
+ const delay_render_js_1 = require("../delay-render.js");
13
14
  const random_js_1 = require("../random.js");
14
15
  const timeline_position_state_js_1 = require("../timeline-position-state.js");
15
16
  const truthy_js_1 = require("../truthy.js");
@@ -18,7 +19,7 @@ const use_unsafe_video_config_js_1 = require("../use-unsafe-video-config.js");
18
19
  const volume_prop_js_1 = require("../volume-prop.js");
19
20
  const get_current_time_js_1 = require("./get-current-time.js");
20
21
  const offthread_video_source_js_1 = require("./offthread-video-source.js");
21
- const OffthreadVideoForRendering = ({ onError, volume: volumeProp, playbackRate, src, muted, allowAmplificationDuringRender, transparent = false, toneMapped = true, toneFrequency, name, loopVolumeCurveBehavior, ...props }) => {
22
+ const OffthreadVideoForRendering = ({ onError, volume: volumeProp, playbackRate, src, muted, allowAmplificationDuringRender, transparent = false, toneMapped = true, toneFrequency, name, loopVolumeCurveBehavior, delayRenderRetries, delayRenderTimeoutInMilliseconds, ...props }) => {
22
23
  const absoluteFrame = (0, timeline_position_state_js_1.useTimelinePosition)();
23
24
  const frame = (0, use_current_frame_js_1.useCurrentFrame)();
24
25
  const volumePropsFrame = (0, use_audio_frame_js_1.useFrameForVolumeProp)(loopVolumeCurveBehavior !== null && loopVolumeCurveBehavior !== void 0 ? loopVolumeCurveBehavior : 'repeat');
@@ -102,19 +103,77 @@ const OffthreadVideoForRendering = ({ onError, volume: volumeProp, playbackRate,
102
103
  toneMapped,
103
104
  });
104
105
  }, [toneMapped, currentTime, src, transparent]);
106
+ const [imageSrc, setImageSrc] = (0, react_1.useState)(null);
107
+ (0, react_1.useLayoutEffect)(() => {
108
+ const cleanup = [];
109
+ setImageSrc(null);
110
+ const controller = new AbortController();
111
+ const newHandle = (0, delay_render_js_1.delayRender)('Fetching ' + actualSrc + 'from server', {
112
+ retries: delayRenderRetries !== null && delayRenderRetries !== void 0 ? delayRenderRetries : undefined,
113
+ timeoutInMilliseconds: delayRenderTimeoutInMilliseconds !== null && delayRenderTimeoutInMilliseconds !== void 0 ? delayRenderTimeoutInMilliseconds : undefined,
114
+ });
115
+ const execute = async () => {
116
+ try {
117
+ const res = await fetch(actualSrc, {
118
+ signal: controller.signal,
119
+ });
120
+ if (res.status !== 200) {
121
+ if (res.status === 500) {
122
+ const json = await res.json();
123
+ if (json.error) {
124
+ const cleanedUpErrorMessage = json.error.replace(/^Error: /, '');
125
+ throw new Error(cleanedUpErrorMessage);
126
+ }
127
+ }
128
+ throw new Error(`Server returned status ${res.status} while fetching ${actualSrc}`);
129
+ }
130
+ const blob = await res.blob();
131
+ const url = URL.createObjectURL(blob);
132
+ cleanup.push(() => URL.revokeObjectURL(url));
133
+ setImageSrc(url);
134
+ (0, delay_render_js_1.continueRender)(newHandle);
135
+ }
136
+ catch (err) {
137
+ if (onError) {
138
+ onError(err);
139
+ }
140
+ else {
141
+ (0, cancel_render_js_1.cancelRender)(err);
142
+ }
143
+ }
144
+ };
145
+ execute();
146
+ cleanup.push(() => {
147
+ if (controller.signal.aborted) {
148
+ return;
149
+ }
150
+ controller.abort();
151
+ });
152
+ return () => {
153
+ cleanup.forEach((c) => c());
154
+ };
155
+ }, [
156
+ actualSrc,
157
+ delayRenderRetries,
158
+ delayRenderTimeoutInMilliseconds,
159
+ onError,
160
+ ]);
105
161
  const onErr = (0, react_1.useCallback)(() => {
106
162
  if (onError) {
107
- onError === null || onError === void 0 ? void 0 : onError(new Error('Failed to load image with src ' + actualSrc));
163
+ onError === null || onError === void 0 ? void 0 : onError(new Error('Failed to load image with src ' + imageSrc));
108
164
  }
109
165
  else {
110
- (0, cancel_render_js_1.cancelRender)('Failed to load image with src ' + actualSrc);
166
+ (0, cancel_render_js_1.cancelRender)('Failed to load image with src ' + imageSrc);
111
167
  }
112
- }, [actualSrc, onError]);
168
+ }, [imageSrc, onError]);
113
169
  const className = (0, react_1.useMemo)(() => {
114
170
  return [default_css_js_1.OFFTHREAD_VIDEO_CLASS_NAME, props.className]
115
171
  .filter(truthy_js_1.truthy)
116
172
  .join(' ');
117
173
  }, [props.className]);
118
- return ((0, jsx_runtime_1.jsx)(Img_js_1.Img, { src: actualSrc, className: className, ...props, onError: onErr }));
174
+ if (!imageSrc) {
175
+ return null;
176
+ }
177
+ return ((0, jsx_runtime_1.jsx)(Img_js_1.Img, { src: imageSrc, className: className, delayRenderRetries: delayRenderRetries, delayRenderTimeoutInMilliseconds: delayRenderTimeoutInMilliseconds, ...props, onError: onErr }));
119
178
  };
120
179
  exports.OffthreadVideoForRendering = OffthreadVideoForRendering;
@@ -138,7 +138,7 @@ function truthy(value) {
138
138
  }
139
139
 
140
140
  // src/version.ts
141
- var VERSION = "4.0.180";
141
+ var VERSION = "4.0.182";
142
142
 
143
143
  // src/multiple-versions-warning.ts
144
144
  var checkMultipleRemotionVersions = () => {
@@ -5758,7 +5758,14 @@ var Still = (props2) => {
5758
5758
  import {useCallback as useCallback14} from "react";
5759
5759
 
5760
5760
  // src/video/OffthreadVideoForRendering.tsx
5761
- import {useCallback as useCallback13, useContext as useContext27, useEffect as useEffect21, useMemo as useMemo29} from "react";
5761
+ import {
5762
+ useCallback as useCallback13,
5763
+ useContext as useContext27,
5764
+ useEffect as useEffect21,
5765
+ useLayoutEffect as useLayoutEffect6,
5766
+ useMemo as useMemo29,
5767
+ useState as useState18
5768
+ } from "react";
5762
5769
  import {
5763
5770
  jsx as jsx29
5764
5771
  } from "react/jsx-runtime";
@@ -5774,6 +5781,8 @@ var OffthreadVideoForRendering = ({
5774
5781
  toneFrequency,
5775
5782
  name,
5776
5783
  loopVolumeCurveBehavior,
5784
+ delayRenderRetries,
5785
+ delayRenderTimeoutInMilliseconds,
5777
5786
  ...props2
5778
5787
  }) => {
5779
5788
  const absoluteFrame = useTimelinePosition();
@@ -5856,19 +5865,77 @@ var OffthreadVideoForRendering = ({
5856
5865
  toneMapped
5857
5866
  });
5858
5867
  }, [toneMapped, currentTime, src, transparent]);
5868
+ const [imageSrc, setImageSrc] = useState18(null);
5869
+ useLayoutEffect6(() => {
5870
+ const cleanup = [];
5871
+ setImageSrc(null);
5872
+ const controller = new AbortController;
5873
+ const newHandle = delayRender("Fetching " + actualSrc + "from server", {
5874
+ retries: delayRenderRetries ?? undefined,
5875
+ timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined
5876
+ });
5877
+ const execute = async () => {
5878
+ try {
5879
+ const res = await fetch(actualSrc, {
5880
+ signal: controller.signal
5881
+ });
5882
+ if (res.status !== 200) {
5883
+ if (res.status === 500) {
5884
+ const json = await res.json();
5885
+ if (json.error) {
5886
+ const cleanedUpErrorMessage = json.error.replace(/^Error: /, "");
5887
+ throw new Error(cleanedUpErrorMessage);
5888
+ }
5889
+ }
5890
+ throw new Error(`Server returned status ${res.status} while fetching ${actualSrc}`);
5891
+ }
5892
+ const blob = await res.blob();
5893
+ const url = URL.createObjectURL(blob);
5894
+ cleanup.push(() => URL.revokeObjectURL(url));
5895
+ setImageSrc(url);
5896
+ continueRender(newHandle);
5897
+ } catch (err) {
5898
+ if (onError) {
5899
+ onError(err);
5900
+ } else {
5901
+ cancelRender(err);
5902
+ }
5903
+ }
5904
+ };
5905
+ execute();
5906
+ cleanup.push(() => {
5907
+ if (controller.signal.aborted) {
5908
+ return;
5909
+ }
5910
+ controller.abort();
5911
+ });
5912
+ return () => {
5913
+ cleanup.forEach((c2) => c2());
5914
+ };
5915
+ }, [
5916
+ actualSrc,
5917
+ delayRenderRetries,
5918
+ delayRenderTimeoutInMilliseconds,
5919
+ onError
5920
+ ]);
5859
5921
  const onErr = useCallback13(() => {
5860
5922
  if (onError) {
5861
- onError?.(new Error("Failed to load image with src " + actualSrc));
5923
+ onError?.(new Error("Failed to load image with src " + imageSrc));
5862
5924
  } else {
5863
- cancelRender("Failed to load image with src " + actualSrc);
5925
+ cancelRender("Failed to load image with src " + imageSrc);
5864
5926
  }
5865
- }, [actualSrc, onError]);
5927
+ }, [imageSrc, onError]);
5866
5928
  const className = useMemo29(() => {
5867
5929
  return [OFFTHREAD_VIDEO_CLASS_NAME, props2.className].filter(truthy).join(" ");
5868
5930
  }, [props2.className]);
5931
+ if (!imageSrc) {
5932
+ return null;
5933
+ }
5869
5934
  return jsx29(Img, {
5870
- src: actualSrc,
5935
+ src: imageSrc,
5871
5936
  className,
5937
+ delayRenderRetries,
5938
+ delayRenderTimeoutInMilliseconds,
5872
5939
  ...props2,
5873
5940
  onError: onErr
5874
5941
  });
@@ -5882,7 +5949,7 @@ useEffect as useEffect22,
5882
5949
  useImperativeHandle as useImperativeHandle7,
5883
5950
  useMemo as useMemo30,
5884
5951
  useRef as useRef13,
5885
- useState as useState18
5952
+ useState as useState19
5886
5953
  } from "react";
5887
5954
  import {
5888
5955
  jsx as jsx30
@@ -5914,7 +5981,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
5914
5981
  const { fps, durationInFrames } = useVideoConfig();
5915
5982
  const parentSequence = useContext28(SequenceContext);
5916
5983
  const { hidden } = useContext28(SequenceVisibilityToggleContext);
5917
- const [timelineId] = useState18(() => String(Math.random()));
5984
+ const [timelineId] = useState19(() => String(Math.random()));
5918
5985
  const isSequenceHidden = hidden[timelineId] ?? false;
5919
5986
  if (typeof acceptableTimeShift !== "undefined") {
5920
5987
  throw new Error("acceptableTimeShift has been removed. Use acceptableTimeShiftInSeconds instead.");
@@ -6113,7 +6180,7 @@ forwardRef as forwardRef10,
6113
6180
  useContext as useContext29,
6114
6181
  useEffect as useEffect23,
6115
6182
  useImperativeHandle as useImperativeHandle8,
6116
- useLayoutEffect as useLayoutEffect6,
6183
+ useLayoutEffect as useLayoutEffect7,
6117
6184
  useMemo as useMemo31,
6118
6185
  useRef as useRef14
6119
6186
  } from "react";
@@ -6364,7 +6431,7 @@ var VideoForRenderingForwardFunction = ({
6364
6431
  ]);
6365
6432
  const { src } = props2;
6366
6433
  if (environment.isRendering) {
6367
- useLayoutEffect6(() => {
6434
+ useLayoutEffect7(() => {
6368
6435
  if (window.process?.env?.NODE_ENV === "test") {
6369
6436
  return;
6370
6437
  }
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "4.0.180";
2
+ var VERSION = "4.0.182";
3
3
  export {
4
4
  VERSION
5
5
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/core"
4
4
  },
5
5
  "name": "remotion",
6
- "version": "4.0.180",
6
+ "version": "4.0.182",
7
7
  "description": "Make videos programmatically",
8
8
  "main": "dist/cjs/index.js",
9
9
  "types": "dist/cjs/index.d.ts",