@remotion/renderer 4.0.0-alpha5 → 4.0.0-alpha7

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 (121) hide show
  1. package/dist/assets/download-and-map-assets-to-file.js +6 -6
  2. package/dist/assets/download-file.d.ts +3 -2
  3. package/dist/assets/download-file.js +18 -3
  4. package/dist/assets/download-map.js +7 -7
  5. package/dist/assets/read-file.d.ts +1 -1
  6. package/dist/assets/read-file.js +2 -2
  7. package/dist/assets/sanitize-filepath.js +2 -2
  8. package/dist/browser/BrowserFetcher.js +13 -13
  9. package/dist/browser/BrowserRunner.d.ts +1 -1
  10. package/dist/browser/BrowserRunner.js +9 -22
  11. package/dist/browser/LaunchOptions.d.ts +1 -2
  12. package/dist/browser/Launcher.js +7 -15
  13. package/dist/browser/NodeWebSocketTransport.js +4 -4
  14. package/dist/browser/get-download-destination.js +8 -8
  15. package/dist/call-ffmpeg.js +8 -3
  16. package/dist/chalk/index.d.ts +54 -0
  17. package/dist/chalk/index.js +135 -0
  18. package/dist/chalk/is-color-supported.d.ts +1 -0
  19. package/dist/chalk/is-color-supported.js +37 -0
  20. package/dist/client.d.ts +41 -41
  21. package/dist/combine-videos.js +6 -6
  22. package/dist/compositor/compose.js +12 -7
  23. package/dist/compositor/compositor.d.ts +2 -2
  24. package/dist/compositor/compositor.js +13 -8
  25. package/dist/compositor/get-executable-path.js +1 -10
  26. package/dist/create-ffmpeg-complex-filter.d.ts +1 -4
  27. package/dist/delete-directory.js +3 -3
  28. package/dist/does-have-m2-bug.js +2 -2
  29. package/dist/ensure-output-directory.js +5 -5
  30. package/dist/ffmpeg-filter-file.js +7 -7
  31. package/dist/find-closest-package-json.js +6 -6
  32. package/dist/get-compositions.d.ts +4 -0
  33. package/dist/get-compositions.js +2 -1
  34. package/dist/get-concurrency.js +3 -3
  35. package/dist/get-extension-from-codec.d.ts +2 -2
  36. package/dist/get-extension-of-filename.js +2 -2
  37. package/dist/get-local-browser-executable.js +4 -4
  38. package/dist/get-video-threads-flag.js +3 -3
  39. package/dist/index.d.ts +111 -36
  40. package/dist/index.js +9 -0
  41. package/dist/logger.d.ts +22 -0
  42. package/dist/logger.js +61 -0
  43. package/dist/merge-audio-track.js +2 -2
  44. package/dist/mime-types.js +2 -2
  45. package/dist/offthread-video-server.d.ts +3 -2
  46. package/dist/offthread-video-server.js +4 -4
  47. package/dist/open-browser.d.ts +1 -1
  48. package/dist/open-browser.js +1 -1
  49. package/dist/options/jpeg-quality.js +1 -1
  50. package/dist/prepare-server.d.ts +2 -1
  51. package/dist/prepare-server.js +7 -5
  52. package/dist/prespawn-ffmpeg.d.ts +1 -0
  53. package/dist/prespawn-ffmpeg.js +37 -14
  54. package/dist/prestitcher-memory-usage.js +2 -2
  55. package/dist/provide-screenshot.d.ts +1 -0
  56. package/dist/puppeteer-screenshot.d.ts +1 -0
  57. package/dist/puppeteer-screenshot.js +1 -1
  58. package/dist/render-frames.d.ts +4 -0
  59. package/dist/render-frames.js +9 -7
  60. package/dist/render-media.d.ts +4 -1
  61. package/dist/render-media.js +47 -26
  62. package/dist/render-still.d.ts +6 -0
  63. package/dist/render-still.js +20 -7
  64. package/dist/resolve-asset-src.js +2 -2
  65. package/dist/screenshot-dom-element.d.ts +1 -0
  66. package/dist/screenshot-task.d.ts +1 -0
  67. package/dist/screenshot-task.js +2 -2
  68. package/dist/serve-handler/index.d.ts +1 -1
  69. package/dist/serve-handler/index.js +15 -15
  70. package/dist/serve-handler/is-path-inside.js +3 -3
  71. package/dist/serve-static.d.ts +1 -0
  72. package/dist/serve-static.js +3 -2
  73. package/dist/stitch-frames-to-video.d.ts +2 -0
  74. package/dist/stitch-frames-to-video.js +62 -39
  75. package/dist/take-frame-and-compose.d.ts +1 -0
  76. package/dist/take-frame-and-compose.js +6 -6
  77. package/dist/tmp-dir.js +7 -7
  78. package/dist/validate-output-filename.d.ts +1 -1
  79. package/install-toolchain.mjs +2 -2
  80. package/package.json +9 -9
  81. package/types/ws/index.d.ts +5 -5
  82. package/dist/assets/get-video-stream-duration.d.ts +0 -9
  83. package/dist/assets/get-video-stream-duration.js +0 -71
  84. package/dist/calculate-sar-dar-pixels.d.ts +0 -9
  85. package/dist/calculate-sar-dar-pixels.js +0 -19
  86. package/dist/determine-resize-params.d.ts +0 -1
  87. package/dist/determine-resize-params.js +0 -10
  88. package/dist/determine-vcodec-ffmpeg-flags.d.ts +0 -2
  89. package/dist/determine-vcodec-ffmpeg-flags.js +0 -13
  90. package/dist/ensure-ffmpeg.d.ts +0 -18
  91. package/dist/ensure-ffmpeg.js +0 -58
  92. package/dist/ensure-presentation-timestamp.d.ts +0 -15
  93. package/dist/ensure-presentation-timestamp.js +0 -88
  94. package/dist/extract-frame-from-video.d.ts +0 -17
  95. package/dist/extract-frame-from-video.js +0 -191
  96. package/dist/ffmpeg-executable.d.ts +0 -1
  97. package/dist/ffmpeg-executable.js +0 -2
  98. package/dist/ffmpeg-flags.d.ts +0 -31
  99. package/dist/ffmpeg-flags.js +0 -245
  100. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
  101. package/dist/frame-to-ffmpeg-timestamp.js +0 -8
  102. package/dist/get-can-extract-frames-fast.d.ts +0 -14
  103. package/dist/get-can-extract-frames-fast.js +0 -71
  104. package/dist/get-frame-of-video-slow.d.ts +0 -15
  105. package/dist/get-frame-of-video-slow.js +0 -72
  106. package/dist/get-video-info.d.ts +0 -8
  107. package/dist/get-video-info.js +0 -59
  108. package/dist/is-beyond-last-frame.d.ts +0 -3
  109. package/dist/is-beyond-last-frame.js +0 -12
  110. package/dist/last-frame-from-video-cache.d.ts +0 -18
  111. package/dist/last-frame-from-video-cache.js +0 -55
  112. package/dist/legacy-webpack-config.d.ts +0 -9
  113. package/dist/legacy-webpack-config.js +0 -13
  114. package/dist/quality.d.ts +0 -1
  115. package/dist/quality.js +0 -21
  116. package/dist/try-to-extract-frame-of-video-fast.d.ts +0 -13
  117. package/dist/try-to-extract-frame-of-video-fast.js +0 -55
  118. package/dist/validate-ffmpeg.d.ts +0 -7
  119. package/dist/validate-ffmpeg.js +0 -77
  120. package/dist/warn-about-ffmpeg-version.d.ts +0 -5
  121. package/dist/warn-about-ffmpeg-version.js +0 -37
