@remotion/renderer 4.1.0-alpha3 → 4.1.0-alpha4

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 (87) hide show
  1. package/dist/assets/get-video-stream-duration.d.ts +9 -0
  2. package/dist/assets/get-video-stream-duration.js +71 -0
  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/calculate-sar-dar-pixels.d.ts +9 -0
  14. package/dist/calculate-sar-dar-pixels.js +19 -0
  15. package/dist/compositor/compositor.d.ts +3 -2
  16. package/dist/compositor/compositor.js +6 -5
  17. package/dist/cycle-browser-tabs.d.ts +2 -1
  18. package/dist/cycle-browser-tabs.js +2 -2
  19. package/dist/determine-resize-params.d.ts +4 -0
  20. package/dist/determine-resize-params.js +10 -0
  21. package/dist/determine-vcodec-ffmpeg-flags.d.ts +2 -0
  22. package/dist/determine-vcodec-ffmpeg-flags.js +13 -0
  23. package/dist/ensure-ffmpeg.d.ts +18 -0
  24. package/dist/ensure-ffmpeg.js +58 -0
  25. package/dist/ensure-presentation-timestamp.d.ts +15 -0
  26. package/dist/ensure-presentation-timestamp.js +88 -0
  27. package/dist/extract-frame-from-video.d.ts +16 -0
  28. package/dist/extract-frame-from-video.js +191 -0
  29. package/dist/ffmpeg-executable.d.ts +1 -0
  30. package/dist/ffmpeg-executable.js +2 -0
  31. package/dist/ffmpeg-flags.d.ts +31 -0
  32. package/dist/ffmpeg-flags.js +245 -0
  33. package/dist/format-logs.d.ts +3 -0
  34. package/dist/format-logs.js +201 -0
  35. package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
  36. package/dist/frame-to-ffmpeg-timestamp.js +8 -0
  37. package/dist/get-browser-instance.d.ts +3 -2
  38. package/dist/get-browser-instance.js +5 -5
  39. package/dist/get-can-extract-frames-fast.d.ts +14 -0
  40. package/dist/get-can-extract-frames-fast.js +71 -0
  41. package/dist/get-compositions.d.ts +4 -3
  42. package/dist/get-compositions.js +6 -5
  43. package/dist/get-frame-of-video-slow.d.ts +17 -0
  44. package/dist/get-frame-of-video-slow.js +72 -0
  45. package/dist/get-video-info.d.ts +8 -0
  46. package/dist/get-video-info.js +59 -0
  47. package/dist/index.d.ts +14 -15
  48. package/dist/is-beyond-last-frame.d.ts +3 -0
  49. package/dist/is-beyond-last-frame.js +12 -0
  50. package/dist/last-frame-from-video-cache.d.ts +17 -0
  51. package/dist/last-frame-from-video-cache.js +55 -0
  52. package/dist/legacy-webpack-config.d.ts +9 -0
  53. package/dist/legacy-webpack-config.js +13 -0
  54. package/dist/logger.d.ts +0 -1
  55. package/dist/logger.js +5 -10
  56. package/dist/offthread-video-server.d.ts +3 -2
  57. package/dist/offthread-video-server.js +4 -3
  58. package/dist/open-browser.d.ts +3 -2
  59. package/dist/open-browser.js +7 -5
  60. package/dist/perf.js +4 -2
  61. package/dist/prepare-server.d.ts +3 -2
  62. package/dist/prepare-server.js +4 -4
  63. package/dist/prespawn-ffmpeg.d.ts +2 -1
  64. package/dist/prespawn-ffmpeg.js +2 -30
  65. package/dist/quality.d.ts +1 -0
  66. package/dist/quality.js +21 -0
  67. package/dist/render-frames.d.ts +11 -4
  68. package/dist/render-frames.js +15 -11
  69. package/dist/render-media.d.ts +11 -4
  70. package/dist/render-media.js +12 -14
  71. package/dist/render-still.d.ts +8 -2
  72. package/dist/render-still.js +8 -8
  73. package/dist/replace-browser.d.ts +2 -1
  74. package/dist/replace-browser.js +2 -2
  75. package/dist/select-composition.d.ts +2 -1
  76. package/dist/select-composition.js +8 -8
  77. package/dist/serve-static.d.ts +2 -1
  78. package/dist/serve-static.js +1 -1
  79. package/dist/stitch-frames-to-video.d.ts +2 -1
  80. package/dist/stitch-frames-to-video.js +12 -22
  81. package/dist/try-to-extract-frame-of-video-fast.d.ts +12 -0
  82. package/dist/try-to-extract-frame-of-video-fast.js +55 -0
  83. package/dist/validate-ffmpeg.d.ts +7 -0
  84. package/dist/validate-ffmpeg.js +77 -0
  85. package/dist/warn-about-ffmpeg-version.d.ts +5 -0
  86. package/dist/warn-about-ffmpeg-version.js +37 -0
  87. package/package.json +9 -9
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import execa from 'execa';
2
3
  import { HeadlessBrowser } from './browser/Browser';
