@remotion/media-parser 4.0.233 → 4.0.235
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.d.ts +19 -0
- package/dist/aac-codecprivate.js +122 -0
- package/dist/add-avc-profile-to-track.d.ts +1 -1
- package/dist/boxes/iso-base-media/get-actual-number-of-channels.d.ts +13 -0
- package/dist/boxes/iso-base-media/get-actual-number-of-channels.js +22 -0
- package/dist/boxes/iso-base-media/make-track.js +16 -7
- package/dist/boxes/iso-base-media/meta/hdlr.d.ts +12 -0
- package/dist/boxes/iso-base-media/meta/hdlr.js +33 -0
- package/dist/boxes/iso-base-media/meta/ilst.d.ts +28 -0
- package/dist/boxes/iso-base-media/meta/ilst.js +86 -0
- package/dist/boxes/iso-base-media/meta/keys.d.ts +10 -0
- package/dist/boxes/iso-base-media/meta/keys.js +17 -0
- package/dist/boxes/iso-base-media/meta/list.d.ts +12 -0
- package/dist/boxes/iso-base-media/meta/list.js +33 -0
- package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -1
- package/dist/boxes/iso-base-media/moov/moov.js +2 -1
- package/dist/boxes/iso-base-media/process-box.d.ts +5 -2
- package/dist/boxes/iso-base-media/process-box.js +66 -8
- package/dist/boxes/iso-base-media/stsd/keys.d.ts +15 -1
- package/dist/boxes/iso-base-media/stsd/keys.js +25 -12
- package/dist/boxes/iso-base-media/stsd/mebx.d.ts +3 -1
- package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
- package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -2
- package/dist/boxes/iso-base-media/stsd/samples.js +7 -2
- package/dist/boxes/iso-base-media/stsd/stsd.d.ts +3 -1
- package/dist/boxes/iso-base-media/stsd/stsd.js +2 -1
- package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -1
- package/dist/boxes/iso-base-media/trak/trak.js +2 -1
- package/dist/boxes/riff/expect-riff-box.d.ts +1 -0
- package/dist/boxes/riff/expect-riff-box.js +1 -1
- package/dist/boxes/riff/get-tracks-from-avi.d.ts +2 -1
- package/dist/boxes/riff/get-tracks-from-avi.js +14 -8
- package/dist/boxes/riff/parse-box.d.ts +3 -1
- package/dist/boxes/riff/parse-box.js +38 -5
- package/dist/boxes/riff/parse-isft.d.ts +6 -0
- package/dist/boxes/riff/parse-isft.js +17 -0
- package/dist/boxes/riff/parse-movi.js +31 -20
- package/dist/boxes/riff/parse-riff-box.js +4 -0
- package/dist/boxes/riff/riff-box.d.ts +5 -1
- package/dist/boxes/webm/ebml.d.ts +1 -1
- package/dist/boxes/webm/parse-ebml.js +2 -1
- package/dist/boxes/webm/parse-webm-header.d.ts +6 -1
- package/dist/boxes/webm/parse-webm-header.js +3 -1
- package/dist/boxes/webm/segments/all-segments.d.ts +42 -2
- package/dist/boxes/webm/segments/all-segments.js +28 -3
- package/dist/boxes/webm/segments/parse-children.d.ts +8 -3
- package/dist/boxes/webm/segments/parse-children.js +39 -4
- package/dist/boxes/webm/segments.d.ts +5 -2
- package/dist/boxes/webm/segments.js +23 -3
- package/dist/boxes/webm/traversal.d.ts +1 -0
- package/dist/boxes/webm/traversal.js +18 -2
- package/dist/buffer-iterator.d.ts +3 -0
- package/dist/buffer-iterator.js +23 -0
- package/dist/create/iso-base-media/codec-specific/mp4a.js +1 -17
- package/dist/create/iso-base-media/mp4-header.js +2 -1
- package/dist/emit-available-info.d.ts +1 -1
- package/dist/emit-available-info.js +17 -6
- package/dist/esm/index.mjs +992 -162
- package/dist/get-audio-codec.d.ts +1 -1
- package/dist/get-dimensions.d.ts +1 -1
- package/dist/get-duration.d.ts +1 -1
- package/dist/get-is-hdr.d.ts +1 -1
- package/dist/get-metadata.d.ts +7 -0
- package/dist/get-metadata.js +63 -0
- package/dist/get-tracks.d.ts +1 -1
- package/dist/get-tracks.js +1 -1
- package/dist/get-video-codec.d.ts +1 -1
- package/dist/has-all-info.d.ts +8 -3
- package/dist/has-all-info.js +21 -12
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/metadata/get-metadata.d.ts +7 -0
- package/dist/metadata/get-metadata.js +16 -0
- package/dist/metadata/metadata-from-iso.d.ts +4 -0
- package/dist/metadata/metadata-from-iso.js +148 -0
- package/dist/metadata/metadata-from-matroska.d.ts +3 -0
- package/dist/metadata/metadata-from-matroska.js +53 -0
- package/dist/metadata/metadata-from-riff.d.ts +3 -0
- package/dist/metadata/metadata-from-riff.js +24 -0
- package/dist/options.d.ts +9 -3
- package/dist/parse-media.js +32 -29
- package/dist/parse-result.d.ts +3 -1
- package/dist/parse-video.d.ts +3 -1
- package/dist/parse-video.js +5 -3
- package/dist/parser-context.d.ts +1 -2
- package/dist/register-track.d.ts +1 -1
- package/dist/state/can-skip-tracks.d.ts +9 -0
- package/dist/state/can-skip-tracks.js +33 -0
- package/dist/state/has-tracks-section.d.ts +6 -0
- package/dist/state/has-tracks-section.js +21 -0
- package/dist/state/parser-state.d.ts +51 -0
- package/dist/state/parser-state.js +170 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
|
@@ -2,7 +2,7 @@ import type { MoovBox } from './boxes/iso-base-media/moov/moov';
|
|
|
2
2
|
import type { TrakBox } from './boxes/iso-base-media/trak/trak';
|
|
3
3
|
import { type MediaParserAudioCodec } from './get-tracks';
|
|
4
4
|
import type { Structure } from './parse-result';
|
|
5
|
-
import type { ParserState } from './parser-state';
|
|
5
|
+
import type { ParserState } from './state/parser-state';
|
|
6
6
|
export declare const getAudioCodec: (boxes: Structure, parserState: ParserState) => MediaParserAudioCodec | null;
|
|
7
7
|
export declare const hasAudioCodec: (boxes: Structure, state: ParserState) => boolean;
|
|
8
8
|
type AudioCodecInfo = {
|
package/dist/get-dimensions.d.ts
CHANGED
package/dist/get-duration.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AnySegment, Structure } from './parse-result';
|
|
2
|
-
import type { ParserState } from './parser-state';
|
|
2
|
+
import type { ParserState } from './state/parser-state';
|
|
3
3
|
export declare const isMatroska: (boxes: AnySegment[]) => {
|
|
4
4
|
type: "Segment";
|
|
5
5
|
value: import("./boxes/webm/segments/all-segments").PossibleEbml[];
|
package/dist/get-is-hdr.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Structure } from './parse-result';
|
|
2
|
-
import type { ParserState } from './parser-state';
|
|
2
|
+
import type { ParserState } from './state/parser-state';
|
|
3
3
|
export declare const getIsHdr: (boxes: Structure, state: ParserState) => boolean;
|
|
4
4
|
export declare const hasHdr: (boxes: Structure, state: ParserState) => boolean;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetadata = void 0;
|
|
4
|
+
const traversal_1 = require("./boxes/iso-base-media/traversal");
|
|
5
|
+
const truthy_1 = require("./truthy");
|
|
6
|
+
const parseIsoMetaBox = (meta, trackId) => {
|
|
7
|
+
const ilstBox = meta.children.find((b) => b.type === 'ilst-box');
|
|
8
|
+
const keysBox = meta.children.find((b) => b.type === 'keys-box');
|
|
9
|
+
if (!ilstBox || !keysBox) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
if (ilstBox.entries.length !== keysBox.entries.length) {
|
|
13
|
+
throw new Error('Number of entries in ilst and keys box do not match');
|
|
14
|
+
}
|
|
15
|
+
const entries = [];
|
|
16
|
+
for (let i = 0; i < ilstBox.entries.length; i++) {
|
|
17
|
+
const ilstEntry = ilstBox.entries[i];
|
|
18
|
+
const keysEntry = keysBox.entries[i];
|
|
19
|
+
if (ilstEntry.value.type !== 'unknown') {
|
|
20
|
+
entries.push({
|
|
21
|
+
key: keysEntry.value,
|
|
22
|
+
value: ilstEntry.value.value,
|
|
23
|
+
trackId,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return entries;
|
|
28
|
+
};
|
|
29
|
+
const getMetadataFromIsoBase = (isoBase) => {
|
|
30
|
+
const moov = (0, traversal_1.getMoovBox)(isoBase.boxes);
|
|
31
|
+
if (!moov) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const traks = (0, traversal_1.getTraks)(moov);
|
|
35
|
+
const meta = moov.children.find((b) => b.type === 'regular-box' && b.boxType === 'meta');
|
|
36
|
+
const metaInTracks = traks
|
|
37
|
+
.map((t) => {
|
|
38
|
+
const metaBox = t.children.find((child) => child.type === 'regular-box' && child.boxType === 'meta');
|
|
39
|
+
if (metaBox) {
|
|
40
|
+
const tkhd = (0, traversal_1.getTkhdBox)(t);
|
|
41
|
+
if (!tkhd) {
|
|
42
|
+
throw new Error('No tkhd box found');
|
|
43
|
+
}
|
|
44
|
+
return parseIsoMetaBox(metaBox, tkhd.trackId);
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
})
|
|
48
|
+
.filter(truthy_1.truthy);
|
|
49
|
+
if (!meta) {
|
|
50
|
+
return metaInTracks.flat(1);
|
|
51
|
+
}
|
|
52
|
+
return [...parseIsoMetaBox(meta, null), ...metaInTracks.flat(1)];
|
|
53
|
+
};
|
|
54
|
+
const getMetadata = (structure) => {
|
|
55
|
+
if (structure.type === 'matroska') {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
if (structure.type === 'riff') {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
return getMetadataFromIsoBase(structure);
|
|
62
|
+
};
|
|
63
|
+
exports.getMetadata = getMetadata;
|
package/dist/get-tracks.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { MoovBox } from './boxes/iso-base-media/moov/moov';
|
|
|
2
2
|
import type { TrakBox } from './boxes/iso-base-media/trak/trak';
|
|
3
3
|
import type { AllTracks } from './boxes/riff/get-tracks-from-avi';
|
|
4
4
|
import type { Structure } from './parse-result';
|
|
5
|
-
import type { ParserState } from './parser-state';
|
|
5
|
+
import type { ParserState } from './state/parser-state';
|
|
6
6
|
type SampleAspectRatio = {
|
|
7
7
|
numerator: number;
|
|
8
8
|
denominator: number;
|
package/dist/get-tracks.js
CHANGED
|
@@ -18,7 +18,7 @@ const hasTracks = (structure, state) => {
|
|
|
18
18
|
if (structure.type === 'matroska') {
|
|
19
19
|
const mainSegment = (0, traversal_2.getMainSegment)(structure.boxes);
|
|
20
20
|
if (!mainSegment) {
|
|
21
|
-
|
|
21
|
+
return false;
|
|
22
22
|
}
|
|
23
23
|
return (0, traversal_2.getTracksSegment)(mainSegment) !== null;
|
|
24
24
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { TrakBox } from './boxes/iso-base-media/trak/trak';
|
|
2
2
|
import { type MediaParserVideoCodec, type VideoTrackColorParams } from './get-tracks';
|
|
3
3
|
import type { Structure } from './parse-result';
|
|
4
|
-
import type { ParserState } from './parser-state';
|
|
4
|
+
import type { ParserState } from './state/parser-state';
|
|
5
5
|
export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h264" | "av1" | "h265" | "prores";
|
|
6
6
|
export declare const getVideoCodec: (boxes: Structure) => MediaParserVideoCodec | null;
|
|
7
7
|
export declare const hasVideoCodec: (boxes: Structure, state: ParserState) => boolean;
|
package/dist/has-all-info.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { Options, ParseMediaFields } from './options';
|
|
2
|
-
import type {
|
|
3
|
-
import type { ParserState } from './parser-state';
|
|
4
|
-
export declare const getAvailableInfo: (options: Options<ParseMediaFields>,
|
|
2
|
+
import type { Structure } from './parse-result';
|
|
3
|
+
import type { ParserState } from './state/parser-state';
|
|
4
|
+
export declare const getAvailableInfo: (options: Options<ParseMediaFields>, structure: Structure | null, state: ParserState) => Record<keyof Options<ParseMediaFields>, boolean>;
|
|
5
|
+
export declare const hasAllInfo: ({ fields, state, structure, }: {
|
|
6
|
+
structure: Structure | null;
|
|
7
|
+
fields: Options<ParseMediaFields>;
|
|
8
|
+
state: ParserState;
|
|
9
|
+
}) => boolean;
|
package/dist/has-all-info.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAvailableInfo = void 0;
|
|
3
|
+
exports.hasAllInfo = exports.getAvailableInfo = void 0;
|
|
4
4
|
const get_audio_codec_1 = require("./get-audio-codec");
|
|
5
5
|
const get_container_1 = require("./get-container");
|
|
6
6
|
const get_dimensions_1 = require("./get-dimensions");
|
|
@@ -9,38 +9,38 @@ const get_fps_1 = require("./get-fps");
|
|
|
9
9
|
const get_is_hdr_1 = require("./get-is-hdr");
|
|
10
10
|
const get_tracks_1 = require("./get-tracks");
|
|
11
11
|
const get_video_codec_1 = require("./get-video-codec");
|
|
12
|
-
const getAvailableInfo = (options,
|
|
12
|
+
const getAvailableInfo = (options, structure, state) => {
|
|
13
13
|
const keys = Object.entries(options).filter(([, value]) => value);
|
|
14
14
|
const infos = keys.map(([_key]) => {
|
|
15
15
|
const key = _key;
|
|
16
16
|
if (key === 'structure') {
|
|
17
|
-
return
|
|
17
|
+
return false;
|
|
18
18
|
}
|
|
19
19
|
if (key === 'durationInSeconds') {
|
|
20
|
-
return Boolean(
|
|
20
|
+
return Boolean(structure && (0, get_duration_1.hasDuration)(structure, state));
|
|
21
21
|
}
|
|
22
22
|
if (key === 'dimensions' ||
|
|
23
23
|
key === 'rotation' ||
|
|
24
24
|
key === 'unrotatedDimensions') {
|
|
25
|
-
return Boolean(
|
|
25
|
+
return Boolean(structure && (0, get_dimensions_1.hasDimensions)(structure, state));
|
|
26
26
|
}
|
|
27
27
|
if (key === 'fps') {
|
|
28
|
-
return Boolean(
|
|
28
|
+
return Boolean(structure && (0, get_fps_1.hasFps)(structure));
|
|
29
29
|
}
|
|
30
30
|
if (key === 'isHdr') {
|
|
31
|
-
return Boolean(
|
|
31
|
+
return Boolean(structure && (0, get_is_hdr_1.hasHdr)(structure, state));
|
|
32
32
|
}
|
|
33
33
|
if (key === 'videoCodec') {
|
|
34
|
-
return Boolean(
|
|
34
|
+
return Boolean(structure && (0, get_video_codec_1.hasVideoCodec)(structure, state));
|
|
35
35
|
}
|
|
36
36
|
if (key === 'audioCodec') {
|
|
37
|
-
return Boolean(
|
|
37
|
+
return Boolean(structure && (0, get_audio_codec_1.hasAudioCodec)(structure, state));
|
|
38
38
|
}
|
|
39
39
|
if (key === 'tracks') {
|
|
40
|
-
return Boolean(
|
|
40
|
+
return Boolean(structure && (0, get_tracks_1.hasTracks)(structure, state));
|
|
41
41
|
}
|
|
42
42
|
if (key === 'internalStats') {
|
|
43
|
-
return
|
|
43
|
+
return true;
|
|
44
44
|
}
|
|
45
45
|
if (key === 'size') {
|
|
46
46
|
return true;
|
|
@@ -49,7 +49,10 @@ const getAvailableInfo = (options, parseResult, state) => {
|
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
51
51
|
if (key === 'container') {
|
|
52
|
-
return Boolean(
|
|
52
|
+
return Boolean(structure && (0, get_container_1.hasContainer)(structure));
|
|
53
|
+
}
|
|
54
|
+
if (key === 'metadata') {
|
|
55
|
+
return false;
|
|
53
56
|
}
|
|
54
57
|
throw new Error(`Unknown key: ${key}`);
|
|
55
58
|
});
|
|
@@ -61,3 +64,9 @@ const getAvailableInfo = (options, parseResult, state) => {
|
|
|
61
64
|
return Object.fromEntries(entries);
|
|
62
65
|
};
|
|
63
66
|
exports.getAvailableInfo = getAvailableInfo;
|
|
67
|
+
const hasAllInfo = ({ fields, state, structure, }) => {
|
|
68
|
+
const availableInfo = (0, exports.getAvailableInfo)(fields !== null && fields !== void 0 ? fields : {}, structure, state);
|
|
69
|
+
return (Object.values(availableInfo).every(Boolean) &&
|
|
70
|
+
(state.maySkipVideoData() || state.canSkipTracksState.canSkipTracks()));
|
|
71
|
+
};
|
|
72
|
+
exports.hasAllInfo = hasAllInfo;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { IoEventEmitter } from './create/event-emitter';
|
|
2
2
|
import type { ProgressTracker } from './create/progress-tracker';
|
|
3
3
|
import type { LogLevel } from './log';
|
|
4
|
+
export { MetadataEntry } from './metadata/get-metadata';
|
|
4
5
|
export { WriterInterface } from './writers/writer';
|
|
5
6
|
export { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, OtherTrack, Track, VideoTrack, VideoTrackColorParams, } from './get-tracks';
|
|
6
7
|
export type { Options, ParseMediaContainer, ParseMediaDynamicOptions, ParseMediaFields, ParseMediaOnProgress, ParseMediaOptions, ParseMediaProgress, ParseMediaResult, TracksField, } from './options';
|
|
@@ -37,6 +38,11 @@ export declare const MediaParserInternals: {
|
|
|
37
38
|
reject: (reason: unknown) => void;
|
|
38
39
|
resolve: (value: T | PromiseLike<T>) => void;
|
|
39
40
|
};
|
|
41
|
+
createAacCodecPrivate: ({ audioObjectType, sampleRate, channelConfiguration, }: {
|
|
42
|
+
audioObjectType: number;
|
|
43
|
+
sampleRate: number;
|
|
44
|
+
channelConfiguration: number;
|
|
45
|
+
}) => Uint8Array;
|
|
40
46
|
};
|
|
41
47
|
export type { IoEventEmitter, LogLevel, ProgressTracker };
|
|
42
48
|
export { VERSION } from './version';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VERSION = exports.MediaParserInternals = exports.parseMedia = void 0;
|
|
4
|
+
const aac_codecprivate_1 = require("./aac-codecprivate");
|
|
4
5
|
const event_emitter_1 = require("./create/event-emitter");
|
|
5
6
|
const create_iso_base_media_1 = require("./create/iso-base-media/create-iso-base-media");
|
|
6
7
|
const create_matroska_media_1 = require("./create/matroska/create-matroska-media");
|
|
@@ -19,6 +20,7 @@ exports.MediaParserInternals = {
|
|
|
19
20
|
makeProgressTracker: progress_tracker_1.makeProgressTracker,
|
|
20
21
|
withResolvers: with_resolvers_1.withResolvers,
|
|
21
22
|
withResolversAndWaitForReturn: with_resolvers_1.withResolversAndWaitForReturn,
|
|
23
|
+
createAacCodecPrivate: aac_codecprivate_1.createAacCodecPrivate,
|
|
22
24
|
};
|
|
23
25
|
var version_1 = require("./version");
|
|
24
26
|
Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetadata = void 0;
|
|
4
|
+
const metadata_from_iso_1 = require("./metadata-from-iso");
|
|
5
|
+
const metadata_from_matroska_1 = require("./metadata-from-matroska");
|
|
6
|
+
const metadata_from_riff_1 = require("./metadata-from-riff");
|
|
7
|
+
const getMetadata = (structure) => {
|
|
8
|
+
if (structure.type === 'matroska') {
|
|
9
|
+
return (0, metadata_from_matroska_1.getMetadataFromMatroska)(structure);
|
|
10
|
+
}
|
|
11
|
+
if (structure.type === 'riff') {
|
|
12
|
+
return (0, metadata_from_riff_1.getMetadataFromRiff)(structure);
|
|
13
|
+
}
|
|
14
|
+
return (0, metadata_from_iso_1.getMetadataFromIsoBase)(structure);
|
|
15
|
+
};
|
|
16
|
+
exports.getMetadata = getMetadata;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IsoBaseMediaStructure, RegularBox } from '../parse-result';
|
|
2
|
+
import type { MetadataEntry } from './get-metadata';
|
|
3
|
+
export declare const parseIsoMetaBox: (meta: RegularBox, trackId: number | null) => MetadataEntry[];
|
|
4
|
+
export declare const getMetadataFromIsoBase: (isoBase: IsoBaseMediaStructure) => MetadataEntry[];
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetadataFromIsoBase = exports.parseIsoMetaBox = void 0;
|
|
4
|
+
const traversal_1 = require("../boxes/iso-base-media/traversal");
|
|
5
|
+
const truthy_1 = require("../truthy");
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param ilstBox ©ART - Artist
|
|
9
|
+
▪ Hex: A9 41 52 54
|
|
10
|
+
2. ©alb - Album
|
|
11
|
+
▪ Hex: A9 61 6C 62
|
|
12
|
+
3. ©cmt - Comment
|
|
13
|
+
▪ Hex: A9 63 6D 74
|
|
14
|
+
4. ©day - Release Date
|
|
15
|
+
▪ Hex: A9 64 61 79
|
|
16
|
+
5. ©gen - Genre
|
|
17
|
+
▪ Hex: A9 67 65 6E
|
|
18
|
+
6. ©nam - Title
|
|
19
|
+
▪ Hex: A9 6E 61 6D
|
|
20
|
+
7. ©too - Encoder
|
|
21
|
+
▪ Hex: A9 74 6F 6F
|
|
22
|
+
8. ©wrt - Writer
|
|
23
|
+
▪ Hex: A9 77 72 74
|
|
24
|
+
9. ©cpy - Copyright
|
|
25
|
+
▪ Hex: A9 63 70 79
|
|
26
|
+
10. ©dir - Director
|
|
27
|
+
▪ Hex: A9 64 69 72
|
|
28
|
+
11. ©prd - Producer
|
|
29
|
+
▪ Hex: A9 70 72 64
|
|
30
|
+
12. ©des - Description
|
|
31
|
+
▪ Hex: A9 64 65 73
|
|
32
|
+
*/
|
|
33
|
+
const mapToKey = (index) => {
|
|
34
|
+
if (index === 0xa9415254) {
|
|
35
|
+
return 'artist';
|
|
36
|
+
}
|
|
37
|
+
if (index === 0xa9616c62) {
|
|
38
|
+
return 'album';
|
|
39
|
+
}
|
|
40
|
+
if (index === 0xa9636d74) {
|
|
41
|
+
return 'comment';
|
|
42
|
+
}
|
|
43
|
+
if (index === 0xa9646179) {
|
|
44
|
+
return 'releaseDate';
|
|
45
|
+
}
|
|
46
|
+
if (index === 0xa967656e) {
|
|
47
|
+
return 'genre';
|
|
48
|
+
}
|
|
49
|
+
if (index === 0xa96e616d) {
|
|
50
|
+
return 'title';
|
|
51
|
+
}
|
|
52
|
+
if (index === 0xa9746f6f) {
|
|
53
|
+
return 'encoder';
|
|
54
|
+
}
|
|
55
|
+
if (index === 0xa9777274) {
|
|
56
|
+
return 'writer';
|
|
57
|
+
}
|
|
58
|
+
if (index === 0xa9637079) {
|
|
59
|
+
return 'copyright';
|
|
60
|
+
}
|
|
61
|
+
if (index === 0xa9646972) {
|
|
62
|
+
return 'director';
|
|
63
|
+
}
|
|
64
|
+
if (index === 0xa9707264) {
|
|
65
|
+
return 'producer';
|
|
66
|
+
}
|
|
67
|
+
if (index === 0xa9646573) {
|
|
68
|
+
return 'description';
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
};
|
|
72
|
+
const parseIlstBoxWithoutKeys = (ilstBox) => {
|
|
73
|
+
return ilstBox.entries
|
|
74
|
+
.map((entry) => {
|
|
75
|
+
const key = mapToKey(entry.index);
|
|
76
|
+
if (!key) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (entry.value.type === 'unknown') {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
trackId: null,
|
|
84
|
+
key,
|
|
85
|
+
value: entry.value.value,
|
|
86
|
+
};
|
|
87
|
+
})
|
|
88
|
+
.filter(truthy_1.truthy);
|
|
89
|
+
};
|
|
90
|
+
const parseIsoMetaBox = (meta, trackId) => {
|
|
91
|
+
const ilstBox = meta.children.find((b) => b.type === 'ilst-box');
|
|
92
|
+
const keysBox = meta.children.find((b) => b.type === 'keys-box');
|
|
93
|
+
if (!ilstBox || !keysBox) {
|
|
94
|
+
if (ilstBox) {
|
|
95
|
+
return parseIlstBoxWithoutKeys(ilstBox);
|
|
96
|
+
}
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const entries = [];
|
|
100
|
+
for (let i = 0; i < ilstBox.entries.length; i++) {
|
|
101
|
+
const ilstEntry = ilstBox.entries[i];
|
|
102
|
+
const keysEntry = keysBox.entries[i];
|
|
103
|
+
if (ilstEntry.value.type !== 'unknown') {
|
|
104
|
+
const value = typeof ilstEntry.value.value === 'string' &&
|
|
105
|
+
ilstEntry.value.value.endsWith('\u0000')
|
|
106
|
+
? ilstEntry.value.value.slice(0, -1)
|
|
107
|
+
: ilstEntry.value.value;
|
|
108
|
+
entries.push({
|
|
109
|
+
key: keysEntry.value,
|
|
110
|
+
value,
|
|
111
|
+
trackId,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return entries;
|
|
116
|
+
};
|
|
117
|
+
exports.parseIsoMetaBox = parseIsoMetaBox;
|
|
118
|
+
const getMetadataFromIsoBase = (isoBase) => {
|
|
119
|
+
const moov = (0, traversal_1.getMoovBox)(isoBase.boxes);
|
|
120
|
+
if (!moov) {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
const traks = (0, traversal_1.getTraks)(moov);
|
|
124
|
+
const meta = moov.children.find((b) => b.type === 'regular-box' && b.boxType === 'meta');
|
|
125
|
+
const udta = moov.children.find((b) => b.type === 'regular-box' && b.boxType === 'udta');
|
|
126
|
+
const metaInUdta = udta === null || udta === void 0 ? void 0 : udta.children.find((b) => {
|
|
127
|
+
return b.type === 'regular-box' && b.boxType === 'meta';
|
|
128
|
+
});
|
|
129
|
+
const metaInTracks = traks
|
|
130
|
+
.map((t) => {
|
|
131
|
+
const metaBox = t.children.find((child) => child.type === 'regular-box' && child.boxType === 'meta');
|
|
132
|
+
if (metaBox) {
|
|
133
|
+
const tkhd = (0, traversal_1.getTkhdBox)(t);
|
|
134
|
+
if (!tkhd) {
|
|
135
|
+
throw new Error('No tkhd box found');
|
|
136
|
+
}
|
|
137
|
+
return (0, exports.parseIsoMetaBox)(metaBox, tkhd.trackId);
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
})
|
|
141
|
+
.filter(truthy_1.truthy);
|
|
142
|
+
return [
|
|
143
|
+
...(meta ? (0, exports.parseIsoMetaBox)(meta, null) : []),
|
|
144
|
+
...(metaInUdta ? (0, exports.parseIsoMetaBox)(metaInUdta, null) : []),
|
|
145
|
+
...metaInTracks.flat(1),
|
|
146
|
+
];
|
|
147
|
+
};
|
|
148
|
+
exports.getMetadataFromIsoBase = getMetadataFromIsoBase;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetadataFromMatroska = void 0;
|
|
4
|
+
const traversal_1 = require("../boxes/webm/traversal");
|
|
5
|
+
const removeEndZeroes = (value) => {
|
|
6
|
+
return value.endsWith('\u0000') ? removeEndZeroes(value.slice(0, -1)) : value;
|
|
7
|
+
};
|
|
8
|
+
const parseSimpleTagIntoEbml = (children, trackId) => {
|
|
9
|
+
const tagName = children.find((c) => c.type === 'TagName');
|
|
10
|
+
const tagString = children.find((c) => c.type === 'TagString');
|
|
11
|
+
if (!tagName || !tagString) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
trackId,
|
|
16
|
+
key: tagName.value.toLowerCase(),
|
|
17
|
+
value: removeEndZeroes(tagString.value),
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
const getMetadataFromMatroska = (structure) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const entries = [];
|
|
23
|
+
for (const segment of structure.boxes) {
|
|
24
|
+
if (segment.type !== 'Segment') {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const tags = segment.value.filter((s) => s.type === 'Tags');
|
|
28
|
+
for (const tag of tags) {
|
|
29
|
+
for (const child of tag.value) {
|
|
30
|
+
if (child.type !== 'Tag') {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
let trackId = null;
|
|
34
|
+
const target = child.value.find((c) => c.type === 'Targets');
|
|
35
|
+
if (target) {
|
|
36
|
+
const tagTrackId = (_a = target.value.find((c) => c.type === 'TagTrackUID')) === null || _a === void 0 ? void 0 : _a.value;
|
|
37
|
+
if (tagTrackId) {
|
|
38
|
+
trackId = (0, traversal_1.getTrackWithUid)(segment, tagTrackId);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const simpleTags = child.value.filter((s) => s.type === 'SimpleTag');
|
|
42
|
+
for (const simpleTag of simpleTags) {
|
|
43
|
+
const parsed = parseSimpleTagIntoEbml(simpleTag.value, trackId);
|
|
44
|
+
if (parsed) {
|
|
45
|
+
entries.push(parsed);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return entries;
|
|
52
|
+
};
|
|
53
|
+
exports.getMetadataFromMatroska = getMetadataFromMatroska;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetadataFromRiff = void 0;
|
|
4
|
+
const truthy_1 = require("../truthy");
|
|
5
|
+
const getMetadataFromRiff = (structure) => {
|
|
6
|
+
const boxes = structure.boxes.find((b) => b.type === 'list-box' && b.listType === 'INFO');
|
|
7
|
+
if (!boxes) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const { children } = boxes;
|
|
11
|
+
return children
|
|
12
|
+
.map((child) => {
|
|
13
|
+
if (child.type !== 'isft-box') {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
trackId: null,
|
|
18
|
+
key: 'encoder',
|
|
19
|
+
value: child.software,
|
|
20
|
+
};
|
|
21
|
+
})
|
|
22
|
+
.filter(truthy_1.truthy);
|
|
23
|
+
};
|
|
24
|
+
exports.getMetadataFromRiff = getMetadataFromRiff;
|
package/dist/options.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Dimensions } from './get-dimensions';
|
|
2
2
|
import type { AudioTrack, MediaParserAudioCodec, MediaParserVideoCodec, VideoTrack } from './get-tracks';
|
|
3
3
|
import type { LogLevel } from './log';
|
|
4
|
+
import type { MetadataEntry } from './metadata/get-metadata';
|
|
4
5
|
import type { Structure } from './parse-result';
|
|
5
|
-
import type { InternalStats } from './parser-state';
|
|
6
6
|
import type { ReaderInterface } from './readers/reader';
|
|
7
|
+
import type { InternalStats } from './state/parser-state';
|
|
7
8
|
import type { OnAudioTrack, OnVideoTrack } from './webcodec-sample-types';
|
|
8
9
|
export type KnownAudioCodecs = 'aac' | 'mp3' | 'aiff' | 'opus' | 'pcm' | 'vorbis' | 'unknown';
|
|
9
10
|
export type ParseMediaFields = {
|
|
@@ -21,6 +22,7 @@ export type ParseMediaFields = {
|
|
|
21
22
|
name: boolean;
|
|
22
23
|
container: boolean;
|
|
23
24
|
isHdr: boolean;
|
|
25
|
+
metadata: boolean;
|
|
24
26
|
};
|
|
25
27
|
export type AllParseMediaFields = {
|
|
26
28
|
dimensions: true;
|
|
@@ -37,6 +39,7 @@ export type AllParseMediaFields = {
|
|
|
37
39
|
name: true;
|
|
38
40
|
container: true;
|
|
39
41
|
isHdr: true;
|
|
42
|
+
metadata: true;
|
|
40
43
|
};
|
|
41
44
|
export type Options<Fields extends ParseMediaFields> = {
|
|
42
45
|
dimensions?: Fields['dimensions'];
|
|
@@ -53,6 +56,7 @@ export type Options<Fields extends ParseMediaFields> = {
|
|
|
53
56
|
name?: Fields['name'];
|
|
54
57
|
container?: Fields['container'];
|
|
55
58
|
isHdr?: Fields['isHdr'];
|
|
59
|
+
metadata?: Fields['metadata'];
|
|
56
60
|
};
|
|
57
61
|
export type TracksField = {
|
|
58
62
|
videoTracks: VideoTrack[];
|
|
@@ -75,12 +79,12 @@ export type ParseMediaCallbacks<Fields extends Options<ParseMediaFields>> = (Fie
|
|
|
75
79
|
onTracks?: (tracks: TracksField) => void;
|
|
76
80
|
} : {}) & (Fields['rotation'] extends true ? {
|
|
77
81
|
onRotation?: (rotation: number | null) => void;
|
|
82
|
+
} : {}) & (Fields['metadata'] extends true ? {
|
|
83
|
+
onMetadata?: (metadata: MetadataEntry[]) => void;
|
|
78
84
|
} : {}) & (Fields['unrotatedDimensions'] extends true ? {
|
|
79
85
|
onUnrotatedDimensions?: (dimensions: Dimensions) => void;
|
|
80
86
|
} : {}) & (Fields['isHdr'] extends true ? {
|
|
81
87
|
onIsHdr?: (isHdr: boolean) => void;
|
|
82
|
-
} : {}) & (Fields['internalStats'] extends true ? {
|
|
83
|
-
onInternalStats?: (stats: InternalStats) => void;
|
|
84
88
|
} : {}) & (Fields['size'] extends true ? {
|
|
85
89
|
onSize?: (size: number | null) => void;
|
|
86
90
|
} : {}) & (Fields['name'] extends true ? {
|
|
@@ -112,6 +116,8 @@ export type ParseMediaResult<Fields extends Options<ParseMediaFields>> = (Fields
|
|
|
112
116
|
size: number | null;
|
|
113
117
|
} : {}) & (Fields['name'] extends true ? {
|
|
114
118
|
name: string;
|
|
119
|
+
} : {}) & (Fields['metadata'] extends true ? {
|
|
120
|
+
metadata: MetadataEntry[];
|
|
115
121
|
} : {}) & (Fields['container'] extends true ? {
|
|
116
122
|
container: ParseMediaContainer | null;
|
|
117
123
|
} : {});
|