@remotion/media-parser 4.0.318 → 4.0.320

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.
@@ -0,0 +1,30 @@
1
+ import type { BufferIterator } from '../../iterator/buffer-iterator';
2
+ import type { BaseBox } from './base-type';
3
+ export type ThreeDMatrix = [
4
+ number,
5
+ number,
6
+ number,
7
+ number,
8
+ number,
9
+ number,
10
+ number,
11
+ number,
12
+ number
13
+ ];
14
+ export interface MvhdBox extends BaseBox {
15
+ durationInUnits: number;
16
+ durationInSeconds: number;
17
+ creationTime: number | null;
18
+ modificationTime: number | null;
19
+ timeScale: number;
20
+ rate: number;
21
+ volume: number;
22
+ matrix: ThreeDMatrix;
23
+ nextTrackId: number;
24
+ type: 'mvhd-box';
25
+ }
26
+ export declare const parseMvhd: ({ iterator, offset, size, }: {
27
+ iterator: BufferIterator;
28
+ offset: number;
29
+ size: number;
30
+ }) => MvhdBox;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseMvhd = void 0;
4
+ const buffer_iterator_1 = require("../../iterator/buffer-iterator");
5
+ const to_date_1 = require("./to-date");
6
+ const parseMvhd = ({ iterator, offset, size, }) => {
7
+ const version = iterator.getUint8();
8
+ // Flags, we discard them
9
+ iterator.discard(3);
10
+ const creationTime = version === 1 ? iterator.getUint64() : iterator.getUint32();
11
+ const modificationTime = version === 1 ? iterator.getUint64() : iterator.getUint32();
12
+ const timeScale = iterator.getUint32();
13
+ const durationInUnits = version === 1 ? iterator.getUint64() : iterator.getUint32();
14
+ const durationInSeconds = Number(durationInUnits) / timeScale;
15
+ const rateArray = iterator.getSlice(4);
16
+ const rateView = (0, buffer_iterator_1.getArrayBufferIterator)(rateArray, rateArray.length);
17
+ const rate = rateView.getInt8() * 10 +
18
+ rateView.getInt8() +
19
+ rateView.getInt8() * 0.1 +
20
+ rateView.getInt8() * 0.01;
21
+ const volumeArray = iterator.getSlice(2);
22
+ const volumeView = (0, buffer_iterator_1.getArrayBufferIterator)(volumeArray, volumeArray.length);
23
+ const volume = volumeView.getInt8() + volumeView.getInt8() * 0.1;
24
+ // reserved 16bit
25
+ iterator.discard(2);
26
+ // reserved 32bit x2
27
+ iterator.discard(4);
28
+ iterator.discard(4);
29
+ // matrix
30
+ const matrix = [
31
+ iterator.getFixedPointSigned1616Number(),
32
+ iterator.getFixedPointSigned1616Number(),
33
+ iterator.getFixedPointSigned230Number(),
34
+ iterator.getFixedPointSigned1616Number(),
35
+ iterator.getFixedPointSigned1616Number(),
36
+ iterator.getFixedPointSigned230Number(),
37
+ iterator.getFixedPointSigned1616Number(),
38
+ iterator.getFixedPointSigned1616Number(),
39
+ iterator.getFixedPointSigned230Number(),
40
+ ];
41
+ // pre-defined
42
+ iterator.discard(4 * 6);
43
+ // next track id
44
+ const nextTrackId = iterator.getUint32();
45
+ volumeView.destroy();
46
+ const bytesRemaining = size - (iterator.counter.getOffset() - offset);
47
+ if (bytesRemaining !== 0) {
48
+ throw new Error('expected 0 bytes ' + bytesRemaining);
49
+ }
50
+ return {
51
+ creationTime: (0, to_date_1.toUnixTimestamp)(Number(creationTime)),
52
+ modificationTime: (0, to_date_1.toUnixTimestamp)(Number(modificationTime)),
53
+ timeScale,
54
+ durationInUnits: Number(durationInUnits),
55
+ durationInSeconds,
56
+ rate,
57
+ volume,
58
+ matrix: matrix,
59
+ nextTrackId,
60
+ type: 'mvhd-box',
61
+ boxSize: size,
62
+ offset,
63
+ };
64
+ };
65
+ exports.parseMvhd = parseMvhd;
@@ -12452,6 +12452,9 @@ var makeFetchRequest = async ({
12452
12452
  });
12453
12453
  const contentRange = res.headers.get("content-range");
12454
12454
  const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
12455
+ if (!res.ok) {
12456
+ throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
12457
+ }
12455
12458
  const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
