@remotion/media-parser 4.0.252 → 4.0.253
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/abort.d.ts +1 -0
- package/dist/abort.js +7 -0
- package/dist/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/iso-base-media/get-keyframes.js +5 -2
- package/dist/containers/iso-base-media/get-moov-atom.js +2 -2
- package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +4 -1
- package/dist/containers/iso-base-media/get-sample-positions-from-track.js +7 -3
- package/dist/containers/iso-base-media/mdat/mdat.js +3 -3
- package/dist/containers/iso-base-media/traversal.d.ts +1 -1
- package/dist/containers/iso-base-media/traversal.js +5 -8
- package/dist/containers/webm/av1-codec-private.js +1 -1
- package/dist/controller.d.ts +17 -0
- package/dist/controller.js +31 -0
- package/dist/download-and-parse-media.js +3 -1
- package/dist/emitter.d.ts +20 -0
- package/dist/emitter.js +29 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +13 -1
- package/dist/esm/from-fetch.mjs +134 -8
- package/dist/esm/from-node.mjs +8 -8
- package/dist/esm/from-web-file.mjs +8 -8
- package/dist/esm/index.mjs +2640 -2490
- package/dist/get-duration.js +5 -2
- package/dist/get-fps.js +3 -0
- package/dist/index.d.ts +9 -7
- package/dist/index.js +7 -1
- package/dist/internal-parse-media.js +17 -7
- package/dist/media-parser-controller.d.ts +17 -0
- package/dist/media-parser-controller.js +31 -0
- package/dist/options.d.ts +4 -1
- package/dist/parse-media.js +3 -1
- package/dist/pause-signal.d.ts +11 -0
- package/dist/pause-signal.js +38 -0
- package/dist/perform-seek.js +3 -2
- package/dist/readers/from-fetch.js +11 -8
- package/dist/readers/from-node.js +8 -8
- package/dist/readers/from-web-file.js +8 -8
- package/dist/readers/reader.d.ts +2 -1
- package/dist/remotion-license-acknowledge.d.ts +6 -0
- package/dist/remotion-license-acknowledge.js +17 -0
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +2 -2
- package/dist/state/iso-base-media/cached-sample-positions.js +12 -6
- package/dist/state/iso-base-media/iso-state.d.ts +2 -2
- package/dist/state/parser-state.d.ts +6 -5
- package/dist/state/parser-state.js +3 -3
- package/dist/state/sample-callbacks.d.ts +3 -2
- package/dist/state/sample-callbacks.js +3 -3
- package/dist/throttled-progress.d.ts +3 -2
- package/dist/throttled-progress.js +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/LICENSE.md +0 -49
package/dist/abort.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const hasBeenAborted: (error: unknown) => error is MediaParserAbortError;
|
package/dist/abort.js
ADDED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
|
-
export declare const getChannelCount: (iterator: BufferIterator) =>
|
|
2
|
+
export declare const getChannelCount: (iterator: BufferIterator) => 2 | 8 | 1 | 7 | 3 | 4 | 5 | 6;
|
|
@@ -7,10 +7,13 @@ const traversal_1 = require("./traversal");
|
|
|
7
7
|
const getKeyframesFromIsoBaseMedia = (state) => {
|
|
8
8
|
const { videoTracks } = (0, get_tracks_1.getTracksFromIsoBaseMedia)(state);
|
|
9
9
|
const structure = state.getIsoStructure();
|
|
10
|
-
const moofBox = (0, traversal_1.
|
|
10
|
+
const moofBox = (0, traversal_1.getMoofBoxes)(structure.boxes);
|
|
11
11
|
const allSamples = videoTracks.map((t) => {
|
|
12
12
|
const { timescale: ts } = t;
|
|
13
|
-
const samplePositions = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)(
|
|
13
|
+
const samplePositions = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
|
|
14
|
+
trakBox: t.trakBox,
|
|
15
|
+
moofBoxes: moofBox,
|
|
16
|
+
});
|
|
14
17
|
const keyframes = samplePositions
|
|
15
18
|
.filter((k) => {
|
|
16
19
|
return k.isKeyframe;
|
|
@@ -11,12 +11,12 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
|
|
|
11
11
|
const { reader } = await state.readerInterface.read({
|
|
12
12
|
src: state.src,
|
|
13
13
|
range: endOfMdat,
|
|
14
|
-
|
|
14
|
+
controller: state.controller,
|
|
15
15
|
});
|
|
16
16
|
const childState = (0, parser_state_1.makeParserState)({
|
|
17
17
|
hasAudioTrackHandlers: false,
|
|
18
18
|
hasVideoTrackHandlers: false,
|
|
19
|
-
|
|
19
|
+
controller: state.controller,
|
|
20
20
|
fields: {
|
|
21
21
|
structure: true,
|
|
22
22
|
},
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { SamplePosition } from '../../get-sample-positions';
|
|
2
2
|
import type { IsoBaseMediaBox } from './base-media-box';
|
|
3
3
|
import type { TrakBox } from './trak/trak';
|
|
4
|
-
export declare const getSamplePositionsFromTrack: (trakBox
|
|
4
|
+
export declare const getSamplePositionsFromTrack: ({ trakBox, moofBoxes, }: {
|
|
5
|
+
trakBox: TrakBox;
|
|
6
|
+
moofBoxes: IsoBaseMediaBox[];
|
|
7
|
+
}) => SamplePosition[];
|
|
@@ -7,7 +7,7 @@ const get_sample_positions_1 = require("../../get-sample-positions");
|
|
|
7
7
|
const get_sample_positions_from_lpcm_1 = require("../../get-sample-positions-from-lpcm");
|
|
8
8
|
const samples_from_moof_1 = require("../../samples-from-moof");
|
|
9
9
|
const traversal_1 = require("./traversal");
|
|
10
|
-
const getSamplePositionsFromTrack = (trakBox,
|
|
10
|
+
const getSamplePositionsFromTrack = ({ trakBox, moofBoxes, }) => {
|
|
11
11
|
const isLpcm = (0, get_audio_codec_1.isLpcmAudioCodec)(trakBox);
|
|
12
12
|
const timescaleAndDuration = (0, get_fps_1.getTimescaleAndDuration)(trakBox);
|
|
13
13
|
if (isLpcm) {
|
|
@@ -46,8 +46,12 @@ const getSamplePositionsFromTrack = (trakBox, moofBox) => {
|
|
|
46
46
|
sttsBox,
|
|
47
47
|
cttsBox,
|
|
48
48
|
});
|
|
49
|
-
if (samplePositions.length === 0 &&
|
|
50
|
-
samplePositions =
|
|
49
|
+
if (samplePositions.length === 0 && moofBoxes.length > 0) {
|
|
50
|
+
samplePositions = moofBoxes
|
|
51
|
+
.map((m) => {
|
|
52
|
+
return (0, samples_from_moof_1.getSamplesFromMoof)({ moofBox: m, trackId: tkhdBox.trackId });
|
|
53
|
+
})
|
|
54
|
+
.flat(1);
|
|
51
55
|
}
|
|
52
56
|
return samplePositions;
|
|
53
57
|
};
|
|
@@ -25,10 +25,10 @@ const parseMdatSection = async (state) => {
|
|
|
25
25
|
state.getIsoStructure().boxes.push(moov);
|
|
26
26
|
return (0, exports.parseMdatSection)(state);
|
|
27
27
|
}
|
|
28
|
-
if (!state.iso.flatSamples.getSamples()) {
|
|
29
|
-
state.iso.flatSamples.setSamples((0, cached_sample_positions_1.calculateFlatSamples)(state));
|
|
28
|
+
if (!state.iso.flatSamples.getSamples(videoSection.start)) {
|
|
29
|
+
state.iso.flatSamples.setSamples(videoSection.start, (0, cached_sample_positions_1.calculateFlatSamples)(state));
|
|
30
30
|
}
|
|
31
|
-
const flatSamples = state.iso.flatSamples.getSamples();
|
|
31
|
+
const flatSamples = state.iso.flatSamples.getSamples(videoSection.start);
|
|
32
32
|
const { iterator } = state;
|
|
33
33
|
const samplesWithIndex = flatSamples.find((sample) => {
|
|
34
34
|
return sample.samplePosition.offset === iterator.counter.getOffset();
|
|
@@ -19,7 +19,7 @@ import type { TrakBox } from './trak/trak';
|
|
|
19
19
|
import type { TrunBox } from './trun';
|
|
20
20
|
export declare const getFtypBox: (segments: AnySegment[]) => FtypBox | null;
|
|
21
21
|
export declare const getMoovBox: (state: ParserState) => MoovBox | null;
|
|
22
|
-
export declare const
|
|
22
|
+
export declare const getMoofBoxes: (main: AnySegment[]) => IsoBaseMediaBox[];
|
|
23
23
|
export declare const getMvhdBox: (moovBox: MoovBox) => MvhdBox | null;
|
|
24
24
|
export declare const getTraks: (moovBox: MoovBox) => TrakBox[];
|
|
25
25
|
export declare const getTkhdBox: (trakBox: TrakBox) => TkhdBox | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getTrunBoxes = exports.getTfhdBox = exports.getTfdtBox = exports.getStssBox = exports.getStscBox = exports.getStszBox = exports.getCttsBox = exports.getSttsBox = exports.getStcoBox = exports.getVideoDescriptors = exports.getStsdBox = exports.getStblBox = exports.getMdhdBox = exports.getMdiaBox = exports.getTkhdBox = exports.getTraks = exports.getMvhdBox = exports.
|
|
3
|
+
exports.getTrunBoxes = exports.getTfhdBox = exports.getTfdtBox = exports.getStssBox = exports.getStscBox = exports.getStszBox = exports.getCttsBox = exports.getSttsBox = exports.getStcoBox = exports.getVideoDescriptors = exports.getStsdBox = exports.getStblBox = exports.getMdhdBox = exports.getMdiaBox = exports.getTkhdBox = exports.getTraks = exports.getMvhdBox = exports.getMoofBoxes = exports.getMoovBox = exports.getFtypBox = void 0;
|
|
4
4
|
const getFtypBox = (segments) => {
|
|
5
5
|
const ftypBox = segments.find((s) => s.type === 'ftyp-box');
|
|
6
6
|
if (!ftypBox || ftypBox.type !== 'ftyp-box') {
|
|
@@ -21,14 +21,11 @@ const getMoovBox = (state) => {
|
|
|
21
21
|
return moovBox;
|
|
22
22
|
};
|
|
23
23
|
exports.getMoovBox = getMoovBox;
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
return moofBox;
|
|
24
|
+
const getMoofBoxes = (main) => {
|
|
25
|
+
const moofBoxes = main.filter((s) => s.type === 'regular-box' && s.boxType === 'moof');
|
|
26
|
+
return moofBoxes;
|
|
30
27
|
};
|
|
31
|
-
exports.
|
|
28
|
+
exports.getMoofBoxes = getMoofBoxes;
|
|
32
29
|
const getMvhdBox = (moovBox) => {
|
|
33
30
|
const mvHdBox = moovBox.children.find((s) => s.type === 'mvhd-box');
|
|
34
31
|
if (!mvHdBox || mvHdBox.type !== 'mvhd-box') {
|
|
@@ -24,7 +24,7 @@ const parseAv1PrivateData = (data, colrAtom) => {
|
|
|
24
24
|
const seq_tier_0 = iterator.getBits(1);
|
|
25
25
|
// Level
|
|
26
26
|
// The level parameter value SHALL equal the first level value indicated by seq_level_idx in the Sequence Header OBU
|
|
27
|
-
str += seq_level_idx
|
|
27
|
+
str += String(seq_level_idx).padStart(2, '0');
|
|
28
28
|
str += seq_tier_0 ? 'H' : 'M';
|
|
29
29
|
str += '.';
|
|
30
30
|
// bitDepth
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MediaParserEmitter } from './emitter';
|
|
2
|
+
import type { PauseSignal } from './pause-signal';
|
|
3
|
+
export type MediaParserController = {
|
|
4
|
+
abort: (reason?: any) => void;
|
|
5
|
+
pause: PauseSignal['pause'];
|
|
6
|
+
resume: PauseSignal['resume'];
|
|
7
|
+
addEventListener: MediaParserEmitter['addEventListener'];
|
|
8
|
+
removeEventListener: MediaParserEmitter['removeEventListener'];
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Not public API
|
|
11
|
+
*/
|
|
12
|
+
_internals: {
|
|
13
|
+
signal: AbortSignal;
|
|
14
|
+
checkForAbortAndPause: () => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export declare const mediaParserController: () => MediaParserController;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mediaParserController = void 0;
|
|
4
|
+
const emitter_1 = require("./emitter");
|
|
5
|
+
const pause_signal_1 = require("./pause-signal");
|
|
6
|
+
const mediaParserController = () => {
|
|
7
|
+
const abortController = new AbortController();
|
|
8
|
+
const emitter = new emitter_1.MediaParserEmitter();
|
|
9
|
+
const pauseSignal = (0, pause_signal_1.makePauseSignal)(emitter);
|
|
10
|
+
const checkForAbortAndPause = async () => {
|
|
11
|
+
if (abortController.signal.aborted) {
|
|
12
|
+
throw new Error('Aborted');
|
|
13
|
+
}
|
|
14
|
+
await pauseSignal.waitUntilResume();
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
abort: (reason) => {
|
|
19
|
+
abortController.abort(reason);
|
|
20
|
+
},
|
|
21
|
+
pause: pauseSignal.pause,
|
|
22
|
+
resume: pauseSignal.resume,
|
|
23
|
+
addEventListener: emitter.addEventListener,
|
|
24
|
+
removeEventListener: emitter.removeEventListener,
|
|
25
|
+
_internals: {
|
|
26
|
+
signal: abortController.signal,
|
|
27
|
+
checkForAbortAndPause,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
exports.mediaParserController = mediaParserController;
|
|
@@ -51,7 +51,7 @@ const downloadAndParseMedia = async (options) => {
|
|
|
51
51
|
onVideoTrack: null,
|
|
52
52
|
progressIntervalInMs: (_6 = options.progressIntervalInMs) !== null && _6 !== void 0 ? _6 : null,
|
|
53
53
|
reader: (_7 = options.reader) !== null && _7 !== void 0 ? _7 : from_fetch_1.fetchReader,
|
|
54
|
-
|
|
54
|
+
controller: (_8 = options.controller) !== null && _8 !== void 0 ? _8 : undefined,
|
|
55
55
|
src: options.src,
|
|
56
56
|
onError: async (err) => {
|
|
57
57
|
var _a, _b;
|
|
@@ -63,6 +63,8 @@ const downloadAndParseMedia = async (options) => {
|
|
|
63
63
|
}
|
|
64
64
|
return action;
|
|
65
65
|
},
|
|
66
|
+
acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
|
|
67
|
+
apiName: 'parseAndDownloadMedia()',
|
|
66
68
|
});
|
|
67
69
|
await content.finish();
|
|
68
70
|
return returnValue;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type MediaParserEventMap = {
|
|
2
|
+
pause: undefined;
|
|
3
|
+
resume: undefined;
|
|
4
|
+
};
|
|
5
|
+
export type MediaParserEventTypes = keyof MediaParserEventMap;
|
|
6
|
+
export type CallbackListener<T extends MediaParserEventTypes> = (data: {
|
|
7
|
+
detail: MediaParserEventMap[T];
|
|
8
|
+
}) => void;
|
|
9
|
+
type MediaParserListeners = {
|
|
10
|
+
[EventType in MediaParserEventTypes]: CallbackListener<EventType>[];
|
|
11
|
+
};
|
|
12
|
+
export declare class MediaParserEmitter {
|
|
13
|
+
listeners: MediaParserListeners;
|
|
14
|
+
addEventListener: <Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>) => void;
|
|
15
|
+
removeEventListener: <Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>) => void;
|
|
16
|
+
private dispatchEvent;
|
|
17
|
+
dispatchPause: () => void;
|
|
18
|
+
dispatchResume: () => void;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
package/dist/emitter.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MediaParserEmitter = void 0;
|
|
4
|
+
class MediaParserEmitter {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.listeners = {
|
|
7
|
+
pause: [],
|
|
8
|
+
resume: [],
|
|
9
|
+
};
|
|
10
|
+
this.addEventListener = (name, callback) => {
|
|
11
|
+
this.listeners[name].push(callback);
|
|
12
|
+
};
|
|
13
|
+
this.removeEventListener = (name, callback) => {
|
|
14
|
+
this.listeners[name] = this.listeners[name].filter((l) => l !== callback);
|
|
15
|
+
};
|
|
16
|
+
this.dispatchPause = () => {
|
|
17
|
+
this.dispatchEvent('pause', undefined);
|
|
18
|
+
};
|
|
19
|
+
this.dispatchResume = () => {
|
|
20
|
+
this.dispatchEvent('resume', undefined);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
dispatchEvent(dispatchName, context) {
|
|
24
|
+
this.listeners[dispatchName].forEach((callback) => {
|
|
25
|
+
callback({ detail: context });
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.MediaParserEmitter = MediaParserEmitter;
|
package/dist/errors.d.ts
CHANGED
|
@@ -65,4 +65,8 @@ export declare class IsAnUnsupportedAudioTypeError extends Error {
|
|
|
65
65
|
audioType: UnsupportedAudioType | null;
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
+
export declare class MediaParserAbortError extends Error {
|
|
69
|
+
constructor(message: string);
|
|
70
|
+
}
|
|
71
|
+
export declare const hasBeenAborted: (error: unknown) => error is MediaParserAbortError;
|
|
68
72
|
export {};
|
package/dist/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IsAnUnsupportedAudioTypeError = exports.IsAnUnsupportedFileTypeError = exports.IsAPdfError = exports.IsAnImageError = exports.IsAGifError = void 0;
|
|
3
|
+
exports.hasBeenAborted = exports.MediaParserAbortError = exports.IsAnUnsupportedAudioTypeError = exports.IsAnUnsupportedFileTypeError = exports.IsAPdfError = exports.IsAnImageError = exports.IsAGifError = void 0;
|
|
4
4
|
class IsAGifError extends Error {
|
|
5
5
|
constructor({ message, mimeType, sizeInBytes, fileName, }) {
|
|
6
6
|
super(message);
|
|
@@ -69,3 +69,15 @@ class IsAnUnsupportedAudioTypeError extends Error {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
exports.IsAnUnsupportedAudioTypeError = IsAnUnsupportedAudioTypeError;
|
|
72
|
+
class MediaParserAbortError extends Error {
|
|
73
|
+
constructor(message) {
|
|
74
|
+
super(message);
|
|
75
|
+
this.name = 'MediaParserAbortError';
|
|
76
|
+
this.cause = undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.MediaParserAbortError = MediaParserAbortError;
|
|
80
|
+
const hasBeenAborted = (error) => {
|
|
81
|
+
return error instanceof MediaParserAbortError;
|
|
82
|
+
};
|
|
83
|
+
exports.hasBeenAborted = hasBeenAborted;
|
package/dist/esm/from-fetch.mjs
CHANGED
|
@@ -1,3 +1,129 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
class IsAGifError extends Error {
|
|
3
|
+
mimeType;
|
|
4
|
+
sizeInBytes;
|
|
5
|
+
fileName;
|
|
6
|
+
constructor({
|
|
7
|
+
message,
|
|
8
|
+
mimeType,
|
|
9
|
+
sizeInBytes,
|
|
10
|
+
fileName
|
|
11
|
+
}) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.fileName = "IsAGifError";
|
|
14
|
+
this.mimeType = mimeType;
|
|
15
|
+
this.sizeInBytes = sizeInBytes;
|
|
16
|
+
this.fileName = fileName;
|
|
17
|
+
if (Error.captureStackTrace) {
|
|
18
|
+
Error.captureStackTrace(this, IsAGifError);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class IsAnImageError extends Error {
|
|
24
|
+
imageType;
|
|
25
|
+
dimensions;
|
|
26
|
+
mimeType;
|
|
27
|
+
sizeInBytes;
|
|
28
|
+
fileName;
|
|
29
|
+
constructor({
|
|
30
|
+
dimensions,
|
|
31
|
+
imageType,
|
|
32
|
+
message,
|
|
33
|
+
mimeType,
|
|
34
|
+
sizeInBytes,
|
|
35
|
+
fileName
|
|
36
|
+
}) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = "IsAnImageError";
|
|
39
|
+
this.imageType = imageType;
|
|
40
|
+
this.dimensions = dimensions;
|
|
41
|
+
this.mimeType = mimeType;
|
|
42
|
+
this.sizeInBytes = sizeInBytes;
|
|
43
|
+
this.fileName = fileName;
|
|
44
|
+
if (Error.captureStackTrace) {
|
|
45
|
+
Error.captureStackTrace(this, IsAnImageError);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
class IsAPdfError extends Error {
|
|
51
|
+
mimeType;
|
|
52
|
+
sizeInBytes;
|
|
53
|
+
fileName;
|
|
54
|
+
constructor({
|
|
55
|
+
message,
|
|
56
|
+
mimeType,
|
|
57
|
+
sizeInBytes,
|
|
58
|
+
fileName
|
|
59
|
+
}) {
|
|
60
|
+
super(message);
|
|
61
|
+
this.name = "IsAPdfError";
|
|
62
|
+
this.mimeType = mimeType;
|
|
63
|
+
this.sizeInBytes = sizeInBytes;
|
|
64
|
+
this.fileName = fileName;
|
|
65
|
+
if (Error.captureStackTrace) {
|
|
66
|
+
Error.captureStackTrace(this, IsAPdfError);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
class IsAnUnsupportedFileTypeError extends Error {
|
|
72
|
+
mimeType;
|
|
73
|
+
sizeInBytes;
|
|
74
|
+
fileName;
|
|
75
|
+
constructor({
|
|
76
|
+
message,
|
|
77
|
+
mimeType,
|
|
78
|
+
sizeInBytes,
|
|
79
|
+
fileName
|
|
80
|
+
}) {
|
|
81
|
+
super(message);
|
|
82
|
+
this.name = "IsAnUnsupportedFileTypeError";
|
|
83
|
+
this.mimeType = mimeType;
|
|
84
|
+
this.sizeInBytes = sizeInBytes;
|
|
85
|
+
this.fileName = fileName;
|
|
86
|
+
if (Error.captureStackTrace) {
|
|
87
|
+
Error.captureStackTrace(this, IsAnUnsupportedFileTypeError);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
class IsAnUnsupportedAudioTypeError extends Error {
|
|
93
|
+
mimeType;
|
|
94
|
+
sizeInBytes;
|
|
95
|
+
fileName;
|
|
96
|
+
audioType;
|
|
97
|
+
constructor({
|
|
98
|
+
message,
|
|
99
|
+
mimeType,
|
|
100
|
+
sizeInBytes,
|
|
101
|
+
fileName,
|
|
102
|
+
audioType
|
|
103
|
+
}) {
|
|
104
|
+
super(message);
|
|
105
|
+
this.name = "IsAnUnsupportedAudioTypeError";
|
|
106
|
+
this.mimeType = mimeType;
|
|
107
|
+
this.sizeInBytes = sizeInBytes;
|
|
108
|
+
this.fileName = fileName;
|
|
109
|
+
this.audioType = audioType;
|
|
110
|
+
if (Error.captureStackTrace) {
|
|
111
|
+
Error.captureStackTrace(this, IsAnUnsupportedAudioTypeError);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
class MediaParserAbortError extends Error {
|
|
117
|
+
constructor(message) {
|
|
118
|
+
super(message);
|
|
119
|
+
this.name = "MediaParserAbortError";
|
|
120
|
+
this.cause = undefined;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
var hasBeenAborted = (error) => {
|
|
124
|
+
return error instanceof MediaParserAbortError;
|
|
125
|
+
};
|
|
126
|
+
|
|
1
127
|
// src/readers/from-fetch.ts
|
|
2
128
|
function parseContentRange(input) {
|
|
3
129
|
const matches = input.match(/^(\w+) ((\d+)-(\d+)|\*)\/(\d+|\*)$/);
|
|
@@ -31,7 +157,7 @@ var validateContentRangeAndDetectIfSupported = (actualRange, parsedContentRange,
|
|
|
31
157
|
return { supportsContentRange: true };
|
|
32
158
|
};
|
|
33
159
|
var fetchReader = {
|
|
34
|
-
read: async ({ src, range,
|
|
160
|
+
read: async ({ src, range, controller }) => {
|
|
35
161
|
if (typeof src !== "string") {
|
|
36
162
|
throw new Error("src must be a string when using `fetchReader`");
|
|
37
163
|
}
|
|
@@ -39,7 +165,7 @@ var fetchReader = {
|
|
|
39
165
|
if (!resolvedUrl.startsWith("https://") && !resolvedUrl.startsWith("blob:") && !resolvedUrl.startsWith("http://")) {
|
|
40
166
|
return Promise.reject(new Error(resolvedUrl + " 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()."));
|
|
41
167
|
}
|
|
42
|
-
const
|
|
168
|
+
const ownController = new AbortController;
|
|
43
169
|
const cache = typeof navigator !== "undefined" && navigator.userAgent.includes("Cloudflare-Workers") ? undefined : "no-store";
|
|
44
170
|
const actualRange = range === null ? 0 : range;
|
|
45
171
|
const res = await fetch(resolvedUrl, {
|
|
@@ -48,14 +174,14 @@ var fetchReader = {
|
|
|
48
174
|
} : {
|
|
49
175
|
Range: `bytes=${`${actualRange[0]}-${actualRange[1]}`}`
|
|
50
176
|
},
|
|
51
|
-
signal:
|
|
177
|
+
signal: ownController.signal,
|
|
52
178
|
cache
|
|
53
179
|
});
|
|
54
180
|
const contentRange = res.headers.get("content-range");
|
|
55
181
|
const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
|
|
56
182
|
const { supportsContentRange } = validateContentRangeAndDetectIfSupported(actualRange, parsedContentRange, res.status);
|
|
57
|
-
signal
|
|
58
|
-
|
|
183
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
184
|
+
ownController.abort(new MediaParserAbortError("Aborted by user"));
|
|
59
185
|
}, { once: true });
|
|
60
186
|
if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
|
|
61
187
|
throw new Error(`Server returned status code ${res.status} for ${src} and range ${actualRange}`);
|
|
@@ -69,8 +195,8 @@ var fetchReader = {
|
|
|
69
195
|
const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
|
|
70
196
|
const fallbackName = src.split("/").pop();
|
|
71
197
|
const reader = res.body.getReader();
|
|
72
|
-
if (
|
|
73
|
-
signal.addEventListener("abort", () => {
|
|
198
|
+
if (controller) {
|
|
199
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
74
200
|
reader.cancel().catch(() => {
|
|
75
201
|
});
|
|
76
202
|
}, { once: true });
|
|
@@ -79,7 +205,7 @@ var fetchReader = {
|
|
|
79
205
|
reader: {
|
|
80
206
|
reader,
|
|
81
207
|
abort: () => {
|
|
82
|
-
|
|
208
|
+
ownController.abort();
|
|
83
209
|
}
|
|
84
210
|
},
|
|
85
211
|
contentLength,
|
package/dist/esm/from-node.mjs
CHANGED
|
@@ -3,23 +3,23 @@ import { createReadStream, statSync } from "fs";
|
|
|
3
3
|
import { sep } from "path";
|
|
4
4
|
import { Readable } from "stream";
|
|
5
5
|
var nodeReader = {
|
|
6
|
-
read: ({ src, range,
|
|
6
|
+
read: ({ src, range, controller }) => {
|
|
7
7
|
if (typeof src !== "string") {
|
|
8
8
|
throw new Error("src must be a string when using `nodeReader`");
|
|
9
9
|
}
|
|
10
|
-
const
|
|
10
|
+
const ownController = new AbortController;
|
|
11
11
|
const stream = createReadStream(src, {
|
|
12
12
|
start: range === null ? 0 : typeof range === "number" ? range : range[0],
|
|
13
13
|
end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
|
|
14
|
-
signal:
|
|
14
|
+
signal: ownController.signal
|
|
15
15
|
});
|
|
16
|
-
signal
|
|
17
|
-
|
|
16
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
17
|
+
ownController.abort();
|
|
18
18
|
}, { once: true });
|
|
19
19
|
const stats = statSync(src);
|
|
20
20
|
const reader = Readable.toWeb(stream).getReader();
|
|
21
|
-
if (
|
|
22
|
-
signal.addEventListener("abort", () => {
|
|
21
|
+
if (controller) {
|
|
22
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
23
23
|
reader.cancel().catch(() => {
|
|
24
24
|
});
|
|
25
25
|
}, { once: true });
|
|
@@ -28,7 +28,7 @@ var nodeReader = {
|
|
|
28
28
|
reader: {
|
|
29
29
|
reader,
|
|
30
30
|
abort: () => {
|
|
31
|
-
|
|
31
|
+
ownController.abort();
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
contentLength: stats.size,
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
// src/readers/from-web-file.ts
|
|
2
2
|
var webFileReader = {
|
|
3
|
-
read: ({ src, range,
|
|
3
|
+
read: ({ src, range, controller }) => {
|
|
4
4
|
if (typeof src === "string") {
|
|
5
5
|
throw new Error("`inputTypeFileReader` only supports `File` objects");
|
|
6
6
|
}
|
|
7
7
|
const part = range === null ? src : typeof range === "number" ? src.slice(range) : src.slice(range[0], range[1]);
|
|
8
8
|
const reader = new FileReader;
|
|
9
9
|
reader.readAsArrayBuffer(src);
|
|
10
|
-
const
|
|
11
|
-
if (
|
|
12
|
-
|
|
10
|
+
const ownController = new AbortController;
|
|
11
|
+
if (ownController) {
|
|
12
|
+
ownController.signal.addEventListener("abort", () => {
|
|
13
13
|
reader.abort();
|
|
14
14
|
}, { once: true });
|
|
15
15
|
}
|
|
16
|
-
if (
|
|
17
|
-
signal.addEventListener("abort", () => {
|
|
18
|
-
|
|
16
|
+
if (controller) {
|
|
17
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
18
|
+
ownController.abort();
|
|
19
19
|
}, { once: true });
|
|
20
20
|
}
|
|
21
21
|
return new Promise((resolve, reject) => {
|
|
@@ -27,7 +27,7 @@ var webFileReader = {
|
|
|
27
27
|
reader: streamReader,
|
|
28
28
|
abort() {
|
|
29
29
|
streamReader.cancel();
|
|
30
|
-
|
|
30
|
+
ownController.abort();
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
contentLength: src.size,
|