@remotion/renderer 3.1.6 → 3.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/assets/convert-assets-to-file-urls.d.ts +3 -2
  2. package/dist/assets/convert-assets-to-file-urls.js +2 -2
  3. package/dist/assets/download-and-map-assets-to-file.d.ts +6 -5
  4. package/dist/assets/download-and-map-assets-to-file.js +47 -47
  5. package/dist/assets/download-map.d.ts +57 -0
  6. package/dist/assets/download-map.js +20 -0
  7. package/dist/assets/get-audio-channels.d.ts +3 -7
  8. package/dist/assets/get-audio-channels.js +6 -7
  9. package/dist/assets/get-files-in-folder.d.ts +9 -0
  10. package/dist/assets/get-files-in-folder.js +50 -0
  11. package/dist/assets/get-video-stream-duration.d.ts +3 -6
  12. package/dist/assets/get-video-stream-duration.js +9 -8
  13. package/dist/browser/TimeoutSettings.d.ts +1 -0
  14. package/dist/browser/TimeoutSettings.js +4 -4
  15. package/dist/browser-executable.d.ts +1 -0
  16. package/dist/browser-executable.js +2 -0
  17. package/dist/browser.d.ts +2 -0
  18. package/dist/browser.js +4 -0
  19. package/dist/can-use-parallel-encoding.d.ts +1 -1
  20. package/dist/can-use-parallel-encoding.js +2 -2
  21. package/dist/codec-supports-media.d.ts +1 -1
  22. package/dist/codec.d.ts +4 -0
  23. package/dist/codec.js +16 -0
  24. package/dist/combine-videos.d.ts +1 -1
  25. package/dist/combine-videos.js +7 -6
  26. package/dist/compress-assets.d.ts +7 -0
  27. package/dist/compress-assets.js +25 -0
  28. package/dist/convert-to-pcm.d.ts +1 -1
  29. package/dist/create-ffmpeg-merge-filter.js +3 -3
  30. package/dist/create-silent-audio.d.ts +1 -1
  31. package/dist/crf.d.ts +5 -0
  32. package/dist/crf.js +64 -0
  33. package/dist/ensure-presentation-timestamp.d.ts +2 -1
  34. package/dist/ensure-presentation-timestamp.js +9 -7
  35. package/dist/extract-frame-from-video.d.ts +5 -1
  36. package/dist/extract-frame-from-video.js +21 -16
  37. package/dist/ffmpeg-executable.d.ts +1 -0
  38. package/dist/ffmpeg-executable.js +2 -0
  39. package/dist/frame-range.d.ts +2 -0
  40. package/dist/frame-range.js +49 -0
  41. package/dist/get-audio-codec-name.d.ts +1 -1
  42. package/dist/get-audio-codec-name.js +2 -2
  43. package/dist/get-browser-instance.d.ts +1 -1
  44. package/dist/get-browser-instance.js +2 -2
  45. package/dist/get-codec-name.d.ts +1 -1
  46. package/dist/get-codec-name.js +2 -2
  47. package/dist/get-compositions.d.ts +8 -1
  48. package/dist/get-compositions.js +6 -6
  49. package/dist/get-extension-from-codec.d.ts +1 -1
  50. package/dist/get-frame-to-render.d.ts +1 -1
  51. package/dist/get-local-browser-executable.d.ts +2 -1
  52. package/dist/get-prores-profile-name.d.ts +2 -1
  53. package/dist/get-video-info.d.ts +3 -8
  54. package/dist/get-video-info.js +7 -8
  55. package/dist/image-format.d.ts +6 -1
  56. package/dist/image-format.js +25 -1
  57. package/dist/index.d.ts +44 -5
  58. package/dist/index.js +70 -1
  59. package/dist/is-audio-codec.d.ts +2 -0
  60. package/dist/is-audio-codec.js +7 -0
  61. package/dist/is-beyond-last-frame.d.ts +3 -2
  62. package/dist/is-beyond-last-frame.js +5 -5
  63. package/dist/last-frame-from-video-cache.d.ts +5 -3
  64. package/dist/last-frame-from-video-cache.js +17 -17
  65. package/dist/log-level.d.ts +4 -0
  66. package/dist/log-level.js +15 -0
  67. package/dist/merge-audio-track.d.ts +1 -1
  68. package/dist/merge-audio-track.js +2 -2
  69. package/dist/offthread-video-server.d.ts +5 -3
  70. package/dist/offthread-video-server.js +3 -2
  71. package/dist/open-browser.d.ts +1 -1
  72. package/dist/open-browser.js +4 -4
  73. package/dist/overwrite.d.ts +1 -0
  74. package/dist/overwrite.js +4 -0
  75. package/dist/perf.d.ts +5 -0
  76. package/dist/perf.js +35 -0
  77. package/dist/pixel-format.d.ts +5 -0
  78. package/dist/pixel-format.js +26 -0
  79. package/dist/prepare-server.d.ts +4 -3
  80. package/dist/prepare-server.js +3 -3
  81. package/dist/preprocess-audio-track.d.ts +3 -1
  82. package/dist/preprocess-audio-track.js +2 -2
  83. package/dist/prespawn-ffmpeg.d.ts +5 -1
  84. package/dist/prespawn-ffmpeg.js +9 -6
  85. package/dist/prores-profile.d.ts +5 -0
  86. package/dist/prores-profile.js +23 -0
  87. package/dist/provide-screenshot.d.ts +1 -1
  88. package/dist/quality.d.ts +1 -0
  89. package/dist/quality.js +21 -0
  90. package/dist/render-frames.d.ts +10 -1
  91. package/dist/render-frames.js +21 -16
  92. package/dist/render-media.d.ts +14 -2
  93. package/dist/render-media.js +16 -9
  94. package/dist/render-still.d.ts +9 -1
  95. package/dist/render-still.js +14 -10
  96. package/dist/screenshot-dom-element.d.ts +1 -1
  97. package/dist/screenshot-task.d.ts +1 -1
  98. package/dist/screenshot-task.js +7 -7
  99. package/dist/serve-static.d.ts +3 -2
  100. package/dist/serve-static.js +3 -4
  101. package/dist/set-props-and-env.js +2 -2
  102. package/dist/stitch-frames-to-video.d.ts +6 -1
  103. package/dist/stitch-frames-to-video.js +16 -11
  104. package/dist/stringify-ffmpeg-filter.js +2 -2
  105. package/dist/symbolicate-stacktrace.js +3 -3
  106. package/dist/truthy.d.ts +3 -0
  107. package/dist/truthy.js +7 -0
  108. package/dist/types.d.ts +1 -1
  109. package/dist/validate-even-dimensions-with-codec.d.ts +1 -1
  110. package/dist/validate-even-dimensions-with-codec.js +2 -2
  111. package/dist/validate-every-nth-frame.d.ts +1 -0
  112. package/dist/validate-every-nth-frame.js +21 -0
  113. package/dist/validate-ffmpeg.js +2 -3
  114. package/dist/validate-frame.d.ts +1 -0
  115. package/dist/validate-frame.js +24 -0
  116. package/dist/validate-opengl-renderer.d.ts +5 -0
  117. package/dist/validate-opengl-renderer.js +15 -0
  118. package/dist/validate-output-filename.d.ts +1 -1
  119. package/package.json +3 -3
