@remotion/renderer 3.2.21 → 3.2.23

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.
@@ -60,10 +60,10 @@ const http = __importStar(require("http"));
60
60
  const https = __importStar(require("https"));
61
61
  const os = __importStar(require("os"));
62
62
  const path = __importStar(require("path"));
63
- const util = __importStar(require("util"));
63
+ const util_1 = __importDefault(require("util"));
64
64
  const extract_zip_1 = __importDefault(require("extract-zip"));
65
65
  const URL = __importStar(require("url"));
66
- const util_1 = require("util");
66
+ const util_2 = require("util");
67
67
  const assert_1 = require("./assert");
68
68
  const delete_directory_1 = require("../delete-directory");
69
69
  const get_download_destination_1 = require("./get-download-destination");
@@ -106,7 +106,7 @@ function archiveName(product, platform, revision) {
106
106
  case 'win64':
107
107
  // Windows archive name changed at r591479.
108
108
  return parseInt(revision, 10) > 591479
109
- ? 'chrome-win'
109
+ ? 'Thorium_107.0.5271.0\\BIN'
110
110
  : 'chrome-win32';
111
111
  default:
112
112
  throw new Error('unknown browser');
@@ -118,8 +118,10 @@ function archiveName(product, platform, revision) {
118
118
  }
119
119
  }
120
120
  function _downloadURL(product, platform, host, revision) {
121
- const url = util.format(downloadURLs[product][platform], host, revision, archiveName(product, platform, revision));
122
- return url;
121
+ if (platform === 'win64' || platform === 'win32') {
122
+ return 'https://remotionchromium-binaries.s3.eu-central-1.amazonaws.com/thorium-107.zip';
123
+ }
124
+ return util_1.default.format(downloadURLs[product][platform], host, revision, archiveName(product, platform, revision));
123
125
  }
124
126
  function handleArm64() {
125
127
  let exists = fs.existsSync('/usr/bin/chromium-browser');
@@ -136,10 +138,10 @@ function handleArm64() {
136
138
  '\n\n sudo apt install chromium-browser\n');
137
139
  throw new Error();
138
140
  }
