@remotion/renderer 4.0.0-alpha5 → 4.0.0-alpha7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/assets/download-and-map-assets-to-file.js +6 -6
  2. package/dist/assets/download-file.d.ts +3 -2
  3. package/dist/assets/download-file.js +18 -3
  4. package/dist/assets/download-map.js +7 -7
  5. package/dist/assets/read-file.d.ts +1 -1
  6. package/dist/assets/read-file.js +2 -2
  7. package/dist/assets/sanitize-filepath.js +2 -2
  8. package/dist/browser/BrowserFetcher.js +13 -13
  9. package/dist/browser/BrowserRunner.d.ts +1 -1
  10. package/dist/browser/BrowserRunner.js +9 -22
  11. package/dist/browser/LaunchOptions.d.ts +1 -2
  12. package/dist/browser/Launcher.js +7 -15
  13. package/dist/browser/NodeWebSocketTransport.js +4 -4
  14. package/dist/browser/get-download-destination.js +8 -8
  15. package/dist/call-ffmpeg.js +8 -3
  16. package/dist/chalk/index.d.ts +54 -0
  17. package/dist/chalk/index.js +135 -0
  18. package/dist/chalk/is-color-supported.d.ts +1 -0
  19. package/dist/chalk/is-color-supported.js +37 -0
  20. package/dist/client.d.ts +41 -41
  21. package/dist/combine-videos.js +6 -6
  22. package/dist/compositor/compose.js +12 -7
  23. package/dist/compositor/compositor.d.ts +2 -2
  24. package/dist/compositor/compositor.js +13 -8
  25. package/dist/compositor/get-executable-path.js +1 -10
  26. package/dist/create-ffmpeg-complex-filter.d.ts +1 -4
  27. package/dist/delete-directory.js +3 -3
  28. package/dist/does-have-m2-bug.js +2 -2
  29. package/dist/ensure-output-directory.js +5 -5
  30. package/dist/ffmpeg-filter-file.js +7 -7
  31. package/dist/find-closest-package-json.js +6 -6
  32. package/dist/get-compositions.d.ts +4 -0
  33. package/dist/get-compositions.js +2 -1
  34. package/dist/get-concurrency.js +3 -3
  35. package/dist/get-extension-from-codec.d.ts +2 -2
  36. package/dist/get-extension-of-filename.js +2 -2
  37. package/dist/get-local-browser-executable.js +4 -4
  38. package/dist/get-video-threads-flag.js +3 -3
  39. package/dist/index.d.ts +111 -36
  40. package/dist/index.js +9 -0
  41. package/dist/logger.d.ts +22 -0
  42. package/dist/logger.js +61 -0
  43. package/dist/merge-audio-track.js +2 -2
  44. package/dist/mime-types.js +2 -2
  45. package/dist/offthread-video-server.d.ts +3 -2
  46. package/dist/offthread-video-server.js +4 -4
  47. package/dist/open-browser.d.ts +1 -1
  48. package/dist/open-browser.js +1 -1
  49. package/dist/options/jpeg-quality.js +1 -1
  50. package/dist/prepare-server.d.ts +2 -1
  51. package/dist/prepare-server.js +7 -5
  52. package/dist/prespawn-ffmpeg.d.ts +1 -0
  53. package/dist/prespawn-ffmpeg.js +37 -14
  54. package/dist/prestitcher-memory-usage.js +2 -2
  55. package/dist/provide-screenshot.d.ts +1 -0
  56. package/dist/puppeteer-screenshot.d.ts +1 -0
  57. package/dist/puppeteer-screenshot.js +1 -1
  58. package/dist/render-frames.d.ts +4 -0
  59. package/dist/render-frames.js +9 -7
  60. package/dist/render-media.d.ts +4 -1
  61. package/dist/render-media.js +47 -26
  62. package/dist/render-still.d.ts +6 -0
  63. package/dist/render-still.js +20 -7
  64. package/dist/resolve-asset-src.js +2 -2
  65. package/dist/screenshot-dom-element.d.ts +1 -0
  66. package/dist/screenshot-task.d.ts +1 -0
  67. package/dist/screenshot-task.js +2 -2
  68. package/dist/serve-handler/index.d.ts +1 -1
  69. package/dist/serve-handler/index.js +15 -15
  70. package/dist/serve-handler/is-path-inside.js +3 -3
  71. package/dist/serve-static.d.ts +1 -0
  72. package/dist/serve-static.js +3 -2
  73. package/dist/stitch-frames-to-video.d.ts +2 -0
  74. package/dist/stitch-frames-to-video.js +62 -39
  75. package/dist/take-frame-and-compose.d.ts +1 -0
  76. package/dist/take-frame-and-compose.js +6 -6
  77. package/dist/tmp-dir.js +7 -7
  78. package/dist/validate-output-filename.d.ts +1 -1
  79. package/install-toolchain.mjs +2 -2
  80. package/package.json +9 -9
  81. package/types/ws/index.d.ts +5 -5
  82. package/dist/assets/get-video-stream-duration.d.ts +0 -9
  83. package/dist/assets/get-video-stream-duration.js +0 -71
  84. package/dist/calculate-sar-dar-pixels.d.ts +0 -9
  85. package/dist/calculate-sar-dar-pixels.js +0 -19
  86. package/dist/determine-resize-params.d.ts +0 -1
  87. package/dist/determine-resize-params.js +0 -10
  88. package/dist/determine-vcodec-ffmpeg-flags.d.ts +0 -2
  89. package/dist/determine-vcodec-ffmpeg-flags.js +0 -13
  90. package/dist/ensure-ffmpeg.d.ts +0 -18
  91. package/dist/ensure-ffmpeg.js +0 -58
  92. package/dist/ensure-presentation-timestamp.d.ts +0 -15
  93. package/dist/ensure-presentation-timestamp.js +0 -88
  94. package/dist/extract-frame-from-video.d.ts +0 -17
  95. package/dist/extract-frame-from-video.js +0 -191
  96. package/dist/ffmpeg-executable.d.ts +0 -1
  97. package/dist/ffmpeg-executable.js +0 -2
  98. package/dist/ffmpeg-flags.d.ts +0 -31
  99. package/dist/ffmpeg-flags.js +0 -245
  100. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
  101. package/dist/frame-to-ffmpeg-timestamp.js +0 -8
  102. package/dist/get-can-extract-frames-fast.d.ts +0 -14
  103. package/dist/get-can-extract-frames-fast.js +0 -71
  104. package/dist/get-frame-of-video-slow.d.ts +0 -15
  105. package/dist/get-frame-of-video-slow.js +0 -72
  106. package/dist/get-video-info.d.ts +0 -8
  107. package/dist/get-video-info.js +0 -59
  108. package/dist/is-beyond-last-frame.d.ts +0 -3
  109. package/dist/is-beyond-last-frame.js +0 -12
  110. package/dist/last-frame-from-video-cache.d.ts +0 -18
  111. package/dist/last-frame-from-video-cache.js +0 -55
  112. package/dist/legacy-webpack-config.d.ts +0 -9
  113. package/dist/legacy-webpack-config.js +0 -13
  114. package/dist/quality.d.ts +0 -1
  115. package/dist/quality.js +0 -21
  116. package/dist/try-to-extract-frame-of-video-fast.d.ts +0 -13
  117. package/dist/try-to-extract-frame-of-video-fast.js +0 -55
  118. package/dist/validate-ffmpeg.d.ts +0 -7
  119. package/dist/validate-ffmpeg.js +0 -77
  120. package/dist/warn-about-ffmpeg-version.d.ts +0 -5
  121. package/dist/warn-about-ffmpeg-version.js +0 -37
