@remotion/renderer 4.0.0-alpha16 → 4.0.0-alpha18

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 (47) hide show
  1. package/dist/assets/download-file.d.ts +1 -1
  2. package/dist/assets/download-file.js +11 -4
  3. package/dist/browser/Browser.d.ts +7 -6
  4. package/dist/browser/Browser.js +12 -12
  5. package/dist/browser/BrowserPage.d.ts +13 -2
  6. package/dist/browser/BrowserPage.js +14 -6
  7. package/dist/browser/BrowserRunner.js +2 -2
  8. package/dist/browser/LaunchOptions.d.ts +2 -0
  9. package/dist/browser/Launcher.js +2 -1
  10. package/dist/browser/Target.d.ts +2 -1
  11. package/dist/browser/Target.js +3 -1
  12. package/dist/browser/should-log-message.js +8 -0
  13. package/dist/compositor/compositor.d.ts +3 -2
  14. package/dist/compositor/compositor.js +6 -5
  15. package/dist/cycle-browser-tabs.d.ts +2 -1
  16. package/dist/cycle-browser-tabs.js +2 -2
  17. package/dist/get-browser-instance.d.ts +3 -2
  18. package/dist/get-browser-instance.js +5 -5
  19. package/dist/get-compositions.d.ts +4 -3
  20. package/dist/get-compositions.js +6 -5
  21. package/dist/index.d.ts +19 -20
  22. package/dist/logger.d.ts +1 -1
  23. package/dist/logger.js +4 -4
  24. package/dist/offthread-video-server.d.ts +3 -2
  25. package/dist/offthread-video-server.js +4 -3
  26. package/dist/open-browser.d.ts +3 -2
  27. package/dist/open-browser.js +7 -5
  28. package/dist/perf.js +4 -2
  29. package/dist/prepare-server.d.ts +3 -2
  30. package/dist/prepare-server.js +4 -4
  31. package/dist/prespawn-ffmpeg.d.ts +13 -1
  32. package/dist/prespawn-ffmpeg.js +21 -31
  33. package/dist/render-frames.d.ts +11 -4
  34. package/dist/render-frames.js +15 -11
  35. package/dist/render-media.d.ts +11 -4
  36. package/dist/render-media.js +19 -14
  37. package/dist/render-still.d.ts +8 -2
  38. package/dist/render-still.js +8 -8
  39. package/dist/replace-browser.d.ts +2 -1
  40. package/dist/replace-browser.js +2 -2
  41. package/dist/select-composition.d.ts +2 -1
  42. package/dist/select-composition.js +8 -8
  43. package/dist/serve-static.d.ts +2 -1
  44. package/dist/serve-static.js +1 -1
  45. package/dist/stitch-frames-to-video.d.ts +2 -1
  46. package/dist/stitch-frames-to-video.js +12 -22
  47. package/package.json +9 -9
package/dist/index.d.ts CHANGED
@@ -43,7 +43,7 @@ export declare const RenderInternals: {
43
43
  downloadMap: import("./assets/download-map").DownloadMap;
44
44
  remotionRoot: string;
45
45
  concurrency: number;
46
- verbose: boolean;
46
+ logLevel: "error" | "verbose" | "info" | "warn";
47
47
  indent: boolean;
48
48
  }) => Promise<{
49
49
  port: number;
@@ -72,7 +72,7 @@ export declare const RenderInternals: {
72
72
  downloaded: number;
73
73
  totalSize: number | null;
74
74
  }) => void) | undefined;
75
- }, retries?: number) => Promise<{
75
+ }, retries?: number, attempt?: number) => Promise<{
76
76
  sizeInBytes: number;
77
77
  to: string;
78
78
  }>;