139
- const readdirAsync = (0, util_1.promisify)(fs.readdir.bind(fs));
140
- const mkdirAsync = (0, util_1.promisify)(fs.mkdir.bind(fs));
141
- const unlinkAsync = (0, util_1.promisify)(fs.unlink.bind(fs));
142
- const chmodAsync = (0, util_1.promisify)(fs.chmod.bind(fs));
141
+ const readdirAsync = (0, util_2.promisify)(fs.readdir.bind(fs));
142
+ const mkdirAsync = (0, util_2.promisify)(fs.mkdir.bind(fs));
143
+ const unlinkAsync = (0, util_2.promisify)(fs.unlink.bind(fs));
144
+ const chmodAsync = (0, util_2.promisify)(fs.chmod.bind(fs));
143
145
  function existsAsync(filePath) {
144
146
  return new Promise((resolve) => {
145
147
  fs.access(filePath, (err) => {
@@ -325,7 +327,7 @@ class BrowserFetcher {
325
327
  executablePath = path.join(folderPath, archiveName(__classPrivateFieldGet(this, _BrowserFetcher_product, "f"), __classPrivateFieldGet(this, _BrowserFetcher_platform, "f"), revision), 'chrome');
326
328
  }
327
329
  else if (__classPrivateFieldGet(this, _BrowserFetcher_platform, "f") === 'win32' || __classPrivateFieldGet(this, _BrowserFetcher_platform, "f") === 'win64') {
328
- executablePath = path.join(folderPath, archiveName(__classPrivateFieldGet(this, _BrowserFetcher_product, "f"), __classPrivateFieldGet(this, _BrowserFetcher_platform, "f"), revision), 'chrome.exe');
330
+ executablePath = path.join(folderPath, archiveName(__classPrivateFieldGet(this, _BrowserFetcher_product, "f"), __classPrivateFieldGet(this, _BrowserFetcher_platform, "f"), revision), 'thorium.exe');
329
331
  }
330
332
  else {
331
333
  throw new Error('Unsupported platform: ' + __classPrivateFieldGet(this, _BrowserFetcher_platform, "f"));
@@ -0,0 +1,4 @@
1
+ export declare type FfmpegOverrideFn = (info: {
2
+ type: 'pre-stitcher' | 'stitcher';
3
+ args: string[];
4
+ }) => string[];
File without changes
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import execa from 'execa';
2
3
  import { SymbolicateableError } from './error-handling/symbolicateable-error';
3
4
  import { mimeContentType, mimeLookup } from './mime-types';
@@ -13,6 +14,7 @@ export { Crf } from './crf';
13
14
  export { ErrorWithStackFrame } from './error-handling/handle-javascript-exception';
14
15
  export { FfmpegExecutable } from './ffmpeg-executable';
15
16
  export { FfmpegVersion } from './ffmpeg-flags';
17
+ export type { FfmpegOverrideFn } from './ffmpeg-override';
16
18
  export { FrameRange } from './frame-range';
17
19
  export { getCompositions } from './get-compositions';
18
20
  export { ImageFormat, StillImageFormat, validateSelectedPixelFormatAndImageFormatCombination, validImageFormats, } from './image-format';
@@ -67,7 +69,7 @@ export declare const RenderInternals: {
67
69
  task: Promise<Buffer | null>;
68
70
  getLogs: () => string;
69
71
  }>;
70
- getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif", type: "chunk" | "final") => "mp3" | "aac" | "wav" | "gif" | "mp4" | "mkv" | "mov" | "webm";
72
+ getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif", type: "chunk" | "final") => "mp3" | "aac" | "wav" | "gif" | "webm" | "mp4" | "mov" | "mkv";
71
73
  tmpDir: (str: string) => string;
72
74
  deleteDirectory: (directory: string) => Promise<void>;
73
75
  isServeUrl: (potentialUrl: string) => boolean;
@@ -122,8 +124,8 @@ export declare const RenderInternals: {
122
124
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
123
125
  DEFAULT_BROWSER: import("./browser").Browser;
124
126
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
125
- DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
126
- validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
127
+ DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | null;
128
+ validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | null) => "angle" | "swangle" | "egl" | "swiftshader" | null;
127
129
  getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
128
130
  validateSelectedCrfAndCodecCombination: (crf: unknown, codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => void;
129
131
  validImageFormats: readonly ["png", "jpeg", "none"];
@@ -135,12 +137,12 @@ export declare const RenderInternals: {
135
137
  DEFAULT_TIMEOUT: number;
136
138
  getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
137
139
  validateSelectedPixelFormatAndCodecCombination: (pixelFormat: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le", codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => void;
138
- validateSelectedCodecAndProResCombination: (actualCodec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif", actualProResProfile: "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined) => void;
139
- validateSelectedPixelFormatAndImageFormatCombination: (pixelFormat: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le", imageFormat: "png" | "jpeg" | "none") => "none" | "valid";
140
+ validateSelectedCodecAndProResCombination: (actualCodec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif", actualProResProfile: "proxy" | "4444-xq" | "4444" | "hq" | "standard" | "light" | undefined) => void;
141
+ validateSelectedPixelFormatAndImageFormatCombination: (pixelFormat: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le", imageFormat: "jpeg" | "png" | "none") => "none" | "valid";
140
142
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
141
143
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
142
144
  logLevels: readonly ["verbose", "info", "warn", "error"];
143
- isEqualOrBelowLogLevel: (currentLevel: "error" | "info" | "verbose" | "warn", level: "error" | "info" | "verbose" | "warn") => boolean;
145
+ isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
144
146
  isValidLogLevel: (level: string) => boolean;
145
147
  validateEveryNthFrame: (everyNthFrame: unknown) => void;
146
148
  perf: typeof perf;
@@ -1,6 +1,7 @@
1
1
  import execa from 'execa';
2
2
  import type { Codec } from './codec';
3
3
  import type { FfmpegExecutable } from './ffmpeg-executable';
4
+ import type { FfmpegOverrideFn } from './ffmpeg-override';
4
5
  import type { ImageFormat } from './image-format';
5
6
  import type { CancelSignal } from './make-cancel-signal';
6
7
  import type { PixelFormat } from './pixel-format';
@@ -18,6 +19,7 @@ declare type PreSticherOptions = {
18
19
  verbose: boolean;
19
20
  ffmpegExecutable: FfmpegExecutable | undefined;
20
21
  imageFormat: ImageFormat;
22
+ ffmpegOverride?: FfmpegOverrideFn;
21
23
  signal: CancelSignal;
22
24
  };
23
25
  export declare const prespawnFfmpeg: (options: PreSticherOptions) => Promise<{
@@ -75,7 +75,10 @@ const prespawnFfmpeg = async (options) => {
75
75
  console.log(ffmpegArgs);
76
76
  }
77
77
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
78
- const task = (0, execa_1.default)((_f = options.ffmpegExecutable) !== null && _f !== void 0 ? _f : 'ffmpeg', ffmpegString);
78
+ const finalFfmpegString = options.ffmpegOverride
79
+ ? options.ffmpegOverride({ type: 'pre-stitcher', args: ffmpegString })
80
+ : ffmpegString;
81
+ const task = (0, execa_1.default)((_f = options.ffmpegExecutable) !== null && _f !== void 0 ? _f : 'ffmpeg', finalFfmpegString);
79
82
  options.signal(() => {
80
83
  task.kill();
81
84
  });
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { SmallTCompMetadata } from 'remotion';
2
3
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
4
  import type { DownloadMap } from './assets/download-map';
@@ -6,6 +7,7 @@ import type { BrowserLog } from './browser-log';
6
7
  import type { Browser as PuppeteerBrowser } from './browser/Browser';
7
8
  import type { Codec } from './codec';
8
9
  import type { FfmpegExecutable } from './ffmpeg-executable';
10
+ import type { FfmpegOverrideFn } from './ffmpeg-override';
9
11
  import type { FrameRange } from './frame-range';
10
12
  import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
11
13
  import type { CancelSignal } from './make-cancel-signal';
@@ -58,6 +60,7 @@ export declare type RenderMediaOptions = {
58
60
  downloadMap?: DownloadMap;
59
61
  muted?: boolean;
60
62
  enforceAudioTrack?: boolean;
63
+ ffmpegOverride?: FfmpegOverrideFn;
61
64
  } & ServeUrlOrWebpackBundle & ConcurrencyOrParallelism;
62
65
  declare type ConcurrencyOrParallelism = {
63
66
  concurrency?: number | null;
@@ -72,5 +75,5 @@ declare type ConcurrencyOrParallelism = {
72
75
  * @description Render a video from a composition
73
76
  * @link https://www.remotion.dev/docs/renderer/render-media
74
77
  */
75
- export declare const renderMedia: ({ proResProfile, crf, composition, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
78
+ export declare const renderMedia: ({ proResProfile, crf, composition, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
76
79
  export {};
@@ -30,6 +30,7 @@ const quality_1 = require("./quality");
30
30
  const render_frames_1 = require("./render-frames");
31
31
  const stitch_frames_to_video_1 = require("./stitch-frames-to-video");
32
32
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
33
+ const validate_ffmpeg_override_1 = require("./validate-ffmpeg-override");
33
34
  const validate_output_filename_1 = require("./validate-output-filename");
34
35
  const validate_scale_1 = require("./validate-scale");
35
36
  const getConcurrency = (others) => {
@@ -46,7 +47,7 @@ const getConcurrency = (others) => {
46
47
  * @description Render a video from a composition
47
48
  * @link https://www.remotion.dev/docs/renderer/render-media
48
49
  */
49
- const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ...options }) => {
50
+ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, ...options }) => {
50
51
  var _a, _b, _c, _d;
51
52
  (0, quality_1.validateQuality)(options.quality);
52
53
  if (typeof crf !== 'undefined' && crf !== null) {
@@ -60,6 +61,7 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
60
61
  : null;
61
62
  (0, validate_scale_1.validateScale)(scale);
62
63
  const concurrency = getConcurrency(options);
64
+ (0, validate_ffmpeg_override_1.validateFfmpegOverride)(ffmpegOverride);
63
65
  const everyNthFrame = (_a = options.everyNthFrame) !== null && _a !== void 0 ? _a : 1;
64
66
  const numberOfGifLoops = (_b = options.numberOfGifLoops) !== null && _b !== void 0 ? _b : null;
65
67
  const serveUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
@@ -146,6 +148,7 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
146
148
  ffmpegExecutable,
147
149
  imageFormat,
148
150
  signal: cancelPrestitcher.cancelSignal,
151
+ ffmpegOverride,
149
152
  });
150
153
  stitcherFfmpeg = preStitcher.task;
151
154
  }
@@ -257,6 +260,7 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
257
260
  cancelSignal: cancelStitcher.cancelSignal,
258
261
  muted: disableAudio,
259
262
  enforceAudioTrack,
263
+ ffmpegOverride,
260
264
  }),
261
265
  stitchStart,
262
266
  ]);
@@ -3,6 +3,7 @@ import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-
3
3
  import type { RenderAssetInfo } from './assets/download-map';
4
4
  import type { Codec } from './codec';
5
5
  import type { FfmpegExecutable } from './ffmpeg-executable';
6
+ import type { FfmpegOverrideFn } from './ffmpeg-override';
6
7
  import type { ImageFormat } from './image-format';
7
8
  import type { CancelSignal } from './make-cancel-signal';
8
9
  import type { PixelFormat } from './pixel-format';
@@ -32,6 +33,7 @@ export declare type StitcherOptions = {
32
33
  };
33
34
  muted?: boolean;
34
35
  enforceAudioTrack?: boolean;
36
+ ffmpegOverride?: FfmpegOverrideFn;
35
37
  };
36
38
  declare type ReturnType = {
37
39
  task: Promise<Buffer | null>;
@@ -116,6 +116,9 @@ const spawnFfmpeg = async (options) => {
116
116
  if (supportsCrf) {
117
117
  console.log('[verbose] crf', crf);
118
118
  }
119
+ if (options.ffmpegOverride) {
120
+ console.log('[verbose] ffmpegOverride', options.ffmpegOverride);
121
+ }
119
122
  console.log('[verbose] codec', codec);
120
123
  console.log('[verbose] shouldRenderAudio', shouldRenderAudio);
121
124
  console.log('[verbose] shouldRenderVideo', shouldRenderVideo);
@@ -233,7 +236,14 @@ const spawnFfmpeg = async (options) => {
233
236
  console.log(ffmpegArgs);
234
237
  }
235
238
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
236
- const task = (0, execa_1.default)((_t = options.ffmpegExecutable) !== null && _t !== void 0 ? _t : 'ffmpeg', ffmpegString, {
239
+ const finalFfmpegString = options.ffmpegOverride
240
+ ? options.ffmpegOverride({ type: 'stitcher', args: ffmpegString })
241
+ : ffmpegString;
242
+ if (options.verbose && options.ffmpegOverride) {
243
+ console.log('Generated final FFMPEG command:');
244
+ console.log(finalFfmpegString);
245
+ }
246
+ const task = (0, execa_1.default)((_t = options.ffmpegExecutable) !== null && _t !== void 0 ? _t : 'ffmpeg', finalFfmpegString, {
237
247
  cwd: options.dir,
238
248
  });
239
249
  (_u = options.cancelSignal) === null || _u === void 0 ? void 0 : _u.call(options, () => {
@@ -0,0 +1,2 @@
1
+ import type { FfmpegOverrideFn } from './ffmpeg-override';
2
+ export declare const validateFfmpegOverride: (ffmpegArgsHook?: FfmpegOverrideFn) => void;
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateFfmpegArgsHook = void 0;
4
- const validateFfmpegArgsHook = (ffmpegArgsHook) => {
3
+ exports.validateFfmpegOverride = void 0;
4
+ const validateFfmpegOverride = (ffmpegArgsHook) => {
5
+ if (typeof ffmpegArgsHook === 'undefined') {
6
+ return;
7
+ }
5
8
  if (ffmpegArgsHook && typeof ffmpegArgsHook !== 'function') {
6
9
  throw new TypeError(`Argument passed for "ffmpegArgsHook" is not a function: ${ffmpegArgsHook}`);
7
10
  }
8
11
  };
9
- exports.validateFfmpegArgsHook = validateFfmpegArgsHook;
12
+ exports.validateFfmpegOverride = validateFfmpegOverride;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "3.2.21",
3
+ "version": "3.2.23",
4
4
  "description": "Renderer for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,7 +22,7 @@
22
22
  "dependencies": {
23
23
  "execa": "5.1.1",
24
24
  "extract-zip": "2.0.1",
25
- "remotion": "3.2.21",
25
+ "remotion": "3.2.23",
26
26
  "source-map": "^0.8.0-beta.0",
27
27
  "ws": "8.7.0"
28
28
  },
@@ -57,5 +57,5 @@
57
57
  "publishConfig": {
58
58
  "access": "public"
59
59
  },
60
- "gitHead": "7236c416c1efcc6079ad262d6d5afa10e6775b81"
60
+ "gitHead": "34a407a825ded88c9058bcf0e9ec4fe04024b7ce"
61
61
  }
@@ -1 +0,0 @@
1
- export declare type FfmpegArgsHook = (args: string[]) => string[];
@@ -1 +0,0 @@
1
- export declare const makeAssetsDownloadTmpDir: () => string;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeAssetsDownloadTmpDir = void 0;
4
- const tmp_dir_1 = require("./tmp-dir");
5
- let dir = null;
6
- const makeAssetsDownloadTmpDir = () => {
7
- if (dir) {
8
- return dir;
9
- }
10
- dir = (0, tmp_dir_1.tmpDir)('remotion-assets-dir');
11
- return dir;
12
- };
13
- exports.makeAssetsDownloadTmpDir = makeAssetsDownloadTmpDir;
@@ -1,2 +0,0 @@
1
- import type { FfmpegArgsHook } from './ffmpeg-args-hook';
2
- export declare const validateFfmpegArgsHook: (ffmpegArgsHook?: FfmpegArgsHook) => void;