@@ -0,0 +1,37 @@
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
+ var _a;
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.isColorSupported = void 0;
28
+ const tty = __importStar(require("tty"));
29
+ const argv = process.argv || [];
30
+ const env = process.env || {};
31
+ const isDisabled = 'NO_COLOR' in env || argv.includes('--no-color');
32
+ const isForced = 'FORCE_COLOR' in env || argv.includes('--color');
33
+ const isWindows = process.platform === 'win32';
34
+ const isCompatibleTerminal = ((_a = tty === null || tty === void 0 ? void 0 : tty.isatty) === null || _a === void 0 ? void 0 : _a.call(tty, 1)) && env.TERM && env.TERM !== 'dumb';
35
+ const isCI = 'CI' in env &&
36
+ ('GITHUB_ACTIONS' in env || 'GITLAB_CI' in env || 'CIRCLECI' in env);
37
+ exports.isColorSupported = !isDisabled && (isForced || isWindows || isCompatibleTerminal || isCI);
package/dist/client.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  export declare const BrowserSafeApis: {
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;
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;
3
3
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
4
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;
5
+ getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
6
+ getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
7
+ isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
8
8
  proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
9
9
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
10
10
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
@@ -21,79 +21,79 @@ export declare const BrowserSafeApis: {
21
21
  readonly wav: readonly ["pcm-16"];
22
22
  };
23
23
  defaultFileExtensionMap: {
24
- aac: {
24
+ h264: {
25
25
  default: import("./file-extensions").FileExtension;
26
26
  forAudioCodec: {
27
- "pcm-16": {
27
+ aac: {
28
28
  possible: import("./file-extensions").FileExtension[];
29
29
  default: import("./file-extensions").FileExtension;
30
30
  };
31
- aac: {
31
+ "pcm-16": {
32
32
  possible: import("./file-extensions").FileExtension[];
33
33
  default: import("./file-extensions").FileExtension;
34
34
  };
35
35
  };
36
36
  };
37
- mp3: {
37
+ h265: {
38
38
  default: import("./file-extensions").FileExtension;
39
39
  forAudioCodec: {
40
- "pcm-16": {
40
+ aac: {
41
41
  possible: import("./file-extensions").FileExtension[];
42
42
  default: import("./file-extensions").FileExtension;
43
43
  };
44
- mp3: {
44
+ "pcm-16": {
45
45
  possible: import("./file-extensions").FileExtension[];
46
46
  default: import("./file-extensions").FileExtension;
47
47
  };
48
48
  };
49
49
  };
50
- h264: {
50
+ vp8: {
51
51
  default: import("./file-extensions").FileExtension;
52
52
  forAudioCodec: {
53
53
  "pcm-16": {
54
54
  possible: import("./file-extensions").FileExtension[];
55
55
  default: import("./file-extensions").FileExtension;
56
56
  };
57
- aac: {
57
+ opus: {
58
58
  possible: import("./file-extensions").FileExtension[];
59
59
  default: import("./file-extensions").FileExtension;
60
60
  };
61
61
  };
62
62
  };
63
- h265: {
63
+ vp9: {
64
64
  default: import("./file-extensions").FileExtension;
65
65
  forAudioCodec: {
66
66
  "pcm-16": {
67
67
  possible: import("./file-extensions").FileExtension[];
68
68
  default: import("./file-extensions").FileExtension;
69
69
  };
70
- aac: {
70
+ opus: {
71
71
  possible: import("./file-extensions").FileExtension[];
72
72
  default: import("./file-extensions").FileExtension;
73
73
  };
74
74
  };
75
75
  };
76
- vp8: {
76
+ mp3: {
77
77
  default: import("./file-extensions").FileExtension;
78
78
  forAudioCodec: {
79
- "pcm-16": {
79
+ mp3: {
80
80
  possible: import("./file-extensions").FileExtension[];
81
81
  default: import("./file-extensions").FileExtension;
82
82
  };
83
- opus: {
83
+ "pcm-16": {
84
84
  possible: import("./file-extensions").FileExtension[];
85
85
  default: import("./file-extensions").FileExtension;
86
86
  };
87
87
  };
88
88
  };
89
- vp9: {
89
+ aac: {
90
90
  default: import("./file-extensions").FileExtension;
91
91
  forAudioCodec: {
92
- "pcm-16": {
92
+ aac: {
93
93
  possible: import("./file-extensions").FileExtension[];
94
94
  default: import("./file-extensions").FileExtension;
95
95
  };
96
- opus: {
96
+ "pcm-16": {
97
97
  possible: import("./file-extensions").FileExtension[];
98
98
  default: import("./file-extensions").FileExtension;
99
99
  };
@@ -111,11 +111,11 @@ export declare const BrowserSafeApis: {
111
111
  prores: {
112
112
  default: import("./file-extensions").FileExtension;
113
113
  forAudioCodec: {
114
- "pcm-16": {
114
+ aac: {
115
115
  possible: import("./file-extensions").FileExtension[];
116
116
  default: import("./file-extensions").FileExtension;
117
117
  };
118
- aac: {
118
+ "pcm-16": {
119
119
  possible: import("./file-extensions").FileExtension[];
120
120
  default: import("./file-extensions").FileExtension;
121
121
  };
@@ -141,21 +141,13 @@ export declare const BrowserSafeApis: {
141
141
  };
142
142
  };
143
143
  defaultAudioCodecs: {
144
- aac: {
145
- compressed: "pcm-16" | "aac" | null;
146
- lossless: "pcm-16" | "aac" | null;
147
- };
148
- mp3: {
149
- compressed: "pcm-16" | "mp3" | null;
150
- lossless: "pcm-16" | "mp3" | null;
151
- };
152
144
  h264: {
153
- compressed: "pcm-16" | "aac" | null;
154
- lossless: "pcm-16" | "aac" | null;
145
+ compressed: "aac" | "pcm-16" | null;
146
+ lossless: "aac" | "pcm-16" | null;
155
147
  };
156
148
  h265: {
157
- compressed: "pcm-16" | "aac" | null;
158
- lossless: "pcm-16" | "aac" | null;
149
+ compressed: "aac" | "pcm-16" | null;
150
+ lossless: "aac" | "pcm-16" | null;
159
151
  };
160
152
  vp8: {
161
153
  compressed: "pcm-16" | "opus" | null;
@@ -165,13 +157,21 @@ export declare const BrowserSafeApis: {
165
157
  compressed: "pcm-16" | "opus" | null;
166
158
  lossless: "pcm-16" | "opus" | null;
167
159
  };
160
+ mp3: {
161
+ compressed: "mp3" | "pcm-16" | null;
162
+ lossless: "mp3" | "pcm-16" | null;
163
+ };
164
+ aac: {
165
+ compressed: "aac" | "pcm-16" | null;
166
+ lossless: "aac" | "pcm-16" | null;
167
+ };
168
168
  wav: {
169
169
  compressed: "pcm-16" | null;
170
170
  lossless: "pcm-16" | null;
171
171
  };
172
172
  prores: {
173
- compressed: "pcm-16" | "aac" | null;
174
- lossless: "pcm-16" | "aac" | null;
173
+ compressed: "aac" | "pcm-16" | null;
174
+ lossless: "aac" | "pcm-16" | null;
175
175
  };
176
176
  "h264-mkv": {
177
177
  compressed: "pcm-16" | null;
@@ -182,10 +182,10 @@ export declare const BrowserSafeApis: {
182
182
  lossless: any;
183
183
  };
184
184
  };
185
- defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">;
186
- validateOutputFilename: <T_1 extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">({ codec, audioCodec, extension, preferLossless, }: {
185
+ defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">;
186
+ validateOutputFilename: <T_1 extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">({ codec, audioCodec, extension, preferLossless, }: {
187
187
  codec: T_1;
188
- audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null;
188
+ audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null;
189
189
  extension: string;
190
190
  preferLossless: boolean;
191
191
  }) => void;
@@ -199,6 +199,6 @@ export declare const BrowserSafeApis: {
199
199
  muteOption: import(".").RemotionOption;
200
200
  videoCodecOption: import(".").RemotionOption;
201
201
  };
202
- codecSupportsCrf: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
203
- codecSupportsVideoBitrate: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
202
+ codecSupportsCrf: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
203
+ codecSupportsVideoBitrate: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
204
204
  };
@@ -2,8 +2,8 @@
2
2
  // Combine multiple video chunks, useful for decentralized rendering
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.combineVideos = void 0;
5
- const fs_1 = require("fs");
6
- const path_1 = require("path");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
7
  const audio_codec_1 = require("./audio-codec");
8
8
  const call_ffmpeg_1 = require("./call-ffmpeg");
9
9
  const is_audio_codec_1 = require("./is-audio-codec");
@@ -13,8 +13,8 @@ const combineVideos = async (options) => {
13
13
  var _a;
14
14
  const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, audioCodec, } = options;
15
15
  const fileList = files.map((p) => `file '${p}'`).join('\n');
16
- const fileListTxt = (0, path_1.join)(filelistDir, 'files.txt');
17
- (0, fs_1.writeFileSync)(fileListTxt, fileList);
16
+ const fileListTxt = (0, node_path_1.join)(filelistDir, 'files.txt');
17
+ (0, node_fs_1.writeFileSync)(fileListTxt, fileList);
18
18
  const resolvedAudioCodec = audioCodec !== null && audioCodec !== void 0 ? audioCodec : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
19
19
  try {
20
20
  const task = (0, call_ffmpeg_1.callFf)('ffmpeg', [
@@ -56,10 +56,10 @@ const combineVideos = async (options) => {
56
56
  });
57
57
  await task;
58
58
  onProgress(numberOfFrames);
59
- (0, fs_1.rmSync)(filelistDir, { recursive: true });
59
+ (0, node_fs_1.rmSync)(filelistDir, { recursive: true });
60
60
  }
61
61
  catch (err) {
62
- (0, fs_1.rmSync)(filelistDir, { recursive: true });
62
+ (0, node_fs_1.rmSync)(filelistDir, { recursive: true });
63
63
  throw err;
64
64
  }
65
65
  };
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.callCompositor = exports.compose = exports.serializeCommand = void 0;
4
- const child_process_1 = require("child_process");
5
- const crypto_1 = require("crypto");
6
- const promises_1 = require("fs/promises");
4
+ const node_child_process_1 = require("node:child_process");
5
+ const node_crypto_1 = require("node:crypto");
6
+ const node_fs_1 = require("node:fs");
7
+ const promises_1 = require("node:fs/promises");
7
8
  const call_ffmpeg_1 = require("../call-ffmpeg");
8
9
  const get_executable_path_1 = require("./get-executable-path");
9
10
  const make_nonce_1 = require("./make-nonce");
10
11
  const getCompositorHash = ({ ...input }) => {
11
- return (0, crypto_1.createHash)('sha256').update(JSON.stringify(input)).digest('base64');
12
+ return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(input)).digest('base64');
12
13
  };
13
14
  const serializeCommand = (command, params) => {
14
15
  return {
@@ -39,9 +40,11 @@ const compose = async ({ height, width, layers, output, downloadMap, imageFormat
39
40
  exports.compose = compose;
40
41
  const callCompositor = (payload) => {
41
42
  return new Promise((resolve, reject) => {
42
- const child = (0, child_process_1.spawn)((0, get_executable_path_1.getExecutablePath)('compositor'), [payload], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
43
- child.stdin.write(payload);
44
- child.stdin.end();
43
+ const execPath = (0, get_executable_path_1.getExecutablePath)('compositor');
44
+ if (!process.env.READ_ONLY_FS) {
45
+ (0, node_fs_1.chmodSync)(execPath, 0o755);
46
+ }
47
+ const child = (0, node_child_process_1.spawn)(execPath, [payload], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
45
48
  const stderrChunks = [];
46
49
  child.stderr.on('data', (d) => stderrChunks.push(d));
47
50
  child.on('close', (code) => {
@@ -62,6 +65,8 @@ const callCompositor = (payload) => {
62
65
  }
63
66
  }
64
67
  });
68
+ child.stdin.write(payload);
69
+ child.stdin.end();
65
70
  });
66
71
  };
67
72
  exports.callCompositor = callCompositor;
@@ -7,6 +7,6 @@ declare type Compositor = {
7
7
  pid: number | null;
8
8
  };
9
9
  export declare const getIdealMaximumFrameCacheItems: () => number;
10
- export declare const startLongRunningCompositor: (maximumFrameCacheItems: number, verbose: boolean) => Compositor;
11
- export declare const startCompositor: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T]) => Compositor;
10
+ export declare const startLongRunningCompositor: (maximumFrameCacheItems: number, verbose: boolean, indent: boolean) => Compositor;
11
+ export declare const startCompositor: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T], indent: boolean) => Compositor;
12
12
  export {};
@@ -4,15 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.startCompositor = exports.startLongRunningCompositor = exports.getIdealMaximumFrameCacheItems = void 0;
7
- const child_process_1 = require("child_process");
8
- const os_1 = __importDefault(require("os"));
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_os_1 = __importDefault(require("node:os"));
9
10
  const call_ffmpeg_1 = require("../call-ffmpeg");
10
11
  const get_concurrency_1 = require("../get-concurrency");
12
+ const logger_1 = require("../logger");
11
13
  const compose_1 = require("./compose");
12
14
  const get_executable_path_1 = require("./get-executable-path");
13
15
  const make_nonce_1 = require("./make-nonce");
14
16
  const getIdealMaximumFrameCacheItems = () => {
15
- const freeMemory = os_1.default.freemem();
17
+ const freeMemory = node_os_1.default.freemem();
16
18
  // Assuming 1 frame is approximately 6MB
17
19
  // Assuming only half the available memory should be used
18
20
  const max = Math.floor(freeMemory / (1024 * 1024 * 6));
@@ -21,26 +23,29 @@ const getIdealMaximumFrameCacheItems = () => {
21
23
  return Math.max(100, Math.min(max, 1000));
22
24
  };
23
25
  exports.getIdealMaximumFrameCacheItems = getIdealMaximumFrameCacheItems;
24
- const startLongRunningCompositor = (maximumFrameCacheItems, verbose) => {
26
+ const startLongRunningCompositor = (maximumFrameCacheItems, verbose, indent) => {
25
27
  return (0, exports.startCompositor)('StartLongRunningProcess', {
26
28
  concurrency: (0, get_concurrency_1.getActualConcurrency)(null),
27
29
  maximum_frame_cache_items: maximumFrameCacheItems,
28
30
  verbose,
29
- });
31
+ }, indent);
30
32
  };
31
33
  exports.startLongRunningCompositor = startLongRunningCompositor;
32
- const startCompositor = (type, payload) => {
34
+ const startCompositor = (type, payload, indent) => {
33
35
  var _a;
34
36
  const bin = (0, get_executable_path_1.getExecutablePath)('compositor');
37
+ if (!process.env.READ_ONLY_FS) {
38
+ (0, node_fs_1.chmodSync)(bin, 0o755);
39
+ }
35
40
  const fullCommand = (0, compose_1.serializeCommand)(type, payload);
36
- const child = (0, child_process_1.spawn)(bin, [JSON.stringify(fullCommand)], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
41
+ const child = (0, node_child_process_1.spawn)(bin, [JSON.stringify(fullCommand)], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
37
42
  const stderrChunks = [];
38
43
  let outputBuffer = Buffer.from('');
39
44
  const separator = Buffer.from('remotion_buffer:');
40
45
  const waiters = new Map();
41
46
  const onMessage = (statusType, nonce, data) => {
42
47
  if (nonce === '0') {
43
- console.log(data.toString('utf8'));
48
+ logger_1.Log.verboseAdvanced({ indent, logLevel: (0, logger_1.getLogLevel)(), tag: 'COMPOSITOR' }, data.toString('utf8'));
44
49
  }
45
50
  if (waiters.has(nonce)) {
46
51
  if (statusType === 'error') {
@@ -8,17 +8,8 @@ function isMusl() {
8
8
  return !glibcVersionRuntime;
9
9
  }
10
10
  const getExecutablePath = (type) => {
11
- if (type === 'ffmpeg' && process.env.FFMPEG_BIN_PATH) {
12
- return '/opt/ffmpeg/remotion/bin/ffmpeg';
13
- }
14
- if (type === 'ffprobe' && process.env.FFPROBE_BIN_PATH) {
15
- return '/opt/ffmpeg/remotion/bin/ffprobe';
16
- }
17
- if (type === 'ffmpeg-cwd' && process.env.FFMPEG_CWD) {
18
- return '/opt/ffmpeg';
19
- }
20
11
  if (type === 'compositor' && process.env.COMPOSITOR_PATH) {
21
- return './compositor';
12
+ return process.env.COMPOSITOR_PATH;
22
13
  }
23
14
  const key = type === 'compositor'
24
15
  ? 'binaryPath'
@@ -4,9 +4,6 @@ export declare const createFfmpegComplexFilter: ({ filters, downloadMap, }: {
4
4
  filters: PreprocessedAudioTrack[];
5
5
  downloadMap: DownloadMap;
6
6
  }) => Promise<{
7
- complexFilterFlag: [
8
- string,
9
- string
10
- ] | null;
7
+ complexFilterFlag: [string, string] | null;
11
8
  cleanup: () => void;
12
9
  }>;
@@ -24,13 +24,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.deleteDirectory = void 0;
27
- const fs_1 = __importStar(require("fs"));
27
+ const node_fs_1 = __importStar(require("node:fs"));
28
28
  const is_serve_url_1 = require("./is-serve-url");
29
29
  const deleteDirectory = (directory) => {
30
30
  if ((0, is_serve_url_1.isServeUrl)(directory)) {
31
31
  return;
32
32
  }
33
- if (!(0, fs_1.existsSync)(directory)) {
33
+ if (!(0, node_fs_1.existsSync)(directory)) {
34
34
  return;
35
35
  }
36
36
  // Working around a bug with NodeJS 16 on Windows:
@@ -41,7 +41,7 @@ const deleteDirectory = (directory) => {
41
41
  let retries = 2;
42
42
  while (retries >= 0) {
43
43
  try {
44
- fs_1.default.rmSync(directory, {
44
+ node_fs_1.default.rmSync(directory, {
45
45
  maxRetries: 2,
46
46
  recursive: true,
47
47
  force: true,
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.warnAboutM2Bug = void 0;
4
- const os_1 = require("os");
4
+ const node_os_1 = require("node:os");
5
5
  const warnAboutM2Bug = (codec, pixelFormat) => {
6
- const isM2 = (0, os_1.cpus)().find((c) => c.model.includes('Apple M2'));
6
+ const isM2 = (0, node_os_1.cpus)().find((c) => c.model.includes('Apple M2'));
7
7
  if (codec === 'prores' && pixelFormat === 'yuv422p10le' && isM2) {
8
8
  console.warn();
9
9
  console.warn('⚠️ Known issue: Apple M2 CPUs currently suffer from a bug where transparent ProRes videos have flickering. https://github.com/remotion-dev/remotion/issues/1929');
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ensureOutputDirectory = 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 ensureOutputDirectory = (outputLocation) => {
10
- const dirName = path_1.default.dirname(outputLocation);
11
- if (!fs_1.default.existsSync(dirName)) {
12
- fs_1.default.mkdirSync(dirName, {
10
+ const dirName = node_path_1.default.dirname(outputLocation);
11
+ if (!node_fs_1.default.existsSync(dirName)) {
12
+ node_fs_1.default.mkdirSync(dirName, {
13
13
  recursive: true,
14
14
  });
15
15
  }
@@ -29,25 +29,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
29
29
  };
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
31
  exports.makeFfmpegFilterFileStr = exports.makeFfmpegFilterFile = void 0;
32
- const fs_1 = __importStar(require("fs"));
33
- const path_1 = __importDefault(require("path"));
32
+ const node_fs_1 = __importStar(require("node:fs"));
33
+ const node_path_1 = __importDefault(require("node:path"));
34
34
  const makeFfmpegFilterFile = (complexFilter, downloadMap) => {
35
35
  return (0, exports.makeFfmpegFilterFileStr)(complexFilter.filter, downloadMap);
36
36
  };
37
37
  exports.makeFfmpegFilterFile = makeFfmpegFilterFile;
38
38
  const makeFfmpegFilterFileStr = async (complexFilter, downloadMap) => {
39
39
  const random = Math.random().toString().replace('.', '');
40
- const filterFile = path_1.default.join(downloadMap.complexFilter, 'complex-filter-' + random + '.txt');
40
+ const filterFile = node_path_1.default.join(downloadMap.complexFilter, 'complex-filter-' + random + '.txt');
41
41
  // Race condition: Sometimes the download map is deleted before the file is written.
42
42
  // Can remove this once the original bug has been fixed
43
- if (!(0, fs_1.existsSync)(downloadMap.complexFilter)) {
44
- fs_1.default.mkdirSync(downloadMap.complexFilter, { recursive: true });
43
+ if (!(0, node_fs_1.existsSync)(downloadMap.complexFilter)) {
44
+ node_fs_1.default.mkdirSync(downloadMap.complexFilter, { recursive: true });
45
45
  }
46
- await fs_1.default.promises.writeFile(filterFile, complexFilter);
46
+ await node_fs_1.default.promises.writeFile(filterFile, complexFilter);
47
47
  return {
48
48
  file: filterFile,
49
49
  cleanup: () => {
50
- fs_1.default.unlinkSync(filterFile);
50
+ node_fs_1.default.unlinkSync(filterFile);
51
51
  },
52
52
  };
53
53
  };
@@ -4,19 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.findRemotionRoot = exports.findClosestPackageJson = 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 recursionLimit = 5;
10
10
  const findClosestPackageJson = () => {
11
11
  let currentDir = process.cwd();
12
12
  let possiblePackageJson = '';
13
13
  for (let i = 0; i < recursionLimit; i++) {
14
- possiblePackageJson = path_1.default.join(currentDir, 'package.json');
15
- const exists = fs_1.default.existsSync(possiblePackageJson);
14
+ possiblePackageJson = node_path_1.default.join(currentDir, 'package.json');
15
+ const exists = node_fs_1.default.existsSync(possiblePackageJson);
16
16
  if (exists) {
17
17
  return possiblePackageJson;
18
18
  }
19
- currentDir = path_1.default.dirname(currentDir);
19
+ currentDir = node_path_1.default.dirname(currentDir);
20
20
  }
21
21
  return null;
22
22
  };
@@ -26,6 +26,6 @@ const findRemotionRoot = () => {
26
26
  if (closestPackageJson === null) {
27
27
  return process.cwd();
28
28
  }
29
- return path_1.default.dirname(closestPackageJson);
29
+ return node_path_1.default.dirname(closestPackageJson);
30
30
  };
31
31
  exports.findRemotionRoot = findRemotionRoot;
@@ -17,6 +17,10 @@ declare type GetCompositionsConfig = {
17
17
  * @deprecated Only for Remotion internal usage
18
18
  */
19
19
  downloadMap?: DownloadMap;
20
+ /**
21
+ * @deprecated Only for Remotion internal usage
22
+ */
23
+ indent?: boolean;
20
24
  verbose?: boolean;
21
25
  };
22
26
  /**
@@ -68,7 +68,7 @@ const getCompositions = async (serveUrlOrWebpackUrl, config) => {
68
68
  chromiumOptions: (_c = config === null || config === void 0 ? void 0 : config.chromiumOptions) !== null && _c !== void 0 ? _c : {},
69
69
  });
70
70
  return new Promise((resolve, reject) => {
71
- var _a, _b;
71
+ var _a, _b, _c;
72
72
  const onError = (err) => reject(err);
73
73
  const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
74
74
  page,
@@ -85,6 +85,7 @@ const getCompositions = async (serveUrlOrWebpackUrl, config) => {
85
85
  remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
86
86
  concurrency: 1,
87
87
  verbose: (_b = config === null || config === void 0 ? void 0 : config.verbose) !== null && _b !== void 0 ? _b : false,
88
+ indent: (_c = config === null || config === void 0 ? void 0 : config.indent) !== null && _c !== void 0 ? _c : false,
88
89
  })
89
90
  .then(({ serveUrl, closeServer, offthreadPort }) => {
90
91
  close = closeServer;
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getActualConcurrency = void 0;
7
- const os_1 = __importDefault(require("os"));
7
+ const node_os_1 = __importDefault(require("node:os"));
8
8
  const getActualConcurrency = (userPreference) => {
9
9
  if (userPreference === null) {
10
- return Math.round(Math.min(8, Math.max(1, os_1.default.cpus().length / 2)));
10
+ return Math.round(Math.min(8, Math.max(1, node_os_1.default.cpus().length / 2)));
11
11
  }
12
- const max = os_1.default.cpus().length;
12
+ const max = node_os_1.default.cpus().length;
13
13
  const min = 1;
14
14
  let rounded;
15
15
  if (typeof userPreference === 'string') {
@@ -1,6 +1,6 @@
1
1
  import type { AudioCodec } from './audio-codec';
2
2
  import type { Codec } from './codec';
3
3
  import type { FileExtension } from './file-extensions';
4
- export declare const getFileExtensionFromCodec: <T extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: AudioCodec | null) => FileExtension;
5
- export declare const makeFileExtensionMap: () => Record<string, ("aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif")[]>;
4
+ export declare const getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: AudioCodec | null) => FileExtension;
5
+ export declare const makeFileExtensionMap: () => Record<string, ("h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif")[]>;
6
6
  export declare const defaultCodecsForFileExtension: Record<FileExtension, Codec>;
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getExtensionOfFilename = void 0;
7
- const path_1 = __importDefault(require("path"));
7
+ const node_path_1 = __importDefault(require("node:path"));
8
8
  const getExtensionOfFilename = (filename) => {
9
9
  if (filename === null) {
10
10
  return null;
11
11
  }
12
- const filenameArr = path_1.default.normalize(filename).split('.');
12
+ const filenameArr = node_path_1.default.normalize(filename).split('.');
13
13
  const hasExtension = filenameArr.length >= 2;
14
14
  const filenameArrLength = filenameArr.length;
15
15
  const extension = hasExtension ? filenameArr[filenameArrLength - 1] : null;