@@ -123,7 +123,7 @@ export declare const RenderInternals: {
123
123
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
124
124
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
125
125
  logLevels: readonly ["verbose", "info", "warn", "error"];
126
- isEqualOrBelowLogLevel: (currentLevel: "verbose" | "error" | "info" | "warn", level: "verbose" | "error" | "info" | "warn") => boolean;
126
+ isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
127
127
  isValidLogLevel: (level: string) => boolean;
128
128
  perf: typeof perf;
129
129
  convertToPositiveFrameIndex: ({ frame, durationInFrames, }: {
@@ -356,7 +356,7 @@ export declare const RenderInternals: {
356
356
  verbose: (message?: any, ...optionalParams: any[]) => void;
357
357
  verboseAdvanced: (options: {
358
358
  indent: boolean;
359
- logLevel: "verbose" | "error" | "info" | "warn";
359
+ logLevel: "error" | "verbose" | "info" | "warn";
360
360
  } & {
361
361
  tag?: string | undefined;
362
362
  secondTag?: string | undefined;
@@ -364,26 +364,26 @@ export declare const RenderInternals: {
364
364
  info: (message?: any, ...optionalParams: any[]) => void;
365
365
  infoAdvanced: (options: {
366
366
  indent: boolean;
367
- logLevel: "verbose" | "error" | "info" | "warn";
367
+ logLevel: "error" | "verbose" | "info" | "warn";
368
368
  }, message?: any, ...optionalParams: any[]) => void;
369
369
  warn: (message?: any, ...optionalParams: any[]) => void;
370
370
  warnAdvanced: (options: {
371
371
  indent: boolean;
372
- logLevel: "verbose" | "error" | "info" | "warn";
372
+ logLevel: "error" | "verbose" | "info" | "warn";
373
373
  }, message?: any, ...optionalParams: any[]) => void;
374
374
  error: (message?: any, ...optionalParams: any[]) => void;
375
375
  };
376
- getLogLevel: () => "verbose" | "error" | "info" | "warn";
377
- setLogLevel: (newLogLevel: "verbose" | "error" | "info" | "warn") => void;
376
+ getLogLevel: () => "error" | "verbose" | "info" | "warn";
377
+ setLogLevel: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
378
378
  INDENT_TOKEN: string;
379
379
  isColorSupported: boolean;
380
380
  HeadlessBrowser: typeof HeadlessBrowser;
381
- prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }: {
381
+ prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: {
382
382
  webpackConfigOrServeUrl: string;
383
383
  port: number | null;
384
384
  remotionRoot: string;
385
385
  concurrency: number;
386
- verbose: boolean;
386
+ logLevel: "error" | "verbose" | "info" | "warn";
387
387
  indent: boolean;
388
388
  }) => Promise<import("./prepare-server").RemotionServer>;
389
389
  makeOrReuseServer: (server: import("./prepare-server").RemotionServer | undefined, config: {
@@ -391,7 +391,7 @@ export declare const RenderInternals: {
391
391
  port: number | null;
392
392
  remotionRoot: string;
393
393
  concurrency: number;
394
- verbose: boolean;
394
+ logLevel: "error" | "verbose" | "info" | "warn";
395
395
  indent: boolean;
396
396
  }, { onDownload, onError, }: {
397
397
  onError: (err: Error) => void;
@@ -408,7 +408,6 @@ export declare const RenderInternals: {
408
408
  imageFormat: "jpeg" | "png" | "webp" | "pdf";
409
409
  jpegQuality: number;
410
410
  puppeteerInstance: HeadlessBrowser | null;
411
- dumpBrowserLogs: boolean;
412
411
  envVariables: Record<string, string>;
413
412
  overwrite: boolean;
414
413
  browserExecutable: import("./browser-executable").BrowserExecutable;
@@ -420,20 +419,20 @@ export declare const RenderInternals: {
420
419
  cancelSignal: import("./make-cancel-signal").CancelSignal | null;
421
420
  indent: boolean;
422
421
  server: import("./prepare-server").RemotionServer | undefined;
423
- verbose: boolean;
422
+ logLevel: "error" | "verbose" | "info" | "warn";
424
423
  serveUrl: string;
425
424
  port: number | null;
426
425
  }) => Promise<{
427
426
  buffer: Buffer | null;
428
427
  }>;
429
- internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }: {
430
- shouldDumpIo: boolean;
428
+ internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: {
431
429
  browserExecutable: string | null;
432
430
  chromiumOptions: import("./open-browser").ChromiumOptions;
433
431
  forceDeviceScaleFactor: number | undefined;
434
432
  viewport: import("./browser/PuppeteerViewport").Viewport | null;
435
433
  indent: boolean;
436
434
  browser: import("./browser").Browser;
435
+ logLevel: "error" | "verbose" | "info" | "warn";
437
436
  }) => Promise<HeadlessBrowser>;
438
437
  internalSelectComposition: (options: {
439
438
  inputProps: Record<string, unknown>;
@@ -446,11 +445,11 @@ export declare const RenderInternals: {
446
445
  port: number | null;
447
446
  indent: boolean;
448
447
  server: import("./prepare-server").RemotionServer | undefined;
449
- verbose: boolean;
448
+ logLevel: "error" | "verbose" | "info" | "warn";
450
449
  serveUrl: string;
451
450
  id: string;
452
451
  }) => Promise<import("remotion").AnyCompMetadata>;
453
- internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, verbose, }: {
452
+ internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, logLevel, }: {
454
453
  inputProps: Record<string, unknown>;
455
454
  envVariables: Record<string, string>;
456
455
  puppeteerInstance: HeadlessBrowser | undefined;
@@ -461,11 +460,11 @@ export declare const RenderInternals: {
461
460
  port: number | null;
462
461
  server: import("./prepare-server").RemotionServer | undefined;
463
462
  indent: boolean;
464
- verbose: boolean;
463
+ logLevel: "error" | "verbose" | "info" | "warn";
465
464
  serveUrlOrWebpackUrl: string;
466
465
  }) => Promise<import("remotion").AnyCompMetadata[]>;
467
- internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, dumpBrowserLogs, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, verbose, webpackBundleOrServeUrl, }: import("./render-frames").InternalRenderFramesOptions) => Promise<import("./types").RenderFramesOutput>;
468
- internalRenderMedia: ({ 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, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, verbose, }: import("./render-media").InternalRenderMediaOptions) => Promise<{
466
+ internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, }: import("./render-frames").InternalRenderFramesOptions) => Promise<import("./types").RenderFramesOutput>;
467
+ internalRenderMedia: ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, }: import("./render-media").InternalRenderMediaOptions) => Promise<{
469
468
  buffer: Buffer | null;
470
469
  slowestFrames: import("./render-media").SlowFrame[];
471
470
  }>;
package/dist/logger.d.ts CHANGED
@@ -19,6 +19,6 @@ export declare const Log: {
19
19
  warnAdvanced: (options: LogOptions, message?: any, ...optionalParams: any[]) => void;
20
20
  error: (message?: any, ...optionalParams: any[]) => void;
21
21
  };
22
- export declare const getLogLevel: () => "verbose" | "error" | "info" | "warn";
22
+ export declare const getLogLevel: () => "error" | "verbose" | "info" | "warn";
23
23
  export declare const setLogLevel: (newLogLevel: LogLevel) => void;
24
24
  export {};
package/dist/logger.js CHANGED
@@ -36,12 +36,12 @@ exports.Log = {
36
36
  exports.Log.infoAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
37
37
  },
38
38
  infoAdvanced: (options, ...args) => {
39
- if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'info')) {
40
- return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
41
- }
39
+ return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
42
40
  },
