@remotion/renderer 4.0.0-alpha4 → 4.0.0-alpha6

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 (143) hide show
  1. package/README.md +5 -43
  2. package/dist/assets/download-and-map-assets-to-file.js +6 -6
  3. package/dist/assets/download-file.d.ts +3 -2
  4. package/dist/assets/download-file.js +18 -3
  5. package/dist/assets/download-map.d.ts +0 -26
  6. package/dist/assets/download-map.js +7 -12
  7. package/dist/assets/get-audio-channels.d.ts +1 -2
  8. package/dist/assets/get-audio-channels.js +5 -9
  9. package/dist/assets/read-file.d.ts +1 -1
  10. package/dist/assets/read-file.js +2 -2
  11. package/dist/assets/sanitize-filepath.js +2 -2
  12. package/dist/audio-codec.d.ts +4 -3
  13. package/dist/audio-codec.js +3 -9
  14. package/dist/browser/BrowserFetcher.d.ts +0 -1
  15. package/dist/browser/BrowserFetcher.js +14 -15
  16. package/dist/browser/BrowserRunner.d.ts +1 -1
  17. package/dist/browser/BrowserRunner.js +10 -4
  18. package/dist/browser/FrameManager.js +2 -3
  19. package/dist/browser/LaunchOptions.d.ts +1 -0
  20. package/dist/browser/Launcher.js +6 -5
  21. package/dist/browser/NodeWebSocketTransport.js +4 -4
  22. package/dist/browser/devtools-commands.d.ts +5 -1
  23. package/dist/browser/devtools-types.d.ts +78 -0
  24. package/dist/browser/get-download-destination.js +8 -8
  25. package/dist/browser/is-target-closed-err.d.ts +1 -0
  26. package/dist/browser/is-target-closed-err.js +9 -0
  27. package/dist/call-ffmpeg.d.ts +14 -0
  28. package/dist/call-ffmpeg.js +40 -0
  29. package/dist/check-apple-silicon.js +2 -45
  30. package/dist/client.d.ts +79 -42
  31. package/dist/client.js +27 -1
  32. package/dist/codec-supports-media.d.ts +2 -1
  33. package/dist/codec-supports-media.js +20 -5
  34. package/dist/combine-videos.d.ts +0 -3
  35. package/dist/combine-videos.js +9 -13
  36. package/dist/compositor/compose.d.ts +3 -1
  37. package/dist/compositor/compose.js +41 -18
  38. package/dist/compositor/compositor.d.ts +12 -0
  39. package/dist/compositor/compositor.js +204 -0
  40. package/dist/compositor/get-executable-path.d.ts +1 -1
  41. package/dist/compositor/get-executable-path.js +27 -8
  42. package/dist/compositor/make-nonce.d.ts +1 -0
  43. package/dist/compositor/make-nonce.js +8 -0
  44. package/dist/compositor/payloads.d.ts +34 -7
  45. package/dist/create-ffmpeg-complex-filter.d.ts +5 -5
  46. package/dist/create-ffmpeg-complex-filter.js +2 -4
  47. package/dist/create-ffmpeg-merge-filter.d.ts +2 -5
  48. package/dist/create-ffmpeg-merge-filter.js +2 -10
  49. package/dist/create-silent-audio.d.ts +1 -4
  50. package/dist/create-silent-audio.js +3 -7
  51. package/dist/crf.js +8 -2
  52. package/dist/delete-directory.js +18 -18
  53. package/dist/does-have-m2-bug.js +2 -2
  54. package/dist/ensure-output-directory.js +5 -5
  55. package/dist/ffmpeg-filter-file.js +7 -7
  56. package/dist/file-extensions.d.ts +1 -12
  57. package/dist/file-extensions.js +8 -14
  58. package/dist/find-closest-package-json.js +6 -6
  59. package/dist/get-compositions.d.ts +3 -5
  60. package/dist/get-compositions.js +8 -11
  61. package/dist/get-concurrency.js +3 -3
  62. package/dist/get-extension-from-codec.d.ts +2 -2
  63. package/dist/get-extension-of-filename.js +2 -2
  64. package/dist/get-frame-padded-index.d.ts +2 -1
  65. package/dist/get-local-browser-executable.js +4 -4
  66. package/dist/get-video-threads-flag.js +3 -3
  67. package/dist/guess-extension-for-media.d.ts +1 -3
  68. package/dist/guess-extension-for-media.js +4 -8
  69. package/dist/image-format.d.ts +12 -6
  70. package/dist/image-format.js +16 -13
  71. package/dist/index.d.ts +80 -61
  72. package/dist/index.js +15 -17
  73. package/dist/jpeg-quality.d.ts +1 -0
  74. package/dist/jpeg-quality.js +21 -0
  75. package/dist/merge-audio-track.d.ts +0 -2
  76. package/dist/merge-audio-track.js +5 -12
  77. package/dist/mime-types.js +2 -2
  78. package/dist/offthread-video-server.d.ts +9 -9
  79. package/dist/offthread-video-server.js +65 -58
  80. package/dist/open-browser.d.ts +1 -0
  81. package/dist/open-browser.js +7 -6
  82. package/dist/options/audio-bitrate.d.ts +2 -0
  83. package/dist/options/audio-bitrate.js +11 -0
  84. package/dist/options/crf.d.ts +2 -0
  85. package/dist/options/crf.js +11 -0
  86. package/dist/options/enforce-audio.d.ts +2 -0
  87. package/dist/options/enforce-audio.js +11 -0
  88. package/dist/options/jpeg-quality.d.ts +2 -0
  89. package/dist/options/jpeg-quality.js +11 -0
  90. package/dist/options/mute.d.ts +2 -0
  91. package/dist/options/mute.js +11 -0
  92. package/dist/options/option.d.ts +8 -0
  93. package/dist/options/option.js +2 -0
  94. package/dist/options/scale.d.ts +2 -0
  95. package/dist/options/scale.js +11 -0
  96. package/dist/options/video-bitrate.d.ts +2 -0
  97. package/dist/options/video-bitrate.js +11 -0
  98. package/dist/options/video-codec.d.ts +2 -0
  99. package/dist/options/video-codec.js +11 -0
  100. package/dist/perf.d.ts +1 -1
  101. package/dist/perf.js +9 -7
  102. package/dist/prepare-server.d.ts +3 -4
  103. package/dist/prepare-server.js +9 -9
  104. package/dist/preprocess-audio-track.d.ts +0 -4
  105. package/dist/preprocess-audio-track.js +4 -8
  106. package/dist/prespawn-ffmpeg.d.ts +6 -9
  107. package/dist/prespawn-ffmpeg.js +7 -12
  108. package/dist/prestitcher-memory-usage.d.ts +0 -4
  109. package/dist/prestitcher-memory-usage.js +4 -5
  110. package/dist/prores-profile.d.ts +1 -2
  111. package/dist/prores-profile.js +4 -4
  112. package/dist/provide-screenshot.d.ts +4 -5
  113. package/dist/provide-screenshot.js +2 -2
  114. package/dist/puppeteer-screenshot.d.ts +3 -3
  115. package/dist/puppeteer-screenshot.js +10 -33
  116. package/dist/render-frames.d.ts +13 -25
  117. package/dist/render-frames.js +34 -45
  118. package/dist/render-media.d.ts +16 -18
  119. package/dist/render-media.js +42 -52
  120. package/dist/render-still.d.ts +12 -8
  121. package/dist/render-still.js +30 -18
  122. package/dist/resolve-asset-src.js +2 -2
  123. package/dist/screenshot-dom-element.d.ts +4 -5
  124. package/dist/screenshot-dom-element.js +6 -3
  125. package/dist/screenshot-task.d.ts +2 -3
  126. package/dist/screenshot-task.js +40 -25
  127. package/dist/serve-handler/index.d.ts +1 -1
  128. package/dist/serve-handler/index.js +21 -19
  129. package/dist/serve-handler/is-path-inside.js +3 -3
  130. package/dist/serve-static.d.ts +2 -3
  131. package/dist/serve-static.js +26 -22
  132. package/dist/stitch-frames-to-video.d.ts +2 -12
  133. package/dist/stitch-frames-to-video.js +37 -46
  134. package/dist/take-frame-and-compose.d.ts +4 -5
  135. package/dist/take-frame-and-compose.js +15 -9
  136. package/dist/tmp-dir.js +7 -8
  137. package/dist/validate-concurrency.d.ts +2 -0
  138. package/dist/validate-concurrency.js +11 -5
  139. package/dist/validate-output-filename.d.ts +1 -1
  140. package/dist/validate-puppeteer-timeout.js +1 -0
  141. package/install-toolchain.mjs +36 -0
  142. package/package.json +11 -10
  143. package/types/ws/index.d.ts +5 -5
