@remotion/renderer 4.0.0-alpha17 → 4.0.0-alpha19

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 (49) 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 +15 -8
  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/create-ffmpeg-merge-filter.js +1 -2
  16. package/dist/cycle-browser-tabs.d.ts +2 -1
  17. package/dist/cycle-browser-tabs.js +2 -2
  18. package/dist/get-browser-instance.d.ts +3 -2
  19. package/dist/get-browser-instance.js +5 -5
  20. package/dist/get-compositions.d.ts +4 -3
  21. package/dist/get-compositions.js +6 -5
  22. package/dist/index.d.ts +24 -27
  23. package/dist/logger.d.ts +1 -2
  24. package/dist/logger.js +5 -10
  25. package/dist/offthread-video-server.d.ts +3 -2
  26. package/dist/offthread-video-server.js +4 -3
  27. package/dist/open-browser.d.ts +3 -2
  28. package/dist/open-browser.js +7 -5
  29. package/dist/perf.js +4 -2
  30. package/dist/prepare-server.d.ts +3 -2
  31. package/dist/prepare-server.js +4 -4
  32. package/dist/prespawn-ffmpeg.d.ts +13 -1
  33. package/dist/prespawn-ffmpeg.js +21 -31
  34. package/dist/render-frames.d.ts +11 -4
  35. package/dist/render-frames.js +15 -11
  36. package/dist/render-media.d.ts +11 -4
  37. package/dist/render-media.js +19 -14
  38. package/dist/render-still.d.ts +8 -2
  39. package/dist/render-still.js +8 -8
  40. package/dist/replace-browser.d.ts +2 -1
  41. package/dist/replace-browser.js +2 -2
  42. package/dist/select-composition.d.ts +2 -1
  43. package/dist/select-composition.js +8 -8
  44. package/dist/serve-static.d.ts +2 -1
  45. package/dist/serve-static.js +1 -1
  46. package/dist/set-props-and-env.js +1 -1
  47. package/dist/stitch-frames-to-video.d.ts +2 -1
  48. package/dist/stitch-frames-to-video.js +12 -22
  49. package/package.json +9 -9
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import execa from 'execa';
3
2
  import { HeadlessBrowser } from './browser/Browser';
4
3
  import { SymbolicateableError } from './error-handling/symbolicateable-error';
@@ -43,7 +42,7 @@ export declare const RenderInternals: {
43
42
  downloadMap: import("./assets/download-map").DownloadMap;
44
43
  remotionRoot: string;
45
44
  concurrency: number;
46
- verbose: boolean;
45
+ logLevel: "verbose" | "info" | "warn" | "error";
47
46
  indent: boolean;
48
47
  }) => Promise<{
49
48
  port: number;
@@ -72,7 +71,7 @@ export declare const RenderInternals: {
72
71
  downloaded: number;
73
72
  totalSize: number | null;
74
73
  }) => void) | undefined;
75
- }, retries?: number) => Promise<{
74
+ }, retries?: number, attempt?: number) => Promise<{
76
75
  sizeInBytes: number;
77
76
  to: string;
78
77
  }>;
@@ -114,8 +113,8 @@ export declare const RenderInternals: {
114
113
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
115
114
  DEFAULT_BROWSER: import("./browser").Browser;
116
115
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
117
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | null;
118
- validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | null) => "angle" | "swangle" | "egl" | "swiftshader" | null;
116
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
117
+ validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
119
118
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
120
119
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
121
120
  validateJpegQuality: (q: number | undefined) => void;