3
4
  import { SymbolicateableError } from './error-handling/symbolicateable-error';
@@ -42,7 +43,7 @@ export declare const RenderInternals: {
42
43
  downloadMap: import("./assets/download-map").DownloadMap;
43
44
  remotionRoot: string;
44
45
  concurrency: number;
45
- verbose: boolean;
46
+ logLevel: "verbose" | "info" | "warn" | "error";
46
47
  indent: boolean;
47
48
  }) => Promise<{
48
49
  port: number;
@@ -300,7 +301,7 @@ export declare const RenderInternals: {
300
301
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
301
302
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
302
303
  DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
303
- DEFAULT_VIDEO_IMAGE_FORMAT: "png" | "jpeg" | "none";
304
+ DEFAULT_VIDEO_IMAGE_FORMAT: "none" | "png" | "jpeg";
304
305
  DEFAULT_JPEG_QUALITY: number;
305
306
  chalk: {
306
307
  enabled: boolean;
@@ -358,7 +359,6 @@ export declare const RenderInternals: {
358
359
  logLevel: "verbose" | "info" | "warn" | "error";
359
360
  } & {
360
361
  tag?: string | undefined;
361
- secondTag?: string | undefined;
362
362
  }, message?: any, ...optionalParams: any[]) => void;
363
363
  info: (message?: any, ...optionalParams: any[]) => void;
364
364
  infoAdvanced: (options: {
@@ -377,12 +377,12 @@ export declare const RenderInternals: {
377
377
  INDENT_TOKEN: string;
378
378
  isColorSupported: boolean;
379
379
  HeadlessBrowser: typeof HeadlessBrowser;
380
- prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, verbose, indent, }: {
380
+ prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: {
381
381
  webpackConfigOrServeUrl: string;
382
382
  port: number | null;
383
383
  remotionRoot: string;
384
384
  concurrency: number;
385
- verbose: boolean;
385
+ logLevel: "verbose" | "info" | "warn" | "error";
386
386
  indent: boolean;
387
387
  }) => Promise<import("./prepare-server").RemotionServer>;
388
388
  makeOrReuseServer: (server: import("./prepare-server").RemotionServer | undefined, config: {
@@ -390,7 +390,7 @@ export declare const RenderInternals: {
390
390
  port: number | null;
391
391
  remotionRoot: string;
392
392
  concurrency: number;
393
- verbose: boolean;
393
+ logLevel: "verbose" | "info" | "warn" | "error";
394
394
  indent: boolean;
395
395
  }, { onDownload, onError, }: {
396
396
  onError: (err: Error) => void;
@@ -407,7 +407,6 @@ export declare const RenderInternals: {
407
407
  imageFormat: "png" | "jpeg" | "pdf" | "webp";
408
408
  jpegQuality: number;
409
409
  puppeteerInstance: HeadlessBrowser | null;
410
- dumpBrowserLogs: boolean;
411
410
  envVariables: Record<string, string>;
412
411
  overwrite: boolean;
413
412
  browserExecutable: import("./browser-executable").BrowserExecutable;
@@ -419,20 +418,20 @@ export declare const RenderInternals: {
419
418
  cancelSignal: import("./make-cancel-signal").CancelSignal | null;
420
419
  indent: boolean;
421
420
  server: import("./prepare-server").RemotionServer | undefined;
422
- verbose: boolean;
421
+ logLevel: "verbose" | "info" | "warn" | "error";
423
422
  serveUrl: string;
424
423
  port: number | null;
425
424
  }) => Promise<{
426
425
  buffer: Buffer | null;
427
426
  }>;
428
- internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, shouldDumpIo, viewport, }: {
429
- shouldDumpIo: boolean;
427
+ internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: {
430
428
  browserExecutable: string | null;
431
429
  chromiumOptions: import("./open-browser").ChromiumOptions;
432
430
  forceDeviceScaleFactor: number | undefined;
433
431
  viewport: import("./browser/PuppeteerViewport").Viewport | null;
434
432
  indent: boolean;
435
433
  browser: import("./browser").Browser;
434
+ logLevel: "verbose" | "info" | "warn" | "error";
436
435
  }) => Promise<HeadlessBrowser>;
437
436
  internalSelectComposition: (options: {
438
437
  inputProps: Record<string, unknown>;
@@ -445,11 +444,11 @@ export declare const RenderInternals: {
445
444
  port: number | null;
446
445
  indent: boolean;
447
446
  server: import("./prepare-server").RemotionServer | undefined;
448
- verbose: boolean;
447
+ logLevel: "verbose" | "info" | "warn" | "error";
449
448
  serveUrl: string;
450
449
  id: string;
451
450
  }) => Promise<import("remotion").AnyCompMetadata>;
452
- internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, verbose, }: {
451
+ internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, logLevel, }: {
453
452
  inputProps: Record<string, unknown>;
454
453
  envVariables: Record<string, string>;
455
454
  puppeteerInstance: HeadlessBrowser | undefined;
@@ -460,11 +459,11 @@ export declare const RenderInternals: {
460
459
  port: number | null;
461
460
  server: import("./prepare-server").RemotionServer | undefined;
462
461
  indent: boolean;
463
- verbose: boolean;
462
+ logLevel: "verbose" | "info" | "warn" | "error";
464
463
  serveUrlOrWebpackUrl: string;
465
464
  }) => Promise<import("remotion").AnyCompMetadata[]>;
466
- 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>;
467
- 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<{
465
+ 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>;
466
+ 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<{
468
467
  buffer: Buffer | null;
469
468
  slowestFrames: import("./render-media").SlowFrame[];
470
469
  }>;
@@ -0,0 +1,3 @@
1
+ import type { DownloadMap } from './assets/download-map';
2
+ export declare const isBeyondLastFrame: (downloadMap: DownloadMap, src: string, time: number) => boolean | 0;
3
+ export declare const markAsBeyondLastFrame: (downloadMap: DownloadMap, src: string, time: number) => void;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.markAsBeyondLastFrame = exports.isBeyondLastFrame = void 0;
4
+ const isBeyondLastFrame = (downloadMap, src, time) => {
5
+ return (downloadMap.isBeyondLastFrameMap[src] &&
6
+ time >= downloadMap.isBeyondLastFrameMap[src]);
7
+ };
8
+ exports.isBeyondLastFrame = isBeyondLastFrame;
9
+ const markAsBeyondLastFrame = (downloadMap, src, time) => {
10
+ downloadMap.isBeyondLastFrameMap[src] = time;
11
+ };
12
+ exports.markAsBeyondLastFrame = markAsBeyondLastFrame;
@@ -0,0 +1,17 @@
1
+ import type { OffthreadVideoImageFormat } from 'remotion';
2
+ import type { DownloadMap, SpecialVCodecForTransparency } from './assets/download-map';
3
+ import type { FfmpegExecutable } from './ffmpeg-executable';
4
+ export type LastFrameOptions = {
5
+ ffmpegExecutable: FfmpegExecutable;
6
+ ffprobeExecutable: FfmpegExecutable;
7
+ offset: number;
8
+ src: string;
9
+ specialVCodecForTransparency: SpecialVCodecForTransparency;
10
+ imageFormat: OffthreadVideoImageFormat;
11
+ needsResize: [number, number] | null;
12
+ downloadMap: DownloadMap;
13
+ remotionRoot: string;
14
+ };
15
+ export declare const setLastFrameInCache: (options: LastFrameOptions, data: Buffer) => void;
16
+ export declare const getLastFrameFromCache: (options: LastFrameOptions) => Buffer | null;
17
+ export declare const clearLastFileCache: (downloadMap: DownloadMap) => void;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // OffthreadVideo requires sometimes that the last frame of a video gets extracted, however, this can be slow. We allocate a cache for it but that can be garbage collected
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.clearLastFileCache = exports.getLastFrameFromCache = exports.setLastFrameInCache = void 0;
5
+ const MAX_CACHE_SIZE = 50 * 1024 * 1024; // 50MB
6
+ let bufferSize = 0;
7
+ const makeLastFrameCacheKey = (options) => {
8
+ return [
9
+ options.ffmpegExecutable,
10
+ options.offset,
11
+ options.src,
12
+ options.imageFormat,
13
+ options.downloadMap.id,
14
+ ].join('-');
15
+ };
16
+ const setLastFrameInCache = (options, data) => {
17
+ const key = makeLastFrameCacheKey(options);
18
+ if (options.downloadMap.lastFrameMap[key]) {
19
+ bufferSize -= options.downloadMap.lastFrameMap[key].data.byteLength;
20
+ }
21
+ options.downloadMap.lastFrameMap[key] = { data, lastAccessed: Date.now() };
22
+ bufferSize += data.byteLength;
23
+ ensureMaxSize(options.downloadMap);
24
+ };
25
+ exports.setLastFrameInCache = setLastFrameInCache;
26
+ const getLastFrameFromCache = (options) => {
27
+ var _a;
28
+ const key = makeLastFrameCacheKey(options);
29
+ if (!options.downloadMap.lastFrameMap[key]) {
30
+ return null;
31
+ }
32
+ options.downloadMap.lastFrameMap[key].lastAccessed = Date.now();
33
+ return (_a = options.downloadMap.lastFrameMap[key].data) !== null && _a !== void 0 ? _a : null;
34
+ };
35
+ exports.getLastFrameFromCache = getLastFrameFromCache;
36
+ const removedLastFrameFromCache = (key, downloadMap) => {
37
+ if (!downloadMap.lastFrameMap[key]) {
38
+ return;
39
+ }
40
+ bufferSize -= downloadMap.lastFrameMap[key].data.byteLength;
41
+ delete downloadMap.lastFrameMap[key];
42
+ };
43
+ const ensureMaxSize = (downloadMap) => {
44
+ // eslint-disable-next-line no-unmodified-loop-condition
45
+ while (bufferSize > MAX_CACHE_SIZE) {
46
+ const earliest = Object.entries(downloadMap.lastFrameMap).sort((a, b) => {
47
+ return a[1].lastAccessed - b[1].lastAccessed;
48
+ })[0];
49
+ removedLastFrameFromCache(earliest[0], downloadMap);
50
+ }
51
+ };
52
+ const clearLastFileCache = (downloadMap) => {
53
+ downloadMap.lastFrameMap = {};
54
+ };
55
+ exports.clearLastFileCache = clearLastFileCache;
@@ -0,0 +1,9 @@
1
+ export type ServeUrlOrWebpackBundle = {
2
+ serveUrl: string;
3
+ } | {
4
+ /**
5
+ * @deprecated Renamed to `serveUrl`
6
+ */
7
+ webpackBundle: string;
8
+ };
9
+ export declare const getServeUrlWithFallback: (serve: ServeUrlOrWebpackBundle) => string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getServeUrlWithFallback = void 0;
4
+ const getServeUrlWithFallback = (serve) => {
5
+ if ('webpackBundle' in serve) {
6
+ return serve.webpackBundle;
7
+ }
8
+ if ('serveUrl' in serve) {
9
+ return serve.serveUrl;
10
+ }
11
+ throw new Error('You must pass the `serveUrl` parameter');
12
+ };
13
+ exports.getServeUrlWithFallback = getServeUrlWithFallback;
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;
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,7 @@ 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';
7
8
  type RunningStatus = {
8
9
  type: 'running';
9
10
  } | {
@@ -24,7 +25,7 @@ type PreStitcherOptions = {
24
25
  crf: number | null | undefined;
25
26
  onProgress: (progress: number) => void;
26
27
  proResProfile: ProResProfile | undefined;
27
- verbose: boolean;
28
+ logLevel: LogLevel;
28
29
  imageFormat: VideoImageFormat;
29
30
  ffmpegOverride: FfmpegOverrideFn;
30
31
  signal: CancelSignal;
@@ -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);
@@ -0,0 +1 @@
1
+ export declare const validateQuality: (q: number | undefined) => void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateQuality = void 0;
4
+ const validateQuality = (q) => {
5
+ if (typeof q !== 'undefined' && typeof q !== 'number') {
6
+ throw new Error(`Quality option must be a number or undefined. Got ${typeof q} (${JSON.stringify(q)})`);
7
+ }
8
+ if (typeof q === 'undefined') {
9
+ return;
10
+ }
11
+ if (!Number.isFinite(q)) {
12
+ throw new RangeError(`Quality must be a finite number, but is ${q}`);
13
+ }
14
+ if (Number.isNaN(q)) {
15
+ throw new RangeError(`Quality is NaN, but must be a real number`);
16
+ }
17
+ if (q > 100 || q < 0) {
18
+ throw new RangeError('Quality option must be between 0 and 100.');
19
+ }
20
+ };
21
+ exports.validateQuality = validateQuality;
@@ -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)