@@ -9,15 +9,15 @@ const path_1 = __importDefault(require("path"));
9
9
  const is_serve_url_1 = require("./is-serve-url");
10
10
  const serve_static_1 = require("./serve-static");
11
11
  const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
12
- const prepareServer = async ({ downloadDir, ffmpegExecutable, ffprobeExecutable, onDownload, onError, webpackConfigOrServeUrl, port, }) => {
12
+ const prepareServer = async ({ ffmpegExecutable, ffprobeExecutable, onDownload, onError, webpackConfigOrServeUrl, port, downloadMap, }) => {
13
13
  if ((0, is_serve_url_1.isServeUrl)(webpackConfigOrServeUrl)) {
14
14
  const { port: offthreadPort, close: closeProxy } = await (0, serve_static_1.serveStatic)(null, {
15
- downloadDir,
16
15
  onDownload,
17
16
  onError,
18
17
  ffmpegExecutable,
19
18
  ffprobeExecutable,
20
19
  port,
20
+ downloadMap,
21
21
  });
22
22
  return Promise.resolve({
23
23
  serveUrl: webpackConfigOrServeUrl,
@@ -34,12 +34,12 @@ const prepareServer = async ({ downloadDir, ffmpegExecutable, ffprobeExecutable,
34
34
  throw new Error(`Tried to serve the Webpack bundle on a HTTP server, but the file ${indexFile} does not exist. Is this a valid path to a Webpack bundle?`);
35
35
  }
36
36
  const { port: serverPort, close } = await (0, serve_static_1.serveStatic)(webpackConfigOrServeUrl, {
37
- downloadDir,
38
37
  onDownload,
39
38
  onError,
40
39
  ffmpegExecutable,
41
40
  ffprobeExecutable,
42
41
  port,
42
+ downloadMap,
43
43
  });
44
44
  return Promise.resolve({
45
45
  closeServer: () => {
@@ -1,5 +1,6 @@
1
- import type { FfmpegExecutable } from 'remotion';
1
+ import type { DownloadMap } from './assets/download-map';
2
2
  import type { MediaAsset } from './assets/types';
3
+ import type { FfmpegExecutable } from './ffmpeg-executable';
3
4
  declare type Options = {
4
5
  ffmpegExecutable: FfmpegExecutable;
5
6
  ffprobeExecutable: FfmpegExecutable;
@@ -7,6 +8,7 @@ declare type Options = {
7
8
  asset: MediaAsset;
8
9
  expectedFrames: number;
9
10
  fps: number;
11
+ downloadMap: DownloadMap;
10
12
  };
11
13
  export declare const preprocessAudioTrack: (options: Options) => Promise<string | null>;
12
14
  export {};
@@ -10,8 +10,8 @@ const calculate_ffmpeg_filters_1 = require("./calculate-ffmpeg-filters");
10
10
  const ffmpeg_filter_file_1 = require("./ffmpeg-filter-file");
11
11
  const p_limit_1 = require("./p-limit");
12
12
  const resolve_asset_src_1 = require("./resolve-asset-src");
13
- const preprocessAudioTrackUnlimited = async ({ ffmpegExecutable, ffprobeExecutable, outName, asset, expectedFrames, fps, }) => {
14
- const { channels, duration } = await (0, get_audio_channels_1.getAudioChannelsAndDuration)((0, resolve_asset_src_1.resolveAssetSrc)(asset.src), ffprobeExecutable);
13
+ const preprocessAudioTrackUnlimited = async ({ ffmpegExecutable, ffprobeExecutable, outName, asset, expectedFrames, fps, downloadMap, }) => {
14
+ const { channels, duration } = await (0, get_audio_channels_1.getAudioChannelsAndDuration)(downloadMap, (0, resolve_asset_src_1.resolveAssetSrc)(asset.src), ffprobeExecutable);
15
15
  const filter = (0, calculate_ffmpeg_filters_1.calculateFfmpegFilter)({
16
16
  asset,
17
17
  durationInFrames: expectedFrames,
@@ -1,6 +1,10 @@
1
1
  import execa from 'execa';
2
- import type { Codec, FfmpegExecutable, ImageFormat, PixelFormat, ProResProfile } from 'remotion';
2
+ import type { Codec } from './codec';
3
+ import type { FfmpegExecutable } from './ffmpeg-executable';
4
+ import type { ImageFormat } from './image-format';
3
5
  import type { CancelSignal } from './make-cancel-signal';
6
+ import type { PixelFormat } from './pixel-format';
7
+ import type { ProResProfile } from './prores-profile';
4
8
  declare type PreSticherOptions = {
5
9
  fps: number;
6
10
  width: number;
@@ -6,25 +6,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.prespawnFfmpeg = void 0;
7
7
  const execa_1 = __importDefault(require("execa"));
8
8
  const remotion_1 = require("remotion");
9
+ const codec_1 = require("./codec");
10
+ const crf_1 = require("./crf");
9
11
  const get_codec_name_1 = require("./get-codec-name");
10
12
  const get_prores_profile_name_1 = require("./get-prores-profile-name");
11
13
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
14
+ const pixel_format_1 = require("./pixel-format");
12
15
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
13
16
  const validate_ffmpeg_1 = require("./validate-ffmpeg");
14
17
  const prespawnFfmpeg = async (options) => {
15
18
  var _a, _b, _c, _d, _e, _f, _g;
16
19
  remotion_1.Internals.validateDimension(options.height, 'height', 'passed to `stitchFramesToVideo()`');
17
20
  remotion_1.Internals.validateDimension(options.width, 'width', 'passed to `stitchFramesToVideo()`');
18
- const codec = (_a = options.codec) !== null && _a !== void 0 ? _a : remotion_1.Internals.DEFAULT_CODEC;
19
- remotion_1.Internals.validateFps(options.fps, 'in `stitchFramesToVideo()`', codec);
21
+ const codec = (_a = options.codec) !== null && _a !== void 0 ? _a : codec_1.DEFAULT_CODEC;
22
+ remotion_1.Internals.validateFps(options.fps, 'in `stitchFramesToVideo()`', codec === 'gif');
20
23
  (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
21
24
  width: options.width,
22
25
  height: options.height,
23
26
  codec,
24
27
  scale: 1,
25
28
  });
26
- const crf = (_b = options.crf) !== null && _b !== void 0 ? _b : remotion_1.Internals.getDefaultCrfForCodec(codec);
27
- const pixelFormat = (_c = options.pixelFormat) !== null && _c !== void 0 ? _c : remotion_1.Internals.DEFAULT_PIXEL_FORMAT;
29
+ const crf = (_b = options.crf) !== null && _b !== void 0 ? _b : (0, crf_1.getDefaultCrfForCodec)(codec);
30
+ const pixelFormat = (_c = options.pixelFormat) !== null && _c !== void 0 ? _c : pixel_format_1.DEFAULT_PIXEL_FORMAT;
28
31
  await (0, validate_ffmpeg_1.validateFfmpeg)((_d = options.ffmpegExecutable) !== null && _d !== void 0 ? _d : null);
29
32
  const encoderName = (0, get_codec_name_1.getCodecName)(codec);
30
33
  const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, options.proResProfile);
@@ -42,8 +45,8 @@ const prespawnFfmpeg = async (options) => {
42
45
  console.log('[verbose] codec', codec);
43
46
  console.log('[verbose] proResProfileName', proResProfileName);
44
47
  }
45
- remotion_1.Internals.validateSelectedCrfAndCodecCombination(crf, codec);
46
- remotion_1.Internals.validateSelectedPixelFormatAndCodecCombination(pixelFormat, codec);
48
+ (0, crf_1.validateSelectedCrfAndCodecCombination)(crf, codec);
49
+ (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
47
50
  const ffmpegArgs = [
48
51
  ['-r', options.fps.toFixed(2)],
49
52
  ...[
@@ -0,0 +1,5 @@
1
+ import type { Codec } from './codec';
2
+ declare const proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
3
+ export declare type ProResProfile = typeof proResProfileOptions[number];
4
+ export declare const validateSelectedCodecAndProResCombination: (actualCodec: Codec, actualProResProfile: ProResProfile | undefined) => void;
5
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSelectedCodecAndProResCombination = void 0;
4
+ const proResProfileOptions = [
5
+ '4444-xq',
6
+ '4444',
7
+ 'hq',
8
+ 'standard',
9
+ 'light',
10
+ 'proxy',
11
+ ];
12
+ const validateSelectedCodecAndProResCombination = (actualCodec, actualProResProfile) => {
13
+ if (typeof actualProResProfile !== 'undefined' && actualCodec !== 'prores') {
14
+ throw new TypeError('You have set a ProRes profile but the codec is not "prores". Set the codec to "prores" or remove the ProRes profile.');
15
+ }
16
+ if (actualProResProfile !== undefined &&
17
+ !proResProfileOptions.includes(actualProResProfile)) {
18
+ throw new TypeError(`The ProRes profile "${actualProResProfile}" is not valid. Valid options are ${proResProfileOptions
19
+ .map((p) => `"${p}"`)
20
+ .join(', ')}`);
21
+ }
22
+ };
23
+ exports.validateSelectedCodecAndProResCombination = validateSelectedCodecAndProResCombination;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
- import type { ImageFormat } from 'remotion';
3
2
  import type { Page } from './browser/BrowserPage';
3
+ import type { ImageFormat } from './image-format';
4
4
  export declare const provideScreenshot: ({ page, imageFormat, options, quality, }: {
5
5
  page: Page;
6
6
  imageFormat: ImageFormat;
@@ -0,0 +1 @@
1
+ export declare const validateQuality: (q: number | undefined) => void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateQuality = void 0;
4
+ const validateQuality = (q) => {
5
+ if (typeof q !== 'undefined' && typeof q !== 'number') {
6
+ throw new Error(`Quality option must be a number or undefined. Got ${typeof q} (${JSON.stringify(q)})`);
7
+ }
8
+ if (typeof q === 'undefined') {
9
+ return;
10
+ }
11
+ if (!Number.isFinite(q)) {
12
+ throw new RangeError(`Quality must be a finite number, but is ${q}`);
13
+ }
14
+ if (Number.isNaN(q)) {
15
+ throw new RangeError(`Quality is NaN, but must be a real number`);
16
+ }
17
+ if (q > 100 || q < 0) {
18
+ throw new RangeError('Quality option must be between 0 and 100.');
19
+ }
20
+ };
21
+ exports.validateQuality = validateQuality;
@@ -1,8 +1,13 @@
1
1
  /// <reference types="node" />
2
- import type { BrowserExecutable, FfmpegExecutable, FrameRange, ImageFormat, SmallTCompMetadata } from 'remotion';
2
+ import type { SmallTCompMetadata } from 'remotion';
3
3
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
+ import type { DownloadMap } from './assets/download-map';
5
+ import type { BrowserExecutable } from './browser-executable';
4
6
  import type { BrowserLog } from './browser-log';
5
7
  import type { Browser } from './browser/Browser';
8
+ import type { FfmpegExecutable } from './ffmpeg-executable';
9
+ import type { FrameRange } from './frame-range';
10
+ import type { ImageFormat } from './image-format';
6
11
  import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
7
12
  import type { CancelSignal } from './make-cancel-signal';
8
13
  import type { ChromiumOptions } from './open-browser';
@@ -39,6 +44,10 @@ declare type RenderFramesOptions = {
39
44
  ffprobeExecutable?: FfmpegExecutable;
40
45
  port?: number | null;
41
46
  cancelSignal?: CancelSignal;
47
+ /**
48
+ * @deprecated Only for Remotion internal usage
49
+ */
50
+ downloadMap?: DownloadMap;
42
51
  } & ConfigOrComposition & ServeUrlOrWebpackBundle;
43
52
  export declare const renderFrames: (options: RenderFramesOptions) => Promise<RenderFramesOutput>;
44
53
  export {};
@@ -8,6 +8,9 @@ const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const remotion_1 = require("remotion");
10
10
  const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
11
+ const download_map_1 = require("./assets/download-map");
12
+ const browser_1 = require("./browser");
13
+ const compress_assets_1 = require("./compress-assets");
11
14
  const cycle_browser_tabs_1 = require("./cycle-browser-tabs");
12
15
  const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
13
16
  const get_concurrency_1 = require("./get-concurrency");
@@ -16,14 +19,16 @@ const get_frame_padded_index_1 = require("./get-frame-padded-index");
16
19
  const get_frame_to_render_1 = require("./get-frame-to-render");
17
20
  const image_format_1 = require("./image-format");
18
21
  const legacy_webpack_config_1 = require("./legacy-webpack-config");
19
- const make_assets_download_dir_1 = require("./make-assets-download-dir");
20
22
  const open_browser_1 = require("./open-browser");
23
+ const perf_1 = require("./perf");
21
24
  const pool_1 = require("./pool");
22
25
  const prepare_server_1 = require("./prepare-server");
23
26
  const provide_screenshot_1 = require("./provide-screenshot");
24
27
  const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
28
+ const quality_1 = require("./quality");
25
29
  const seek_to_frame_1 = require("./seek-to-frame");
26
30
  const set_props_and_env_1 = require("./set-props-and-env");
31
+ const truthy_1 = require("./truthy");
27
32
  const validate_scale_1 = require("./validate-scale");
28
33
  const getComposition = (others) => {
29
34
  if ('composition' in others) {
@@ -39,7 +44,7 @@ const getPool = async (pages) => {
39
44
  const pool = new pool_1.Pool(puppeteerPages);
40
45
  return pool;
41
46
  };
42
- const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, quality, imageFormat = image_format_1.DEFAULT_IMAGE_FORMAT, frameRange, puppeteerInstance, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualParallelism, downloadDir, everyNthFrame = 1, proxyPort, cancelSignal, }) => {
47
+ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, quality, imageFormat = image_format_1.DEFAULT_IMAGE_FORMAT, frameRange, puppeteerInstance, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualParallelism, everyNthFrame = 1, proxyPort, cancelSignal, downloadMap, }) => {
43
48
  if (!puppeteerInstance) {
44
49
  throw new Error('no puppeteer instance passed to innerRenderFrames - internal error');
45
50
  }
@@ -133,7 +138,7 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, qual
133
138
  await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
134
139
  if (imageFormat !== 'none') {
135
140
  if (onFrameBuffer) {
136
- const id = remotion_1.Internals.perf.startPerfMeasure('save');
141
+ const id = (0, perf_1.startPerfMeasure)('save');
137
142
  const buffer = await (0, provide_screenshot_1.provideScreenshot)({
138
143
  page: freePage,
139
144
  imageFormat,
@@ -143,7 +148,7 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, qual
143
148
  output: null,
144
149
  },
145
150
  });
146
- remotion_1.Internals.perf.stopPerfMeasure(id);
151
+ (0, perf_1.stopPerfMeasure)(id);
147
152
  onFrameBuffer(buffer, frame);
148
153
  }
149
154
  else {
@@ -177,13 +182,13 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, qual
177
182
  frame,
178
183
  page: freePage,
179
184
  });
180
- const compressedAssets = collectedAssets.map((asset) => remotion_1.Internals.AssetCompression.compressAsset(assets.filter(remotion_1.Internals.truthy).flat(1), asset));
185
+ const compressedAssets = collectedAssets.map((asset) => (0, compress_assets_1.compressAsset)(assets.filter(truthy_1.truthy).flat(1), asset));
181
186
  assets[index] = compressedAssets;
182
187
  compressedAssets.forEach((asset) => {
183
188
  (0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
184
189
  asset,
185
- downloadDir,
186
190
  onDownload,
191
+ downloadMap,
187
192
  }).catch((err) => {
188
193
  onError(new Error(`Error while downloading asset: ${err.stack}`));
189
194
  });
@@ -199,9 +204,9 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, qual
199
204
  const returnValue = {
200
205
  assetsInfo: {
201
206
  assets,
202
- downloadDir,
203
207
  imageSequenceName: `element-%0${filePadLength}d.${imageFormat}`,
204
208
  firstFrameIndex: framesToRender[0],
209
+ downloadMap,
205
210
  },
206
211
  frameCount: framesToRender.length,
207
212
  };
@@ -214,30 +219,30 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, qual
214
219
  .then(() => happyPath);
215
220
  };
216
221
  const renderFrames = (options) => {
217
- var _a, _b, _c, _d;
222
+ var _a, _b, _c, _d, _e;
218
223
  const composition = getComposition(options);
219
224
  if (!composition) {
220
225
  throw new Error('No `composition` option has been specified for renderFrames()');
221
226
  }
222
227
  remotion_1.Internals.validateDimension(composition.height, 'height', 'in the `config` object passed to `renderFrames()`');
223
228
  remotion_1.Internals.validateDimension(composition.width, 'width', 'in the `config` object passed to `renderFrames()`');
224
- remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderFrames()`', null);
229
+ remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderFrames()`', false);
225
230
  remotion_1.Internals.validateDurationInFrames(composition.durationInFrames, 'in the `config` object passed to `renderFrames()`');
226
231
  if (options.quality !== undefined && options.imageFormat !== 'jpeg') {
227
232
  throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
228
233
  }
229
234
  const selectedServeUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
230
- remotion_1.Internals.validateQuality(options.quality);
235
+ (0, quality_1.validateQuality)(options.quality);
231
236
  (0, validate_scale_1.validateScale)(options.scale);
232
- const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : (0, open_browser_1.openBrowser)(remotion_1.Internals.DEFAULT_BROWSER, {
237
+ const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
233
238
  shouldDumpIo: options.dumpBrowserLogs,
234
239
  browserExecutable: options.browserExecutable,
235
240
  chromiumOptions: options.chromiumOptions,
236
241
  forceDeviceScaleFactor: (_b = options.scale) !== null && _b !== void 0 ? _b : 1,
237
242
  });
238
- const downloadDir = (0, make_assets_download_dir_1.makeAssetsDownloadTmpDir)();
239
- const onDownload = (_c = options.onDownload) !== null && _c !== void 0 ? _c : (() => () => undefined);
240
- const actualParallelism = (0, get_concurrency_1.getActualConcurrency)((_d = options.parallelism) !== null && _d !== void 0 ? _d : null);
243
+ const downloadMap = (_c = options.downloadMap) !== null && _c !== void 0 ? _c : (0, download_map_1.makeDownloadMap)();
244
+ const onDownload = (_d = options.onDownload) !== null && _d !== void 0 ? _d : (() => () => undefined);
245
+ const actualParallelism = (0, get_concurrency_1.getActualConcurrency)((_e = options.parallelism) !== null && _e !== void 0 ? _e : null);
241
246
  const openedPages = [];
242
247
  return new Promise((resolve, reject) => {
243
248
  var _a, _b, _c;
@@ -255,12 +260,12 @@ const renderFrames = (options) => {
255
260
  Promise.all([
256
261
  (0, prepare_server_1.prepareServer)({
257
262
  webpackConfigOrServeUrl: selectedServeUrl,
258
- downloadDir,
259
263
  onDownload,
260
264
  onError,
261
265
  ffmpegExecutable: (_a = options.ffmpegExecutable) !== null && _a !== void 0 ? _a : null,
262
266
  ffprobeExecutable: (_b = options.ffprobeExecutable) !== null && _b !== void 0 ? _b : null,
263
267
  port: (_c = options.port) !== null && _c !== void 0 ? _c : null,
268
+ downloadMap,
264
269
  }),
265
270
  browserInstance,
266
271
  ]).then(([{ serveUrl, closeServer, offthreadPort }, puppeteerInstance]) => {
@@ -276,8 +281,8 @@ const renderFrames = (options) => {
276
281
  composition,
277
282
  actualParallelism,
278
283
  onDownload,
279
- downloadDir,
280
284
  proxyPort: offthreadPort,
285
+ downloadMap,
281
286
  });
282
287
  }),
283
288
  ])
@@ -1,11 +1,18 @@
1
1
  /// <reference types="node" />
2
- import type { BrowserExecutable, Codec, FfmpegExecutable, FrameRange, PixelFormat, ProResProfile, SmallTCompMetadata } from 'remotion';
2
+ import type { SmallTCompMetadata } from 'remotion';
3
3
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
+ import type { DownloadMap } from './assets/download-map';
5
+ import type { BrowserExecutable } from './browser-executable';
4
6
  import type { BrowserLog } from './browser-log';
5
7
  import type { Browser as PuppeteerBrowser } from './browser/Browser';
8
+ import type { Codec } from './codec';
9
+ import type { FfmpegExecutable } from './ffmpeg-executable';
10
+ import type { FrameRange } from './frame-range';
6
11
  import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
7
12
  import type { CancelSignal } from './make-cancel-signal';
8
13
  import type { ChromiumOptions } from './open-browser';
14
+ import type { PixelFormat } from './pixel-format';
15
+ import type { ProResProfile } from './prores-profile';
9
16
  import type { OnStartData } from './types';
10
17
  export declare type StitchingState = 'encoding' | 'muxing';
11
18
  export declare type RenderMediaOnProgress = (progress: {
@@ -45,10 +52,15 @@ export declare type RenderMediaOptions = {
45
52
  port?: number | null;
46
53
  cancelSignal?: CancelSignal;
47
54
  browserExecutable?: BrowserExecutable;
55
+ verbose?: boolean;
56
+ /**
57
+ * @deprecated Only for Remotion internal usage
58
+ */
59
+ downloadMap?: DownloadMap;
48
60
  } & ServeUrlOrWebpackBundle;
49
61
  /**
50
62
  *
51
63
  * @description Render a video from a composition
52
64
  * @link https://www.remotion.dev/docs/renderer/render-media
53
65
  */
54
- export declare const renderMedia: ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
66
+ export declare const renderMedia: ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, downloadMap, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
@@ -8,7 +8,9 @@ const fs_1 = __importDefault(require("fs"));
8
8
  const os_1 = __importDefault(require("os"));
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const remotion_1 = require("remotion");
11
+ const download_map_1 = require("./assets/download-map");
11
12
  const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
13
+ const crf_1 = require("./crf");
12
14
  const ensure_frames_in_order_1 = require("./ensure-frames-in-order");
13
15
  const ensure_output_directory_1 = require("./ensure-output-directory");
14
16
  const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
@@ -17,7 +19,10 @@ const get_extension_of_filename_1 = require("./get-extension-of-filename");
17
19
  const get_frame_to_render_1 = require("./get-frame-to-render");
18
20
  const legacy_webpack_config_1 = require("./legacy-webpack-config");
19
21
  const make_cancel_signal_1 = require("./make-cancel-signal");
22
+ const overwrite_1 = require("./overwrite");
23
+ const perf_1 = require("./perf");
20
24
  const prespawn_ffmpeg_1 = require("./prespawn-ffmpeg");
25
+ const quality_1 = require("./quality");
21
26
  const render_frames_1 = require("./render-frames");
22
27
  const stitch_frames_to_video_1 = require("./stitch-frames-to-video");
23
28
  const tmp_dir_1 = require("./tmp-dir");
@@ -29,11 +34,11 @@ const validate_scale_1 = require("./validate-scale");
29
34
  * @description Render a video from a composition
30
35
  * @link https://www.remotion.dev/docs/renderer/render-media
31
36
  */
32
- const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }) => {
37
+ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, downloadMap, ...options }) => {
33
38
  var _a, _b;
34
- remotion_1.Internals.validateQuality(quality);
39
+ (0, quality_1.validateQuality)(quality);
35
40
  if (typeof crf !== 'undefined' && crf !== null) {
36
- remotion_1.Internals.validateSelectedCrfAndCodecCombination(crf, codec);
41
+ (0, crf_1.validateSelectedCrfAndCodecCombination)(crf, codec);
37
42
  }
38
43
  if (outputLocation) {
39
44
  (0, validate_output_filename_1.validateOutputFilename)(codec, (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation));
@@ -84,8 +89,9 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
84
89
  });
85
90
  const { waitForRightTimeOfFrameToBeInserted, setFrameToStitch, waitForFinish } = (0, ensure_frames_in_order_1.ensureFramesInOrder)(realFrameRange);
86
91
  const fps = composition.fps / (everyNthFrame !== null && everyNthFrame !== void 0 ? everyNthFrame : 1);
87
- remotion_1.Internals.validateFps(fps, 'in "renderMedia()"', codec);
92
+ remotion_1.Internals.validateFps(fps, 'in "renderMedia()"', codec === 'gif');
88
93
  const createPrestitcherIfNecessary = async () => {
94
+ var _a;
89
95
  if (preEncodedFileLocation) {
90
96
  preStitcher = await (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
91
97
  width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
@@ -100,7 +106,7 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
100
106
  encodedFrames = frame;
101
107
  callUpdate();
102
108
  },
103
- verbose: remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose'),
109
+ verbose: (_a = options.verbose) !== null && _a !== void 0 ? _a : false,
104
110
  ffmpegExecutable,
105
111
  imageFormat: actualImageFormat,
106
112
  signal: cancelPrestitcher.cancelSignal,
@@ -150,9 +156,9 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
150
156
  if (cancelled) {
151
157
  return;
152
158
  }
153
- const id = remotion_1.Internals.perf.startPerfMeasure('piping');
159
+ const id = (0, perf_1.startPerfMeasure)('piping');
154
160
  (_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.write(buffer);
155
- remotion_1.Internals.perf.stopPerfMeasure(id);
161
+ (0, perf_1.stopPerfMeasure)(id);
156
162
  setFrameToStitch(Math.min(realFrameRange[1] + 1, frame + everyNthFrame));
157
163
  }
158
164
  : undefined,
@@ -168,6 +174,7 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
168
174
  browserExecutable,
169
175
  port,
170
176
  cancelSignal: cancelRenderFrames.cancelSignal,
177
+ downloadMap: downloadMap !== null && downloadMap !== void 0 ? downloadMap : (0, download_map_1.makeDownloadMap)(),
171
178
  });
172
179
  return renderFramesProc;
173
180
  })
@@ -191,7 +198,7 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
191
198
  preEncodedFileLocation,
192
199
  imageFormat: actualImageFormat,
193
200
  },
194
- force: overwrite !== null && overwrite !== void 0 ? overwrite : remotion_1.Internals.DEFAULT_OVERWRITE,
201
+ force: overwrite !== null && overwrite !== void 0 ? overwrite : overwrite_1.DEFAULT_OVERWRITE,
195
202
  pixelFormat,
196
203
  codec,
197
204
  proResProfile,
@@ -206,7 +213,7 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
206
213
  },
207
214
  onDownload,
208
215
  numberOfGifLoops,
209
- verbose: remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose'),
216
+ verbose: options.verbose,
210
217
  dir: outputDir !== null && outputDir !== void 0 ? outputDir : undefined,
211
218
  cancelSignal: cancelStitcher.cancelSignal,
212
219
  }),
@@ -1,6 +1,10 @@
1
- import type { BrowserExecutable, FfmpegExecutable, SmallTCompMetadata, StillImageFormat } from 'remotion';
1
+ import type { SmallTCompMetadata } from 'remotion';
2
2
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
+ import type { DownloadMap } from './assets/download-map';
4
+ import type { BrowserExecutable } from './browser-executable';
3
5
  import type { Browser as PuppeteerBrowser } from './browser/Browser';
6
+ import type { FfmpegExecutable } from './ffmpeg-executable';
7
+ import type { StillImageFormat } from './image-format';
4
8
  import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
5
9
  import type { CancelSignal } from './make-cancel-signal';
6
10
  import type { ChromiumOptions } from './open-browser';
@@ -23,6 +27,10 @@ declare type InnerStillOptions = {
23
27
  cancelSignal?: CancelSignal;
24
28
  ffmpegExecutable?: FfmpegExecutable;
25
29
  ffprobeExecutable?: FfmpegExecutable;
30
+ /**
31
+ * @deprecated Only for Remotion internal usage
32
+ */
33
+ downloadMap?: DownloadMap;
26
34
  };
27
35
  declare type RenderStillOptions = InnerStillOptions & ServeUrlOrWebpackBundle & {
28
36
  port?: number | null;
@@ -30,25 +30,29 @@ exports.renderStill = void 0;
30
30
  const fs_1 = __importStar(require("fs"));
31
31
  const path_1 = __importDefault(require("path"));
32
32
  const remotion_1 = require("remotion");
33
+ const download_map_1 = require("./assets/download-map");
34
+ const browser_1 = require("./browser");
33
35
  const ensure_output_directory_1 = require("./ensure-output-directory");
34
36
  const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
37
+ const image_format_1 = require("./image-format");
35
38
  const legacy_webpack_config_1 = require("./legacy-webpack-config");
36
- const make_assets_download_dir_1 = require("./make-assets-download-dir");
37
39
  const open_browser_1 = require("./open-browser");
38
40
  const prepare_server_1 = require("./prepare-server");
39
41
  const provide_screenshot_1 = require("./provide-screenshot");
40
42
  const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
43
+ const quality_1 = require("./quality");
41
44
  const seek_to_frame_1 = require("./seek-to-frame");
42
45
  const set_props_and_env_1 = require("./set-props-and-env");
46
+ const validate_frame_1 = require("./validate-frame");
43
47
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
44
48
  const validate_scale_1 = require("./validate-scale");
45
49
  const innerRenderStill = async ({ composition, quality, imageFormat = 'png', serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale, proxyPort, cancelSignal, }) => {
46
50
  remotion_1.Internals.validateDimension(composition.height, 'height', 'in the `config` object passed to `renderStill()`');
47
51
  remotion_1.Internals.validateDimension(composition.width, 'width', 'in the `config` object passed to `renderStill()`');
48
- remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderStill()`', null);
52
+ remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderStill()`', false);
49
53
  remotion_1.Internals.validateDurationInFrames(composition.durationInFrames, 'in the `config` object passed to `renderStill()`');
50
- remotion_1.Internals.validateNonNullImageFormat(imageFormat);
51
- remotion_1.Internals.validateFrame(frame, composition.durationInFrames);
54
+ (0, image_format_1.validateNonNullImageFormat)(imageFormat);
55
+ (0, validate_frame_1.validateFrame)(frame, composition.durationInFrames);
52
56
  (0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
53
57
  (0, validate_scale_1.validateScale)(scale);
54
58
  if (typeof output !== 'string') {
@@ -58,7 +62,7 @@ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', ser
58
62
  if (quality !== undefined && imageFormat !== 'jpeg') {
59
63
  throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
60
64
  }
61
- remotion_1.Internals.validateQuality(quality);
65
+ (0, quality_1.validateQuality)(quality);
62
66
  if (fs_1.default.existsSync(output)) {
63
67
  if (!overwrite) {
64
68
  throw new Error(`Cannot render still - "overwrite" option was set to false, but the output destination ${output} already exists.`);
@@ -69,7 +73,7 @@ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', ser
69
73
  }
70
74
  }
71
75
  (0, ensure_output_directory_1.ensureOutputDirectory)(output);
72
- const browserInstance = puppeteerInstance !== null && puppeteerInstance !== void 0 ? puppeteerInstance : (await (0, open_browser_1.openBrowser)(remotion_1.Internals.DEFAULT_BROWSER, {
76
+ const browserInstance = puppeteerInstance !== null && puppeteerInstance !== void 0 ? puppeteerInstance : (await (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
73
77
  browserExecutable,
74
78
  shouldDumpIo: dumpBrowserLogs,
75
79
  chromiumOptions,
@@ -143,22 +147,22 @@ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', ser
143
147
  * @link https://www.remotion.dev/docs/renderer/render-still
144
148
  */
145
149
  const renderStill = (options) => {
146
- var _a;
150
+ var _a, _b;
147
151
  const selectedServeUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
148
- const downloadDir = (0, make_assets_download_dir_1.makeAssetsDownloadTmpDir)();
149
- const onDownload = (_a = options.onDownload) !== null && _a !== void 0 ? _a : (() => () => undefined);
152
+ const downloadMap = (_a = options.downloadMap) !== null && _a !== void 0 ? _a : (0, download_map_1.makeDownloadMap)();
153
+ const onDownload = (_b = options.onDownload) !== null && _b !== void 0 ? _b : (() => () => undefined);
150
154
  const happyPath = new Promise((resolve, reject) => {
151
155
  var _a, _b, _c;
152
156
  const onError = (err) => reject(err);
153
157
  let close = null;
154
158
  (0, prepare_server_1.prepareServer)({
155
159
  webpackConfigOrServeUrl: selectedServeUrl,
156
- downloadDir,
157
160
  onDownload,
158
161
  onError,
159
162
  ffmpegExecutable: (_a = options.ffmpegExecutable) !== null && _a !== void 0 ? _a : null,
160
163
  ffprobeExecutable: (_b = options.ffprobeExecutable) !== null && _b !== void 0 ? _b : null,
161
164
  port: (_c = options.port) !== null && _c !== void 0 ? _c : null,
165
+ downloadMap,
162
166
  })
163
167
  .then(({ serveUrl, closeServer, offthreadPort }) => {
164
168
  close = closeServer;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
- import type { ImageFormat } from 'remotion';
3
2
  import type { Page } from './browser/BrowserPage';
3
+ import type { ImageFormat } from './image-format';
4
4
  export declare const screenshotDOMElement: ({ page, imageFormat, quality, opts, }: {
5
5
  page: Page;
6
6
  imageFormat: ImageFormat;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import type { StillImageFormat } from 'remotion';
3
2
  import type { Page } from './browser/BrowserPage';
4
3
  import type { ScreenshotOptions } from './browser/ScreenshotOptions';
4
+ import type { StillImageFormat } from './image-format';
5
5
  export declare const _screenshotTask: (page: Page, format: StillImageFormat, options: ScreenshotOptions) => Promise<Buffer | string>;