43
41
  warn: (...args) => {
44
- exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
42
+ if ((0, log_level_1.isEqualOrBelowLogLevel)((0, exports.getLogLevel)(), 'warn')) {
43
+ exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
44
+ }
45
45
  },
46
46
  warnAdvanced: (options, ...args) => {
47
47
  if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'warn')) {
@@ -1,15 +1,16 @@
1
1
  import type { RequestListener } from 'node:http';
2
2
  import type { DownloadMap } from './assets/download-map';
3
3
  import type { Compositor } from './compositor/compositor';
4
+ import type { LogLevel } from './log-level';
4
5
  export declare const extractUrlAndSourceFromUrl: (url: string) => {
5
6
  src: string;
6
7
  time: number;
7
8
  transparent: boolean;
8
9
  };
9
- export declare const startOffthreadVideoServer: ({ downloadMap, concurrency, verbose, indent, }: {
10
+ export declare const startOffthreadVideoServer: ({ downloadMap, concurrency, logLevel, indent, }: {
10
11
  downloadMap: DownloadMap;
11
12
  concurrency: number;
12
- verbose: boolean;
13
+ logLevel: LogLevel;
13
14
  indent: boolean;
14
15
  }) => {
15
16
  listener: RequestListener;
@@ -4,6 +4,7 @@ exports.OffthreadVideoServerEmitter = exports.startOffthreadVideoServer = export
4
4
  const node_url_1 = require("node:url");
5
5
  const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
6
6
  const compositor_1 = require("./compositor/compositor");
7
+ const log_level_1 = require("./log-level");
7
8
  const extractUrlAndSourceFromUrl = (url) => {
8
9
  const parsed = new URL(url, 'http://localhost');
9
10
  const query = parsed.search;
@@ -27,13 +28,13 @@ const extractUrlAndSourceFromUrl = (url) => {
27
28
  };
28
29
  };
29
30
  exports.extractUrlAndSourceFromUrl = extractUrlAndSourceFromUrl;
30
- const startOffthreadVideoServer = ({ downloadMap, concurrency, verbose, indent, }) => {
31
+ const startOffthreadVideoServer = ({ downloadMap, concurrency, logLevel, indent, }) => {
31
32
  const events = new OffthreadVideoServerEmitter();
32
33
  const compositor = (0, compositor_1.startCompositor)('StartLongRunningProcess', {
33
34
  concurrency,
34
35
  maximum_frame_cache_items: (0, compositor_1.getIdealMaximumFrameCacheItems)(),
35
- verbose,
36
- }, indent);
36
+ verbose: (0, log_level_1.isEqualOrBelowLogLevel)(logLevel, 'verbose'),
37
+ }, logLevel, indent);
37
38
  return {
38
39
  close: () => {
39
40
  compositor.finishCommands();
@@ -1,6 +1,7 @@
1
1
  import type { Browser } from './browser';
2
2
  import type { HeadlessBrowser } from './browser/Browser';
3
3
  import type { Viewport } from './browser/PuppeteerViewport';
4
+ import { type LogLevel } from './log-level';
4
5
  declare const validRenderers: readonly ["swangle", "angle", "egl", "swiftshader"];
5
6
  type OpenGlRenderer = typeof validRenderers[number];
6
7
  export type ChromiumOptions = {
@@ -12,13 +13,13 @@ export type ChromiumOptions = {
12
13
  };
13
14
  export declare const killAllBrowsers: () => Promise<void>;
14
15
  type InternalOpenBrowserOptions = {
15
- shouldDumpIo: boolean;
16
16
  browserExecutable: string | null;
17
17
  chromiumOptions: ChromiumOptions;
18
18
  forceDeviceScaleFactor: number | undefined;
19
19
  viewport: Viewport | null;
20
20
  indent: boolean;
21
21
  browser: Browser;
22
+ logLevel: LogLevel;
22
23
  };
23
24
  export type OpenBrowserOptions = {
24
25
  shouldDumpIo?: boolean;
@@ -26,7 +27,7 @@ export type OpenBrowserOptions = {
26
27
  chromiumOptions?: ChromiumOptions;
27
28
  forceDeviceScaleFactor?: number;
28
29
  };
29
- export declare const internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }: InternalOpenBrowserOptions) => Promise<HeadlessBrowser>;
30
+ export declare const internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: InternalOpenBrowserOptions) => Promise<HeadlessBrowser>;
30
31
  /**
31
32
  * @description Opens a Chrome or Chromium browser instance.
32
33
  * @see [Documentation](https://www.remotion.dev/docs/renderer/open-browser)
@@ -4,6 +4,7 @@ exports.openBrowser = exports.internalOpenBrowser = exports.killAllBrowsers = vo
4
4
  const node_1 = require("./browser/node");
5
5
  const get_local_browser_executable_1 = require("./get-local-browser-executable");
6
6
  const get_video_threads_flag_1 = require("./get-video-threads-flag");
7
+ const log_level_1 = require("./log-level");
7
8
  const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
8
9
  const validRenderers = ['swangle', 'angle', 'egl', 'swiftshader'];
9
10
  const getOpenGlRenderer = (option) => {
@@ -21,13 +22,13 @@ const browserInstances = [];
21
22
  const killAllBrowsers = async () => {
22
23
  for (const browser of browserInstances) {
23
24
  try {
24
- await browser.close(true);
25
+ await browser.close(true, 'info', false);
25
26
  }
26
27
  catch (err) { }
27
28
  }
28
29
  };
29
30
  exports.killAllBrowsers = killAllBrowsers;
30
- const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }) => {
31
+ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }) => {
31
32
  var _a, _b;
32
33
  if (browser === 'firefox') {
33
34
  throw new TypeError('Firefox supported is not yet turned on. Stay tuned for the future.');
@@ -38,7 +39,8 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
38
39
  const browserInstance = await node_1.puppeteer.launch({
39
40
  executablePath,
40
41
  product: browser,
41
- dumpio: shouldDumpIo,
42
+ dumpio: (0, log_level_1.isEqualOrBelowLogLevel)(logLevel, 'verbose'),
43
+ logLevel,
42
44
  indent,
43
45
  args: [
44
46
  'about:blank',
@@ -109,7 +111,7 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
109
111
  deviceScaleFactor: 1,
110
112
  },
111
113
  });
112
- const pages = await browserInstance.pages();
114
+ const pages = await browserInstance.pages(logLevel, indent);
113
115
  await pages[0].close();
114
116
  browserInstances.push(browserInstance);
115
117
  return browserInstance;
@@ -127,8 +129,8 @@ const openBrowser = (browser, options) => {
127
129
  chromiumOptions: chromiumOptions !== null && chromiumOptions !== void 0 ? chromiumOptions : {},
128
130
  forceDeviceScaleFactor,
129
131
  indent: false,
130
- shouldDumpIo: shouldDumpIo !== null && shouldDumpIo !== void 0 ? shouldDumpIo : false,
131
132
  viewport: null,
133
+ logLevel: shouldDumpIo ? 'verbose' : 'info',
132
134
  });
133
135
  };
134
136
  exports.openBrowser = openBrowser;
package/dist/perf.js CHANGED
@@ -29,8 +29,10 @@ exports.stopPerfMeasure = stopPerfMeasure;
29
29
  const getPerf = () => {
30
30
  return [
31
31
  'Render performance:',
32
- ...Object.keys(perf).map((p) => {
33
- return ` ${p} => ${perf[p].reduce((a, b) => a + b, 0) / perf[p].length} (n = ${perf[p].length})`;
32
+ ...Object.keys(perf)
33
+ .filter((p) => perf[p].length)
34
+ .map((p) => {
35
+ return ` ${p} => ${perf[p].reduce((a, b) => a + b, 0) / perf[p].length}ms (n = ${perf[p].length})`;
34
36
  }),
35
37
  ];
36
38
  };
@@ -3,6 +3,7 @@ import type { DownloadMap } from './assets/download-map';
3
3
  import type { Compositor } from './compositor/compositor';
4
4
  import type { OffthreadVideoServerEmitter } from './offthread-video-server';
5
5
  import type { AnySourceMapConsumer } from './symbolicate-stacktrace';
6
+ import type { LogLevel } from './log-level';
6
7
  export type RemotionServer = {
7
8
  serveUrl: string;
8
9
  closeServer: (force: boolean) => Promise<unknown>;
@@ -17,10 +18,10 @@ type PrepareServerOptions = {
17
18
  port: number | null;
18
19
  remotionRoot: string;
19
20
  concurrency: number;
20
- verbose: boolean;
21
+ logLevel: LogLevel;
21
22
  indent: boolean;
22
23
  };
23
- export declare const prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }: PrepareServerOptions) => Promise<RemotionServer>;
24
+ export declare const prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: PrepareServerOptions) => Promise<RemotionServer>;
24
25
  export declare const makeOrReuseServer: (server: RemotionServer | undefined, config: PrepareServerOptions, { onDownload, onError, }: {
25
26
  onError: (err: Error) => void;
26
27
  onDownload: RenderMediaOnDownload | null;
@@ -14,16 +14,16 @@ const logger_1 = require("./logger");
14
14
  const serve_static_1 = require("./serve-static");
15
15
  const symbolicate_stacktrace_1 = require("./symbolicate-stacktrace");
16
16
  const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
17
- const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }) => {
17
+ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }) => {
18
18
  const downloadMap = (0, download_map_1.makeDownloadMap)();
19
- logger_1.Log.verboseAdvanced({ indent, logLevel: verbose ? 'verbose' : 'info' }, 'Created directory for temporary files', downloadMap.assetDir);
19
+ logger_1.Log.verboseAdvanced({ indent, logLevel }, 'Created directory for temporary files', downloadMap.assetDir);
20
20
  if ((0, is_serve_url_1.isServeUrl)(webpackConfigOrServeUrl)) {
21
21
  const { port: offthreadPort, close: closeProxy, compositor: comp, events, } = await (0, serve_static_1.serveStatic)(null, {
22
22
  port,
23
23
  downloadMap,
24
24
  remotionRoot,
25
25
  concurrency,
26
- verbose,
26
+ logLevel,
27
27
  indent,
28
28
  });
29
29
  return Promise.resolve({
@@ -51,7 +51,7 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
51
51
  downloadMap,
52
52
  remotionRoot,
53
53
  concurrency,
54
- verbose,
54
+ logLevel,
55
55
  indent,
56
56
  });
57
57
  return Promise.resolve({
@@ -4,6 +4,17 @@ import type { VideoImageFormat } from './image-format';
4
4
  import type { CancelSignal } from './make-cancel-signal';
5
5
  import type { PixelFormat } from './pixel-format';
6
6
  import type { ProResProfile } from './prores-profile';
7
+ import type { LogLevel } from './log-level';
8
+ type RunningStatus = {
9
+ type: 'running';
10
+ } | {
11
+ type: 'quit-successfully';
12
+ stderr: string;
13
+ } | {
14
+ type: 'quit-with-error';
15
+ exitCode: number;
16
+ stderr: string;
17
+ };
7
18
  type PreStitcherOptions = {
8
19
  fps: number;
9
20
  width: number;
@@ -14,7 +25,7 @@ type PreStitcherOptions = {
14
25
  crf: number | null | undefined;
15
26
  onProgress: (progress: number) => void;
16
27
  proResProfile: ProResProfile | undefined;
17
- verbose: boolean;
28
+ logLevel: LogLevel;
18
29
  imageFormat: VideoImageFormat;
19
30
  ffmpegOverride: FfmpegOverrideFn;
20
31
  signal: CancelSignal;
@@ -24,5 +35,6 @@ type PreStitcherOptions = {
24
35
  export declare const prespawnFfmpeg: (options: PreStitcherOptions) => {
25
36
  task: import("execa").ExecaChildProcess<string>;
26
37
  getLogs: () => string;
38
+ getExitStatus: () => RunningStatus;
27
39
  };
28
40
  export {};
@@ -29,34 +29,6 @@ const prespawnFfmpeg = (options) => {
29
29
  if (encoderName === null) {
30
30
  throw new TypeError('encoderName is null: ' + JSON.stringify(options));
31
31
  }
32
- const supportsCrf = codec !== 'prores';
33
- logger_1.Log.verboseAdvanced({
34
- indent: options.indent,
35
- logLevel: options.verbose ? 'verbose' : 'info',
36
- tag: 'prespawnFfmpeg()',
37
- }, 'encoder', encoderName);
38
- logger_1.Log.verboseAdvanced({
39
- indent: options.indent,
40
- logLevel: options.verbose ? 'verbose' : 'info',
41
- tag: 'prespawnFfmpeg()',
42
- }, 'pixelFormat', pixelFormat);
43
- if (supportsCrf) {
44
- logger_1.Log.verboseAdvanced({
45
- indent: options.indent,
46
- logLevel: options.verbose ? 'verbose' : 'info',
47
- tag: 'prespawnFfmpeg()',
48
- }, 'pixelFormat', options.crf);
49
- }
50
- logger_1.Log.verboseAdvanced({
51
- indent: options.indent,
52
- logLevel: options.verbose ? 'verbose' : 'info',
53
- tag: 'prespawnFfmpeg()',
54
- }, 'codec', codec);
55
- logger_1.Log.verboseAdvanced({
56
- indent: options.indent,
57
- logLevel: options.verbose ? 'verbose' : 'info',
58
- tag: 'prespawnFfmpeg()',
59
- }, 'proResProfileName', proResProfileName);
60
32
  (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
61
33
  const ffmpegArgs = [
62
34
  ['-r', options.fps.toFixed(2)],
@@ -86,12 +58,12 @@ const prespawnFfmpeg = (options) => {
86
58
  ];
87
59
  logger_1.Log.verboseAdvanced({
88
60
  indent: options.indent,
89
- logLevel: options.verbose ? 'verbose' : 'info',
61
+ logLevel: options.logLevel,
90
62
  tag: 'prespawnFfmpeg()',
91
63
  }, 'Generated FFMPEG command:');
92
64
  logger_1.Log.verboseAdvanced({
93
65
  indent: options.indent,
94
- logLevel: options.verbose ? 'verbose' : 'info',
66
+ logLevel: options.logLevel,
95
67
  tag: 'prespawnFfmpeg()',
96
68
  }, ffmpegArgs.join(' '));
97
69
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
@@ -113,6 +85,24 @@ const prespawnFfmpeg = (options) => {
113
85
  }
114
86
  }
115
87
  });
116
- return { task, getLogs: () => ffmpegOutput };
88
+ let exitCode = {
89
+ type: 'running',
90
+ };
91
+ task.on('exit', (code) => {
92
+ if (typeof code === 'number' && code > 0) {
93
+ exitCode = {
94
+ type: 'quit-with-error',
95
+ exitCode: code,
96
+ stderr: ffmpegOutput,
97
+ };
98
+ }
99
+ else {
100
+ exitCode = {
101
+ type: 'quit-successfully',
102
+ stderr: ffmpegOutput,
103
+ };
104
+ }
105
+ });
106
+ return { task, getLogs: () => ffmpegOutput, getExitStatus: () => exitCode };
117
107
  };
118
108
  exports.prespawnFfmpeg = prespawnFfmpeg;
@@ -10,6 +10,7 @@ import type { CancelSignal } from './make-cancel-signal';
10
10
  import type { ChromiumOptions } from './open-browser';
11
11
  import type { RemotionServer } from './prepare-server';
12
12
  import type { OnStartData, RenderFramesOutput } from './types';
13
+ import { type LogLevel } from './log-level';
13
14
  export type InternalRenderFramesOptions = {
14
15
  onStart: null | ((data: OnStartData) => void);
15
16
  onFrameUpdate: null | ((framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void);
@@ -20,7 +21,6 @@ export type InternalRenderFramesOptions = {
20
21
  jpegQuality: number;
21
22
  frameRange: FrameRange | null;
22
23
  everyNthFrame: number;
23
- dumpBrowserLogs: boolean;
24
24
  puppeteerInstance: HeadlessBrowser | undefined;
25
25
  browserExecutable: BrowserExecutable | null;
26
26
  onBrowserLog: null | ((log: BrowserLog) => void);
@@ -37,7 +37,7 @@ export type InternalRenderFramesOptions = {
37
37
  muted: boolean;
38
38
  concurrency: number | string | null;
39
39
  webpackBundleOrServeUrl: string;
40
- verbose: boolean;
40
+ logLevel: LogLevel;
41
41
  };
42
42
  export type RenderFramesOptions = {
43
43
  onStart: (data: OnStartData) => void;
@@ -53,7 +53,15 @@ export type RenderFramesOptions = {
53
53
  jpegQuality?: number;
54
54
  frameRange?: FrameRange | null;
55
55
  everyNthFrame?: number;
56
+ /**
57
+ * @deprecated Use "logLevel": "verbose" instead
58
+ */
56
59
  dumpBrowserLogs?: boolean;
60
+ /**
61
+ * @deprecated Use "logLevel" instead
62
+ */
63
+ verbose?: boolean;
64
+ logLevel?: LogLevel;
57
65
  puppeteerInstance?: HeadlessBrowser;
58
66
  browserExecutable?: BrowserExecutable;
59
67
  onBrowserLog?: (log: BrowserLog) => void;
@@ -68,9 +76,8 @@ export type RenderFramesOptions = {
68
76
  muted?: boolean;
69
77
  concurrency?: number | string | null;
70
78
  serveUrl: string;
71
- verbose?: boolean;
72
79
  };
73
- export declare const internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, dumpBrowserLogs, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, verbose, webpackBundleOrServeUrl, }: InternalRenderFramesOptions) => Promise<RenderFramesOutput>;
80
+ export declare const internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, }: InternalRenderFramesOptions) => Promise<RenderFramesOutput>;
74
81
  /**
75
82
  * @description Renders a series of images using Puppeteer and computes information for mixing audio.
76
83
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-frames)
@@ -33,8 +33,9 @@ const set_props_and_env_1 = require("./set-props-and-env");
33
33
  const take_frame_and_compose_1 = require("./take-frame-and-compose");
34
34
  const truthy_1 = require("./truthy");
35
35
  const validate_scale_1 = require("./validate-scale");
36
+ const logger_1 = require("./logger");
36
37
  const MAX_RETRIES_PER_FRAME = 1;
37
- const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps, jpegQuality, imageFormat, frameRange, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualConcurrency, everyNthFrame, proxyPort, cancelSignal, downloadMap, muted, makeBrowser, browserReplacer, compositor, sourcemapContext, }) => {
38
+ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps, jpegQuality, imageFormat, frameRange, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualConcurrency, everyNthFrame, proxyPort, cancelSignal, downloadMap, muted, makeBrowser, browserReplacer, compositor, sourcemapContext, logLevel, indent, }) => {
38
39
  if (outputDir) {
39
40
  if (!node_fs_1.default.existsSync(outputDir)) {
40
41
  node_fs_1.default.mkdirSync(outputDir, {
@@ -47,7 +48,9 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
47
48
  const framesToRender = (0, get_duration_from_frame_range_1.getFramesToRender)(realFrameRange, everyNthFrame);
48
49
  const lastFrame = framesToRender[framesToRender.length - 1];
49
50
  const makePage = async (context) => {
50
- const page = await browserReplacer.getBrowser().newPage(context);
51
+ const page = await browserReplacer
52
+ .getBrowser()
53
+ .newPage(context, logLevel, indent);
51
54
  pagesArray.push(page);
52
55
  await page.setViewport({
53
56
  width: composition.width,
@@ -283,7 +286,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
283
286
  await Promise.all(downloadPromises);
284
287
  return result;
285
288
  };
286
- const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, dumpBrowserLogs, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, verbose, webpackBundleOrServeUrl, }) => {
289
+ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, }) => {
287
290
  remotion_1.Internals.validateDimension(composition.height, 'height', 'in the `config` object passed to `renderFrames()`');
288
291
  remotion_1.Internals.validateDimension(composition.width, 'width', 'in the `config` object passed to `renderFrames()`');
289
292
  remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderFrames()`', false);
@@ -296,12 +299,12 @@ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions
296
299
  (0, validate_scale_1.validateScale)(scale);
297
300
  const makeBrowser = () => (0, open_browser_1.internalOpenBrowser)({
298
301
  browser: browser_1.DEFAULT_BROWSER,
299
- shouldDumpIo: dumpBrowserLogs,
300
302
  browserExecutable,
301
303
  chromiumOptions,
302
304
  forceDeviceScaleFactor: scale,
303
305
  indent,
304
306
  viewport: null,
307
+ logLevel,
305
308
  });
306
309
  const browserInstance = puppeteerInstance !== null && puppeteerInstance !== void 0 ? puppeteerInstance : makeBrowser();
307
310
  const actualConcurrency = (0, get_concurrency_1.getActualConcurrency)(concurrency);
@@ -323,7 +326,7 @@ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions
323
326
  port,
324
327
  remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
325
328
  concurrency: actualConcurrency,
326
- verbose,
329
+ logLevel,
327
330
  indent,
328
331
  }, {
329
332
  onDownload,
@@ -331,8 +334,8 @@ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions
331
334
  }),
332
335
  browserInstance,
333
336
  ]).then(([{ server: { serveUrl, offthreadPort, compositor, sourceMap, downloadMap, }, cleanupServer, }, pInstance,]) => {
334
- const browserReplacer = (0, replace_browser_1.handleBrowserCrash)(pInstance);
335
- cleanup.push((0, cycle_browser_tabs_1.cycleBrowserTabs)(browserReplacer, actualConcurrency).stopCycling);
337
+ const browserReplacer = (0, replace_browser_1.handleBrowserCrash)(pInstance, logLevel, indent);
338
+ cleanup.push((0, cycle_browser_tabs_1.cycleBrowserTabs)(browserReplacer, actualConcurrency, logLevel, indent).stopCycling);
336
339
  cleanup.push(() => cleanupServer(false));
337
340
  return innerRenderFrames({
338
341
  onError,
@@ -362,6 +365,8 @@ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions
362
365
  outputDir,
363
366
  scale,
364
367
  timeoutInMilliseconds,
368
+ logLevel,
369
+ indent,
365
370
  });
366
371
  }),
367
372
  ])
@@ -384,7 +389,7 @@ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions
384
389
  else {
385
390
  Promise.resolve(browserInstance)
386
391
  .then((instance) => {
387
- return instance.close(true);
392
+ return instance.close(true, logLevel, indent);
388
393
  })
389
394
  .catch((err) => {
390
395
  if (!(err === null || err === void 0 ? void 0 : err.message.includes('Target closed'))) {
@@ -405,7 +410,7 @@ exports.internalRenderFrames = internalRenderFrames;
405
410
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-frames)
406
411
  */
407
412
  const renderFrames = (options) => {
408
- const { composition, inputProps, onFrameUpdate, onStart, outputDir, serveUrl, browserExecutable, cancelSignal, chromiumOptions, concurrency, dumpBrowserLogs, envVariables, everyNthFrame, frameRange, imageFormat, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, port, puppeteerInstance, scale, timeoutInMilliseconds, verbose, quality, } = options;
413
+ const { composition, inputProps, onFrameUpdate, onStart, outputDir, serveUrl, browserExecutable, cancelSignal, chromiumOptions, concurrency, dumpBrowserLogs, envVariables, everyNthFrame, frameRange, imageFormat, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, port, puppeteerInstance, scale, timeoutInMilliseconds, verbose, quality, logLevel, } = options;
409
414
  if (!composition) {
410
415
  throw new Error('No `composition` option has been specified for renderFrames()');
411
416
  }
@@ -421,7 +426,6 @@ const renderFrames = (options) => {
421
426
  chromiumOptions: chromiumOptions !== null && chromiumOptions !== void 0 ? chromiumOptions : {},
422
427
  composition,
423
428
  concurrency: concurrency !== null && concurrency !== void 0 ? concurrency : null,
424
- dumpBrowserLogs: dumpBrowserLogs !== null && dumpBrowserLogs !== void 0 ? dumpBrowserLogs : false,
425
429
  envVariables: envVariables !== null && envVariables !== void 0 ? envVariables : {},
426
430
  everyNthFrame: everyNthFrame !== null && everyNthFrame !== void 0 ? everyNthFrame : 1,
427
431
  frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : null,
@@ -439,7 +443,7 @@ const renderFrames = (options) => {
439
443
  outputDir,
440
444
  port: port !== null && port !== void 0 ? port : null,
441
445
  scale: scale !== null && scale !== void 0 ? scale : 1,
442
- verbose: verbose !== null && verbose !== void 0 ? verbose : false,
446
+ logLevel: verbose || dumpBrowserLogs ? 'verbose' : logLevel !== null && logLevel !== void 0 ? logLevel : (0, logger_1.getLogLevel)(),
443
447
  timeoutInMilliseconds: timeoutInMilliseconds !== null && timeoutInMilliseconds !== void 0 ? timeoutInMilliseconds : TimeoutSettings_1.DEFAULT_TIMEOUT,
444
448
  webpackBundleOrServeUrl: serveUrl,
445
449
  server: undefined,