12456
12459
  requestedRange,
12457
12460
  parsedContentRange,
@@ -12462,9 +12465,6 @@ var makeFetchRequest = async ({
12462
12465
  ownController.abort(new MediaParserAbortError("Aborted by user"));
12463
12466
  }, { once: true });
12464
12467
  }
12465
- if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
12466
- throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
12467
- }
12468
12468
  const contentDisposition = res.headers.get("content-disposition");
12469
12469
  const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
12470
12470
  const { contentLength, needsContentRange, reader } = await getLengthAndReader({
@@ -18105,7 +18105,7 @@ var downloadAndParseMedia = async (options) => {
18105
18105
  return returnValue;
18106
18106
  };
18107
18107
  // src/version.ts
18108
- var VERSION = "4.0.318";
18108
+ var VERSION = "4.0.320";
18109
18109
 
18110
18110
  // src/index.ts
18111
18111
  var MediaParserInternals = {
@@ -252,6 +252,7 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
252
252
  return prom.promise;
253
253
  });
254
254
  const callbacks = {};
255
+ const trackDoneCallbacks = {};
255
256
  function onMessage(message) {
256
257
  const data = message.data;
257
258
  if (data.type === "response-done") {
@@ -435,15 +436,35 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
435
436
  if (!callback) {
436
437
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
437
438
  }
438
- await callback(data.payload.value);
439
- return { payloadType: "void" };
439
+ const trackDoneCallback = await callback(data.payload.value);
440
+ if (trackDoneCallback) {
441
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
442
+ }
443
+ return {
444
+ payloadType: "on-sample-response",
445
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
446
+ };
440
447
  }
441
448
  if (data.payload.callbackType === "on-video-sample") {
442
449
  const callback = callbacks[data.payload.trackId];
443
450
  if (!callback) {
444
451
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
445
452
  }
446
- await callback(data.payload.value);
453
+ const trackDoneCallback = await callback(data.payload.value);
454
+ if (trackDoneCallback) {
455
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
456
+ }
457
+ return {
458
+ payloadType: "on-sample-response",
459
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
460
+ };
461
+ }
462
+ if (data.payload.callbackType === "track-done") {
463
+ const trackDoneCallback = trackDoneCallbacks[data.payload.trackId];
464
+ if (!trackDoneCallback) {
465
+ throw new Error(`No track done callback registered for track ${data.payload.trackId}`);
466
+ }
467
+ trackDoneCallback();
447
468
  return { payloadType: "void" };
448
469
  }
449
470
  throw new Error(`Unknown callback type: ${data.payload}`);
@@ -174,6 +174,9 @@ var makeFetchRequest = async ({
174
174
  });
175
175
  const contentRange = res.headers.get("content-range");
176
176
  const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
177
+ if (!res.ok) {
178
+ throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
179
+ }
177
180
  const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
178
181
  requestedRange,
179
182
  parsedContentRange,
@@ -184,9 +187,6 @@ var makeFetchRequest = async ({
184
187
  ownController.abort(new MediaParserAbortError("Aborted by user"));
185
188
  }, { once: true });
186
189
  }
187
- if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
188
- throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
189
- }
190
190
  const contentDisposition = res.headers.get("content-disposition");
191
191
  const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
192
192
  const { contentLength, needsContentRange, reader } = await getLengthAndReader({
package/dist/esm/web.mjs CHANGED
@@ -174,6 +174,9 @@ var makeFetchRequest = async ({
174
174
  });
175
175
  const contentRange = res.headers.get("content-range");
176
176
  const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
177
+ if (!res.ok) {
178
+ throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
179
+ }
177
180
  const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
178
181
  requestedRange,
179
182
  parsedContentRange,
@@ -184,9 +187,6 @@ var makeFetchRequest = async ({
184
187
  ownController.abort(new MediaParserAbortError("Aborted by user"));
185
188
  }, { once: true });
186
189
  }
187
- if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
188
- throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
189
- }
190
190
  const contentDisposition = res.headers.get("content-disposition");
191
191
  const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
192
192
  const { contentLength, needsContentRange, reader } = await getLengthAndReader({
@@ -243,6 +243,9 @@ var makeFetchRequest = async ({
243
243
  });
244
244
  const contentRange = res.headers.get("content-range");
245
245
  const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
246
+ if (!res.ok) {
247
+ throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
248
+ }
246
249
  const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
247
250
  requestedRange,
248
251
  parsedContentRange,
@@ -253,9 +256,6 @@ var makeFetchRequest = async ({
253
256
  ownController.abort(new MediaParserAbortError("Aborted by user"));
254
257
  }, { once: true });
255
258
  }
256
- if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
257
- throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
258
- }
259
259
  const contentDisposition = res.headers.get("content-disposition");