@@ -19,6 +19,7 @@ declare type PreStitcherOptions = {
19
19
  ffmpegOverride: FfmpegOverrideFn;
20
20
  signal: CancelSignal;
21
21
  videoBitrate: string | null;
22
+ indent: boolean;
22
23
  };
23
24
  export declare const prespawnFfmpeg: (options: PreStitcherOptions) => {
24
25
  task: import("execa").ExecaChildProcess<string>;
@@ -4,10 +4,10 @@ exports.prespawnFfmpeg = void 0;
4
4
  const remotion_1 = require("remotion");
5
5
  const call_ffmpeg_1 = require("./call-ffmpeg");
6
6
  const codec_1 = require("./codec");
7
- const get_executable_path_1 = require("./compositor/get-executable-path");
8
7
  const crf_1 = require("./crf");
9
8
  const get_codec_name_1 = require("./get-codec-name");
10
9
  const get_prores_profile_name_1 = require("./get-prores-profile-name");
10
+ const logger_1 = require("./logger");
11
11
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
12
12
  const pixel_format_1 = require("./pixel-format");
13
13
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
@@ -30,16 +30,33 @@ const prespawnFfmpeg = (options) => {
30
30
  throw new TypeError('encoderName is null: ' + JSON.stringify(options));
31
31
  }
32
32
  const supportsCrf = codec !== 'prores';
33
- if (options.verbose) {
34
- console.log('[verbose] ffmpeg', (0, get_executable_path_1.getExecutablePath)('ffmpeg'));
35
- console.log('[verbose] encoder', encoderName);
36
- console.log('[verbose] pixelFormat', pixelFormat);
37
- if (supportsCrf) {
38
- console.log('[verbose] crf', options.crf);
39
- }
40
- console.log('[verbose] codec', codec);
41
- console.log('[verbose] proResProfileName', proResProfileName);
33
+ logger_1.Log.verboseAdvanced({
34
+ indent: options.indent,
35
+ logLevel: options.verbose ? 'verbose' : 'info',
36
+ tag: 'encoder',
37
+ }, 'encoder', encoderName);
38
+ logger_1.Log.verboseAdvanced({
39
+ indent: options.indent,
40
+ logLevel: options.verbose ? 'verbose' : 'info',
41
+ tag: 'encoder',
42
+ }, 'pixelFormat', pixelFormat);
43
+ if (supportsCrf) {
44
+ logger_1.Log.verboseAdvanced({
45
+ indent: options.indent,
46
+ logLevel: options.verbose ? 'verbose' : 'info',
47
+ tag: 'encoder',
48
+ }, 'pixelFormat', options.crf);
42
49
  }
50
+ logger_1.Log.verboseAdvanced({
51
+ indent: options.indent,
52
+ logLevel: options.verbose ? 'verbose' : 'info',
53
+ tag: 'encoder',
54
+ }, 'codec', codec);
55
+ logger_1.Log.verboseAdvanced({
56
+ indent: options.indent,
57
+ logLevel: options.verbose ? 'verbose' : 'info',
58
+ tag: 'encoder',
59
+ }, 'proResProfileName', proResProfileName);
43
60
  (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
44
61
  const ffmpegArgs = [
45
62
  ['-r', options.fps.toFixed(2)],
@@ -67,10 +84,16 @@ const prespawnFfmpeg = (options) => {
67
84
  '-y',
68
85
  options.outputLocation,
69
86
  ];
70
- if (options.verbose) {
71
- console.log('Generated FFMPEG command:');
72
- console.log(ffmpegArgs);
73
- }
87
+ logger_1.Log.verboseAdvanced({
88
+ indent: options.indent,
89
+ logLevel: options.verbose ? 'verbose' : 'info',
90
+ tag: 'encoder',
91
+ }, 'Generated FFMPEG command:');
92
+ logger_1.Log.verboseAdvanced({
93
+ indent: options.indent,
94
+ logLevel: options.verbose ? 'verbose' : 'info',
95
+ tag: 'encoder',
96
+ }, ffmpegArgs.join(' '));
74
97
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
75
98
  const finalFfmpegString = options.ffmpegOverride
76
99
  ? options.ffmpegOverride({ type: 'pre-stitcher', args: ffmpegString })
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.shouldUseParallelEncoding = void 0;
7
- const os_1 = __importDefault(require("os"));
7
+ const node_os_1 = __importDefault(require("node:os"));
8
8
  const estimateMemoryUsageForPrestitcher = ({ width, height, }) => {
9
9
  // Empirically we detected that per 1 million pixels, FFMPEG uses around 1GB of memory, relatively independent of
10
10
  // the duration of the video.
@@ -13,7 +13,7 @@ const estimateMemoryUsageForPrestitcher = ({ width, height, }) => {
13
13
  return memoryUsageOfPixel * width * height;
14
14
  };
15
15
  const shouldUseParallelEncoding = ({ width, height, }) => {
16
- const freeMemory = os_1.default.freemem();
16
+ const freeMemory = node_os_1.default.freemem();
17
17
  const estimatedUsage = estimateMemoryUsageForPrestitcher({
18
18
  height,
19
19
  width,
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { ClipRegion } from 'remotion';
2
3
  import type { Page } from './browser/BrowserPage';
3
4
  import type { StillImageFormat } from './image-format';
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { ClipRegion } from 'remotion';
2
3
  import type { Page } from './browser/BrowserPage';
3
4
  import type { StillImageFormat } from './image-format';
@@ -24,7 +24,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.screenshot = void 0;
27
- const assert = __importStar(require("assert"));
27
+ const assert = __importStar(require("node:assert"));
28
28
  const screenshot_task_1 = require("./screenshot-task");
29
29
  const screenshot = (options) => {
30
30
  if (options.jpegQuality) {
@@ -40,6 +40,10 @@ declare type RenderFramesOptions = {
40
40
  * @deprecated Only for Remotion internal usage
41
41
  */
42
42
  downloadMap?: DownloadMap;
43
+ /**
44
+ * @deprecated Only for Remotion internal usage
45
+ */
46
+ indent?: boolean;
43
47
  muted?: boolean;
44
48
  concurrency?: number | string | null;
45
49
  serveUrl: string;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.renderFrames = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
9
  const perf_hooks_1 = require("perf_hooks");
10
10
  const remotion_1 = require("remotion");
11
11
  const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
@@ -37,8 +37,8 @@ const validate_scale_1 = require("./validate-scale");
37
37
  const MAX_RETRIES_PER_FRAME = 1;
38
38
  const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, jpegQuality, quality, imageFormat = image_format_1.DEFAULT_VIDEO_IMAGE_FORMAT, frameRange, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale = 1, actualConcurrency, everyNthFrame = 1, proxyPort, cancelSignal, downloadMap, muted, makeBrowser, browserReplacer, }) => {
39
39
  if (outputDir) {
40
- if (!fs_1.default.existsSync(outputDir)) {
41
- fs_1.default.mkdirSync(outputDir, {
40
+ if (!node_fs_1.default.existsSync(outputDir)) {
41
+ node_fs_1.default.mkdirSync(outputDir, {
42
42
  recursive: true,
43
43
  });
44
44
  }
@@ -162,7 +162,7 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, jpeg
162
162
  freePage,
163
163
  height,
164
164
  imageFormat,
165
- output: path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
165
+ output: node_path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
166
166
  frame,
167
167
  imageFormat,
168
168
  index,
@@ -300,12 +300,13 @@ const renderFrames = (options) => {
300
300
  (0, jpeg_quality_1.validateJpegQuality)(options.jpegQuality);
301
301
  (0, validate_scale_1.validateScale)(options.scale);
302
302
  const makeBrowser = () => {
303
- var _a;
303
+ var _a, _b;
304
304
  return (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
305
305
  shouldDumpIo: options.dumpBrowserLogs,
306
306
  browserExecutable: options.browserExecutable,
307
307
  chromiumOptions: options.chromiumOptions,
308
308
  forceDeviceScaleFactor: (_a = options.scale) !== null && _a !== void 0 ? _a : 1,
309
+ indent: (_b = options.indent) !== null && _b !== void 0 ? _b : false,
309
310
  });
310
311
  };
311
312
  const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : makeBrowser();
@@ -314,7 +315,7 @@ const renderFrames = (options) => {
314
315
  const actualConcurrency = (0, get_concurrency_1.getActualConcurrency)(concurrency !== null && concurrency !== void 0 ? concurrency : null);
315
316
  const openedPages = [];
316
317
  return new Promise((resolve, reject) => {
317
- var _a, _b;
318
+ var _a, _b, _c;
318
319
  const cleanup = [];
319
320
  if (!options.downloadMap) {
320
321
  cleanup.push(() => (0, download_map_1.cleanDownloadMap)(downloadMap));
@@ -339,6 +340,7 @@ const renderFrames = (options) => {
339
340
  remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
340
341
  concurrency: actualConcurrency,
341
342
  verbose: (_b = options.verbose) !== null && _b !== void 0 ? _b : false,
343
+ indent: (_c = options.indent) !== null && _c !== void 0 ? _c : false,
342
344
  }),
343
345
  browserInstance,
344
346
  ]).then(([{ serveUrl, closeServer, offthreadPort }, puppeteerInstance]) => {
@@ -69,6 +69,10 @@ export declare type RenderMediaOptions = {
69
69
  * @deprecated Only for Remotion internal usage
70
70
  */
71
71
  onCtrlCExit?: (fn: () => void) => void;
72
+ /**
73
+ * @deprecated Only for Remotion internal usage
74
+ */
75
+ indent?: boolean;
72
76
  };
73
77
  preferLossless?: boolean;
74
78
  muted?: boolean;
@@ -77,7 +81,6 @@ export declare type RenderMediaOptions = {
77
81
  audioBitrate?: string | null;
78
82
  videoBitrate?: string | null;
79
83
  disallowParallelEncoding?: boolean;
80
- printLog?: (...data: unknown[]) => void;
81
84
  audioCodec?: AudioCodec | null;
82
85
  serveUrl: string;
83
86
  concurrency?: number | string | null;
@@ -4,9 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.renderMedia = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const os_1 = __importDefault(require("os"));
9
- const path_1 = __importDefault(require("path"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
10
  const remotion_1 = require("remotion");
11
11
  const download_map_1 = require("./assets/download-map");
12
12
  const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
@@ -22,6 +22,7 @@ const get_frame_to_render_1 = require("./get-frame-to-render");
22
22
  const image_format_1 = require("./image-format");
23
23
  const is_audio_codec_1 = require("./is-audio-codec");
24
24
  const jpeg_quality_1 = require("./jpeg-quality");
25
+ const logger_1 = require("./logger");
25
26
  const make_cancel_signal_1 = require("./make-cancel-signal");
26
27
  const overwrite_1 = require("./overwrite");
27
28
  const perf_1 = require("./perf");
@@ -45,7 +46,7 @@ const SLOWEST_FRAME_COUNT = 10;
45
46
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
46
47
  */
47
48
  const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, ...options }) => {
48
- var _a, _b, _c, _d, _e, _f, _g, _h;
49
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
49
50
  if (options.quality) {
50
51
  throw new Error(`The "quality" option has been renamed. Please use "jpegQuality" instead.`);
51
52
  }
@@ -67,7 +68,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
67
68
  });
68
69
  }
69
70
  const absoluteOutputLocation = outputLocation
70
- ? path_1.default.resolve(process.cwd(), outputLocation)
71
+ ? node_path_1.default.resolve(process.cwd(), outputLocation)
71
72
  : null;
72
73
  (0, validate_scale_1.validateScale)(scale);
73
74
  (0, validate_ffmpeg_override_1.validateFfmpegOverride)(ffmpegOverride);
@@ -92,30 +93,47 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
92
93
  const parallelEncoding = !options.disallowParallelEncoding &&
93
94
  hasEnoughMemory &&
94
95
  (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
95
- if (options.verbose) {
96
- const log = (_f = options.printLog) !== null && _f !== void 0 ? _f : console.log;
97
- log('[PRESTITCHER] Free memory:', freeMemory, 'Estimated usage parallel encoding', estimatedUsage);
98
- log('[PRESTITCHER]: Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
99
- log('[PRESTITCHER]: User disallowed parallel encoding:', Boolean(options.disallowParallelEncoding));
100
- if (parallelEncoding) {
101
- log('[PRESTITCHER] Parallel encoding is enabled.');
102
- }
103
- else {
104
- log('[PRESTITCHER] Parallel encoding is disabled.');
105
- }
96
+ logger_1.Log.verboseAdvanced({
97
+ indent: (_g = (_f = options.internal) === null || _f === void 0 ? void 0 : _f.indent) !== null && _g !== void 0 ? _g : false,
98
+ logLevel: options.verbose ? 'verbose' : 'info',
99
+ tag: 'PARALLEL ENCODING',
100
+ }, 'Free memory:', freeMemory, 'Estimated usage parallel encoding', estimatedUsage);
101
+ logger_1.Log.verboseAdvanced({
102
+ indent: (_j = (_h = options.internal) === null || _h === void 0 ? void 0 : _h.indent) !== null && _j !== void 0 ? _j : false,
103
+ logLevel: options.verbose ? 'verbose' : 'info',
104
+ tag: 'PARALLEL ENCODING',
105
+ }, 'Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
106
+ logger_1.Log.verboseAdvanced({
107
+ indent: (_l = (_k = options.internal) === null || _k === void 0 ? void 0 : _k.indent) !== null && _l !== void 0 ? _l : false,
108
+ logLevel: options.verbose ? 'verbose' : 'info',
109
+ tag: 'PARALLEL ENCODING',
110
+ }, 'User disallowed parallel encoding:', Boolean(options.disallowParallelEncoding));
111
+ if (parallelEncoding) {
112
+ logger_1.Log.verboseAdvanced({
113
+ indent: (_o = (_m = options.internal) === null || _m === void 0 ? void 0 : _m.indent) !== null && _o !== void 0 ? _o : false,
114
+ logLevel: options.verbose ? 'verbose' : 'info',
115
+ tag: 'PARALLEL ENCODING',
116
+ }, 'Parallel encoding is enabled.');
117
+ }
118
+ else {
119
+ logger_1.Log.verboseAdvanced({
120
+ indent: (_q = (_p = options.internal) === null || _p === void 0 ? void 0 : _p.indent) !== null && _q !== void 0 ? _q : false,
121
+ logLevel: options.verbose ? 'verbose' : 'info',
122
+ tag: 'PARALLEL ENCODING',
123
+ }, 'Parallel encoding is disabled.');
106
124
  }
107
125
  const imageFormat = (0, is_audio_codec_1.isAudioCodec)(codec)
108
126
  ? 'none'
109
- : (_g = options.imageFormat) !== null && _g !== void 0 ? _g : 'jpeg';
127
+ : (_r = options.imageFormat) !== null && _r !== void 0 ? _r : 'jpeg';
110
128
  const jpegQuality = imageFormat === 'jpeg' ? options.jpegQuality : undefined;
111
129
  (0, image_format_1.validateSelectedPixelFormatAndImageFormatCombination)(pixelFormat, imageFormat);
112
130
  const preEncodedFileLocation = parallelEncoding
113
- ? path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, audioCodec !== null && audioCodec !== void 0 ? audioCodec : null))
131
+ ? node_path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, audioCodec !== null && audioCodec !== void 0 ? audioCodec : null))
114
132
  : null;
115
133
  const outputDir = parallelEncoding
116
134
  ? null
117
- : fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
118
- if (((_h = options.internal) === null || _h === void 0 ? void 0 : _h.onCtrlCExit) && outputDir) {
135
+ : node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'react-motion-render'));
136
+ if (((_s = options.internal) === null || _s === void 0 ? void 0 : _s.onCtrlCExit) && outputDir) {
119
137
  options.internal.onCtrlCExit(() => (0, delete_directory_1.deleteDirectory)(outputDir));
120
138
  }
121
139
  (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
@@ -147,7 +165,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
147
165
  const fps = composition.fps / (everyNthFrame !== null && everyNthFrame !== void 0 ? everyNthFrame : 1);
148
166
  remotion_1.Internals.validateFps(fps, 'in "renderMedia()"', codec === 'gif');
149
167
  const createPrestitcherIfNecessary = () => {
150
- var _a;
168
+ var _a, _b, _c;
151
169
  if (preEncodedFileLocation) {
152
170
  preStitcher = (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
153
171
  width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
@@ -167,6 +185,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
167
185
  signal: cancelPrestitcher.cancelSignal,
168
186
  ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : (({ args }) => args),
169
187
  videoBitrate: videoBitrate !== null && videoBitrate !== void 0 ? videoBitrate : null,
188
+ indent: (_c = (_b = options.internal) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : false,
170
189
  });
171
190
  stitcherFfmpeg = preStitcher.task;
172
191
  }
@@ -212,7 +231,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
212
231
  };
213
232
  const happyPath = Promise.resolve(createPrestitcherIfNecessary())
214
233
  .then(() => {
215
- var _a;
234
+ var _a, _b, _c;
216
235
  const renderFramesProc = (0, render_frames_1.renderFrames)({
217
236
  composition,
218
237
  onFrameUpdate: (frame, frameIndex, timeToRenderInMilliseconds) => {
@@ -260,6 +279,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
260
279
  downloadMap,
261
280
  muted: disableAudio,
262
281
  verbose: (_a = options.verbose) !== null && _a !== void 0 ? _a : false,
282
+ indent: (_c = (_b = options.internal) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : false,
263
283
  });
264
284
  return renderFramesProc;
265
285
  })
@@ -267,7 +287,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
267
287
  return Promise.all([renderFramesReturn, waitForPrestitcherIfNecessary()]);
268
288
  })
269
289
  .then(([{ assetsInfo }]) => {
270
- var _a;
290
+ var _a, _b, _c;
271
291
  renderedDoneIn = Date.now() - renderStart;
272
292
  callUpdate();
273
293
  if (absoluteOutputLocation) {
@@ -307,6 +327,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
307
327
  audioBitrate,
308
328
  videoBitrate,
309
329
  audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
330
+ indent: (_c = (_b = options.internal) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : false,
310
331
  }),
311
332
  stitchStart,
312
333
  ]);
@@ -348,15 +369,15 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
348
369
  .finally(() => {
349
370
  var _a;
350
371
  if (preEncodedFileLocation !== null &&
351
- fs_1.default.existsSync(preEncodedFileLocation)) {
352
- (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(preEncodedFileLocation));
372
+ node_fs_1.default.existsSync(preEncodedFileLocation)) {
373
+ (0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(preEncodedFileLocation));
353
374
  }
354
375
  // Clean download map if it was not passed in
355
376
  if (!((_a = options.internal) === null || _a === void 0 ? void 0 : _a.downloadMap)) {
356
377
  (0, download_map_1.cleanDownloadMap)(downloadMap);
357
378
  }
358
379
  // Clean temporary image frames when rendering ends or fails
359
- if (outputDir && fs_1.default.existsSync(outputDir)) {
380
+ if (outputDir && node_fs_1.default.existsSync(outputDir)) {
360
381
  (0, delete_directory_1.deleteDirectory)(outputDir);
361
382
  }
362
383
  });
@@ -3,6 +3,7 @@ import type { AnySmallCompMetadata } from 'remotion';
3
3
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
4
  import type { DownloadMap } from './assets/download-map';
5
5
  import type { BrowserExecutable } from './browser-executable';
6
+ import type { BrowserLog } from './browser-log';
6
7
  import type { Browser as PuppeteerBrowser } from './browser/Browser';
7
8
  import type { StillImageFormat } from './image-format';
8
9
  import type { CancelSignal } from './make-cancel-signal';
@@ -23,6 +24,7 @@ declare type InnerStillOptions = {
23
24
  envVariables?: Record<string, string>;
24
25
  overwrite?: boolean;
25
26
  browserExecutable?: BrowserExecutable;
27
+ onBrowserLog?: (log: BrowserLog) => void;
26
28
  timeoutInMilliseconds?: number;
27
29
  chromiumOptions?: ChromiumOptions;
28
30
  scale?: number;
@@ -32,6 +34,10 @@ declare type InnerStillOptions = {
32
34
  * @deprecated Only for Remotion internal usage
33
35
  */
34
36
  downloadMap?: DownloadMap;
37
+ /**
38
+ * @deprecated Only for Remotion internal usage
39
+ */
40
+ indent?: boolean;
35
41
  verbose?: boolean;
36
42
  };
37
43
  declare type RenderStillReturnValue = {
@@ -27,8 +27,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.renderStill = void 0;
30
- const fs_1 = __importStar(require("fs"));
31
- const path_1 = __importDefault(require("path"));
30
+ const node_fs_1 = __importStar(require("node:fs"));
31
+ const node_path_1 = __importDefault(require("node:path"));
32
32
  const remotion_1 = require("remotion");
33
33
  const download_map_1 = require("./assets/download-map");
34
34
  const browser_1 = require("./browser");
@@ -47,7 +47,7 @@ const set_props_and_env_1 = require("./set-props-and-env");
47
47
  const take_frame_and_compose_1 = require("./take-frame-and-compose");
48
48
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
49
49
  const validate_scale_1 = require("./validate-scale");
50
- const innerRenderStill = async ({ composition, quality, imageFormat = image_format_1.DEFAULT_STILL_IMAGE_FORMAT, serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale = 1, proxyPort, cancelSignal, downloadMap, jpegQuality, }) => {
50
+ const innerRenderStill = async ({ composition, quality, imageFormat = image_format_1.DEFAULT_STILL_IMAGE_FORMAT, serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale = 1, proxyPort, cancelSignal, downloadMap, jpegQuality, onBrowserLog, }) => {
51
51
  if (quality) {
52
52
  throw new Error('quality has been renamed to jpegQuality. Please rename the option.');
53
53
  }
@@ -72,17 +72,17 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
72
72
  (0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
73
73
  (0, validate_scale_1.validateScale)(scale);
74
74
  output =
75
- typeof output === 'string' ? path_1.default.resolve(process.cwd(), output) : null;
75
+ typeof output === 'string' ? node_path_1.default.resolve(process.cwd(), output) : null;
76
76
  if (jpegQuality !== undefined && imageFormat !== 'jpeg') {
77
77
  throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
78
78
  }
79
79
  (0, jpeg_quality_1.validateJpegQuality)(jpegQuality);
80
80
  if (output) {
81
- if (fs_1.default.existsSync(output)) {
81
+ if (node_fs_1.default.existsSync(output)) {
82
82
  if (!overwrite) {
83
83
  throw new Error(`Cannot render still - "overwrite" option was set to false, but the output destination ${output} already exists.`);
84
84
  }
85
- const stat = (0, fs_1.statSync)(output);
85
+ const stat = (0, node_fs_1.statSync)(output);
86
86
  if (!stat.isFile()) {
87
87
  throw new Error(`The output location ${output} already exists, but is not a file, but something else (e.g. folder). Cannot save to it.`);
88
88
  }
@@ -94,6 +94,7 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
94
94
  shouldDumpIo: dumpBrowserLogs,
95
95
  chromiumOptions,
96
96
  forceDeviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
97
+ indent: false,
97
98
  }));
98
99
  const page = await browserInstance.newPage();
99
100
  await page.setViewport({
@@ -110,8 +111,16 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
110
111
  onError: errorCallback,
111
112
  frame: null,
112
113
  });
114
+ const logCallback = (log) => {
115
+ onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
116
+ stackTrace: log.stackTrace(),
117
+ text: log.text,
118
+ type: log.type,
119
+ });
120
+ };
113
121
  const cleanup = async () => {
114
122
  cleanUpJSException();
123
+ page.off('console', logCallback);
115
124
  if (puppeteerInstance) {
116
125
  await page.close();
117
126
  }
@@ -124,6 +133,9 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
124
133
  cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
125
134
  cleanup();
126
135
  });
136
+ if (onBrowserLog) {
137
+ page.on('console', logCallback);
138
+ }
127
139
  await (0, set_props_and_env_1.setPropsAndEnv)({
128
140
  inputProps,
129
141
  envVariables,
@@ -186,7 +198,7 @@ const renderStill = (options) => {
186
198
  const downloadMap = (_a = options.downloadMap) !== null && _a !== void 0 ? _a : (0, download_map_1.makeDownloadMap)();
187
199
  const onDownload = (_b = options.onDownload) !== null && _b !== void 0 ? _b : (() => () => undefined);
188
200
  const happyPath = new Promise((resolve, reject) => {
189
- var _a, _b;
201
+ var _a, _b, _c;
190
202
  const onError = (err) => reject(err);
191
203
  let close = null;
192
204
  (0, prepare_server_1.prepareServer)({
@@ -198,6 +210,7 @@ const renderStill = (options) => {
198
210
  remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
199
211
  concurrency: 1,
200
212
  verbose: (_b = options.verbose) !== null && _b !== void 0 ? _b : false,
213
+ indent: (_c = options.indent) !== null && _c !== void 0 ? _c : false,
201
214
  })
202
215
  .then(({ serveUrl, closeServer, offthreadPort }) => {
203
216
  close = closeServer;
@@ -4,14 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.resolveAssetSrc = void 0;
7
- const url_1 = __importDefault(require("url"));
7
+ const node_url_1 = __importDefault(require("node:url"));
8
8
  const resolveAssetSrc = (src) => {
9
9
  if (!src.startsWith('file:')) {
10
10
  return src;
11
11
  }
12
12
  const { protocol } = new URL(src);
13
13
  if (protocol === 'file:')
14
- return url_1.default.fileURLToPath(src);
14
+ return node_url_1.default.fileURLToPath(src);
15
15
  throw new TypeError(`Unexpected src ${src}`);
16
16
  };
17
17
  exports.resolveAssetSrc = resolveAssetSrc;
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { ClipRegion } from 'remotion';
2
3
  import type { Page } from './browser/BrowserPage';
3
4
  import type { StillImageFormat } from './image-format';
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { ClipRegion } from 'remotion';
2
3
  import type { Page } from './browser/BrowserPage';
3
4
  import type { StillImageFormat } from './image-format';
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.screenshotTask = void 0;
7
- const fs_1 = __importDefault(require("fs"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
8
  const perf_1 = require("./perf");
9
9
  const screenshotTask = async ({ format, height, omitBackground, page, width, path, jpegQuality, clipRegion, }) => {
10
10
  var _a;
@@ -64,7 +64,7 @@ const screenshotTask = async ({ format, height, omitBackground, page, width, pat
64
64
  const saveMarker = (0, perf_1.startPerfMeasure)('save');
65
65
  const buffer = Buffer.from(result.data, 'base64');
66
66
  if (path)
67
- await fs_1.default.promises.writeFile(path, buffer);
67
+ await node_fs_1.default.promises.writeFile(path, buffer);
68
68
  (0, perf_1.stopPerfMeasure)(saveMarker);
69
69
  return buffer;
70
70
  }
@@ -1,4 +1,4 @@
1
- import type { IncomingMessage, ServerResponse } from 'http';
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  export declare const serveHandler: (request: IncomingMessage, response: ServerResponse, config: {
3
3
  public: string;
4
4
  }) => Promise<void>;