@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.
- package/dist/containers/iso-base-media/mvhd.d.ts +30 -0
- package/dist/containers/iso-base-media/mvhd.js +65 -0
- package/dist/esm/index.mjs +4 -4
- package/dist/esm/server-worker.mjs +24 -3
- package/dist/esm/universal.mjs +3 -3
- package/dist/esm/web.mjs +3 -3
- package/dist/esm/worker-server-entry.mjs +29 -5
- package/dist/esm/worker-web-entry.mjs +29 -5
- package/dist/esm/worker.mjs +24 -3
- package/dist/parse-media-on-worker-entry.js +24 -3
- package/dist/readers/from-fetch.js +3 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/worker-types.d.ts +6 -0
- package/dist/worker-server.js +26 -2
- package/package.json +4 -4
|
@@ -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;
|
package/dist/esm/index.mjs
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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}`);
|
package/dist/esm/universal.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({
|
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,
|
package/dist/esm/worker.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
1
|
+
export declare const VERSION = "4.0.320";
|
package/dist/version.js
CHANGED
|
@@ -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';
|
package/dist/worker-server.js
CHANGED
|
@@ -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.
|
|
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.
|
|
14
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
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"
|