260
260
  const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
261
261
  const { contentLength, needsContentRange, reader } = await getLengthAndReader({
@@ -18585,11 +18585,23 @@ var startParsing = async (message, reader) => {
18585
18585
  return null;
18586
18586
  }
18587
18587
  return async (sample) => {
18588
- await executeCallback({
18588
+ const audioSampleRes = await executeCallback({
18589
18589
  callbackType: "on-audio-sample",
18590
18590
  value: sample,
18591
18591
  trackId: params.track.trackId
18592
18592
  });
18593
+ if (audioSampleRes.payloadType !== "on-sample-response") {
18594
+ throw new Error("Invalid response from callback");
18595
+ }
18596
+ if (!audioSampleRes.registeredTrackDoneCallback) {
18597
+ return;
18598
+ }
18599
+ return async () => {
18600
+ await executeCallback({
18601
+ callbackType: "track-done",
18602
+ trackId: params.track.trackId
18603
+ });
18604
+ };
18593
18605
  };
18594
18606
  } : null,
18595
18607
  onVideoTrack: postOnVideoTrack ? async (params) => {
@@ -18604,11 +18616,23 @@ var startParsing = async (message, reader) => {
18604
18616
  return null;
18605
18617
  }
18606
18618
  return async (sample) => {
18607
- await executeCallback({
18619
+ const videoSampleRes = await executeCallback({
18608
18620
  callbackType: "on-video-sample",
18609
18621
  value: sample,
18610
18622
  trackId: params.track.trackId
18611
18623
  });
18624
+ if (videoSampleRes.payloadType !== "on-sample-response") {
18625
+ throw new Error("Invalid response from callback");
18626
+ }
18627
+ if (!videoSampleRes.registeredTrackDoneCallback) {
18628
+ return;
18629
+ }
18630
+ return async () => {
18631
+ await executeCallback({
18632
+ callbackType: "track-done",
18633
+ trackId: params.track.trackId
18634
+ });
18635
+ };
18612
18636
  };
18613
18637
  } : null,
18614
18638
  onDiscardedData: null,
@@ -243,6 +243,9 @@ var makeFetchRequest = async ({
243
243
  });
244
244
  const contentRange = res.headers.get("content-range");
245
245
  const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
246
+ if (!res.ok) {
247
+ throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
248
+ }
246
249
  const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
247
250
  requestedRange,
248
251
  parsedContentRange,
@@ -253,9 +256,6 @@ var makeFetchRequest = async ({
253
256
  ownController.abort(new MediaParserAbortError("Aborted by user"));
254
257
  }, { once: true });
255
258
  }
256
- if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
257
- throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
258
- }
259
259
  const contentDisposition = res.headers.get("content-disposition");
260
260
  const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
261
261
  const { contentLength, needsContentRange, reader } = await getLengthAndReader({
@@ -18454,11 +18454,23 @@ var startParsing = async (message, reader) => {
18454
18454
  return null;
18455
18455
  }
18456
18456
  return async (sample) => {
18457
- await executeCallback({
18457
+ const audioSampleRes = await executeCallback({
18458
18458
  callbackType: "on-audio-sample",
18459
18459
  value: sample,
18460
18460
  trackId: params.track.trackId
18461
18461
  });
18462
+ if (audioSampleRes.payloadType !== "on-sample-response") {
18463
+ throw new Error("Invalid response from callback");
18464
+ }
18465
+ if (!audioSampleRes.registeredTrackDoneCallback) {
18466
+ return;
18467
+ }
18468
+ return async () => {
18469
+ await executeCallback({
18470
+ callbackType: "track-done",
18471
+ trackId: params.track.trackId
18472
+ });
18473
+ };
18462
18474
  };
18463
18475
  } : null,
18464
18476
  onVideoTrack: postOnVideoTrack ? async (params) => {
@@ -18473,11 +18485,23 @@ var startParsing = async (message, reader) => {
18473
18485
  return null;
18474
18486
  }
18475
18487
  return async (sample) => {
18476
- await executeCallback({
18488
+ const videoSampleRes = await executeCallback({
18477
18489
  callbackType: "on-video-sample",
18478
18490
  value: sample,
18479
18491
  trackId: params.track.trackId
18480
18492
  });
18493
+ if (videoSampleRes.payloadType !== "on-sample-response") {
18494
+ throw new Error("Invalid response from callback");
18495
+ }
18496
+ if (!videoSampleRes.registeredTrackDoneCallback) {
18497
+ return;
18498
+ }
18499
+ return async () => {
18500
+ await executeCallback({
18501
+ callbackType: "track-done",
18502
+ trackId: params.track.trackId
18503
+ });
18504
+ };
18481
18505
  };
18482
18506
  } : null,
18483
18507
  onDiscardedData: null,
@@ -252,6 +252,7 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
252
252
  return prom.promise;
253
253
  });
254
254
  const callbacks = {};
255
+ const trackDoneCallbacks = {};
255
256
  function onMessage(message) {
256
257
  const data = message.data;
257
258
  if (data.type === "response-done") {
@@ -435,15 +436,35 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
435
436
  if (!callback) {
436
437
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
437
438
  }
438
- await callback(data.payload.value);
439
- return { payloadType: "void" };
439
+ const trackDoneCallback = await callback(data.payload.value);
440
+ if (trackDoneCallback) {
441
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
442
+ }
443
+ return {
444
+ payloadType: "on-sample-response",
445
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
446
+ };
440
447
  }
441
448
  if (data.payload.callbackType === "on-video-sample") {
442
449
  const callback = callbacks[data.payload.trackId];
443
450
  if (!callback) {
444
451
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
445
452
  }
446
- await callback(data.payload.value);
453
+ const trackDoneCallback = await callback(data.payload.value);
454
+ if (trackDoneCallback) {
455
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
456
+ }
457
+ return {
458
+ payloadType: "on-sample-response",
459
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
460
+ };
461
+ }
462
+ if (data.payload.callbackType === "track-done") {
463
+ const trackDoneCallback = trackDoneCallbacks[data.payload.trackId];
464
+ if (!trackDoneCallback) {
465
+ throw new Error(`No track done callback registered for track ${data.payload.trackId}`);
466
+ }
467
+ trackDoneCallback();
447
468
  return { payloadType: "void" };
448
469
  }
449
470
  throw new Error(`Unknown callback type: ${data.payload}`);
@@ -93,6 +93,7 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
93
93
  return prom.promise;
94
94
  });
95
95
  const callbacks = {};
96
+ const trackDoneCallbacks = {};
96
97
  function onMessage(message) {
97
98
  const data = message.data;
98
99
  if (data.type === 'response-done') {
@@ -284,15 +285,35 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
284
285
  if (!callback) {
285
286
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
286
287
  }
287
- await callback(data.payload.value);
288
- return { payloadType: 'void' };
288
+ const trackDoneCallback = await callback(data.payload.value);
289
+ if (trackDoneCallback) {
290
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
291
+ }
292
+ return {
293
+ payloadType: 'on-sample-response',
294
+ registeredTrackDoneCallback: Boolean(trackDoneCallback),
295
+ };
289
296
  }
290
297
  if (data.payload.callbackType === 'on-video-sample') {
291
298
  const callback = callbacks[data.payload.trackId];
292
299
  if (!callback) {
293
300
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
294
301
  }
295
- await callback(data.payload.value);
302
+ const trackDoneCallback = await callback(data.payload.value);
303
+ if (trackDoneCallback) {
304
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
305
+ }
306
+ return {
307
+ payloadType: 'on-sample-response',
308
+ registeredTrackDoneCallback: Boolean(trackDoneCallback),
309
+ };
310
+ }
311
+ if (data.payload.callbackType === 'track-done') {
312
+ const trackDoneCallback = trackDoneCallbacks[data.payload.trackId];
313
+ if (!trackDoneCallback) {
314
+ throw new Error(`No track done callback registered for track ${data.payload.trackId}`);
315
+ }
316
+ trackDoneCallback();
296
317
  return { payloadType: 'void' };
297
318
  }
298
319
  throw new Error(`Unknown callback type: ${data.payload}`);
@@ -82,6 +82,9 @@ const makeFetchRequest = async ({ range, src, controller, }) => {
82
82
  const parsedContentRange = contentRange
83
83
  ? parseContentRange(contentRange)
84
84
  : null;
85
+ if (!res.ok) {
86
+ throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
87
+ }
85
88
  const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
86
89
  requestedRange,
87
90
  parsedContentRange,
@@ -92,10 +95,6 @@ const makeFetchRequest = async ({ range, src, controller, }) => {
92
95
  ownController.abort(new errors_1.MediaParserAbortError('Aborted by user'));
93
96
  }, { once: true });
94
97
  }
95
- if (res.status.toString().startsWith('4') ||
96
- res.status.toString().startsWith('5')) {
97
- throw new Error(`Server returned status code ${res.status} for ${resolvedUrl} and range ${requestedRange}`);
98
- }
99
98
  const contentDisposition = res.headers.get('content-disposition');
100
99
  const name = (_a = contentDisposition === null || contentDisposition === void 0 ? void 0 : contentDisposition.match(/filename="([^"]+)"/)) === null || _a === void 0 ? void 0 : _a[1];
101
100
  const { contentLength, needsContentRange, reader } = await (0, get_body_and_reader_1.getLengthAndReader)({
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.318";
1
+ export declare const VERSION = "4.0.320";
package/dist/version.js CHANGED
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // Automatically generated on publish
5
- exports.VERSION = '4.0.318';
5
+ exports.VERSION = '4.0.320';
@@ -240,6 +240,9 @@ export type ResponseCallbackPayload = {
240
240
  callbackType: 'on-video-sample';
241
241
  value: MediaParserVideoSample;
242
242
  trackId: number;
243
+ } | {
244
+ callbackType: 'track-done';
245
+ trackId: number;
243
246
  } | {
244
247
  callbackType: 'm3u-associated-playlists-selection';
245
248
  value: SelectM3uAssociatedPlaylistsFnOptions;
@@ -263,6 +266,9 @@ export type AcknowledgePayload = {
263
266
  } | {
264
267
  payloadType: 'on-video-track-response';
265
268
  registeredCallback: boolean;
269
+ } | {
270
+ payloadType: 'on-sample-response';
271
+ registeredTrackDoneCallback: boolean;
266
272
  };
267
273
  export type AcknowledgeCallback = {
268
274
  type: 'acknowledge-callback';
@@ -328,11 +328,23 @@ const startParsing = async (message, reader) => {
328
328
  return null;
329
329
  }
330
330
  return async (sample) => {
331
- await executeCallback({
331
+ const audioSampleRes = await executeCallback({
332
332
  callbackType: 'on-audio-sample',
333
333
  value: sample,
334
334
  trackId: params.track.trackId,
335
335
  });
336
+ if (audioSampleRes.payloadType !== 'on-sample-response') {
337
+ throw new Error('Invalid response from callback');
338
+ }
339
+ if (!audioSampleRes.registeredTrackDoneCallback) {
340
+ return;
341
+ }
342
+ return async () => {
343
+ await executeCallback({
344
+ callbackType: 'track-done',
345
+ trackId: params.track.trackId,
346
+ });
347
+ };
336
348
  };
337
349
  }
338
350
  : null,
@@ -349,11 +361,23 @@ const startParsing = async (message, reader) => {
349
361
  return null;
350
362
  }
351
363
  return async (sample) => {
352
- await executeCallback({
364
+ const videoSampleRes = await executeCallback({
353
365
  callbackType: 'on-video-sample',
354
366
  value: sample,
355
367
  trackId: params.track.trackId,
356
368
  });
369
+ if (videoSampleRes.payloadType !== 'on-sample-response') {
370
+ throw new Error('Invalid response from callback');
371
+ }
372
+ if (!videoSampleRes.registeredTrackDoneCallback) {
373
+ return;
374
+ }
375
+ return async () => {
376
+ await executeCallback({
377
+ callbackType: 'track-done',
378
+ trackId: params.track.trackId,
379
+ });
380
+ };
357
381
  };
358
382
  }
359
383
  : null,
package/package.json CHANGED
@@ -3,15 +3,15 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
4
4
  },
5
5
  "name": "@remotion/media-parser",
6
- "version": "4.0.318",
6
+ "version": "4.0.320",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "devDependencies": {
10
10
  "@types/wicg-file-system-access": "2023.10.5",
11
11
  "eslint": "9.19.0",
12
12
  "@types/bun": "1.2.8",
13
- "@remotion/example-videos": "4.0.318",
14
- "@remotion/eslint-config-internal": "4.0.318"
13
+ "@remotion/example-videos": "4.0.320",
14
+ "@remotion/eslint-config-internal": "4.0.320"
15
15
  },
16
16
  "publishConfig": {
17
17
  "access": "public"
@@ -116,7 +116,7 @@
116
116
  "homepage": "https://www.remotion.dev/docs/media-parser",
117
117
  "description": "A pure JavaScript library for parsing video files",
118
118
  "scripts": {
119
- "formatting": "prettier src --check",
119
+ "formatting": "prettier --experimental-cli src --check",
120
120
  "lint": "eslint src",
121
121
  "test": "bun test src/test",
122
122
  "make": "tsc -d && bun --env-file=../.env.bundle bundle.ts"