@@ -537,6 +537,84 @@ export interface CaptureScreenshotResponse {
537
537
  */
538
538
  data: string;
539
539
  }
540
+ export interface PrintPDFRequest {
541
+ /**
542
+ * Paper orientation. Defaults to false.
543
+ */
544
+ landscape?: boolean;
545
+ /**
546
+ * Display header and footer. Defaults to false.
547
+ */
548
+ displayHeaderFooter?: boolean;
549
+ /**
550
+ * Print background graphics. Defaults to false.
551
+ */
552
+ printBackground?: boolean;
553
+ /**
554
+ * Scale of the webpage rendering. Defaults to 1.
555
+ */
556
+ scale?: number;
557
+ /**
558
+ * Paper width in inches. Defaults to 8.5 inches.
559
+ */
560
+ paperWidth?: number;
561
+ /**
562
+ * Paper height in inches. Defaults to 11 inches.
563
+ */
564
+ paperHeight?: number;
565
+ /**
566
+ * Top margin in inches. Defaults to 1cm (~0.4 inches).
567
+ */
568
+ marginTop?: number;
569
+ /**
570
+ * Bottom margin in inches. Defaults to 1cm (~0.4 inches).
571
+ */
572
+ marginBottom?: number;
573
+ /**
574
+ * Left margin in inches. Defaults to 1cm (~0.4 inches).
575
+ */
576
+ marginLeft?: number;
577
+ /**
578
+ * Right margin in inches. Defaults to 1cm (~0.4 inches).
579
+ */
580
+ marginRight?: number;
581
+ /**
582
+ * Paper ranges to print, one based, e.g., '1-5, 8, 11-13'.
583
+ * Pages are printed in the document order, not in the order specified,
584
+ * and no more than once. Defaults to empty string,
585
+ * which implies the entire document is printed.
586
+ * The page numbers are quietly capped to actual page count of the document,
587
+ * and ranges beyond the end of the document are ignored.
588
+ * If this results in no pages to print, an error is reported.
589
+ * It is an error to specify a range with start greater than end.
590
+ */
591
+ pageRanges?: string;
592
+ /**
593
+ * HTML template for the print header.
594
+ * Should be valid HTML markup with following classes used to inject printing values into them:
595
+ * date: formatted print date
596
+ * title: document title
597
+ * url: document location
598
+ * pageNumber: current page number
599
+ * totalPages: total pages in the document
600
+ * For example, <span class=title></span> would generate span containing the title.
601
+ */
602
+ headerTemplate?: string;
603
+ /**
604
+ * HTML template for the print footer. Should use the same format as the headerTemplate.
605
+ */
606
+ footerTemplate?: string;
607
+ /**
608
+ * Whether or not to prefer page size as defined by css. Defaults to false, in which case the content will be scaled to fit the paper size.
609
+ */
610
+ preferCSSPageSize?: boolean;
611
+ }
612
+ export interface PrintPDFResponse {
613
+ /**
614
+ * Base64-encoded pdf data. Empty if |returnAsStream| is specified. (Encoded as a base64 string when passed over JSON)
615
+ */
616
+ data: string;
617
+ }
540
618
  export interface RequestWillBeSentEvent {
541
619
  /**
542
620
  * Request identifier.
@@ -4,20 +4,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getDownloadsCacheDir = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
9
  const getDownloadsCacheDir = () => {
10
10
  const cwd = process.cwd();
11
11
  let dir = cwd;
12
12
  for (;;) {
13
13
  try {
14
- if (fs_1.default.statSync(path_1.default.join(dir, 'package.json')).isFile()) {
14
+ if (node_fs_1.default.statSync(node_path_1.default.join(dir, 'package.json')).isFile()) {
15
15
  break;
16
16
  }
17
17
  // eslint-disable-next-line no-empty
18
18
  }
19
19
  catch (e) { }
20
- const parent = path_1.default.dirname(dir);
20
+ const parent = node_path_1.default.dirname(dir);
21
21
  if (dir === parent) {
22
22
  dir = undefined;
23
23
  break;
@@ -25,14 +25,14 @@ const getDownloadsCacheDir = () => {
25
25
  dir = parent;
26
26
  }
27
27
  if (!dir) {
28
- return path_1.default.resolve(cwd, '.remotion');
28
+ return node_path_1.default.resolve(cwd, '.remotion');
29
29
  }
30
30
  if (process.versions.pnp === '1') {
31
- return path_1.default.resolve(dir, '.pnp/.remotion');
31
+ return node_path_1.default.resolve(dir, '.pnp/.remotion');
32
32
  }
33
33
  if (process.versions.pnp === '3') {
34
- return path_1.default.resolve(dir, '.yarn/.remotion');
34
+ return node_path_1.default.resolve(dir, '.yarn/.remotion');
35
35
  }
36
- return path_1.default.resolve(dir, 'node_modules/.remotion');
36
+ return node_path_1.default.resolve(dir, 'node_modules/.remotion');
37
37
  };
38
38
  exports.getDownloadsCacheDir = getDownloadsCacheDir;
@@ -0,0 +1 @@
1
+ export declare const isTargetClosedErr: (error: Error | undefined) => boolean | undefined;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTargetClosedErr = void 0;
4
+ const isTargetClosedErr = (error) => {
5
+ var _a, _b;
6
+ return (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.includes('Target closed')) ||
7
+ ((_b = error === null || error === void 0 ? void 0 : error.message) === null || _b === void 0 ? void 0 : _b.includes('Session closed')));
8
+ };
9
+ exports.isTargetClosedErr = isTargetClosedErr;
@@ -0,0 +1,14 @@
1
+ import execa from 'execa';
2
+ export declare const dynamicLibraryPathOptions: () => {
3
+ env: {
4
+ DYLD_LIBRARY_PATH: string;
5
+ RUST_BACKTRACE: string;
6
+ } | {
7
+ PATH: string;
8
+ RUST_BACKTRACE: string;
9
+ } | {
10
+ LD_LIBRARY_PATH: string;
11
+ RUST_BACKTRACE: string;
12
+ };
13
+ };
14
+ export declare const callFf: (bin: 'ffmpeg' | 'ffprobe', args: (string | null)[], options?: execa.Options<string>) => execa.ExecaChildProcess<string>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.callFf = exports.dynamicLibraryPathOptions = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const get_executable_path_1 = require("./compositor/get-executable-path");
11
+ const truthy_1 = require("./truthy");
12
+ const dynamicLibraryPathOptions = () => {
13
+ const lib = node_path_1.default.join((0, get_executable_path_1.getExecutablePath)('ffmpeg-cwd'), 'remotion', 'lib');
14
+ return {
15
+ env: {
16
+ RUST_BACKTRACE: 'full',
17
+ ...(process.platform === 'darwin'
18
+ ? {
19
+ DYLD_LIBRARY_PATH: lib,
20
+ }
21
+ : process.platform === 'win32'
22
+ ? {
23
+ PATH: `${process.env.PATH};${lib}`,
24
+ }
25
+ : {
26
+ LD_LIBRARY_PATH: lib,
27
+ }),
28
+ },
29
+ };
30
+ };
31
+ exports.dynamicLibraryPathOptions = dynamicLibraryPathOptions;
32
+ const callFf = (bin, args, options) => {
33
+ const executablePath = (0, get_executable_path_1.getExecutablePath)(bin);
34
+ (0, node_fs_1.chmodSync)(executablePath, 0o755);
35
+ return (0, execa_1.default)(executablePath, args.filter(truthy_1.truthy), {
36
+ ...(0, exports.dynamicLibraryPathOptions)(),
37
+ ...options,
38
+ });
39
+ };
40
+ exports.callFf = callFf;
@@ -1,55 +1,12 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.checkNodeVersionAndWarnAboutRosetta = void 0;
27
- const os = __importStar(require("os"));
28
4
  const checkNodeVersionAndWarnAboutRosetta = () => {
29
- // see https://github.com/nodejs/node/issues/41900#issuecomment-1113511254
30
- const cpus = os.cpus();
31
- const isAppleSilicon = cpus[0].model.includes('Apple');
32
- const isArm64 = os.arch() === 'arm64';
33
5
  const version = process.version.replace('v', '').split('.');
34
6
  const majorVersion = Number(version[0]);
35
- const requiredNodeVersion = 14;
36
- if (majorVersion < 13) {
7
+ const requiredNodeVersion = 16;
8
+ if (majorVersion < 16) {
37
9
  throw new Error(`Remotion requires at least Node ${requiredNodeVersion}. You currently have ${process.version}. Update your node version to ${requiredNodeVersion} to use Remotion.`);
38
10
  }
39
- if (isAppleSilicon && !isArm64) {
40
- const recommendedNodeVersion = 16;
41
- const recommendNodeUpgrade = majorVersion < recommendedNodeVersion;
42
- console.warn([
43
- `⚠️ Apple Silicon detected but Node.JS running under Rosetta. This will cause performance issues.\n`,
44
- `Recommended actions:\n`,
45
- recommendNodeUpgrade
46
- ? ` - Upgrade to Node ${recommendedNodeVersion} or later\n`
47
- : ' - Run Node using `arch -arm64` architecture\n',
48
- 'See https://remotion.dev/docs/troubleshooting/rosetta for more information.',
49
- '---',
50
- ]
51
- .filter(Boolean)
52
- .join('\n'));
53
- }
54
11
  };
55
12
  exports.checkNodeVersionAndWarnAboutRosetta = checkNodeVersionAndWarnAboutRosetta;
package/dist/client.d.ts CHANGED
@@ -1,97 +1,99 @@
1
1
  export declare const BrowserSafeApis: {
2
- getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null) => import("./file-extensions").FileExtension;
2
+ getFileExtensionFromCodec: <T extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null) => import("./file-extensions").FileExtension;
3
3
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
4
- getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
5
- getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
6
- isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
4
+ validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
5
+ getDefaultCrfForCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => number;
6
+ getValidCrfRanges: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
7
+ isAudioCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
8
+ proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
7
9
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
8
10
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
9
11
  supportedAudioCodecs: {
10
12
  readonly h264: readonly ["aac", "pcm-16"];
11
13
  readonly 'h264-mkv': readonly ["pcm-16"];
12
14
  readonly aac: readonly ["aac", "pcm-16"];
13
- readonly gif: readonly [];
15
+ readonly gif: ("pcm-16" | "aac" | "mp3" | "opus")[];
14
16
  readonly h265: readonly ["aac", "pcm-16"];
15
17
  readonly mp3: readonly ["mp3", "pcm-16"];
16
- readonly prores: readonly ["pcm-16", "aac"];
18
+ readonly prores: readonly ["aac", "pcm-16"];
17
19
  readonly vp8: readonly ["opus", "pcm-16"];
18
20
  readonly vp9: readonly ["opus", "pcm-16"];
19
21
  readonly wav: readonly ["pcm-16"];
20
22
  };
21
23
  defaultFileExtensionMap: {
22
- h264: {
24
+ aac: {
23
25
  default: import("./file-extensions").FileExtension;
24
26
  forAudioCodec: {
25
- aac: {
27
+ "pcm-16": {
26
28
  possible: import("./file-extensions").FileExtension[];
27
29
  default: import("./file-extensions").FileExtension;
28
30
  };
29
- "pcm-16": {
31
+ aac: {
30
32
  possible: import("./file-extensions").FileExtension[];
31
33
  default: import("./file-extensions").FileExtension;
32
34
  };
33
35
  };
34
36
  };
35
- h265: {
37
+ mp3: {
36
38
  default: import("./file-extensions").FileExtension;
37
39
  forAudioCodec: {
38
- aac: {
40
+ "pcm-16": {
39
41
  possible: import("./file-extensions").FileExtension[];
40
42
  default: import("./file-extensions").FileExtension;
41
43
  };
42
- "pcm-16": {
44
+ mp3: {
43
45
  possible: import("./file-extensions").FileExtension[];
44
46
  default: import("./file-extensions").FileExtension;
45
47
  };
46
48
  };
47
49
  };
48
- vp8: {
50
+ h264: {
49
51
  default: import("./file-extensions").FileExtension;
50
52
  forAudioCodec: {
51
53
  "pcm-16": {
52
54
  possible: import("./file-extensions").FileExtension[];
53
55
  default: import("./file-extensions").FileExtension;
54
56
  };
55
- opus: {
57
+ aac: {
56
58
  possible: import("./file-extensions").FileExtension[];
57
59
  default: import("./file-extensions").FileExtension;
58
60
  };
59
61
  };
60
62
  };
61
- vp9: {
63
+ h265: {
62
64
  default: import("./file-extensions").FileExtension;
63
65
  forAudioCodec: {
64
66
  "pcm-16": {
65
67
  possible: import("./file-extensions").FileExtension[];
66
68
  default: import("./file-extensions").FileExtension;
67
69
  };
68
- opus: {
70
+ aac: {
69
71
  possible: import("./file-extensions").FileExtension[];
70
72
  default: import("./file-extensions").FileExtension;
71
73
  };
72
74
  };
73
75
  };
74
- mp3: {
76
+ vp8: {
75
77
  default: import("./file-extensions").FileExtension;
76
78
  forAudioCodec: {
77
- mp3: {
79
+ "pcm-16": {
78
80
  possible: import("./file-extensions").FileExtension[];
79
81
  default: import("./file-extensions").FileExtension;
80
82
  };
81
- "pcm-16": {
83
+ opus: {
82
84
  possible: import("./file-extensions").FileExtension[];
83
85
  default: import("./file-extensions").FileExtension;
84
86
  };
85
87
  };
86
88
  };
87
- aac: {
89
+ vp9: {
88
90
  default: import("./file-extensions").FileExtension;
89
91
  forAudioCodec: {
90
- aac: {
92
+ "pcm-16": {
91
93
  possible: import("./file-extensions").FileExtension[];
92
94
  default: import("./file-extensions").FileExtension;
93
95
  };
94
- "pcm-16": {
96
+ opus: {
95
97
  possible: import("./file-extensions").FileExtension[];
96
98
  default: import("./file-extensions").FileExtension;
97
99
  };
@@ -109,11 +111,11 @@ export declare const BrowserSafeApis: {
109
111
  prores: {
110
112
  default: import("./file-extensions").FileExtension;
111
113
  forAudioCodec: {
112
- aac: {
114
+ "pcm-16": {
113
115
  possible: import("./file-extensions").FileExtension[];
114
116
  default: import("./file-extensions").FileExtension;
115
117
  };
116
- "pcm-16": {
118
+ aac: {
117
119
  possible: import("./file-extensions").FileExtension[];
118
120
  default: import("./file-extensions").FileExtension;
119
121
  };
@@ -130,17 +132,42 @@ export declare const BrowserSafeApis: {
130
132
  };
131
133
  gif: {
132
134
  default: import("./file-extensions").FileExtension;
133
- forAudioCodec: {};
135
+ forAudioCodec: {
136
+ "pcm-16": {
137
+ possible: import("./file-extensions").FileExtension[];
138
+ default: import("./file-extensions").FileExtension;
139
+ };
140
+ aac: {
141
+ possible: import("./file-extensions").FileExtension[];
142
+ default: import("./file-extensions").FileExtension;
143
+ };
144
+ mp3: {
145
+ possible: import("./file-extensions").FileExtension[];
146
+ default: import("./file-extensions").FileExtension;
147
+ };
148
+ opus: {
149
+ possible: import("./file-extensions").FileExtension[];
150
+ default: import("./file-extensions").FileExtension;
151
+ };
152
+ };
134
153
  };
135
154
  };
136
155
  defaultAudioCodecs: {
156
+ aac: {
157
+ compressed: "pcm-16" | "aac" | null;
158
+ lossless: "pcm-16" | "aac" | null;
159
+ };
160
+ mp3: {
161
+ compressed: "pcm-16" | "mp3" | null;
162
+ lossless: "pcm-16" | "mp3" | null;
163
+ };
137
164
  h264: {
138
- compressed: "aac" | "pcm-16" | null;
139
- lossless: "aac" | "pcm-16" | null;
165
+ compressed: "pcm-16" | "aac" | null;
166
+ lossless: "pcm-16" | "aac" | null;
140
167
  };
141
168
  h265: {
142
- compressed: "aac" | "pcm-16" | null;
143
- lossless: "aac" | "pcm-16" | null;
169
+ compressed: "pcm-16" | "aac" | null;
170
+ lossless: "pcm-16" | "aac" | null;
144
171
  };
145
172
  vp8: {
146
173
  compressed: "pcm-16" | "opus" | null;
@@ -150,30 +177,40 @@ export declare const BrowserSafeApis: {
150
177
  compressed: "pcm-16" | "opus" | null;
151
178
  lossless: "pcm-16" | "opus" | null;
152
179
  };
153
- mp3: {
154
- compressed: "mp3" | "pcm-16" | null;
155
- lossless: "mp3" | "pcm-16" | null;
156
- };
157
- aac: {
158
- compressed: "aac" | "pcm-16" | null;
159
- lossless: "aac" | "pcm-16" | null;
160
- };
161
180
  wav: {
162
181
  compressed: "pcm-16" | null;
163
182
  lossless: "pcm-16" | null;
164
183
  };
165
184
  prores: {
166
- compressed: "aac" | "pcm-16" | null;
167
- lossless: "aac" | "pcm-16" | null;
185
+ compressed: "pcm-16" | "aac" | null;
186
+ lossless: "pcm-16" | "aac" | null;
168
187
  };
169
188
  "h264-mkv": {
170
189
  compressed: "pcm-16" | null;
171
190
  lossless: "pcm-16" | null;
172
191
  };
173
192
  gif: {
174
- compressed: null;
175
- lossless: null;
193
+ compressed: "pcm-16" | "aac" | "mp3" | "opus" | null;
194
+ lossless: "pcm-16" | "aac" | "mp3" | "opus" | null;
176
195
  };
177
196
  };
178
- defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">;
197
+ defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">;
198
+ validateOutputFilename: <T_1 extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">({ codec, audioCodec, extension, preferLossless, }: {
199
+ codec: T_1;
200
+ audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null;
201
+ extension: string;
202
+ preferLossless: boolean;
203
+ }) => void;
204
+ options: {
205
+ scaleOption: import(".").RemotionOption;
206
+ crfOption: import(".").RemotionOption;
207
+ jpegQualityOption: import(".").RemotionOption;
208
+ videoBitrate: import(".").RemotionOption;
209
+ audioBitrateOption: import(".").RemotionOption;
210
+ enforceAudioOption: import(".").RemotionOption;
211
+ muteOption: import(".").RemotionOption;
212
+ videoCodecOption: import(".").RemotionOption;
213
+ };
214
+ codecSupportsCrf: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
215
+ codecSupportsVideoBitrate: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
179
216
  };
package/dist/client.js CHANGED
@@ -3,21 +3,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BrowserSafeApis = void 0;
4
4
  const audio_codec_1 = require("./audio-codec");
5
5
  const codec_1 = require("./codec");
6
+ const codec_supports_media_1 = require("./codec-supports-media");
6
7
  const crf_1 = require("./crf");
7
8
  const file_extensions_1 = require("./file-extensions");
8
9
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
9
10
  const is_audio_codec_1 = require("./is-audio-codec");
11
+ const audio_bitrate_1 = require("./options/audio-bitrate");
12
+ const crf_2 = require("./options/crf");
13
+ const enforce_audio_1 = require("./options/enforce-audio");
14
+ const jpeg_quality_1 = require("./options/jpeg-quality");
15
+ const mute_1 = require("./options/mute");
16
+ const scale_1 = require("./options/scale");
17
+ const video_bitrate_1 = require("./options/video-bitrate");
18
+ const video_codec_1 = require("./options/video-codec");
10
19
  const pixel_format_1 = require("./pixel-format");
20
+ const prores_profile_1 = require("./prores-profile");
21
+ const validate_output_filename_1 = require("./validate-output-filename");
11
22
  exports.BrowserSafeApis = {
12
23
  getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
13
24
  validCodecs: codec_1.validCodecs,
25
+ validAudioCodecs: audio_codec_1.validAudioCodecs,
14
26
  getDefaultCrfForCodec: crf_1.getDefaultCrfForCodec,
15
27
  getValidCrfRanges: crf_1.getValidCrfRanges,
16
28
  isAudioCodec: is_audio_codec_1.isAudioCodec,
29
+ proResProfileOptions: prores_profile_1.proResProfileOptions,
17
30
  validPixelFormats: pixel_format_1.validPixelFormats,
18
31
  DEFAULT_PIXEL_FORMAT: pixel_format_1.DEFAULT_PIXEL_FORMAT,
19
- supportedAudioCodecs: file_extensions_1.supportedAudioCodecs,
32
+ supportedAudioCodecs: audio_codec_1.supportedAudioCodecs,
20
33
  defaultFileExtensionMap: file_extensions_1.defaultFileExtensionMap,
21
34
  defaultAudioCodecs: audio_codec_1.defaultAudioCodecs,
22
35
  defaultCodecsForFileExtension: get_extension_from_codec_1.defaultCodecsForFileExtension,
36
+ validateOutputFilename: validate_output_filename_1.validateOutputFilename,
37
+ options: {
38
+ scaleOption: scale_1.scaleOption,
39
+ crfOption: crf_2.crfOption,
40
+ jpegQualityOption: jpeg_quality_1.jpegQualityOption,
41
+ videoBitrate: video_bitrate_1.videoBitrate,
42
+ audioBitrateOption: audio_bitrate_1.audioBitrateOption,
43
+ enforceAudioOption: enforce_audio_1.enforceAudioOption,
44
+ muteOption: mute_1.muteOption,
45
+ videoCodecOption: video_codec_1.videoCodecOption,
46
+ },
47
+ codecSupportsCrf: codec_supports_media_1.codecSupportsCrf,
48
+ codecSupportsVideoBitrate: codec_supports_media_1.codecSupportsVideoBitrate,
23
49
  };
@@ -4,5 +4,6 @@ declare type MediaSupport = {
4
4
  audio: boolean;
5
5
  };
6
6
  export declare const codecSupportsMedia: (codec: Codec) => MediaSupport;
7
- export declare const codecSupportsCrf: (codec: Codec) => boolean | "" | null;
7
+ export declare const codecSupportsCrf: (codec: Codec) => boolean;
8
+ export declare const codecSupportsVideoBitrate: (codec: Codec) => boolean;
8
9
  export {};
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.codecSupportsCrf = exports.codecSupportsMedia = void 0;
4
- const get_codec_name_1 = require("./get-codec-name");
3
+ exports.codecSupportsVideoBitrate = exports.codecSupportsCrf = exports.codecSupportsMedia = void 0;
4
+ const crf_1 = require("./crf");
5
5
  const support = {
6
6
  'h264-mkv': {
7
7
  audio: true,
@@ -48,9 +48,24 @@ const codecSupportsMedia = (codec) => {
48
48
  return support[codec];
49
49
  };
50
50
  exports.codecSupportsMedia = codecSupportsMedia;
51
+ const codecSupportsVideoBitrateMap = {
52
+ 'h264-mkv': true,
53
+ aac: false,
54
+ gif: false,
55
+ h264: true,
56
+ h265: true,
57
+ mp3: false,
58
+ prores: false,
59
+ vp8: true,
60
+ vp9: true,
61
+ wav: false,
62
+ };
51
63
  const codecSupportsCrf = (codec) => {
52
- const encoderName = (0, get_codec_name_1.getCodecName)(codec);
53
- const supportsCrf = encoderName && codec !== 'prores';
54
- return supportsCrf;
64
+ const range = (0, crf_1.getValidCrfRanges)(codec);
65
+ return range[0] !== range[1];
55
66
  };
56
67
  exports.codecSupportsCrf = codecSupportsCrf;
68
+ const codecSupportsVideoBitrate = (codec) => {
69
+ return codecSupportsVideoBitrateMap[codec];
70
+ };
71
+ exports.codecSupportsVideoBitrate = codecSupportsVideoBitrate;
@@ -1,6 +1,5 @@
1
1
  import type { AudioCodec } from './audio-codec';
2
2
  import type { Codec } from './codec';
3
- import type { FfmpegExecutable } from './ffmpeg-executable';
4
3
  declare type Options = {
5
4
  files: string[];
6
5
  filelistDir: string;
@@ -10,8 +9,6 @@ declare type Options = {
10
9
  codec: Codec;
11
10
  fps: number;
12
11
  numberOfGifLoops: number | null;
13
- remotionRoot: string;
14
- ffmpegExecutable: FfmpegExecutable;
15
12
  audioCodec: AudioCodec | null;
16
13
  };
17
14
  export declare const combineVideos: (options: Options) => Promise<void>;