@@ -123,7 +122,7 @@ export declare const RenderInternals: {
123
122
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
124
123
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
125
124
  logLevels: readonly ["verbose", "info", "warn", "error"];
126
- isEqualOrBelowLogLevel: (currentLevel: "verbose" | "error" | "info" | "warn", level: "verbose" | "error" | "info" | "warn") => boolean;
125
+ isEqualOrBelowLogLevel: (currentLevel: "verbose" | "info" | "warn" | "error", level: "verbose" | "info" | "warn" | "error") => boolean;
127
126
  isValidLogLevel: (level: string) => boolean;
128
127
  perf: typeof perf;
129
128
  convertToPositiveFrameIndex: ({ frame, durationInFrames, }: {
@@ -300,8 +299,8 @@ export declare const RenderInternals: {
300
299
  };
301
300
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
302
301
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
303
- DEFAULT_STILL_IMAGE_FORMAT: "jpeg" | "png" | "webp" | "pdf";
304
- DEFAULT_VIDEO_IMAGE_FORMAT: "jpeg" | "png" | "none";
302
+ DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
303
+ DEFAULT_VIDEO_IMAGE_FORMAT: "none" | "png" | "jpeg";
305
304
  DEFAULT_JPEG_QUALITY: number;
306
305
  chalk: {
307
306
  enabled: boolean;
@@ -356,34 +355,33 @@ export declare const RenderInternals: {
356
355
  verbose: (message?: any, ...optionalParams: any[]) => void;
357
356
  verboseAdvanced: (options: {
358
357
  indent: boolean;
359
- logLevel: "verbose" | "error" | "info" | "warn";
358
+ logLevel: "verbose" | "info" | "warn" | "error";
360
359
  } & {
361
360
  tag?: string | undefined;
362
- secondTag?: string | undefined;
363
361
  }, message?: any, ...optionalParams: any[]) => void;
364
362
  info: (message?: any, ...optionalParams: any[]) => void;
365
363
  infoAdvanced: (options: {
366
364
  indent: boolean;
367
- logLevel: "verbose" | "error" | "info" | "warn";
365
+ logLevel: "verbose" | "info" | "warn" | "error";
368
366
  }, message?: any, ...optionalParams: any[]) => void;
369
367
  warn: (message?: any, ...optionalParams: any[]) => void;
370
368
  warnAdvanced: (options: {
371
369
  indent: boolean;
372
- logLevel: "verbose" | "error" | "info" | "warn";
370
+ logLevel: "verbose" | "info" | "warn" | "error";
373
371
  }, message?: any, ...optionalParams: any[]) => void;
374
372
  error: (message?: any, ...optionalParams: any[]) => void;
375
373
  };
376
- getLogLevel: () => "verbose" | "error" | "info" | "warn";
377
- setLogLevel: (newLogLevel: "verbose" | "error" | "info" | "warn") => void;
374
+ getLogLevel: () => "verbose" | "info" | "warn" | "error";
375
+ setLogLevel: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
378
376
  INDENT_TOKEN: string;
379
377
  isColorSupported: boolean;
380
378
  HeadlessBrowser: typeof HeadlessBrowser;
381
- prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }: {
379
+ prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: {
382
380
  webpackConfigOrServeUrl: string;
383
381
  port: number | null;
384
382
  remotionRoot: string;
385
383
  concurrency: number;
386
- verbose: boolean;
384
+ logLevel: "verbose" | "info" | "warn" | "error";
387
385
  indent: boolean;
388
386
  }) => Promise<import("./prepare-server").RemotionServer>;
389
387
  makeOrReuseServer: (server: import("./prepare-server").RemotionServer | undefined, config: {
@@ -391,7 +389,7 @@ export declare const RenderInternals: {
391
389
  port: number | null;
392
390
  remotionRoot: string;
393
391
  concurrency: number;
394
- verbose: boolean;
392
+ logLevel: "verbose" | "info" | "warn" | "error";
395
393
  indent: boolean;
396
394
  }, { onDownload, onError, }: {
397
395
  onError: (err: Error) => void;
@@ -405,10 +403,9 @@ export declare const RenderInternals: {
405
403
  output: string | null;
406
404
  frame: number;
407
405
  inputProps: Record<string, unknown>;
408
- imageFormat: "jpeg" | "png" | "webp" | "pdf";
406
+ imageFormat: "png" | "jpeg" | "pdf" | "webp";
409
407
  jpegQuality: number;
410
408
  puppeteerInstance: HeadlessBrowser | null;
411
- dumpBrowserLogs: boolean;
412
409
  envVariables: Record<string, string>;
413
410
  overwrite: boolean;
414
411
  browserExecutable: import("./browser-executable").BrowserExecutable;
@@ -420,20 +417,20 @@ export declare const RenderInternals: {
420
417
  cancelSignal: import("./make-cancel-signal").CancelSignal | null;
421
418
  indent: boolean;
422
419
  server: import("./prepare-server").RemotionServer | undefined;
423
- verbose: boolean;
420
+ logLevel: "verbose" | "info" | "warn" | "error";
424
421
  serveUrl: string;
425
422
  port: number | null;
426
423
  }) => Promise<{
427
424
  buffer: Buffer | null;
428
425
  }>;
429
- internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }: {
430
- shouldDumpIo: boolean;
426
+ internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: {
431
427
  browserExecutable: string | null;
432
428
  chromiumOptions: import("./open-browser").ChromiumOptions;
433
429
  forceDeviceScaleFactor: number | undefined;
434
430
  viewport: import("./browser/PuppeteerViewport").Viewport | null;
435
431
  indent: boolean;
436
432
  browser: import("./browser").Browser;
433
+ logLevel: "verbose" | "info" | "warn" | "error";
437
434
  }) => Promise<HeadlessBrowser>;
438
435
  internalSelectComposition: (options: {
439
436
  inputProps: Record<string, unknown>;
@@ -446,11 +443,11 @@ export declare const RenderInternals: {
446
443
  port: number | null;
447
444
  indent: boolean;
448
445
  server: import("./prepare-server").RemotionServer | undefined;
449
- verbose: boolean;
446
+ logLevel: "verbose" | "info" | "warn" | "error";
450
447
  serveUrl: string;
451
448
  id: string;
452
449
  }) => Promise<import("remotion").AnyCompMetadata>;
453
- internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, verbose, }: {
450
+ internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, logLevel, }: {
454
451
  inputProps: Record<string, unknown>;
455
452
  envVariables: Record<string, string>;
456
453
  puppeteerInstance: HeadlessBrowser | undefined;
@@ -461,11 +458,11 @@ export declare const RenderInternals: {
461
458
  port: number | null;
462
459
  server: import("./prepare-server").RemotionServer | undefined;
463
460
  indent: boolean;
464
- verbose: boolean;
461
+ logLevel: "verbose" | "info" | "warn" | "error";
465
462
  serveUrlOrWebpackUrl: string;
466
463
  }) => 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<{
464
+ 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>;
465
+ 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
466
  buffer: Buffer | null;
470
467
  slowestFrames: import("./render-media").SlowFrame[];
471
468
  }>;
package/dist/logger.d.ts CHANGED
@@ -6,7 +6,6 @@ type LogOptions = {
6
6
  };
7
7
  type VerboseLogOptions = LogOptions & {
8
8
  tag?: string;
9
- secondTag?: string;
10
9
  };
11
10
  export declare const verboseTag: (str: string) => string;
12
11
  export declare const secondverboseTag: (str: string) => string;
@@ -19,6 +18,6 @@ export declare const Log: {
19
18
  warnAdvanced: (options: LogOptions, message?: any, ...optionalParams: any[]) => void;
20
19
  error: (message?: any, ...optionalParams: any[]) => void;
21
20
  };
22
- export declare const getLogLevel: () => "verbose" | "error" | "info" | "warn";
21
+ export declare const getLogLevel: () => "verbose" | "info" | "warn" | "error";
23
22
  export declare const setLogLevel: (newLogLevel: LogLevel) => void;
24
23
  export {};
package/dist/logger.js CHANGED
@@ -22,12 +22,7 @@ exports.Log = {
22
22
  if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'verbose')) {
23
23
  return console.log(...[
24
24
  options.indent ? exports.INDENT_TOKEN : null,
25
- [
26
- options.tag ? (0, exports.verboseTag)(options.tag) : null,
27
- options.secondTag ? (0, exports.secondverboseTag)(options.secondTag) : null,
28
- ]
29
- .filter(truthy_1.truthy)
30
- .join(''),
25
+ options.tag ? (0, exports.verboseTag)(options.tag) : null,
31
26
  ...args.map((a) => chalk_1.chalk.gray(a)),
32
27
  ].filter(truthy_1.truthy));
33
28
  }
@@ -36,12 +31,12 @@ exports.Log = {
36
31
  exports.Log.infoAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
37
32
  },
38
33
  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
- }
34
+ return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
42
35
  },
43
36
  warn: (...args) => {
44
- exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
37
+ if ((0, log_level_1.isEqualOrBelowLogLevel)((0, exports.getLogLevel)(), 'warn')) {
38
+ exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
39
+ }
45
40
  },
46
41
  warnAdvanced: (options, ...args) => {
47
42
  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)