@remotion/media-parser 4.0.270 → 4.0.271
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/aac-codecprivate.js +6 -13
- package/dist/add-avc-profile-to-track.js +5 -9
- package/dist/buffer-iterator.js +8 -13
- package/dist/combine-uint8-arrays.js +1 -5
- package/dist/containers/aac/parse-aac.js +9 -13
- package/dist/containers/aac/types.js +1 -2
- package/dist/containers/avc/codec-string.js +1 -5
- package/dist/containers/avc/color.js +3 -9
- package/dist/containers/avc/create-sps-pps-data.js +5 -9
- package/dist/containers/avc/interpret-sps.js +7 -13
- package/dist/containers/avc/key.js +1 -5
- package/dist/containers/avc/parse-avc.js +3 -7
- package/dist/containers/avc/sps-and-pps.js +1 -5
- package/dist/containers/flac/get-block-size.js +1 -5
- package/dist/containers/flac/get-channel-count.js +1 -5
- package/dist/containers/flac/get-duration-from-flac.js +1 -5
- package/dist/containers/flac/get-metadata-from-flac.js +1 -5
- package/dist/containers/flac/get-sample-rate.js +1 -5
- package/dist/containers/flac/parse-flac-frame.js +14 -19
- package/dist/containers/flac/parse-flac.js +15 -19
- package/dist/containers/flac/parse-header.js +1 -5
- package/dist/containers/flac/parse-metadata.js +1 -5
- package/dist/containers/flac/parse-streaminfo.js +3 -7
- package/dist/containers/flac/parse-unknown-block.js +1 -5
- package/dist/containers/flac/types.d.ts +2 -2
- package/dist/containers/flac/types.js +1 -2
- package/dist/containers/iso-base-media/base-media-box.js +1 -2
- package/dist/containers/iso-base-media/base-type.js +1 -2
- package/dist/containers/iso-base-media/esds/decoder-specific-config.js +1 -5
- package/dist/containers/iso-base-media/esds/esds-descriptors.js +5 -10
- package/dist/containers/iso-base-media/esds/esds.js +3 -7
- package/dist/containers/iso-base-media/ftyp.js +1 -5
- package/dist/containers/iso-base-media/get-actual-number-of-channels.js +4 -8
- package/dist/containers/iso-base-media/get-children.js +3 -7
- package/dist/containers/iso-base-media/get-keyframes.js +7 -11
- package/dist/containers/iso-base-media/get-moov-atom.js +21 -15
- package/dist/containers/iso-base-media/get-sample-positions-from-track.js +20 -24
- package/dist/containers/iso-base-media/get-video-codec-from-iso-track.d.ts +1 -1
- package/dist/containers/iso-base-media/get-video-codec-from-iso-track.js +3 -7
- package/dist/containers/iso-base-media/make-track.js +30 -34
- package/dist/containers/iso-base-media/mdat/mdat.js +16 -20
- package/dist/containers/iso-base-media/mdhd.js +1 -5
- package/dist/containers/iso-base-media/meta/hdlr.js +1 -5
- package/dist/containers/iso-base-media/meta/ilst.js +1 -5
- package/dist/containers/iso-base-media/moov/moov.js +3 -7
- package/dist/containers/iso-base-media/mvhd.js +7 -11
- package/dist/containers/iso-base-media/parse-boxes.js +5 -9
- package/dist/containers/iso-base-media/parse-icc-profile.js +4 -8
- package/dist/containers/iso-base-media/process-box.js +63 -67
- package/dist/containers/iso-base-media/stsd/av1c.js +1 -5
- package/dist/containers/iso-base-media/stsd/avcc.js +1 -5
- package/dist/containers/iso-base-media/stsd/colr.js +3 -7
- package/dist/containers/iso-base-media/stsd/ctts.js +1 -5
- package/dist/containers/iso-base-media/stsd/hvcc.js +3 -7
- package/dist/containers/iso-base-media/stsd/keys.js +1 -5
- package/dist/containers/iso-base-media/stsd/mebx.js +3 -7
- package/dist/containers/iso-base-media/stsd/pasp.js +1 -5
- package/dist/containers/iso-base-media/stsd/samples.js +8 -13
- package/dist/containers/iso-base-media/stsd/stco.js +1 -5
- package/dist/containers/iso-base-media/stsd/stsc.js +1 -5
- package/dist/containers/iso-base-media/stsd/stsd.js +3 -7
- package/dist/containers/iso-base-media/stsd/stss.js +1 -5
- package/dist/containers/iso-base-media/stsd/stsz.js +1 -5
- package/dist/containers/iso-base-media/stsd/stts.js +1 -5
- package/dist/containers/iso-base-media/tfdt.js +1 -5
- package/dist/containers/iso-base-media/tfhd.js +1 -5
- package/dist/containers/iso-base-media/tkhd.js +4 -8
- package/dist/containers/iso-base-media/to-date.js +1 -5
- package/dist/containers/iso-base-media/trak/trak.js +3 -7
- package/dist/containers/iso-base-media/traversal.d.ts +3 -2
- package/dist/containers/iso-base-media/traversal.js +42 -57
- package/dist/containers/iso-base-media/trun.js +2 -6
- package/dist/containers/iso-base-media/void-box.js +1 -2
- package/dist/containers/m3u/after-manifest-fetch.d.ts +5 -3
- package/dist/containers/m3u/after-manifest-fetch.js +13 -17
- package/dist/containers/m3u/fetch-m3u8-stream.d.ts +5 -1
- package/dist/containers/m3u/fetch-m3u8-stream.js +4 -12
- package/dist/containers/m3u/get-chunks.d.ts +1 -0
- package/dist/containers/m3u/get-chunks.js +6 -6
- package/dist/containers/m3u/get-duration-from-m3u.js +4 -8
- package/dist/containers/m3u/get-playlist.js +6 -12
- package/dist/containers/m3u/get-streams.d.ts +11 -5
- package/dist/containers/m3u/get-streams.js +5 -15
- package/dist/containers/m3u/iterate-over-segment-files.d.ts +19 -0
- package/dist/containers/m3u/iterate-over-segment-files.js +106 -0
- package/dist/containers/m3u/parse-directive.js +10 -10
- package/dist/containers/m3u/parse-m3u-manifest.js +3 -7
- package/dist/containers/m3u/parse-m3u-media-directive.d.ts +1 -0
- package/dist/containers/m3u/parse-m3u-media-directive.js +7 -7
- package/dist/containers/m3u/parse-m3u.js +13 -13
- package/dist/containers/m3u/parse-m3u8-text.js +3 -7
- package/dist/containers/m3u/parse-stream-inf.js +2 -7
- package/dist/containers/m3u/return-packets.d.ts +1 -1
- package/dist/containers/m3u/return-packets.js +14 -5
- package/dist/containers/m3u/run-over-m3u.js +10 -13
- package/dist/containers/m3u/sample-sorter.js +4 -8
- package/dist/containers/m3u/select-stream.d.ts +3 -2
- package/dist/containers/m3u/select-stream.js +9 -13
- package/dist/containers/m3u/types.d.ts +1 -1
- package/dist/containers/m3u/types.js +1 -2
- package/dist/containers/mp3/get-duration.js +5 -9
- package/dist/containers/mp3/get-frame-length.js +2 -7
- package/dist/containers/mp3/get-metadata-from-mp3.d.ts +2 -2
- package/dist/containers/mp3/get-metadata-from-mp3.js +1 -5
- package/dist/containers/mp3/id3-v1.js +1 -5
- package/dist/containers/mp3/id3.js +1 -5
- package/dist/containers/mp3/parse-mp3.js +7 -11
- package/dist/containers/mp3/parse-mpeg-header.js +10 -14
- package/dist/containers/mp3/samples-per-mpeg-file.js +1 -5
- package/dist/containers/riff/expect-riff-box.js +11 -15
- package/dist/containers/riff/get-duration.js +7 -12
- package/dist/containers/riff/get-tracks-from-avi.js +20 -28
- package/dist/containers/riff/is-movi.js +1 -5
- package/dist/containers/riff/parse-avih.js +1 -5
- package/dist/containers/riff/parse-isft.js +1 -5
- package/dist/containers/riff/parse-list-box.js +3 -7
- package/dist/containers/riff/parse-movi.js +13 -18
- package/dist/containers/riff/parse-riff-body.js +9 -13
- package/dist/containers/riff/parse-riff-box.js +9 -13
- package/dist/containers/riff/parse-riff-header.js +1 -5
- package/dist/containers/riff/parse-riff.js +5 -9
- package/dist/containers/riff/parse-strf.js +1 -5
- package/dist/containers/riff/parse-strh.js +3 -7
- package/dist/containers/riff/parse-video-section.js +7 -11
- package/dist/containers/riff/riff-box.js +1 -2
- package/dist/containers/riff/timescale.js +1 -4
- package/dist/containers/riff/traversal.js +7 -15
- package/dist/containers/transport-stream/adts-header.js +6 -10
- package/dist/containers/transport-stream/boxes.js +1 -2
- package/dist/containers/transport-stream/discard-rest-of-packet.js +2 -7
- package/dist/containers/transport-stream/find-separator.js +1 -4
- package/dist/containers/transport-stream/get-tracks.js +7 -12
- package/dist/containers/transport-stream/handle-aac-packet.js +12 -16
- package/dist/containers/transport-stream/handle-avc-packet.js +22 -26
- package/dist/containers/transport-stream/next-pes-header-store.js +1 -5
- package/dist/containers/transport-stream/parse-packet.js +13 -17
- package/dist/containers/transport-stream/parse-pat.js +5 -10
- package/dist/containers/transport-stream/parse-pes.js +1 -5
- package/dist/containers/transport-stream/parse-pmt.js +3 -7
- package/dist/containers/transport-stream/parse-stream-packet.js +13 -17
- package/dist/containers/transport-stream/parse-transport-stream.js +5 -9
- package/dist/containers/transport-stream/process-stream-buffers.js +10 -15
- package/dist/containers/transport-stream/traversal.js +4 -10
- package/dist/containers/wav/get-duration-from-wav.js +3 -8
- package/dist/containers/wav/get-metadata-from-wav.d.ts +2 -2
- package/dist/containers/wav/get-metadata-from-wav.js +1 -5
- package/dist/containers/wav/parse-data.js +5 -9
- package/dist/containers/wav/parse-fmt.js +3 -7
- package/dist/containers/wav/parse-header.js +1 -5
- package/dist/containers/wav/parse-id3.js +1 -5
- package/dist/containers/wav/parse-list.js +1 -5
- package/dist/containers/wav/parse-video-section.js +3 -7
- package/dist/containers/wav/parse-wav.js +15 -19
- package/dist/containers/wav/types.d.ts +2 -2
- package/dist/containers/wav/types.js +1 -2
- package/dist/containers/webm/allowed-partial-segments.js +1 -4
- package/dist/containers/webm/av1-codec-private.js +3 -7
- package/dist/containers/webm/color.js +6 -10
- package/dist/containers/webm/description.js +6 -10
- package/dist/containers/webm/get-ready-tracks.js +13 -18
- package/dist/containers/webm/get-sample-from-block.js +12 -16
- package/dist/containers/webm/make-track.js +43 -48
- package/dist/containers/webm/parse-ebml.js +14 -19
- package/dist/containers/webm/parse-webm-header.js +3 -7
- package/dist/containers/webm/segments/all-segments.js +168 -173
- package/dist/containers/webm/segments/block-simple-block-flags.js +4 -8
- package/dist/containers/webm/segments/track-entry.js +1 -5
- package/dist/containers/webm/segments.js +9 -13
- package/dist/containers/webm/traversal.js +37 -67
- package/dist/convert-audio-or-video-sample.js +1 -5
- package/dist/download-and-parse-media.js +44 -47
- package/dist/emit-available-info.js +38 -38
- package/dist/emitter.js +1 -5
- package/dist/errors.d.ts +2 -17
- package/dist/errors.js +10 -30
- package/dist/esm/fetch.mjs +93 -67
- package/dist/esm/index.mjs +679 -175
- package/dist/esm/node.mjs +59 -36
- package/dist/esm/universal.mjs +323 -0
- package/dist/esm/web-file.mjs +55 -43
- package/dist/esm/web.mjs +257 -0
- package/dist/esm/worker-server-entry.mjs +13056 -0
- package/dist/esm/worker-server.mjs +12914 -0
- package/dist/esm/worker-web-entry.mjs +12969 -0
- package/dist/esm/worker.mjs +439 -0
- package/dist/fetch.js +1 -17
- package/dist/file-types/bmp.js +3 -7
- package/dist/file-types/detect-file-type.js +24 -38
- package/dist/file-types/index.js +22 -26
- package/dist/file-types/jpeg.js +4 -9
- package/dist/file-types/pdf.js +3 -7
- package/dist/file-types/png.js +4 -9
- package/dist/file-types/webp.js +3 -7
- package/dist/forward-controller.js +1 -5
- package/dist/get-audio-codec.js +25 -38
- package/dist/get-container.d.ts +3 -3
- package/dist/get-container.js +5 -10
- package/dist/get-dimensions.js +8 -13
- package/dist/get-duration.js +27 -34
- package/dist/get-fields-from-callbacks.js +1 -5
- package/dist/get-fps.js +24 -34
- package/dist/get-is-hdr.js +5 -10
- package/dist/get-keyframes.js +6 -11
- package/dist/get-location.js +4 -9
- package/dist/get-number-of-audio-channels.js +2 -7
- package/dist/get-sample-aspect-ratio.js +17 -30
- package/dist/get-sample-positions-from-lpcm.js +5 -9
- package/dist/get-sample-positions.js +1 -5
- package/dist/get-sample-rate.js +2 -7
- package/dist/get-tracks.d.ts +5 -0
- package/dist/get-tracks.js +37 -44
- package/dist/get-video-codec.js +26 -34
- package/dist/has-all-info.js +33 -38
- package/dist/index.d.ts +15 -11
- package/dist/index.js +34 -48
- package/dist/init-video.d.ts +1 -1
- package/dist/init-video.js +47 -20
- package/dist/internal-parse-media.js +36 -40
- package/dist/is-audio-structure.d.ts +2 -2
- package/dist/is-audio-structure.js +1 -5
- package/dist/log.js +8 -12
- package/dist/make-hvc1-codec-strings.js +1 -5
- package/dist/media-parser-controller.js +7 -11
- package/dist/metadata/get-metadata.d.ts +4 -4
- package/dist/metadata/get-metadata.js +17 -22
- package/dist/metadata/metadata-from-iso.d.ts +3 -3
- package/dist/metadata/metadata-from-iso.js +12 -17
- package/dist/metadata/metadata-from-matroska.d.ts +2 -2
- package/dist/metadata/metadata-from-matroska.js +3 -7
- package/dist/metadata/metadata-from-riff.d.ts +2 -2
- package/dist/metadata/metadata-from-riff.js +3 -7
- package/dist/node-writer.js +1 -17
- package/dist/node.js +1 -17
- package/dist/options.d.ts +30 -24
- package/dist/options.js +1 -2
- package/dist/parse-media-on-browser-worker.d.ts +2 -0
- package/dist/parse-media-on-browser-worker.js +4 -0
- package/dist/parse-media-on-server-worker.d.ts +2 -0
- package/dist/parse-media-on-server-worker.js +4 -0
- package/dist/parse-media-on-web-worker.d.ts +2 -0
- package/dist/parse-media-on-web-worker.js +4 -0
- package/dist/parse-media-on-worker-entry.d.ts +2 -0
- package/dist/parse-media-on-worker-entry.js +269 -0
- package/dist/parse-media-on-worker.d.ts +2 -0
- package/dist/parse-media-on-worker.js +4 -0
- package/dist/parse-media.js +10 -13
- package/dist/parse-result.d.ts +3 -3
- package/dist/parse-result.js +1 -2
- package/dist/pause-signal.js +1 -5
- package/dist/perform-seek.js +6 -10
- package/dist/readers/fetch/get-body-and-reader.js +1 -5
- package/dist/readers/fetch/resolve-url.d.ts +1 -1
- package/dist/readers/fetch/resolve-url.js +1 -5
- package/dist/readers/from-fetch.d.ts +4 -1
- package/dist/readers/from-fetch.js +109 -94
- package/dist/readers/from-node.d.ts +4 -1
- package/dist/readers/from-node.js +58 -41
- package/dist/readers/from-web-file.d.ts +4 -1
- package/dist/readers/from-web-file.js +55 -49
- package/dist/readers/reader.d.ts +5 -1
- package/dist/readers/reader.js +1 -2
- package/dist/readers/universal.d.ts +2 -0
- package/dist/readers/universal.js +35 -0
- package/dist/readers/web.d.ts +2 -0
- package/dist/readers/web.js +22 -0
- package/dist/register-track.js +9 -15
- package/dist/remotion-license-acknowledge.js +4 -8
- package/dist/run-parse-iteration.js +26 -25
- package/dist/samples-from-moof.js +8 -12
- package/dist/skip.js +1 -5
- package/dist/state/aac-state.js +1 -5
- package/dist/state/can-skip-tracks.d.ts +2 -2
- package/dist/state/can-skip-tracks.js +3 -8
- package/dist/state/emitted-fields.js +1 -5
- package/dist/state/flac-state.js +1 -5
- package/dist/state/has-tracks-section.js +3 -7
- package/dist/state/images.js +1 -5
- package/dist/state/iso-base-media/cached-sample-positions.js +8 -13
- package/dist/state/iso-base-media/iso-state.js +5 -9
- package/dist/state/iso-base-media/moov-box.js +1 -5
- package/dist/state/keyframes.js +1 -5
- package/dist/state/last-eventloop-break.js +3 -7
- package/dist/state/m3u-state.d.ts +3 -0
- package/dist/state/m3u-state.js +16 -11
- package/dist/state/may-skip-video-data.js +3 -7
- package/dist/state/mp3.js +1 -5
- package/dist/state/need-samples-for-fields.js +1 -5
- package/dist/state/parser-state.d.ts +12 -10
- package/dist/state/parser-state.js +36 -41
- package/dist/state/riff.js +1 -5
- package/dist/state/sample-callbacks.js +8 -12
- package/dist/state/slow-duration-fps.js +1 -5
- package/dist/state/structure.d.ts +4 -4
- package/dist/state/structure.js +1 -5
- package/dist/state/transport-stream.js +3 -7
- package/dist/state/video-section.js +1 -5
- package/dist/state/webm.js +5 -9
- package/dist/throttled-progress.js +1 -5
- package/dist/truthy.js +1 -4
- package/dist/universal.d.ts +1 -0
- package/dist/universal.js +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -4
- package/dist/web-file.js +1 -17
- package/dist/web.d.ts +1 -0
- package/dist/web.js +1 -0
- package/dist/webcodec-sample-types.d.ts +6 -4
- package/dist/webcodec-sample-types.js +1 -2
- package/dist/worker/forward-controller.d.ts +3 -0
- package/dist/worker/forward-controller.js +20 -0
- package/dist/worker/serialize-error.d.ts +4 -0
- package/dist/worker/serialize-error.js +95 -0
- package/dist/worker/worker-types.d.ts +243 -0
- package/dist/worker/worker-types.js +1 -0
- package/dist/worker-bun-entry.d.ts +1 -0
- package/dist/worker-bun-entry.js +5 -0
- package/dist/worker-entry.d.ts +1 -0
- package/dist/worker-entry.js +5 -0
- package/dist/worker-server-entry.d.ts +1 -0
- package/dist/worker-server-entry.js +5 -0
- package/dist/worker-server.d.ts +2 -0
- package/dist/worker-server.js +381 -0
- package/dist/worker-web-entry.d.ts +1 -0
- package/dist/worker-web-entry.js +5 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +267 -0
- package/dist/writers/node.js +16 -23
- package/dist/writers/writer.js +1 -2
- package/package.json +40 -21
- package/fetch.js +0 -2
- package/test.json +0 -663
- package/web-file.js +0 -2
package/dist/esm/node.mjs
CHANGED
|
@@ -1,44 +1,67 @@
|
|
|
1
1
|
// src/readers/from-node.ts
|
|
2
|
-
import { createReadStream, statSync } from "fs";
|
|
3
|
-
import { sep } from "path";
|
|
2
|
+
import { createReadStream, promises, statSync } from "fs";
|
|
3
|
+
import { dirname, join, relative, sep } from "path";
|
|
4
4
|
import { Readable } from "stream";
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
var nodeReadContent = ({ src, range, controller }) => {
|
|
6
|
+
if (typeof src !== "string") {
|
|
7
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
8
|
+
}
|
|
9
|
+
const ownController = new AbortController;
|
|
10
|
+
const stream = createReadStream(src, {
|
|
11
|
+
start: range === null ? 0 : typeof range === "number" ? range : range[0],
|
|
12
|
+
end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
|
|
13
|
+
signal: ownController.signal
|
|
14
|
+
});
|
|
15
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
16
|
+
ownController.abort();
|
|
17
|
+
}, { once: true });
|
|
18
|
+
const stats = statSync(src);
|
|
19
|
+
const reader = Readable.toWeb(stream).getReader();
|
|
20
|
+
if (controller) {
|
|
16
21
|
controller._internals.signal.addEventListener("abort", () => {
|
|
17
|
-
|
|
22
|
+
reader.cancel().catch(() => {
|
|
23
|
+
});
|
|
18
24
|
}, { once: true });
|
|
19
|
-
const stats = statSync(src);
|
|
20
|
-
const reader = Readable.toWeb(stream).getReader();
|
|
21
|
-
if (controller) {
|
|
22
|
-
controller._internals.signal.addEventListener("abort", () => {
|
|
23
|
-
reader.cancel().catch(() => {
|
|
24
|
-
});
|
|
25
|
-
}, { once: true });
|
|
26
|
-
}
|
|
27
|
-
return Promise.resolve({
|
|
28
|
-
reader: {
|
|
29
|
-
reader,
|
|
30
|
-
abort: () => {
|
|
31
|
-
ownController.abort();
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
contentLength: stats.size,
|
|
35
|
-
contentType: null,
|
|
36
|
-
name: src.split(sep).pop(),
|
|
37
|
-
supportsContentRange: true,
|
|
38
|
-
needsContentRange: true
|
|
39
|
-
});
|
|
40
25
|
}
|
|
26
|
+
return Promise.resolve({
|
|
27
|
+
reader: {
|
|
28
|
+
reader,
|
|
29
|
+
abort: () => {
|
|
30
|
+
ownController.abort();
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
contentLength: stats.size,
|
|
34
|
+
contentType: null,
|
|
35
|
+
name: src.split(sep).pop(),
|
|
36
|
+
supportsContentRange: true,
|
|
37
|
+
needsContentRange: true
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
var nodeReadWholeAsText = (src) => {
|
|
41
|
+
if (typeof src !== "string") {
|
|
42
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
43
|
+
}
|
|
44
|
+
return promises.readFile(src, "utf8");
|
|
45
|
+
};
|
|
46
|
+
var nodeCreateAdjacentFileSource = (relativePath, src) => {
|
|
47
|
+
if (typeof src !== "string") {
|
|
48
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
49
|
+
}
|
|
50
|
+
const result = join(dirname(src), relativePath);
|
|
51
|
+
const rel = relative(dirname(src), result);
|
|
52
|
+
if (rel.startsWith("..")) {
|
|
53
|
+
throw new Error("Path is outside of the parent directory - not allowing reading of arbitrary files");
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
};
|
|
57
|
+
var nodeReader = {
|
|
58
|
+
read: nodeReadContent,
|
|
59
|
+
readWholeAsText: nodeReadWholeAsText,
|
|
60
|
+
createAdjacentFileSource: nodeCreateAdjacentFileSource
|
|
41
61
|
};
|
|
42
62
|
export {
|
|
43
|
-
nodeReader
|
|
63
|
+
nodeReader,
|
|
64
|
+
nodeReadWholeAsText,
|
|
65
|
+
nodeReadContent,
|
|
66
|
+
nodeCreateAdjacentFileSource
|
|
44
67
|
};
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
class MediaParserAbortError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "MediaParserAbortError";
|
|
6
|
+
this.cause = undefined;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// src/readers/fetch/get-body-and-reader.ts
|
|
11
|
+
var getLengthAndReader = async ({
|
|
12
|
+
canLiveWithoutContentLength,
|
|
13
|
+
res,
|
|
14
|
+
ownController,
|
|
15
|
+
requestedWithoutRange
|
|
16
|
+
}) => {
|
|
17
|
+
const length = res.headers.get("content-length");
|
|
18
|
+
const contentLength = length === null ? null : parseInt(length, 10);
|
|
19
|
+
if (requestedWithoutRange || canLiveWithoutContentLength && contentLength === null) {
|
|
20
|
+
const buffer = await res.arrayBuffer();
|
|
21
|
+
const encoded = new Uint8Array(buffer);
|
|
22
|
+
const stream = new ReadableStream({
|
|
23
|
+
start(controller) {
|
|
24
|
+
controller.enqueue(encoded);
|
|
25
|
+
controller.close();
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
contentLength: encoded.byteLength,
|
|
30
|
+
reader: {
|
|
31
|
+
reader: stream.getReader(),
|
|
32
|
+
abort() {
|
|
33
|
+
ownController.abort();
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
needsContentRange: false
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (!res.body) {
|
|
40
|
+
throw new Error("No body");
|
|
41
|
+
}
|
|
42
|
+
const reader = res.body.getReader();
|
|
43
|
+
return {
|
|
44
|
+
reader: {
|
|
45
|
+
reader,
|
|
46
|
+
abort: () => {
|
|
47
|
+
ownController.abort();
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
contentLength,
|
|
51
|
+
needsContentRange: true
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/readers/fetch/resolve-url.ts
|
|
56
|
+
var resolveUrl = (src) => {
|
|
57
|
+
try {
|
|
58
|
+
const resolvedUrl = typeof window !== "undefined" && typeof window.location !== "undefined" ? new URL(src, window.location.origin) : new URL(src);
|
|
59
|
+
return resolvedUrl;
|
|
60
|
+
} catch {
|
|
61
|
+
return src;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/readers/from-fetch.ts
|
|
66
|
+
function parseContentRange(input) {
|
|
67
|
+
const matches = input.match(/^(\w+) ((\d+)-(\d+)|\*)\/(\d+|\*)$/);
|
|
68
|
+
if (!matches)
|
|
69
|
+
return null;
|
|
70
|
+
const [, unit, , start, end, size] = matches;
|
|
71
|
+
const range = {
|
|
72
|
+
unit,
|
|
73
|
+
start: start != null ? Number(start) : null,
|
|
74
|
+
end: end != null ? Number(end) : null,
|
|
75
|
+
size: size === "*" ? null : Number(size)
|
|
76
|
+
};
|
|
77
|
+
if (range.start === null && range.end === null && range.size === null) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return range;
|
|
81
|
+
}
|
|
82
|
+
var validateContentRangeAndDetectIfSupported = ({
|
|
83
|
+
requestedRange,
|
|
84
|
+
parsedContentRange,
|
|
85
|
+
statusCode
|
|
86
|
+
}) => {
|
|
87
|
+
if (statusCode === 206) {
|
|
88
|
+
return { supportsContentRange: true };
|
|
89
|
+
}
|
|
90
|
+
if (typeof requestedRange === "number" && parsedContentRange?.start !== requestedRange) {
|
|
91
|
+
if (requestedRange === 0) {
|
|
92
|
+
return { supportsContentRange: false };
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Range header (${requestedRange}) does not match content-range header (${parsedContentRange?.start})`);
|
|
95
|
+
}
|
|
96
|
+
if (requestedRange !== null && typeof requestedRange !== "number" && (parsedContentRange?.start !== requestedRange[0] || parsedContentRange?.end !== requestedRange[1])) {
|
|
97
|
+
throw new Error(`Range header (${requestedRange}) does not match content-range header (${parsedContentRange?.start})`);
|
|
98
|
+
}
|
|
99
|
+
return { supportsContentRange: true };
|
|
100
|
+
};
|
|
101
|
+
var fetchReadContent = async ({
|
|
102
|
+
src,
|
|
103
|
+
range,
|
|
104
|
+
controller
|
|
105
|
+
}) => {
|
|
106
|
+
if (typeof src !== "string" && src instanceof URL === false) {
|
|
107
|
+
throw new Error("src must be a string when using `fetchReader`");
|
|
108
|
+
}
|
|
109
|
+
const resolvedUrl = resolveUrl(src);
|
|
110
|
+
const resolvedUrlString = resolvedUrl.toString();
|
|
111
|
+
if (!resolvedUrlString.startsWith("https://") && !resolvedUrlString.startsWith("blob:") && !resolvedUrlString.startsWith("http://")) {
|
|
112
|
+
return Promise.reject(new Error(`${resolvedUrlString} is not a URL - needs to start with http:// or https:// or blob:. If you want to read a local file, pass \`reader: nodeReader\` to parseMedia().`));
|
|
113
|
+
}
|
|
114
|
+
const ownController = new AbortController;
|
|
115
|
+
const cache = typeof navigator !== "undefined" && navigator.userAgent.includes("Cloudflare-Workers") ? undefined : "no-store";
|
|
116
|
+
const requestedRange = range === null ? 0 : range;
|
|
117
|
+
const asString = typeof resolvedUrl === "string" ? resolvedUrl : resolvedUrl.pathname;
|
|
118
|
+
const requestWithoutRange = asString.endsWith(".m3u8");
|
|
119
|
+
const canLiveWithoutContentLength = asString.endsWith(".m3u8") || asString.endsWith(".ts");
|
|
120
|
+
const headers = requestedRange === 0 && requestWithoutRange ? {} : typeof requestedRange === "number" ? {
|
|
121
|
+
Range: `bytes=${requestedRange}-`
|
|
122
|
+
} : {
|
|
123
|
+
Range: `bytes=${`${requestedRange[0]}-${requestedRange[1]}`}`
|
|
124
|
+
};
|
|
125
|
+
const res = await fetch(resolvedUrl, {
|
|
126
|
+
headers,
|
|
127
|
+
signal: ownController.signal,
|
|
128
|
+
cache
|
|
129
|
+
});
|
|
130
|
+
const contentRange = res.headers.get("content-range");
|
|
131
|
+
const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
|
|
132
|
+
const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
|
|
133
|
+
requestedRange,
|
|
134
|
+
parsedContentRange,
|
|
135
|
+
statusCode: res.status
|
|
136
|
+
});
|
|
137
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
138
|
+
ownController.abort(new MediaParserAbortError("Aborted by user"));
|
|
139
|
+
}, { once: true });
|
|
140
|
+
if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
|
|
141
|
+
throw new Error(`Server returned status code ${res.status} for ${src} and range ${requestedRange}`);
|
|
142
|
+
}
|
|
143
|
+
const contentDisposition = res.headers.get("content-disposition");
|
|
144
|
+
const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
|
|
145
|
+
const fallbackName = src.toString().split("/").pop();
|
|
146
|
+
const { contentLength, needsContentRange, reader } = await getLengthAndReader({
|
|
147
|
+
canLiveWithoutContentLength,
|
|
148
|
+
res,
|
|
149
|
+
ownController,
|
|
150
|
+
requestedWithoutRange: requestWithoutRange
|
|
151
|
+
});
|
|
152
|
+
if (controller) {
|
|
153
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
154
|
+
reader.reader.cancel().catch(() => {
|
|
155
|
+
});
|
|
156
|
+
}, { once: true });
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
reader,
|
|
160
|
+
contentLength,
|
|
161
|
+
contentType: res.headers.get("content-type"),
|
|
162
|
+
name: name ?? fallbackName,
|
|
163
|
+
supportsContentRange,
|
|
164
|
+
needsContentRange
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
var fetchReadWholeAsText = async (src) => {
|
|
168
|
+
if (typeof src !== "string" && src instanceof URL === false) {
|
|
169
|
+
throw new Error("src must be a string when using `fetchReader`");
|
|
170
|
+
}
|
|
171
|
+
const res = await fetch(src);
|
|
172
|
+
if (!res.ok) {
|
|
173
|
+
throw new Error(`Failed to fetch ${src} (HTTP code: ${res.status})`);
|
|
174
|
+
}
|
|
175
|
+
return res.text();
|
|
176
|
+
};
|
|
177
|
+
var fetchCreateAdjacentFileSource = (relativePath, src) => {
|
|
178
|
+
if (typeof src !== "string" && src instanceof URL === false) {
|
|
179
|
+
throw new Error("src must be a string or URL when using `fetchReader`");
|
|
180
|
+
}
|
|
181
|
+
return new URL(relativePath, src).toString();
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// src/readers/from-node.ts
|
|
185
|
+
import { createReadStream, promises, statSync } from "fs";
|
|
186
|
+
import { dirname, join, relative, sep } from "path";
|
|
187
|
+
import { Readable } from "stream";
|
|
188
|
+
var nodeReadContent = ({ src, range, controller }) => {
|
|
189
|
+
if (typeof src !== "string") {
|
|
190
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
191
|
+
}
|
|
192
|
+
const ownController = new AbortController;
|
|
193
|
+
const stream = createReadStream(src, {
|
|
194
|
+
start: range === null ? 0 : typeof range === "number" ? range : range[0],
|
|
195
|
+
end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
|
|
196
|
+
signal: ownController.signal
|
|
197
|
+
});
|
|
198
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
199
|
+
ownController.abort();
|
|
200
|
+
}, { once: true });
|
|
201
|
+
const stats = statSync(src);
|
|
202
|
+
const reader = Readable.toWeb(stream).getReader();
|
|
203
|
+
if (controller) {
|
|
204
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
205
|
+
reader.cancel().catch(() => {
|
|
206
|
+
});
|
|
207
|
+
}, { once: true });
|
|
208
|
+
}
|
|
209
|
+
return Promise.resolve({
|
|
210
|
+
reader: {
|
|
211
|
+
reader,
|
|
212
|
+
abort: () => {
|
|
213
|
+
ownController.abort();
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
contentLength: stats.size,
|
|
217
|
+
contentType: null,
|
|
218
|
+
name: src.split(sep).pop(),
|
|
219
|
+
supportsContentRange: true,
|
|
220
|
+
needsContentRange: true
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
var nodeReadWholeAsText = (src) => {
|
|
224
|
+
if (typeof src !== "string") {
|
|
225
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
226
|
+
}
|
|
227
|
+
return promises.readFile(src, "utf8");
|
|
228
|
+
};
|
|
229
|
+
var nodeCreateAdjacentFileSource = (relativePath, src) => {
|
|
230
|
+
if (typeof src !== "string") {
|
|
231
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
232
|
+
}
|
|
233
|
+
const result = join(dirname(src), relativePath);
|
|
234
|
+
const rel = relative(dirname(src), result);
|
|
235
|
+
if (rel.startsWith("..")) {
|
|
236
|
+
throw new Error("Path is outside of the parent directory - not allowing reading of arbitrary files");
|
|
237
|
+
}
|
|
238
|
+
return result;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
// src/readers/from-web-file.ts
|
|
242
|
+
var webFileReadContent = ({ src, range, controller }) => {
|
|
243
|
+
if (typeof src === "string" || src instanceof URL) {
|
|
244
|
+
throw new Error("`inputTypeFileReader` only supports `File` objects");
|
|
245
|
+
}
|
|
246
|
+
const part = range === null ? src : typeof range === "number" ? src.slice(range) : src.slice(range[0], range[1]);
|
|
247
|
+
const reader = new FileReader;
|
|
248
|
+
reader.readAsArrayBuffer(src);
|
|
249
|
+
const ownController = new AbortController;
|
|
250
|
+
if (ownController) {
|
|
251
|
+
ownController.signal.addEventListener("abort", () => {
|
|
252
|
+
reader.abort();
|
|
253
|
+
}, { once: true });
|
|
254
|
+
}
|
|
255
|
+
if (controller) {
|
|
256
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
257
|
+
ownController.abort();
|
|
258
|
+
}, { once: true });
|
|
259
|
+
}
|
|
260
|
+
return new Promise((resolve, reject) => {
|
|
261
|
+
reader.onload = () => {
|
|
262
|
+
const stream = part.stream();
|
|
263
|
+
const streamReader = stream.getReader();
|
|
264
|
+
resolve({
|
|
265
|
+
reader: {
|
|
266
|
+
reader: streamReader,
|
|
267
|
+
abort() {
|
|
268
|
+
streamReader.cancel();
|
|
269
|
+
ownController.abort();
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
contentLength: src.size,
|
|
273
|
+
name: src.name,
|
|
274
|
+
supportsContentRange: true,
|
|
275
|
+
contentType: src.type,
|
|
276
|
+
needsContentRange: true
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
reader.onerror = () => {
|
|
280
|
+
reject(reader.error);
|
|
281
|
+
};
|
|
282
|
+
});
|
|
283
|
+
};
|
|
284
|
+
var webFileReadWholeAsText = () => {
|
|
285
|
+
throw new Error("`webFileReader` cannot read auxiliary files.");
|
|
286
|
+
};
|
|
287
|
+
var webFileCreateAdjacentFileSource = () => {
|
|
288
|
+
throw new Error("`webFileReader` cannot create adjacent file sources.");
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
// src/readers/universal.ts
|
|
292
|
+
var universalReader = {
|
|
293
|
+
read: (params) => {
|
|
294
|
+
if (params.src instanceof Blob) {
|
|
295
|
+
return webFileReadContent(params);
|
|
296
|
+
}
|
|
297
|
+
if (params.src.toString().startsWith("http") || params.src.toString().startsWith("blob:")) {
|
|
298
|
+
return fetchReadContent(params);
|
|
299
|
+
}
|
|
300
|
+
return nodeReadContent(params);
|
|
301
|
+
},
|
|
302
|
+
readWholeAsText: (src) => {
|
|
303
|
+
if (src instanceof Blob) {
|
|
304
|
+
return webFileReadWholeAsText(src);
|
|
305
|
+
}
|
|
306
|
+
if (src.toString().startsWith("http") || src.toString().startsWith("blob:")) {
|
|
307
|
+
return fetchReadWholeAsText(src);
|
|
308
|
+
}
|
|
309
|
+
return nodeReadWholeAsText(src);
|
|
310
|
+
},
|
|
311
|
+
createAdjacentFileSource: (relativePath, src) => {
|
|
312
|
+
if (src instanceof Blob) {
|
|
313
|
+
return webFileCreateAdjacentFileSource(relativePath, src);
|
|
314
|
+
}
|
|
315
|
+
if (src.toString().startsWith("http") || src.toString().startsWith("blob:")) {
|
|
316
|
+
return fetchCreateAdjacentFileSource(relativePath, src);
|
|
317
|
+
}
|
|
318
|
+
return nodeCreateAdjacentFileSource(relativePath, src);
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
export {
|
|
322
|
+
universalReader
|
|
323
|
+
};
|
package/dist/esm/web-file.mjs
CHANGED
|
@@ -1,48 +1,60 @@
|
|
|
1
1
|
// src/readers/from-web-file.ts
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}, { once: true });
|
|
15
|
-
}
|
|
16
|
-
if (controller) {
|
|
17
|
-
controller._internals.signal.addEventListener("abort", () => {
|
|
18
|
-
ownController.abort();
|
|
19
|
-
}, { once: true });
|
|
20
|
-
}
|
|
21
|
-
return new Promise((resolve, reject) => {
|
|
22
|
-
reader.onload = () => {
|
|
23
|
-
const stream = part.stream();
|
|
24
|
-
const streamReader = stream.getReader();
|
|
25
|
-
resolve({
|
|
26
|
-
reader: {
|
|
27
|
-
reader: streamReader,
|
|
28
|
-
abort() {
|
|
29
|
-
streamReader.cancel();
|
|
30
|
-
ownController.abort();
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
contentLength: src.size,
|
|
34
|
-
name: src.name,
|
|
35
|
-
supportsContentRange: true,
|
|
36
|
-
contentType: src.type,
|
|
37
|
-
needsContentRange: true
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
reader.onerror = (error) => {
|
|
41
|
-
reject(error);
|
|
42
|
-
};
|
|
43
|
-
});
|
|
2
|
+
var webFileReadContent = ({ src, range, controller }) => {
|
|
3
|
+
if (typeof src === "string" || src instanceof URL) {
|
|
4
|
+
throw new Error("`inputTypeFileReader` only supports `File` objects");
|
|
5
|
+
}
|
|
6
|
+
const part = range === null ? src : typeof range === "number" ? src.slice(range) : src.slice(range[0], range[1]);
|
|
7
|
+
const reader = new FileReader;
|
|
8
|
+
reader.readAsArrayBuffer(src);
|
|
9
|
+
const ownController = new AbortController;
|
|
10
|
+
if (ownController) {
|
|
11
|
+
ownController.signal.addEventListener("abort", () => {
|
|
12
|
+
reader.abort();
|
|
13
|
+
}, { once: true });
|
|
44
14
|
}
|
|
15
|
+
if (controller) {
|
|
16
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
17
|
+
ownController.abort();
|
|
18
|
+
}, { once: true });
|
|
19
|
+
}
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
reader.onload = () => {
|
|
22
|
+
const stream = part.stream();
|
|
23
|
+
const streamReader = stream.getReader();
|
|
24
|
+
resolve({
|
|
25
|
+
reader: {
|
|
26
|
+
reader: streamReader,
|
|
27
|
+
abort() {
|
|
28
|
+
streamReader.cancel();
|
|
29
|
+
ownController.abort();
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
contentLength: src.size,
|
|
33
|
+
name: src.name,
|
|
34
|
+
supportsContentRange: true,
|
|
35
|
+
contentType: src.type,
|
|
36
|
+
needsContentRange: true
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
reader.onerror = (error) => {
|
|
40
|
+
reject(error);
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var webFileReadWholeAsText = () => {
|
|
45
|
+
throw new Error("`webFileReader` cannot read auxiliary files.");
|
|
46
|
+
};
|
|
47
|
+
var webFileCreateAdjacentFileSource = () => {
|
|
48
|
+
throw new Error("`webFileReader` cannot create adjacent file sources.");
|
|
49
|
+
};
|
|
50
|
+
var webFileReader = {
|
|
51
|
+
read: webFileReadContent,
|
|
52
|
+
readWholeAsText: webFileReadWholeAsText,
|
|
53
|
+
createAdjacentFileSource: webFileCreateAdjacentFileSource
|
|
45
54
|
};
|
|
46
55
|
export {
|
|
47
|
-
webFileReader
|
|
56
|
+
webFileReader,
|
|
57
|
+
webFileReadWholeAsText,
|
|
58
|
+
webFileReadContent,
|
|
59
|
+
webFileCreateAdjacentFileSource
|
|
48
60
|
};
|