@remotion/renderer 4.0.3 → 4.0.5

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.
@@ -1,14 +1,12 @@
1
1
  import type { TAsset } from 'remotion';
2
- import { OffthreadVideoServerEmitter } from '../offthread-video-server';
3
2
  import type { DownloadMap } from './download-map';
4
3
  export type RenderMediaOnDownload = (src: string) => ((progress: {
5
4
  percent: number | null;
6
5
  downloaded: number;
7
6
  totalSize: number | null;
8
7
  }) => void) | undefined | void;
9
- export declare const downloadAsset: ({ src, downloadMap, emitter, }: {
8
+ export declare const downloadAsset: ({ src, downloadMap, }: {
10
9
  src: string;
11
- emitter: OffthreadVideoServerEmitter;
12
10
  downloadMap: DownloadMap;
13
11
  }) => Promise<string>;
14
12
  export declare const markAllAssetsAsDownloaded: (downloadMap: DownloadMap) => void;
@@ -23,4 +21,4 @@ export declare const downloadAndMapAssetsToFileUrl: ({ asset, onDownload, downlo
23
21
  onDownload: RenderMediaOnDownload | null;
24
22
  downloadMap: DownloadMap;
25
23
  }) => Promise<TAsset>;
26
- export declare const attachDownloadListenerToEmitter: (emitter: OffthreadVideoServerEmitter, onDownload: RenderMediaOnDownload | null) => () => void;
24
+ export declare const attachDownloadListenerToEmitter: (downloadMap: DownloadMap, onDownload: RenderMediaOnDownload | null) => () => void;
@@ -33,7 +33,6 @@ const remotion_1 = require("remotion");
33
33
  const compress_assets_1 = require("../compress-assets");
34
34
  const ensure_output_directory_1 = require("../ensure-output-directory");
35
35
  const mime_types_1 = require("../mime-types");
36
- const offthread_video_server_1 = require("../offthread-video-server");
37
36
  const download_file_1 = require("./download-file");
38
37
  const sanitize_filepath_1 = require("./sanitize-filepath");
39
38
  const waitForAssetToBeDownloaded = ({ src, downloadDir, downloadMap, }) => {
@@ -116,7 +115,7 @@ function validateBufferEncoding(potentialEncoding, dataUrl) {
116
115
  throw new TypeError(errMessage);
117
116
  }
118
117
  }
119
- const downloadAsset = async ({ src, downloadMap, emitter, }) => {
118
+ const downloadAsset = async ({ src, downloadMap, }) => {
120
119
  var _a, _b, _c;
121
120
  if ((0, compress_assets_1.isAssetCompressed)(src)) {
122
121
  return src;
@@ -146,7 +145,7 @@ const downloadAsset = async ({ src, downloadMap, emitter, }) => {
146
145
  if (process.env.NODE_ENV === 'test') {
147
146
  console.log('Actually downloading asset', src);
148
147
  }
149
- emitter.dispatchDownload(src);
148
+ downloadMap.emitter.dispatchDownload(src);
150
149
  if (src.startsWith('data:')) {
151
150
  const [assetDetails, assetData] = src.substring('data:'.length).split(',');
152
151
  if (!assetDetails.includes(';')) {
@@ -176,7 +175,7 @@ const downloadAsset = async ({ src, downloadMap, emitter, }) => {
176
175
  const { to } = await (0, download_file_1.downloadFile)({
177
176
  url: src,
178
177
  onProgress: (progress) => {
179
- emitter.dispatchDownloadProgress(src, progress.percent, progress.downloaded, progress.totalSize);
178
+ downloadMap.emitter.dispatchDownloadProgress(src, progress.percent, progress.downloaded, progress.totalSize);
180
179
  },
181
180
  to: (contentDisposition, contentType) => (0, exports.getSanitizedFilenameForAssetUrl)({
182
181
  contentDisposition,
@@ -243,11 +242,9 @@ const getSanitizedFilenameForAssetUrl = ({ src, downloadDir, contentDisposition,
243
242
  };
244
243
  exports.getSanitizedFilenameForAssetUrl = getSanitizedFilenameForAssetUrl;
245
244
  const downloadAndMapAssetsToFileUrl = async ({ asset, onDownload, downloadMap, }) => {
246
- const emitter = new offthread_video_server_1.OffthreadVideoServerEmitter();
247
- const cleanup = (0, exports.attachDownloadListenerToEmitter)(emitter, onDownload);
245
+ const cleanup = (0, exports.attachDownloadListenerToEmitter)(downloadMap, onDownload);
248
246
  const newSrc = await (0, exports.downloadAsset)({
249
247
  src: asset.src,
250
- emitter,
251
248
  downloadMap,
252
249
  });
253
250
  cleanup();
@@ -257,14 +254,21 @@ const downloadAndMapAssetsToFileUrl = async ({ asset, onDownload, downloadMap, }
257
254
  };
258
255
  };
259
256
  exports.downloadAndMapAssetsToFileUrl = downloadAndMapAssetsToFileUrl;
260
- const attachDownloadListenerToEmitter = (emitter, onDownload) => {
257
+ const attachDownloadListenerToEmitter = (downloadMap, onDownload) => {
261
258
  const cleanup = [];
262
259
  if (!onDownload) {
263
260
  return () => undefined;
264
261
  }
265
- const a = emitter.addEventListener('download', ({ detail: { src: initialSrc } }) => {
262
+ if (downloadMap.downloadListeners.includes(onDownload)) {
263
+ return () => undefined;
264
+ }
265
+ downloadMap.downloadListeners.push(onDownload);
266
+ cleanup.push(() => {
267
+ downloadMap.downloadListeners = downloadMap.downloadListeners.filter((l) => l !== onDownload);
268
+ });
269
+ const a = downloadMap.emitter.addEventListener('download', ({ detail: { src: initialSrc } }) => {
266
270
  const progress = onDownload(initialSrc);
267
- const b = emitter.addEventListener('progress', ({ detail: { downloaded, percent, src: progressSrc, totalSize } }) => {
271
+ const b = downloadMap.emitter.addEventListener('progress', ({ detail: { downloaded, percent, src: progressSrc, totalSize } }) => {
268
272
  if (initialSrc === progressSrc) {
269
273
  progress === null || progress === void 0 ? void 0 : progress({ downloaded, percent, totalSize });
270
274
  }
@@ -1,10 +1,14 @@
1
1
  import type { TAsset } from 'remotion';
2
+ import { OffthreadVideoServerEmitter } from '../offthread-video-server';
3
+ import type { RenderMediaOnDownload } from './download-and-map-assets-to-file';
2
4
  export type AudioChannelsAndDurationResultCache = {
3
5
  channels: number;
4
6
  duration: number | null;
5
7
  };
6
8
  export type DownloadMap = {
7
9
  id: string;
10
+ emitter: OffthreadVideoServerEmitter;
11
+ downloadListeners: RenderMediaOnDownload[];
8
12
  isDownloadingMap: {
9
13
  [src: string]: {
10
14
  [downloadDir: string]: boolean;
@@ -31,6 +31,7 @@ const node_fs_1 = __importStar(require("node:fs"));
31
31
  const node_path_1 = __importDefault(require("node:path"));
32
32
  const delete_directory_1 = require("../delete-directory");
33
33
  const tmp_dir_1 = require("../tmp-dir");
34
+ const offthread_video_server_1 = require("../offthread-video-server");
34
35
  const makeAndReturn = (dir, name) => {
35
36
  const p = node_path_1.default.join(dir, name);
36
37
  (0, node_fs_1.mkdirSync)(p);
@@ -51,6 +52,7 @@ const makeDownloadMap = () => {
51
52
  durationOfAssetCache: {},
52
53
  id: String(Math.random()),
53
54
  assetDir: dir,
55
+ downloadListeners: [],
54
56
  downloadDir: makeAndReturn(dir, 'remotion-assets-dir'),
55
57
  complexFilter: makeAndReturn(dir, 'remotion-complex-filter'),
56
58
  preEncode: makeAndReturn(dir, 'pre-encode'),
@@ -59,6 +61,7 @@ const makeDownloadMap = () => {
59
61
  stitchFrames: makeAndReturn(dir, 'remotion-stitch-temp-dir'),
60
62
  compositingDir: makeAndReturn(dir, 'remotion-compositing-temp-dir'),
61
63
  compositorCache: {},
64
+ emitter: new offthread_video_server_1.OffthreadVideoServerEmitter(),
62
65
  };
63
66
  };
64
67
  exports.makeDownloadMap = makeDownloadMap;
@@ -5,7 +5,7 @@ export declare const supportedAudioCodecs: {
5
5
  readonly h264: readonly ["aac", "pcm-16"];
6
6
  readonly 'h264-mkv': readonly ["pcm-16"];
7
7
  readonly aac: readonly ["aac", "pcm-16"];
8
- readonly gif: const[];
8
+ readonly gif: readonly [];
9
9
  readonly h265: readonly ["aac", "pcm-16"];
10
10
  readonly mp3: readonly ["mp3", "pcm-16"];
11
11
  readonly prores: readonly ["aac", "pcm-16"];
package/dist/client.d.ts CHANGED
@@ -12,7 +12,7 @@ export declare const BrowserSafeApis: {
12
12
  readonly h264: readonly ["aac", "pcm-16"];
13
13
  readonly 'h264-mkv': readonly ["pcm-16"];
14
14
  readonly aac: readonly ["aac", "pcm-16"];
15
- readonly gif: const[];
15
+ readonly gif: readonly [];
16
16
  readonly h265: readonly ["aac", "pcm-16"];
17
17
  readonly mp3: readonly ["mp3", "pcm-16"];
18
18
  readonly prores: readonly ["aac", "pcm-16"];
@@ -132,12 +132,7 @@ export declare const BrowserSafeApis: {
132
132
  };
133
133
  gif: {
134
134
  default: import("./file-extensions").FileExtension;
135
- forAudioCodec: {
136
- [x: string]: {
137
- possible: import("./file-extensions").FileExtension[];
138
- default: import("./file-extensions").FileExtension;
139
- };
140
- };
135
+ forAudioCodec: {};
141
136
  };
142
137
  };
143
138
  defaultAudioCodecs: {
@@ -178,8 +173,8 @@ export declare const BrowserSafeApis: {
178
173
  lossless: "pcm-16" | null;
179
174
  };
180
175
  gif: {
181
- compressed: any;
182
- lossless: any;
176
+ compressed: null;
177
+ lossless: null;
183
178
  };
184
179
  };
185
180
  defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">;
@@ -12,7 +12,7 @@ const seek_to_frame_1 = require("./seek-to-frame");
12
12
  const set_props_and_env_1 = require("./set-props-and-env");
13
13
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
14
14
  const logger_1 = require("./logger");
15
- const innerGetCompositions = async ({ envVariables, serializedInputPropsWithCustomSchema, onBrowserLog, page, proxyPort, serveUrl, timeoutInMilliseconds, }) => {
15
+ const innerGetCompositions = async ({ envVariables, serializedInputPropsWithCustomSchema, onBrowserLog, page, proxyPort, serveUrl, timeoutInMilliseconds, indent, logLevel, }) => {
16
16
  if (onBrowserLog) {
17
17
  page.on('console', (log) => {
18
18
  onBrowserLog({
@@ -34,6 +34,8 @@ const innerGetCompositions = async ({ envVariables, serializedInputPropsWithCust
34
34
  retriesRemaining: 2,
35
35
  audioEnabled: false,
36
36
  videoEnabled: false,
37
+ indent,
38
+ logLevel,
37
39
  });
38
40
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
39
41
  page,
@@ -96,6 +98,8 @@ const internalGetCompositions = async ({ browserExecutable, chromiumOptions, env
96
98
  proxyPort: offthreadPort,
97
99
  serveUrl,
98
100
  timeoutInMilliseconds,
101
+ indent,
102
+ logLevel,
99
103
  });
100
104
  })
101
105
  .then((comp) => {
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getLocalBrowserExecutable = exports.ensureLocalBrowser = void 0;
7
7
  const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
8
9
  const BrowserFetcher_1 = require("./browser/BrowserFetcher");
9
10
  const create_browser_fetcher_1 = require("./browser/create-browser-fetcher");
10
11
  const revisions_1 = require("./browser/revisions");
@@ -28,6 +29,20 @@ const getSearchPathsForProduct = (product) => {
28
29
  process.platform === 'win32'
29
30
  ? 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
30
31
  : null,
32
+ process.platform === 'win32'
33
+ ? node_os_1.default.homedir() +
34
+ '\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe'
35
+ : null,
36
+ process.platform === 'win32'
37
+ ? 'C:\\Program Files\\Google\\Chrome SxS\\Application\\chrome.exe'
38
+ : null,
39
+ process.platform === 'win32'
40
+ ? 'C:\\Program Files (x86)\\Google\\Chrome SxS\\Application\\chrome.exe'
41
+ : null,
42
+ process.platform === 'win32'
43
+ ? node_os_1.default.homedir() +
44
+ '\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe'
45
+ : null,
31
46
  ].filter(Boolean);
32
47
  }
33
48
  if (product === 'firefox') {
package/dist/index.d.ts CHANGED
@@ -43,13 +43,12 @@ export declare const RenderInternals: {
43
43
  downloadMap: import("./assets/download-map").DownloadMap;
44
44
  remotionRoot: string;
45
45
  concurrency: number;
46
- logLevel: "error" | "verbose" | "info" | "warn";
46
+ logLevel: "verbose" | "info" | "warn" | "error";
47
47
  indent: boolean;
48
48
  }) => Promise<{
49
49
  port: number;
50
50
  close: () => Promise<void>;
51
51
  compositor: import("./compositor/compositor").Compositor;
52
- events: import("./offthread-video-server").OffthreadVideoServerEmitter;
53
52
  }>;
54
53
  validateEvenDimensionsWithCodec: ({ width, height, codec, scale, }: {
55
54
  width: number;
@@ -123,7 +122,7 @@ export declare const RenderInternals: {
123
122
  DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
124
123
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
125
124
  logLevels: readonly ["verbose", "info", "warn", "error"];
126
- isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
125
+ isEqualOrBelowLogLevel: (currentLevel: "verbose" | "info" | "warn" | "error", level: "verbose" | "info" | "warn" | "error") => boolean;
127
126
  isValidLogLevel: (level: string) => boolean;
128
127
  perf: typeof perf;
129
128
  convertToPositiveFrameIndex: ({ frame, durationInFrames, }: {
@@ -262,19 +261,14 @@ export declare const RenderInternals: {
262
261
  };
263
262
  gif: {
264
263
  default: import("./file-extensions").FileExtension;
265
- forAudioCodec: {
266
- [x: string]: {
267
- possible: import("./file-extensions").FileExtension[];
268
- default: import("./file-extensions").FileExtension;
269
- };
270
- };
264
+ forAudioCodec: {};
271
265
  };
272
266
  };
273
267
  supportedAudioCodecs: {
274
268
  readonly h264: readonly ["aac", "pcm-16"];
275
269
  readonly 'h264-mkv': readonly ["pcm-16"];
276
270
  readonly aac: readonly ["aac", "pcm-16"];
277
- readonly gif: const[];
271
+ readonly gif: readonly [];
278
272
  readonly h265: readonly ["aac", "pcm-16"];
279
273
  readonly mp3: readonly ["mp3", "pcm-16"];
280
274
  readonly prores: readonly ["aac", "pcm-16"];
@@ -357,24 +351,24 @@ export declare const RenderInternals: {
357
351
  verbose: (message?: any, ...optionalParams: any[]) => void;
358
352
  verboseAdvanced: (options: {
359
353
  indent: boolean;
360
- logLevel: "error" | "verbose" | "info" | "warn";
354
+ logLevel: "verbose" | "info" | "warn" | "error";
361
355
  } & {
362
356
  tag?: string | undefined;
363
357
  }, message?: any, ...optionalParams: any[]) => void;
364
358
  info: (message?: any, ...optionalParams: any[]) => void;
365
359
  infoAdvanced: (options: {
366
360
  indent: boolean;
367
- logLevel: "error" | "verbose" | "info" | "warn";
361
+ logLevel: "verbose" | "info" | "warn" | "error";
368
362
  }, message?: any, ...optionalParams: any[]) => void;
369
363
  warn: (message?: any, ...optionalParams: any[]) => void;
370
364
  warnAdvanced: (options: {
371
365
  indent: boolean;
372
- logLevel: "error" | "verbose" | "info" | "warn";
366
+ logLevel: "verbose" | "info" | "warn" | "error";
373
367
  }, message?: any, ...optionalParams: any[]) => void;
374
368
  error: (message?: any, ...optionalParams: any[]) => void;
375
369
  };
376
- getLogLevel: () => "error" | "verbose" | "info" | "warn";
377
- setLogLevel: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
370
+ getLogLevel: () => "verbose" | "info" | "warn" | "error";
371
+ setLogLevel: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
378
372
  INDENT_TOKEN: string;
379
373
  isColorSupported: () => boolean;
380
374
  HeadlessBrowser: typeof HeadlessBrowser;
@@ -383,7 +377,7 @@ export declare const RenderInternals: {
383
377
  port: number | null;
384
378
  remotionRoot: string;
385
379
  concurrency: number;
386
- logLevel: "error" | "verbose" | "info" | "warn";
380
+ logLevel: "verbose" | "info" | "warn" | "error";
387
381
  indent: boolean;
388
382
  }) => Promise<import("./prepare-server").RemotionServer>;
389
383
  makeOrReuseServer: (server: import("./prepare-server").RemotionServer | undefined, config: {
@@ -391,7 +385,7 @@ export declare const RenderInternals: {
391
385
  port: number | null;
392
386
  remotionRoot: string;
393
387
  concurrency: number;
394
- logLevel: "error" | "verbose" | "info" | "warn";
388
+ logLevel: "verbose" | "info" | "warn" | "error";
395
389
  indent: boolean;
396
390
  }, { onDownload, onError, }: {
397
391
  onError: (err: Error) => void;
@@ -420,7 +414,7 @@ export declare const RenderInternals: {
420
414
  cancelSignal: import("./make-cancel-signal").CancelSignal | null;
421
415
  indent: boolean;
422
416
  server: import("./prepare-server").RemotionServer | undefined;
423
- logLevel: "error" | "verbose" | "info" | "warn";
417
+ logLevel: "verbose" | "info" | "warn" | "error";
424
418
  serveUrl: string;
425
419
  port: number | null;
426
420
  }) => Promise<{
@@ -433,7 +427,7 @@ export declare const RenderInternals: {
433
427
  viewport: import("./browser/PuppeteerViewport").Viewport | null;
434
428
  indent: boolean;
435
429
  browser: import("./browser").Browser;
436
- logLevel: "error" | "verbose" | "info" | "warn";
430
+ logLevel: "verbose" | "info" | "warn" | "error";
437
431
  }) => Promise<HeadlessBrowser>;
438
432
  internalSelectComposition: (options: {
439
433
  serializedInputPropsWithCustomSchema: string;
@@ -446,7 +440,7 @@ export declare const RenderInternals: {
446
440
  port: number | null;
447
441
  indent: boolean;
448
442
  server: import("./prepare-server").RemotionServer | undefined;
449
- logLevel: "error" | "verbose" | "info" | "warn";
443
+ logLevel: "verbose" | "info" | "warn" | "error";
450
444
  serveUrl: string;
451
445
  id: string;
452
446
  }) => Promise<{
@@ -464,7 +458,7 @@ export declare const RenderInternals: {
464
458
  port: number | null;
465
459
  server: import("./prepare-server").RemotionServer | undefined;
466
460
  indent: boolean;
467
- logLevel: "error" | "verbose" | "info" | "warn";
461
+ logLevel: "verbose" | "info" | "warn" | "error";
468
462
  serveUrlOrWebpackUrl: string;
469
463
  }) => Promise<import("remotion").VideoConfig[]>;
470
464
  internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, }: import("./render-frames").InternalRenderFramesOptions) => Promise<import("./types").RenderFramesOutput>;
package/dist/logger.d.ts CHANGED
@@ -18,6 +18,6 @@ export declare const Log: {
18
18
  warnAdvanced: (options: LogOptions, message?: any, ...optionalParams: any[]) => void;
19
19
  error: (message?: any, ...optionalParams: any[]) => void;
20
20
  };
21
- export declare const getLogLevel: () => "error" | "verbose" | "info" | "warn";
21
+ export declare const getLogLevel: () => "verbose" | "info" | "warn" | "error";
22
22
  export declare const setLogLevel: (newLogLevel: LogLevel) => void;
23
23
  export {};
@@ -16,7 +16,6 @@ export declare const startOffthreadVideoServer: ({ downloadMap, concurrency, log
16
16
  listener: RequestListener;
17
17
  close: () => Promise<void>;
18
18
  compositor: Compositor;
19
- events: OffthreadVideoServerEmitter;
20
19
  };
21
20
  type DownloadEventPayload = {
22
21
  src: string;
@@ -30,7 +30,6 @@ const extractUrlAndSourceFromUrl = (url) => {
30
30
  };
31
31
  exports.extractUrlAndSourceFromUrl = extractUrlAndSourceFromUrl;
32
32
  const startOffthreadVideoServer = ({ downloadMap, concurrency, logLevel, indent, }) => {
33
- const events = new OffthreadVideoServerEmitter();
34
33
  const compositor = (0, compositor_1.startCompositor)('StartLongRunningProcess', {
35
34
  concurrency,
36
35
  maximum_frame_cache_items: (0, compositor_1.getIdealMaximumFrameCacheItems)(),
@@ -70,7 +69,7 @@ const startOffthreadVideoServer = ({ downloadMap, concurrency, logLevel, indent,
70
69
  return;
71
70
  }
72
71
  let extractStart = Date.now();
73
- (0, download_and_map_assets_to_file_1.downloadAsset)({ src, emitter: events, downloadMap })
72
+ (0, download_and_map_assets_to_file_1.downloadAsset)({ src, downloadMap })
74
73
  .then((to) => {
75
74
  extractStart = Date.now();
76
75
  return compositor.executeCommand('ExtractFrame', {
@@ -95,12 +94,11 @@ const startOffthreadVideoServer = ({ downloadMap, concurrency, logLevel, indent,
95
94
  .catch((err) => {
96
95
  res.writeHead(500);
97
96
  res.end();
98
- events.dispatchError(err);
97
+ downloadMap.emitter.dispatchError(err);
99
98
  console.log('Error occurred', err);
100
99
  });
101
100
  },
102
101
  compositor,
103
- events,
104
102
  };
105
103
  };
106
104
  exports.startOffthreadVideoServer = startOffthreadVideoServer;
@@ -1,7 +1,6 @@
1
1
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
2
2
  import type { DownloadMap } from './assets/download-map';
3
3
  import type { Compositor } from './compositor/compositor';
4
- import type { OffthreadVideoServerEmitter } from './offthread-video-server';
5
4
  import type { AnySourceMapConsumer } from './symbolicate-stacktrace';
6
5
  import type { LogLevel } from './log-level';
7
6
  export type RemotionServer = {
@@ -10,7 +9,6 @@ export type RemotionServer = {
10
9
  offthreadPort: number;
11
10
  compositor: Compositor;
12
11
  sourceMap: AnySourceMapConsumer | null;
13
- events: OffthreadVideoServerEmitter;
14
12
  downloadMap: DownloadMap;
15
13
  };
16
14
  type PrepareServerOptions = {
@@ -18,7 +18,7 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
18
18
  const downloadMap = (0, download_map_1.makeDownloadMap)();
19
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
- const { port: offthreadPort, close: closeProxy, compositor: comp, events, } = await (0, serve_static_1.serveStatic)(null, {
21
+ const { port: offthreadPort, close: closeProxy, compositor: comp, } = await (0, serve_static_1.serveStatic)(null, {
22
22
  port,
23
23
  downloadMap,
24
24
  remotionRoot,
@@ -35,7 +35,6 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
35
35
  offthreadPort,
36
36
  compositor: comp,
37
37
  sourceMap: null,
38
- events,
39
38
  downloadMap,
40
39
  });
41
40
  }
@@ -46,7 +45,7 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
46
45
  throw new Error(`Tried to serve the Webpack bundle on a HTTP server, but the file ${indexFile} does not exist. Is this a valid path to a Webpack bundle?`);
47
46
  }
48
47
  const sourceMap = (0, symbolicate_stacktrace_1.getSourceMapFromLocalFile)(node_path_1.default.join(webpackConfigOrServeUrl, remotion_1.Internals.bundleName));
49
- const { port: serverPort, close, compositor, events: newEvents, } = await (0, serve_static_1.serveStatic)(webpackConfigOrServeUrl, {
48
+ const { port: serverPort, close, compositor, } = await (0, serve_static_1.serveStatic)(webpackConfigOrServeUrl, {
50
49
  port,
51
50
  downloadMap,
52
51
  remotionRoot,
@@ -67,15 +66,14 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
67
66
  offthreadPort: serverPort,
68
67
  compositor,
69
68
  sourceMap: await sourceMap,
70
- events: newEvents,
71
69
  downloadMap,
72
70
  });
73
71
  };
74
72
  exports.prepareServer = prepareServer;
75
73
  const makeOrReuseServer = async (server, config, { onDownload, onError, }) => {
76
74
  if (server) {
77
- const cleanupOnDownload = (0, download_and_map_assets_to_file_1.attachDownloadListenerToEmitter)(server.events, onDownload);
78
- const cleanupError = server.events.addEventListener('error', ({ detail: { error } }) => {
75
+ const cleanupOnDownload = (0, download_and_map_assets_to_file_1.attachDownloadListenerToEmitter)(server.downloadMap, onDownload);
76
+ const cleanupError = server.downloadMap.emitter.addEventListener('error', ({ detail: { error } }) => {
79
77
  onError(error);
80
78
  });
81
79
  return {
@@ -88,8 +86,8 @@ const makeOrReuseServer = async (server, config, { onDownload, onError, }) => {
88
86
  };
89
87
  }
90
88
  const newServer = await (0, exports.prepareServer)(config);
91
- const cleanupOnDownloadNew = (0, download_and_map_assets_to_file_1.attachDownloadListenerToEmitter)(newServer.events, onDownload);
92
- const cleanupErrorNew = newServer.events.addEventListener('error', ({ detail: { error } }) => {
89
+ const cleanupOnDownloadNew = (0, download_and_map_assets_to_file_1.attachDownloadListenerToEmitter)(newServer.downloadMap, onDownload);
90
+ const cleanupErrorNew = newServer.downloadMap.emitter.addEventListener('error', ({ detail: { error } }) => {
93
91
  onError(error);
94
92
  });
95
93
  return {
@@ -79,6 +79,8 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
79
79
  retriesRemaining: 2,
80
80
  audioEnabled: !muted,
81
81
  videoEnabled: imageFormat !== 'none',
82
+ indent,
83
+ logLevel,
82
84
  });
83
85
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
84
86
  // eslint-disable-next-line max-params
@@ -338,9 +340,11 @@ const internalRenderFrames = ({ browserExecutable, cancelSignal, chromiumOptions
338
340
  onError,
339
341
  }),
340
342
  browserInstance,
341
- ]).then(([{ server: { serveUrl, offthreadPort, compositor, sourceMap, downloadMap, }, cleanupServer, }, pInstance,]) => {
343
+ ]).then(([{ server: openedServer, cleanupServer }, pInstance]) => {
344
+ const { serveUrl, offthreadPort, compositor, sourceMap, downloadMap } = openedServer;
342
345
  const browserReplacer = (0, replace_browser_1.handleBrowserCrash)(pInstance, logLevel, indent);
343
- cleanup.push((0, cycle_browser_tabs_1.cycleBrowserTabs)(browserReplacer, actualConcurrency, logLevel, indent).stopCycling);
346
+ cleanup.push((0, cycle_browser_tabs_1.cycleBrowserTabs)(browserReplacer, actualConcurrency, logLevel, indent)
347
+ .stopCycling);
344
348
  cleanup.push(() => cleanupServer(false));
345
349
  return innerRenderFrames({
346
350
  onError,
@@ -404,7 +404,7 @@ exports.internalRenderMedia = internalRenderMedia;
404
404
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
405
405
  */
406
406
  const renderMedia = ({ 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, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel, }) => {
407
- var _a;
407
+ var _a, _b;
408
408
  if (quality !== undefined) {
409
409
  console.warn(`The "quality" option has been renamed. Please use "jpegQuality" instead.`);
410
410
  }
@@ -455,7 +455,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
455
455
  serializedResolvedPropsWithCustomSchema: remotion_1.Internals.serializeJSONWithDate({
456
456
  indent: undefined,
457
457
  staticBase: null,
458
- data: composition.props,
458
+ data: (_b = composition.props) !== null && _b !== void 0 ? _b : {},
459
459
  }).serializedString,
460
460
  });
461
461
  };
@@ -144,6 +144,8 @@ const innerRenderStill = async ({ composition, imageFormat = image_format_1.DEFA
144
144
  retriesRemaining: 2,
145
145
  audioEnabled: false,
146
146
  videoEnabled: true,
147
+ indent,
148
+ logLevel,
147
149
  });
148
150
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
149
151
  // eslint-disable-next-line max-params
@@ -42,5 +42,5 @@ export declare const internalSelectComposition: (options: InternalSelectComposit
42
42
  * @description Gets a composition defined in a Remotion project based on a Webpack bundle.
43
43
  * @see [Documentation](https://www.remotion.dev/docs/renderer/select-composition)
44
44
  */
45
- export declare const selectComposition: (options: SelectCompositionOptions) => Promise<Omit<VideoConfig, 'defaultProps'>>;
45
+ export declare const selectComposition: (options: SelectCompositionOptions) => Promise<VideoConfig>;
46
46
  export {};
@@ -34,6 +34,8 @@ const innerSelectComposition = async ({ page, onBrowserLog, serializedInputProps
34
34
  retriesRemaining: 2,
35
35
  audioEnabled: false,
36
36
  videoEnabled: false,
37
+ indent,
38
+ logLevel,
37
39
  });
38
40
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
39
41
  page,
@@ -169,7 +169,7 @@ const serveHandler = async (request, response, config) => {
169
169
  return sendError(absolutePath, response, {
170
170
  statusCode: 404,
171
171
  code: 'not_found',
172
- message: 'The requested path could not be found',
172
+ message: 'The requested path (' + absolutePath + ') could not be found',
173
173
  });
174
174
  }
175
175
  let streamOpts = null;
@@ -1,6 +1,5 @@
1
1
  import type { DownloadMap } from './assets/download-map';
2
2
  import type { Compositor } from './compositor/compositor';
3
- import type { OffthreadVideoServerEmitter } from './offthread-video-server';
4
3
  import type { LogLevel } from './log-level';
5
4
  export declare const serveStatic: (path: string | null, options: {
6
5
  port: number | null;
@@ -13,5 +12,4 @@ export declare const serveStatic: (path: string | null, options: {
13
12
  port: number;
14
13
  close: () => Promise<void>;
15
14
  compositor: Compositor;
16
- events: OffthreadVideoServerEmitter;
17
15
  }>;
@@ -9,7 +9,7 @@ const get_port_1 = require("./get-port");
9
9
  const offthread_video_server_1 = require("./offthread-video-server");
10
10
  const serve_handler_1 = require("./serve-handler");
11
11
  const serveStatic = async (path, options) => {
12
- const { listener: offthreadRequest, close: closeCompositor, compositor, events, } = (0, offthread_video_server_1.startOffthreadVideoServer)({
12
+ const { listener: offthreadRequest, close: closeCompositor, compositor, } = (0, offthread_video_server_1.startOffthreadVideoServer)({
13
13
  downloadMap: options.downloadMap,
14
14
  concurrency: options.concurrency,
15
15
  logLevel: options.logLevel,
@@ -85,7 +85,7 @@ const serveStatic = async (path, options) => {
85
85
  }),
86
86
  ]);
87
87
  };
88
- return { port: selectedPort, close, compositor, events };
88
+ return { port: selectedPort, close, compositor };
89
89
  }
90
90
  catch (err) {
91
91
  if (!(err instanceof Error)) {
@@ -1,4 +1,5 @@
1
1
  import type { Page } from './browser/BrowserPage';
2
+ import type { LogLevel } from './log-level';
2
3
  type SetPropsAndEnv = {
3
4
  serializedInputPropsWithCustomSchema: string;
4
5
  envVariables: Record<string, string> | undefined;
@@ -10,6 +11,8 @@ type SetPropsAndEnv = {
10
11
  retriesRemaining: number;
11
12
  audioEnabled: boolean;
12
13
  videoEnabled: boolean;
14
+ indent: boolean;
15
+ logLevel: LogLevel;
13
16
  };
14
17
  export declare const setPropsAndEnv: (params: SetPropsAndEnv) => Promise<unknown>;
15
18
  export {};
@@ -8,7 +8,7 @@ const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
8
8
  const redirect_status_codes_1 = require("./redirect-status-codes");
9
9
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
10
10
  const logger_1 = require("./logger");
11
- const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVariables, page, serveUrl, initialFrame, timeoutInMilliseconds, proxyPort, retriesRemaining, audioEnabled, videoEnabled, }) => {
11
+ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVariables, page, serveUrl, initialFrame, timeoutInMilliseconds, proxyPort, retriesRemaining, audioEnabled, videoEnabled, indent, logLevel, }) => {
12
12
  (0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
13
13
  const actualTimeout = timeoutInMilliseconds !== null && timeoutInMilliseconds !== void 0 ? timeoutInMilliseconds : TimeoutSettings_1.DEFAULT_TIMEOUT;
14
14
  page.setDefaultTimeout(actualTimeout);
@@ -61,12 +61,14 @@ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVa
61
61
  timeoutInMilliseconds,
62
62
  audioEnabled,
63
63
  videoEnabled,
64
+ indent,
65
+ logLevel,
64
66
  });
65
67
  }
66
68
  if (!redirect_status_codes_1.redirectStatusCodes.every((code) => code !== status)) {
67
69
  throw new Error(`Error while getting compositions: Tried to go to ${urlToVisit} but the status code was ${status} instead of 200. Does the site you specified exist?`);
68
70
  }
69
- const isRemotionFn = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
71
+ const { value: isRemotionFn } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
70
72
  pageFunction: () => {
71
73
  return window.getStaticCompositions;
72
74
  },
@@ -74,8 +76,23 @@ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVa
74
76
  frame: null,
75
77
  page,
76
78
  });
77
- if (isRemotionFn === undefined) {
78
- throw new Error(`Error while getting compositions: Tried to go to ${urlToVisit} and verify that it is a Remotion project by checking if window.getStaticCompositions is defined. However, the function was undefined, which indicates that this is not a valid Remotion project. Please check the URL you passed.`);
79
+ if (typeof isRemotionFn === 'undefined') {
80
+ const { value: body } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
81
+ pageFunction: () => {
82
+ return document.body.innerHTML;
83
+ },
84
+ args: [],
85
+ frame: null,
86
+ page,
87
+ });
88
+ const errorMessage = [
89
+ `Error while getting compositions: Tried to go to ${urlToVisit} and verify that it is a Remotion project by checking if window.getStaticCompositions is defined.`,
90
+ 'However, the function was undefined, which indicates that this is not a valid Remotion project. Please check the URL you passed.',
91
+ 'The page loaded contained the following markup:',
92
+ body.substring(0, 500) + (body.length > 500 ? '...' : ''),
93
+ 'Does this look like a foreign page? If so, try to stop this server.',
94
+ ].join('\n');
95
+ throw new Error(errorMessage);
79
96
  }
80
97
  const { value: siteVersion } = await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
81
98
  pageFunction: () => {
@@ -99,10 +116,16 @@ const innerSetPropsAndEnv = async ({ serializedInputPropsWithCustomSchema, envVa
99
116
  }
100
117
  if (remotionVersion !== version_1.VERSION && process.env.NODE_ENV !== 'test') {
101
118
  if (remotionVersion) {
102
- logger_1.Log.warn(`The site was bundled with version ${remotionVersion} of @remotion/bundler, while @remotion/renderer is on version ${version_1.VERSION}. You may not have the newest bugfixes and features. Re-bundle the site to fix this issue.`);
119
+ logger_1.Log.warnAdvanced({
120
+ indent,
121
+ logLevel,
122
+ }, `The site was bundled with version ${remotionVersion} of @remotion/bundler, while @remotion/renderer is on version ${version_1.VERSION}. You may not have the newest bugfixes and features. Re-bundle the site to fix this issue.`);
103
123
  }
104
124
  else {
105
- logger_1.Log.warn(`The site was bundled with an old version of Remotion, while @remotion/renderer is on version ${version_1.VERSION}. You may not have the newest bugfixes and features. Re-bundle the site to fix this issue.`);
125
+ logger_1.Log.warnAdvanced({
126
+ indent,
127
+ logLevel,
128
+ }, `The site was bundled with an old version of Remotion, while @remotion/renderer is on version ${version_1.VERSION}. You may not have the newest bugfixes and features. Re-bundle the site to fix this issue.`);
106
129
  }
107
130
  }
108
131
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
4
4
  "description": "Renderer for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "extract-zip": "2.0.1",
19
19
  "source-map": "^0.8.0-beta.0",
20
20
  "ws": "8.7.0",
21
- "remotion": "4.0.3"
21
+ "remotion": "4.0.5"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": ">=16.8.0",
@@ -42,13 +42,13 @@
42
42
  "zod": "^3.21.4"
43
43
  },
44
44
  "optionalDependencies": {
45
- "@remotion/compositor-darwin-x64": "4.0.3",
46
- "@remotion/compositor-darwin-arm64": "4.0.3",
47
- "@remotion/compositor-linux-arm64-musl": "4.0.3",
48
- "@remotion/compositor-linux-x64-gnu": "4.0.3",
49
- "@remotion/compositor-linux-x64-musl": "4.0.3",
50
- "@remotion/compositor-linux-arm64-gnu": "4.0.3",
51
- "@remotion/compositor-win32-x64-msvc": "4.0.3"
45
+ "@remotion/compositor-darwin-arm64": "4.0.5",
46
+ "@remotion/compositor-linux-arm64-musl": "4.0.5",
47
+ "@remotion/compositor-linux-x64-gnu": "4.0.5",
48
+ "@remotion/compositor-win32-x64-msvc": "4.0.5",
49
+ "@remotion/compositor-linux-x64-musl": "4.0.5",
50
+ "@remotion/compositor-linux-arm64-gnu": "4.0.5",
51
+ "@remotion/compositor-darwin-x64": "4.0.5"
52
52
  },
53
53
  "keywords": [
54
54
  "remotion",