@remotion/media-parser 4.0.239 → 4.0.241
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/boxes/avc/codec-private.d.ts +1 -1
- package/dist/boxes/transport-stream/adts-header.d.ts +1 -1
- package/dist/boxes/transport-stream/discard-rest-of-packet.d.ts +1 -1
- package/dist/boxes/webm/ebml.d.ts +1 -1
- package/dist/boxes/webm/make-header.d.ts +3 -3
- package/dist/buffer-iterator.d.ts +2 -6
- package/dist/buffer-iterator.js +4 -29
- package/dist/create/iso-base-media/codec-specific/avc1.d.ts +1 -1
- package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +1 -1
- package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +1 -1
- package/dist/create/iso-base-media/create-colr.d.ts +1 -1
- package/dist/create/iso-base-media/create-ftyp.d.ts +2 -2
- package/dist/create/iso-base-media/create-ilst.d.ts +1 -1
- package/dist/create/iso-base-media/create-mdia.d.ts +1 -1
- package/dist/create/iso-base-media/create-moov.d.ts +1 -1
- package/dist/create/iso-base-media/create-mvhd.d.ts +1 -1
- package/dist/create/iso-base-media/create-trak.d.ts +1 -1
- package/dist/create/iso-base-media/create-udta.d.ts +1 -1
- package/dist/create/iso-base-media/create-url.d.ts +1 -1
- package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -1
- package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -1
- package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +1 -1
- package/dist/create/iso-base-media/mp4-header.d.ts +1 -1
- package/dist/create/iso-base-media/primitives.d.ts +13 -13
- package/dist/create/iso-base-media/serialize-track.d.ts +1 -1
- package/dist/create/iso-base-media/trak/create-tkhd.d.ts +2 -2
- package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -1
- package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -1
- package/dist/create/iso-base-media/udta/create-meta.d.ts +1 -1
- package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -1
- package/dist/create/matroska/cluster-segment.d.ts +1 -1
- package/dist/emit-available-info.d.ts +6 -3
- package/dist/emit-available-info.js +113 -64
- package/dist/errors/detect-file-type.d.ts +1 -0
- package/dist/errors/detect-file-type.js +88 -0
- package/dist/errors/file-types.d.ts +1 -0
- package/dist/errors/file-types.js +88 -0
- package/dist/errors.d.ts +68 -0
- package/dist/errors.js +71 -0
- package/dist/esm/from-fetch.mjs +1 -0
- package/dist/esm/from-node.mjs +1 -0
- package/dist/esm/from-web-file.mjs +2 -1
- package/dist/esm/index.mjs +673 -107
- package/dist/file-types/bmp.d.ts +6 -0
- package/dist/file-types/bmp.js +23 -0
- package/dist/file-types/detect-file-type.d.ts +42 -0
- package/dist/file-types/detect-file-type.js +59 -0
- package/dist/file-types/get-jpeg-dimensions.d.ts +4 -0
- package/dist/file-types/get-jpeg-dimensions.js +32 -0
- package/dist/file-types/index.d.ts +2 -0
- package/dist/file-types/index.js +57 -0
- package/dist/file-types/jpeg.d.ts +12 -0
- package/dist/file-types/jpeg.js +44 -0
- package/dist/file-types/pdf.d.ts +4 -0
- package/dist/file-types/pdf.js +12 -0
- package/dist/file-types/png.d.ts +10 -0
- package/dist/file-types/png.js +32 -0
- package/dist/file-types/webp.d.ts +6 -0
- package/dist/file-types/webp.js +69 -0
- package/dist/file-types.d.ts +1 -0
- package/dist/file-types.js +88 -0
- package/dist/get-audio-codec.d.ts +1 -1
- package/dist/get-fields-from-callbacks.d.ts +5 -0
- package/dist/get-fields-from-callbacks.js +27 -0
- package/dist/get-location.d.ts +13 -0
- package/dist/get-location.js +40 -0
- package/dist/has-all-info.d.ts +5 -1
- package/dist/has-all-info.js +11 -4
- package/dist/index.d.ts +3 -1
- package/dist/index.js +7 -1
- package/dist/options.d.ts +40 -49
- package/dist/parse-media.js +53 -14
- package/dist/parse-video.d.ts +4 -1
- package/dist/parse-video.js +71 -8
- package/dist/probing/detect-file-type.d.ts +1 -0
- package/dist/probing/detect-file-type.js +88 -0
- package/dist/probing/get-jpeg-dimensions.d.ts +4 -0
- package/dist/probing/get-jpeg-dimensions.js +32 -0
- package/dist/readers/from-fetch.js +1 -0
- package/dist/readers/from-node.js +1 -0
- package/dist/readers/from-web-file.js +1 -0
- package/dist/readers/reader.d.ts +1 -0
- package/dist/state/can-skip-tracks.js +2 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
package/dist/esm/index.mjs
CHANGED
|
@@ -83,6 +83,7 @@ var fetchReader = {
|
|
|
83
83
|
}
|
|
84
84
|
},
|
|
85
85
|
contentLength,
|
|
86
|
+
contentType: res.headers.get("content-type"),
|
|
86
87
|
name: name ?? fallbackName,
|
|
87
88
|
supportsContentRange
|
|
88
89
|
};
|
|
@@ -1366,7 +1367,7 @@ var createIsoBaseMediaFtyp = ({
|
|
|
1366
1367
|
};
|
|
1367
1368
|
|
|
1368
1369
|
// src/version.ts
|
|
1369
|
-
var VERSION = "4.0.
|
|
1370
|
+
var VERSION = "4.0.241";
|
|
1370
1371
|
|
|
1371
1372
|
// src/create/iso-base-media/create-ilst.ts
|
|
1372
1373
|
var createIlst = (items) => {
|
|
@@ -3529,6 +3530,120 @@ var createWav = async ({
|
|
|
3529
3530
|
};
|
|
3530
3531
|
};
|
|
3531
3532
|
|
|
3533
|
+
// src/errors.ts
|
|
3534
|
+
class IsAGifError extends Error {
|
|
3535
|
+
mimeType;
|
|
3536
|
+
sizeInBytes;
|
|
3537
|
+
fileName;
|
|
3538
|
+
constructor({
|
|
3539
|
+
message,
|
|
3540
|
+
mimeType,
|
|
3541
|
+
sizeInBytes,
|
|
3542
|
+
fileName
|
|
3543
|
+
}) {
|
|
3544
|
+
super(message);
|
|
3545
|
+
this.fileName = "IsAGifError";
|
|
3546
|
+
this.mimeType = mimeType;
|
|
3547
|
+
this.sizeInBytes = sizeInBytes;
|
|
3548
|
+
this.fileName = fileName;
|
|
3549
|
+
if (Error.captureStackTrace) {
|
|
3550
|
+
Error.captureStackTrace(this, IsAGifError);
|
|
3551
|
+
}
|
|
3552
|
+
}
|
|
3553
|
+
}
|
|
3554
|
+
|
|
3555
|
+
class IsAnImageError extends Error {
|
|
3556
|
+
imageType;
|
|
3557
|
+
dimensions;
|
|
3558
|
+
mimeType;
|
|
3559
|
+
sizeInBytes;
|
|
3560
|
+
fileName;
|
|
3561
|
+
constructor({
|
|
3562
|
+
dimensions,
|
|
3563
|
+
imageType,
|
|
3564
|
+
message,
|
|
3565
|
+
mimeType,
|
|
3566
|
+
sizeInBytes,
|
|
3567
|
+
fileName
|
|
3568
|
+
}) {
|
|
3569
|
+
super(message);
|
|
3570
|
+
this.name = "IsAnImageError";
|
|
3571
|
+
this.imageType = imageType;
|
|
3572
|
+
this.dimensions = dimensions;
|
|
3573
|
+
this.mimeType = mimeType;
|
|
3574
|
+
this.sizeInBytes = sizeInBytes;
|
|
3575
|
+
this.fileName = fileName;
|
|
3576
|
+
if (Error.captureStackTrace) {
|
|
3577
|
+
Error.captureStackTrace(this, IsAnImageError);
|
|
3578
|
+
}
|
|
3579
|
+
}
|
|
3580
|
+
}
|
|
3581
|
+
|
|
3582
|
+
class IsAPdfError extends Error {
|
|
3583
|
+
mimeType;
|
|
3584
|
+
sizeInBytes;
|
|
3585
|
+
fileName;
|
|
3586
|
+
constructor({
|
|
3587
|
+
message,
|
|
3588
|
+
mimeType,
|
|
3589
|
+
sizeInBytes,
|
|
3590
|
+
fileName
|
|
3591
|
+
}) {
|
|
3592
|
+
super(message);
|
|
3593
|
+
this.name = "IsAPdfError";
|
|
3594
|
+
this.mimeType = mimeType;
|
|
3595
|
+
this.sizeInBytes = sizeInBytes;
|
|
3596
|
+
this.fileName = fileName;
|
|
3597
|
+
if (Error.captureStackTrace) {
|
|
3598
|
+
Error.captureStackTrace(this, IsAPdfError);
|
|
3599
|
+
}
|
|
3600
|
+
}
|
|
3601
|
+
}
|
|
3602
|
+
|
|
3603
|
+
class IsAnUnsupportedFileTypeError extends Error {
|
|
3604
|
+
mimeType;
|
|
3605
|
+
sizeInBytes;
|
|
3606
|
+
fileName;
|
|
3607
|
+
constructor({
|
|
3608
|
+
message,
|
|
3609
|
+
mimeType,
|
|
3610
|
+
sizeInBytes,
|
|
3611
|
+
fileName
|
|
3612
|
+
}) {
|
|
3613
|
+
super(message);
|
|
3614
|
+
this.name = "IsAnUnsupportedFileTypeError";
|
|
3615
|
+
this.mimeType = mimeType;
|
|
3616
|
+
this.sizeInBytes = sizeInBytes;
|
|
3617
|
+
this.fileName = fileName;
|
|
3618
|
+
if (Error.captureStackTrace) {
|
|
3619
|
+
Error.captureStackTrace(this, IsAnUnsupportedFileTypeError);
|
|
3620
|
+
}
|
|
3621
|
+
}
|
|
3622
|
+
}
|
|
3623
|
+
|
|
3624
|
+
class IsAnUnsupportedAudioTypeError extends Error {
|
|
3625
|
+
mimeType;
|
|
3626
|
+
sizeInBytes;
|
|
3627
|
+
fileName;
|
|
3628
|
+
audioType;
|
|
3629
|
+
constructor({
|
|
3630
|
+
message,
|
|
3631
|
+
mimeType,
|
|
3632
|
+
sizeInBytes,
|
|
3633
|
+
fileName,
|
|
3634
|
+
audioType
|
|
3635
|
+
}) {
|
|
3636
|
+
super(message);
|
|
3637
|
+
this.name = "IsAnUnsupportedAudioTypeError";
|
|
3638
|
+
this.mimeType = mimeType;
|
|
3639
|
+
this.sizeInBytes = sizeInBytes;
|
|
3640
|
+
this.fileName = fileName;
|
|
3641
|
+
this.audioType = audioType;
|
|
3642
|
+
if (Error.captureStackTrace) {
|
|
3643
|
+
Error.captureStackTrace(this, IsAnUnsupportedAudioTypeError);
|
|
3644
|
+
}
|
|
3645
|
+
}
|
|
3646
|
+
}
|
|
3532
3647
|
// src/boxes/iso-base-media/traversal.ts
|
|
3533
3648
|
var getMoovBox = (segments) => {
|
|
3534
3649
|
const moovBox = segments.find((s) => s.type === "moov-box");
|
|
@@ -4358,6 +4473,234 @@ var getPrimariesFromIndex = (index) => {
|
|
|
4358
4473
|
return index === 1 ? "bt709" : index === 5 ? "bt470bg" : index === 6 ? "smpte170m" : index === 9 ? "bt2020" : null;
|
|
4359
4474
|
};
|
|
4360
4475
|
|
|
4476
|
+
// src/file-types/detect-file-type.ts
|
|
4477
|
+
var matchesPattern = (pattern) => {
|
|
4478
|
+
return (data) => {
|
|
4479
|
+
return pattern.every((value, index) => data[index] === value);
|
|
4480
|
+
};
|
|
4481
|
+
};
|
|
4482
|
+
var isRiffAvi2 = (data) => {
|
|
4483
|
+
const riffPattern = new Uint8Array([82, 73, 70, 70]);
|
|
4484
|
+
if (!matchesPattern(riffPattern)(data.subarray(0, 4))) {
|
|
4485
|
+
return false;
|
|
4486
|
+
}
|
|
4487
|
+
const fileType = data.subarray(8, 12);
|
|
4488
|
+
return new TextDecoder().decode(fileType) === "AVI ";
|
|
4489
|
+
};
|
|
4490
|
+
var isRiffWave = (data) => {
|
|
4491
|
+
const riffPattern = new Uint8Array([82, 73, 70, 70]);
|
|
4492
|
+
if (!matchesPattern(riffPattern)(data.subarray(0, 4))) {
|
|
4493
|
+
return false;
|
|
4494
|
+
}
|
|
4495
|
+
const fileType = data.subarray(8, 12);
|
|
4496
|
+
return new TextDecoder().decode(fileType) === "WAVE";
|
|
4497
|
+
};
|
|
4498
|
+
var isWebm = (data) => {
|
|
4499
|
+
return matchesPattern(webmPattern)(data.subarray(0, 4));
|
|
4500
|
+
};
|
|
4501
|
+
var isIsoBaseMedia = (data) => {
|
|
4502
|
+
const isoBaseMediaMp4Pattern = new TextEncoder().encode("ftyp");
|
|
4503
|
+
return matchesPattern(isoBaseMediaMp4Pattern)(data.subarray(4, 8));
|
|
4504
|
+
};
|
|
4505
|
+
var isTransportStream = (data) => {
|
|
4506
|
+
return data[0] === 71 && data[188] === 71;
|
|
4507
|
+
};
|
|
4508
|
+
var isMp3 = (data) => {
|
|
4509
|
+
const mpegPattern = new Uint8Array([255, 243, 228, 100]);
|
|
4510
|
+
const id3Pattern = new Uint8Array([73, 68, 51, 3]);
|
|
4511
|
+
const subarray = data.subarray(0, 4);
|
|
4512
|
+
return matchesPattern(mpegPattern)(subarray) || matchesPattern(id3Pattern)(subarray);
|
|
4513
|
+
};
|
|
4514
|
+
var isGif = (data) => {
|
|
4515
|
+
const gifPattern = new Uint8Array([71, 73, 70, 56]);
|
|
4516
|
+
return matchesPattern(gifPattern)(data.subarray(0, 4));
|
|
4517
|
+
};
|
|
4518
|
+
var isAac = (data) => {
|
|
4519
|
+
const aacPattern = new Uint8Array([255, 241]);
|
|
4520
|
+
return matchesPattern(aacPattern)(data.subarray(0, 2));
|
|
4521
|
+
};
|
|
4522
|
+
|
|
4523
|
+
// src/file-types/bmp.ts
|
|
4524
|
+
function getBmpDimensions(bmpData) {
|
|
4525
|
+
if (bmpData.length < 26) {
|
|
4526
|
+
return null;
|
|
4527
|
+
}
|
|
4528
|
+
const view = new DataView(bmpData.buffer, bmpData.byteOffset);
|
|
4529
|
+
return {
|
|
4530
|
+
width: view.getUint32(18, true),
|
|
4531
|
+
height: Math.abs(view.getInt32(22, true))
|
|
4532
|
+
};
|
|
4533
|
+
}
|
|
4534
|
+
var isBmp = (data) => {
|
|
4535
|
+
const bmpPattern = new Uint8Array([66, 77]);
|
|
4536
|
+
if (matchesPattern(bmpPattern)(data.subarray(0, 2))) {
|
|
4537
|
+
const bmp = getBmpDimensions(data);
|
|
4538
|
+
return { dimensions: bmp, type: "bmp" };
|
|
4539
|
+
}
|
|
4540
|
+
return null;
|
|
4541
|
+
};
|
|
4542
|
+
|
|
4543
|
+
// src/file-types/jpeg.ts
|
|
4544
|
+
function getJpegDimensions(data) {
|
|
4545
|
+
let offset = 0;
|
|
4546
|
+
function readUint16BE(o) {
|
|
4547
|
+
return data[o] << 8 | data[o + 1];
|
|
4548
|
+
}
|
|
4549
|
+
if (readUint16BE(offset) !== 65496) {
|
|
4550
|
+
return null;
|
|
4551
|
+
}
|
|
4552
|
+
offset += 2;
|
|
4553
|
+
while (offset < data.length) {
|
|
4554
|
+
if (data[offset] === 255) {
|
|
4555
|
+
const marker = data[offset + 1];
|
|
4556
|
+
if (marker === 192 || marker === 194) {
|
|
4557
|
+
const height = readUint16BE(offset + 5);
|
|
4558
|
+
const width = readUint16BE(offset + 7);
|
|
4559
|
+
return { width, height };
|
|
4560
|
+
}
|
|
4561
|
+
const length = readUint16BE(offset + 2);
|
|
4562
|
+
offset += length + 2;
|
|
4563
|
+
} else {
|
|
4564
|
+
offset++;
|
|
4565
|
+
}
|
|
4566
|
+
}
|
|
4567
|
+
return null;
|
|
4568
|
+
}
|
|
4569
|
+
var isJpeg = (data) => {
|
|
4570
|
+
const jpegPattern = new Uint8Array([255, 216]);
|
|
4571
|
+
const jpeg = matchesPattern(jpegPattern)(data.subarray(0, 2));
|
|
4572
|
+
if (!jpeg) {
|
|
4573
|
+
return null;
|
|
4574
|
+
}
|
|
4575
|
+
const dim = getJpegDimensions(data);
|
|
4576
|
+
return { dimensions: dim, type: "jpeg" };
|
|
4577
|
+
};
|
|
4578
|
+
|
|
4579
|
+
// src/file-types/pdf.ts
|
|
4580
|
+
var isPdf = (data) => {
|
|
4581
|
+
if (data.length < 4) {
|
|
4582
|
+
return null;
|
|
4583
|
+
}
|
|
4584
|
+
const pdfPattern = new Uint8Array([37, 80, 68, 70]);
|
|
4585
|
+
return matchesPattern(pdfPattern)(data.subarray(0, 4)) ? { type: "pdf" } : null;
|
|
4586
|
+
};
|
|
4587
|
+
|
|
4588
|
+
// src/file-types/png.ts
|
|
4589
|
+
function getPngDimensions(pngData) {
|
|
4590
|
+
if (pngData.length < 24) {
|
|
4591
|
+
return null;
|
|
4592
|
+
}
|
|
4593
|
+
const view = new DataView(pngData.buffer, pngData.byteOffset);
|
|
4594
|
+
const pngSignature = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
4595
|
+
for (let i = 0;i < 8; i++) {
|
|
4596
|
+
if (pngData[i] !== pngSignature[i]) {
|
|
4597
|
+
return null;
|
|
4598
|
+
}
|
|
4599
|
+
}
|
|
4600
|
+
return {
|
|
4601
|
+
width: view.getUint32(16, false),
|
|
4602
|
+
height: view.getUint32(20, false)
|
|
4603
|
+
};
|
|
4604
|
+
}
|
|
4605
|
+
var isPng = (data) => {
|
|
4606
|
+
const pngPattern = new Uint8Array([137, 80, 78, 71]);
|
|
4607
|
+
if (matchesPattern(pngPattern)(data.subarray(0, 4))) {
|
|
4608
|
+
const png = getPngDimensions(data);
|
|
4609
|
+
return { dimensions: png, type: "png" };
|
|
4610
|
+
}
|
|
4611
|
+
return null;
|
|
4612
|
+
};
|
|
4613
|
+
|
|
4614
|
+
// src/file-types/webp.ts
|
|
4615
|
+
function getWebPDimensions(bytes) {
|
|
4616
|
+
if (bytes.length < 30) {
|
|
4617
|
+
return null;
|
|
4618
|
+
}
|
|
4619
|
+
if (bytes[0] !== 82 || bytes[1] !== 73 || bytes[2] !== 70 || bytes[3] !== 70 || bytes[8] !== 87 || bytes[9] !== 69 || bytes[10] !== 66 || bytes[11] !== 80) {
|
|
4620
|
+
return null;
|
|
4621
|
+
}
|
|
4622
|
+
if (bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56) {
|
|
4623
|
+
if (bytes[15] === 32) {
|
|
4624
|
+
return {
|
|
4625
|
+
width: bytes[26] | bytes[27] << 8 & 16383,
|
|
4626
|
+
height: bytes[28] | bytes[29] << 8 & 16383
|
|
4627
|
+
};
|
|
4628
|
+
}
|
|
4629
|
+
}
|
|
4630
|
+
if (bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 76) {
|
|
4631
|
+
return {
|
|
4632
|
+
width: 1 + (bytes[21] | (bytes[22] & 63) << 8),
|
|
4633
|
+
height: 1 + ((bytes[22] & 192) >> 6 | bytes[23] << 2 | (bytes[24] & 15) << 10)
|
|
4634
|
+
};
|
|
4635
|
+
}
|
|
4636
|
+
if (bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 88) {
|
|
4637
|
+
return {
|
|
4638
|
+
width: 1 + (bytes[24] | bytes[25] << 8 | bytes[26] << 16),
|
|
4639
|
+
height: 1 + (bytes[27] | bytes[28] << 8 | bytes[29] << 16)
|
|
4640
|
+
};
|
|
4641
|
+
}
|
|
4642
|
+
return null;
|
|
4643
|
+
}
|
|
4644
|
+
var isWebp = (data) => {
|
|
4645
|
+
const webpPattern = new Uint8Array([82, 73, 70, 70]);
|
|
4646
|
+
if (matchesPattern(webpPattern)(data.subarray(0, 4))) {
|
|
4647
|
+
return {
|
|
4648
|
+
type: "webp",
|
|
4649
|
+
dimensions: getWebPDimensions(data)
|
|
4650
|
+
};
|
|
4651
|
+
}
|
|
4652
|
+
return null;
|
|
4653
|
+
};
|
|
4654
|
+
|
|
4655
|
+
// src/file-types/index.ts
|
|
4656
|
+
var detectFileType = (data) => {
|
|
4657
|
+
if (isRiffWave(data)) {
|
|
4658
|
+
return { type: "wav" };
|
|
4659
|
+
}
|
|
4660
|
+
if (isRiffAvi2(data)) {
|
|
4661
|
+
return { type: "riff" };
|
|
4662
|
+
}
|
|
4663
|
+
if (isAac(data)) {
|
|
4664
|
+
return { type: "aac" };
|
|
4665
|
+
}
|
|
4666
|
+
const webp = isWebp(data);
|
|
4667
|
+
if (webp) {
|
|
4668
|
+
return webp;
|
|
4669
|
+
}
|
|
4670
|
+
if (isWebm(data)) {
|
|
4671
|
+
return { type: "webm" };
|
|
4672
|
+
}
|
|
4673
|
+
if (isIsoBaseMedia(data)) {
|
|
4674
|
+
return { type: "iso-base-media" };
|
|
4675
|
+
}
|
|
4676
|
+
if (isTransportStream(data)) {
|
|
4677
|
+
return { type: "transport-stream" };
|
|
4678
|
+
}
|
|
4679
|
+
if (isMp3(data)) {
|
|
4680
|
+
return { type: "mp3" };
|
|
4681
|
+
}
|
|
4682
|
+
if (isGif(data)) {
|
|
4683
|
+
return { type: "gif" };
|
|
4684
|
+
}
|
|
4685
|
+
const png = isPng(data);
|
|
4686
|
+
if (png) {
|
|
4687
|
+
return png;
|
|
4688
|
+
}
|
|
4689
|
+
const pdf = isPdf(data);
|
|
4690
|
+
if (pdf) {
|
|
4691
|
+
return pdf;
|
|
4692
|
+
}
|
|
4693
|
+
const bmp = isBmp(data);
|
|
4694
|
+
if (bmp) {
|
|
4695
|
+
return bmp;
|
|
4696
|
+
}
|
|
4697
|
+
const jpeg = isJpeg(data);
|
|
4698
|
+
if (jpeg) {
|
|
4699
|
+
return jpeg;
|
|
4700
|
+
}
|
|
4701
|
+
return { type: "unknown" };
|
|
4702
|
+
};
|
|
4703
|
+
|
|
4361
4704
|
// src/buffer-iterator.ts
|
|
4362
4705
|
class OffsetCounter {
|
|
4363
4706
|
#offset;
|
|
@@ -4394,14 +4737,6 @@ class OffsetCounter {
|
|
|
4394
4737
|
this.#offset -= amount;
|
|
4395
4738
|
}
|
|
4396
4739
|
}
|
|
4397
|
-
var isoBaseMediaMp4Pattern = new TextEncoder().encode("ftyp");
|
|
4398
|
-
var mpegPattern = new Uint8Array([255, 243, 228, 100]);
|
|
4399
|
-
var riffPattern = new Uint8Array([82, 73, 70, 70]);
|
|
4400
|
-
var matchesPattern = (pattern) => {
|
|
4401
|
-
return (data) => {
|
|
4402
|
-
return pattern.every((value, index) => data[index] === value);
|
|
4403
|
-
};
|
|
4404
|
-
};
|
|
4405
4740
|
var makeOffsetCounter = () => {
|
|
4406
4741
|
return new OffsetCounter(0);
|
|
4407
4742
|
};
|
|
@@ -4542,21 +4877,6 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
4542
4877
|
const bytesRemaining = () => {
|
|
4543
4878
|
return data.byteLength - counter.getDiscardedOffset();
|
|
4544
4879
|
};
|
|
4545
|
-
const isIsoBaseMedia = () => {
|
|
4546
|
-
return matchesPattern(isoBaseMediaMp4Pattern)(data.subarray(4, 8));
|
|
4547
|
-
};
|
|
4548
|
-
const isRiff = () => {
|
|
4549
|
-
return matchesPattern(riffPattern)(data.subarray(0, 4));
|
|
4550
|
-
};
|
|
4551
|
-
const isWebm = () => {
|
|
4552
|
-
return matchesPattern(webmPattern)(data.subarray(0, 4));
|
|
4553
|
-
};
|
|
4554
|
-
const isMp3 = () => {
|
|
4555
|
-
return matchesPattern(mpegPattern)(data.subarray(0, 4));
|
|
4556
|
-
};
|
|
4557
|
-
const isTransportStream = () => {
|
|
4558
|
-
return data[0] === 71;
|
|
4559
|
-
};
|
|
4560
4880
|
const removeBytesRead = () => {
|
|
4561
4881
|
if (!discardAllowed) {
|
|
4562
4882
|
return;
|
|
@@ -4671,10 +4991,8 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
4671
4991
|
getBits,
|
|
4672
4992
|
byteLength,
|
|
4673
4993
|
bytesRemaining,
|
|
4674
|
-
isIsoBaseMedia,
|
|
4675
4994
|
leb128,
|
|
4676
4995
|
removeBytesRead,
|
|
4677
|
-
isWebm,
|
|
4678
4996
|
discard,
|
|
4679
4997
|
getEightByteNumber,
|
|
4680
4998
|
getFourByteNumber,
|
|
@@ -4683,7 +5001,9 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
4683
5001
|
const atom = getSlice(4);
|
|
4684
5002
|
return new TextDecoder().decode(atom);
|
|
4685
5003
|
},
|
|
4686
|
-
|
|
5004
|
+
detectFileType: () => {
|
|
5005
|
+
return detectFileType(data);
|
|
5006
|
+
},
|
|
4687
5007
|
getPaddedFourByteNumber,
|
|
4688
5008
|
getMatroskaSegmentId: () => {
|
|
4689
5009
|
if (bytesRemaining() === 0) {
|
|
@@ -4836,11 +5156,9 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
4836
5156
|
getInt32Le,
|
|
4837
5157
|
getInt32,
|
|
4838
5158
|
destroy,
|
|
4839
|
-
isMp3,
|
|
4840
5159
|
disallowDiscard,
|
|
4841
5160
|
allowDiscard,
|
|
4842
5161
|
startBox,
|
|
4843
|
-
isTransportStream,
|
|
4844
5162
|
readExpGolomb
|
|
4845
5163
|
};
|
|
4846
5164
|
};
|
|
@@ -6168,141 +6486,242 @@ var hasHdr = (boxes, state) => {
|
|
|
6168
6486
|
return hasTracks(boxes, state);
|
|
6169
6487
|
};
|
|
6170
6488
|
|
|
6489
|
+
// src/get-location.ts
|
|
6490
|
+
function parseLocation(locationString) {
|
|
6491
|
+
const locationPattern = /^([+-]\d{2}\.?\d{0,10})([+-]\d{3}\.?\d{0,10})([+-]\d+(\.\d+)?)?\/$/;
|
|
6492
|
+
const match = locationString.match(locationPattern);
|
|
6493
|
+
if (!match) {
|
|
6494
|
+
return null;
|
|
6495
|
+
}
|
|
6496
|
+
const latitude = parseFloat(match[1]);
|
|
6497
|
+
const longitude = parseFloat(match[2]);
|
|
6498
|
+
const altitude = match[3] ? parseFloat(match[3]) : null;
|
|
6499
|
+
return {
|
|
6500
|
+
latitude,
|
|
6501
|
+
longitude,
|
|
6502
|
+
altitude
|
|
6503
|
+
};
|
|
6504
|
+
}
|
|
6505
|
+
var getLocation = (structure) => {
|
|
6506
|
+
const metadata = getMetadata(structure);
|
|
6507
|
+
const locationEntry = metadata.find((entry) => entry.key === "com.apple.quicktime.location.ISO6709");
|
|
6508
|
+
const horizontalAccuracy = metadata.find((entry) => entry.key === "com.apple.quicktime.location.accuracy.horizontal");
|
|
6509
|
+
if (locationEntry) {
|
|
6510
|
+
const parsed = parseLocation(locationEntry.value);
|
|
6511
|
+
if (parsed === null) {
|
|
6512
|
+
return null;
|
|
6513
|
+
}
|
|
6514
|
+
return {
|
|
6515
|
+
...parsed,
|
|
6516
|
+
horizontalAccuracy: horizontalAccuracy?.value ? parseFloat(String(horizontalAccuracy.value)) : null
|
|
6517
|
+
};
|
|
6518
|
+
}
|
|
6519
|
+
return null;
|
|
6520
|
+
};
|
|
6521
|
+
|
|
6171
6522
|
// src/emit-available-info.ts
|
|
6172
6523
|
var emitAvailableInfo = ({
|
|
6173
6524
|
hasInfo,
|
|
6174
6525
|
parseResult,
|
|
6175
|
-
|
|
6526
|
+
callbacks,
|
|
6176
6527
|
state,
|
|
6177
6528
|
returnValue,
|
|
6178
6529
|
contentLength,
|
|
6179
|
-
name
|
|
6530
|
+
name,
|
|
6531
|
+
mimeType,
|
|
6532
|
+
fieldsInReturnValue,
|
|
6533
|
+
emittedFields
|
|
6180
6534
|
}) => {
|
|
6181
6535
|
const keys = Object.keys(hasInfo);
|
|
6182
6536
|
for (const key of keys) {
|
|
6183
6537
|
if (key === "structure") {
|
|
6184
|
-
if (parseResult && hasInfo.structure &&
|
|
6185
|
-
|
|
6186
|
-
|
|
6538
|
+
if (parseResult && hasInfo.structure && !emittedFields.structure) {
|
|
6539
|
+
callbacks.onStructure?.(parseResult.segments);
|
|
6540
|
+
if (fieldsInReturnValue.structure) {
|
|
6541
|
+
returnValue.structure = parseResult.segments;
|
|
6542
|
+
}
|
|
6543
|
+
emittedFields.structure = true;
|
|
6187
6544
|
}
|
|
6188
6545
|
continue;
|
|
6189
6546
|
}
|
|
6190
6547
|
if (key === "durationInSeconds") {
|
|
6191
|
-
if (hasInfo.durationInSeconds &&
|
|
6548
|
+
if (hasInfo.durationInSeconds && !emittedFields.durationInSeconds && parseResult) {
|
|
6192
6549
|
const durationInSeconds = getDuration(parseResult.segments, state);
|
|
6193
|
-
|
|
6194
|
-
|
|
6550
|
+
callbacks.onDurationInSeconds?.(durationInSeconds);
|
|
6551
|
+
if (fieldsInReturnValue.durationInSeconds) {
|
|
6552
|
+
returnValue.durationInSeconds = durationInSeconds;
|
|
6553
|
+
}
|
|
6554
|
+
emittedFields.durationInSeconds = true;
|
|
6195
6555
|
}
|
|
6196
6556
|
continue;
|
|
6197
6557
|
}
|
|
6198
6558
|
if (key === "dimensions") {
|
|
6199
|
-
if (hasInfo.dimensions &&
|
|
6559
|
+
if (hasInfo.dimensions && !emittedFields.dimensions && parseResult) {
|
|
6200
6560
|
const dimensionsQueried = getDimensions(parseResult.segments, state);
|
|
6201
6561
|
const dimensions = {
|
|
6202
6562
|
height: dimensionsQueried.height,
|
|
6203
6563
|
width: dimensionsQueried.width
|
|
6204
6564
|
};
|
|
6205
|
-
|
|
6206
|
-
|
|
6565
|
+
callbacks.onDimensions?.(dimensions);
|
|
6566
|
+
if (fieldsInReturnValue.dimensions) {
|
|
6567
|
+
returnValue.dimensions = dimensions;
|
|
6568
|
+
}
|
|
6569
|
+
emittedFields.dimensions = true;
|
|
6207
6570
|
}
|
|
6208
6571
|
continue;
|
|
6209
6572
|
}
|
|
6210
6573
|
if (key === "unrotatedDimensions") {
|
|
6211
|
-
if (
|
|
6574
|
+
if (hasInfo.unrotatedDimensions && !emittedFields.unrotatedDimensions && parseResult) {
|
|
6212
6575
|
const dimensionsQueried = getDimensions(parseResult.segments, state);
|
|
6213
6576
|
const unrotatedDimensions = {
|
|
6214
6577
|
height: dimensionsQueried.unrotatedHeight,
|
|
6215
6578
|
width: dimensionsQueried.unrotatedWidth
|
|
6216
6579
|
};
|
|
6217
|
-
|
|
6218
|
-
|
|
6580
|
+
callbacks.onUnrotatedDimensions?.(unrotatedDimensions);
|
|
6581
|
+
if (fieldsInReturnValue.unrotatedDimensions) {
|
|
6582
|
+
returnValue.unrotatedDimensions = unrotatedDimensions;
|
|
6583
|
+
}
|
|
6584
|
+
emittedFields.unrotatedDimensions = true;
|
|
6219
6585
|
}
|
|
6220
6586
|
continue;
|
|
6221
6587
|
}
|
|
6222
6588
|
if (key === "rotation") {
|
|
6223
|
-
if (
|
|
6589
|
+
if (hasInfo.rotation && !emittedFields.rotation && parseResult) {
|
|
6224
6590
|
const dimensionsQueried = getDimensions(parseResult.segments, state);
|
|
6225
6591
|
const { rotation } = dimensionsQueried;
|
|
6226
|
-
|
|
6227
|
-
|
|
6592
|
+
callbacks.onRotation?.(rotation);
|
|
6593
|
+
if (fieldsInReturnValue.rotation) {
|
|
6594
|
+
returnValue.rotation = rotation;
|
|
6595
|
+
}
|
|
6596
|
+
emittedFields.rotation = true;
|
|
6228
6597
|
}
|
|
6229
6598
|
continue;
|
|
6230
6599
|
}
|
|
6231
6600
|
if (key === "fps") {
|
|
6232
|
-
if (
|
|
6601
|
+
if (!emittedFields.fps && hasInfo.fps && parseResult) {
|
|
6233
6602
|
const fps = getFps(parseResult.segments);
|
|
6234
|
-
|
|
6235
|
-
|
|
6603
|
+
callbacks.onFps?.(fps);
|
|
6604
|
+
if (fieldsInReturnValue.fps) {
|
|
6605
|
+
returnValue.fps = fps;
|
|
6606
|
+
}
|
|
6607
|
+
emittedFields.fps = true;
|
|
6236
6608
|
}
|
|
6237
6609
|
continue;
|
|
6238
6610
|
}
|
|
6239
6611
|
if (key === "videoCodec") {
|
|
6240
|
-
if (
|
|
6612
|
+
if (!emittedFields.videoCodec && hasInfo.videoCodec && parseResult) {
|
|
6241
6613
|
const videoCodec = getVideoCodec(parseResult.segments, state);
|
|
6242
|
-
|
|
6243
|
-
|
|
6614
|
+
callbacks.onVideoCodec?.(videoCodec);
|
|
6615
|
+
if (fieldsInReturnValue.videoCodec) {
|
|
6616
|
+
returnValue.videoCodec = videoCodec;
|
|
6617
|
+
}
|
|
6618
|
+
emittedFields.videoCodec = true;
|
|
6244
6619
|
}
|
|
6245
6620
|
continue;
|
|
6246
6621
|
}
|
|
6247
6622
|
if (key === "audioCodec") {
|
|
6248
|
-
if (
|
|
6623
|
+
if (!emittedFields.audioCodec && hasInfo.audioCodec && parseResult) {
|
|
6249
6624
|
const audioCodec = getAudioCodec(parseResult.segments, state);
|
|
6250
|
-
|
|
6251
|
-
|
|
6625
|
+
callbacks.onAudioCodec?.(audioCodec);
|
|
6626
|
+
if (fieldsInReturnValue.audioCodec) {
|
|
6627
|
+
returnValue.audioCodec = audioCodec;
|
|
6628
|
+
}
|
|
6629
|
+
emittedFields.audioCodec = true;
|
|
6252
6630
|
}
|
|
6253
6631
|
continue;
|
|
6254
6632
|
}
|
|
6255
6633
|
if (key === "tracks") {
|
|
6256
|
-
if (
|
|
6634
|
+
if (!emittedFields.tracks && hasInfo.tracks && parseResult) {
|
|
6257
6635
|
const { videoTracks, audioTracks } = getTracks(parseResult.segments, state);
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6636
|
+
callbacks.onTracks?.({ videoTracks, audioTracks });
|
|
6637
|
+
if (fieldsInReturnValue.tracks) {
|
|
6638
|
+
returnValue.tracks = { videoTracks, audioTracks };
|
|
6639
|
+
}
|
|
6640
|
+
emittedFields.tracks = true;
|
|
6261
6641
|
}
|
|
6262
6642
|
continue;
|
|
6263
6643
|
}
|
|
6264
6644
|
if (key === "internalStats") {
|
|
6265
6645
|
if (hasInfo.internalStats) {
|
|
6266
6646
|
const internalStats = state.getInternalStats();
|
|
6267
|
-
|
|
6647
|
+
if (fieldsInReturnValue.internalStats) {
|
|
6648
|
+
returnValue.internalStats = internalStats;
|
|
6649
|
+
}
|
|
6650
|
+
emittedFields.internalStats = true;
|
|
6268
6651
|
}
|
|
6269
6652
|
continue;
|
|
6270
6653
|
}
|
|
6271
6654
|
if (key === "size") {
|
|
6272
|
-
if (
|
|
6273
|
-
|
|
6274
|
-
|
|
6655
|
+
if (!emittedFields.size && hasInfo.size) {
|
|
6656
|
+
callbacks.onSize?.(contentLength);
|
|
6657
|
+
if (fieldsInReturnValue.size) {
|
|
6658
|
+
returnValue.size = contentLength;
|
|
6659
|
+
}
|
|
6660
|
+
emittedFields.size = true;
|
|
6661
|
+
}
|
|
6662
|
+
continue;
|
|
6663
|
+
}
|
|
6664
|
+
if (key === "mimeType") {
|
|
6665
|
+
if (!emittedFields.mimeType && hasInfo.mimeType) {
|
|
6666
|
+
callbacks.onMimeType?.(mimeType);
|
|
6667
|
+
if (fieldsInReturnValue.mimeType) {
|
|
6668
|
+
returnValue.mimeType = mimeType;
|
|
6669
|
+
}
|
|
6670
|
+
emittedFields.mimeType = true;
|
|
6275
6671
|
}
|
|
6276
6672
|
continue;
|
|
6277
6673
|
}
|
|
6278
6674
|
if (key === "name") {
|
|
6279
|
-
if (
|
|
6280
|
-
|
|
6281
|
-
|
|
6675
|
+
if (!emittedFields.name && hasInfo.name) {
|
|
6676
|
+
callbacks.onName?.(name);
|
|
6677
|
+
if (fieldsInReturnValue.name) {
|
|
6678
|
+
returnValue.name = name;
|
|
6679
|
+
}
|
|
6680
|
+
emittedFields.name = true;
|
|
6282
6681
|
}
|
|
6283
6682
|
continue;
|
|
6284
6683
|
}
|
|
6285
6684
|
if (key === "isHdr") {
|
|
6286
|
-
if (returnValue.isHdr
|
|
6685
|
+
if (!returnValue.isHdr && hasInfo.isHdr && parseResult) {
|
|
6287
6686
|
const isHdr = getIsHdr(parseResult.segments, state);
|
|
6288
|
-
|
|
6289
|
-
|
|
6687
|
+
callbacks.onIsHdr?.(isHdr);
|
|
6688
|
+
if (fieldsInReturnValue.isHdr) {
|
|
6689
|
+
returnValue.isHdr = isHdr;
|
|
6690
|
+
}
|
|
6691
|
+
emittedFields.isHdr = true;
|
|
6290
6692
|
}
|
|
6291
6693
|
continue;
|
|
6292
6694
|
}
|
|
6293
6695
|
if (key === "container") {
|
|
6294
|
-
if (returnValue.container
|
|
6696
|
+
if (!returnValue.container && hasInfo.container && parseResult) {
|
|
6295
6697
|
const container = getContainer(parseResult.segments);
|
|
6296
|
-
|
|
6297
|
-
|
|
6698
|
+
callbacks.onContainer?.(container);
|
|
6699
|
+
if (fieldsInReturnValue.container) {
|
|
6700
|
+
returnValue.container = container;
|
|
6701
|
+
}
|
|
6702
|
+
emittedFields.container = true;
|
|
6298
6703
|
}
|
|
6299
6704
|
continue;
|
|
6300
6705
|
}
|
|
6301
6706
|
if (key === "metadata") {
|
|
6302
|
-
if (
|
|
6707
|
+
if (!emittedFields.metadata && hasInfo.metadata && parseResult) {
|
|
6303
6708
|
const metadata = getMetadata(parseResult.segments);
|
|
6304
|
-
|
|
6305
|
-
|
|
6709
|
+
callbacks.onMetadata?.(metadata);
|
|
6710
|
+
if (fieldsInReturnValue.metadata) {
|
|
6711
|
+
returnValue.metadata = metadata;
|
|
6712
|
+
}
|
|
6713
|
+
emittedFields.metadata = true;
|
|
6714
|
+
}
|
|
6715
|
+
continue;
|
|
6716
|
+
}
|
|
6717
|
+
if (key === "location") {
|
|
6718
|
+
if (!emittedFields.location && hasInfo.location && parseResult) {
|
|
6719
|
+
const location = getLocation(parseResult.segments);
|
|
6720
|
+
callbacks.onLocation?.(location);
|
|
6721
|
+
if (fieldsInReturnValue.location) {
|
|
6722
|
+
returnValue.location = location;
|
|
6723
|
+
}
|
|
6724
|
+
emittedFields.location = true;
|
|
6306
6725
|
}
|
|
6307
6726
|
continue;
|
|
6308
6727
|
}
|
|
@@ -6310,9 +6729,41 @@ var emitAvailableInfo = ({
|
|
|
6310
6729
|
}
|
|
6311
6730
|
};
|
|
6312
6731
|
|
|
6732
|
+
// src/get-fields-from-callbacks.ts
|
|
6733
|
+
var getFieldsFromCallback = ({
|
|
6734
|
+
fields,
|
|
6735
|
+
callbacks
|
|
6736
|
+
}) => {
|
|
6737
|
+
const newFields = {
|
|
6738
|
+
audioCodec: Boolean(callbacks.onAudioCodec),
|
|
6739
|
+
container: Boolean(callbacks.onContainer),
|
|
6740
|
+
dimensions: Boolean(callbacks.onDimensions),
|
|
6741
|
+
durationInSeconds: Boolean(callbacks.onDurationInSeconds),
|
|
6742
|
+
fps: Boolean(callbacks.onFps),
|
|
6743
|
+
internalStats: Boolean(callbacks.onInternalStats),
|
|
6744
|
+
isHdr: Boolean(callbacks.onIsHdr),
|
|
6745
|
+
location: Boolean(callbacks.onLocation),
|
|
6746
|
+
metadata: Boolean(callbacks.onMetadata),
|
|
6747
|
+
mimeType: Boolean(callbacks.onMimeType),
|
|
6748
|
+
name: Boolean(callbacks.onName),
|
|
6749
|
+
rotation: Boolean(callbacks.onRotation),
|
|
6750
|
+
size: Boolean(callbacks.onSize),
|
|
6751
|
+
structure: Boolean(callbacks.onStructure),
|
|
6752
|
+
tracks: Boolean(callbacks.onTracks),
|
|
6753
|
+
unrotatedDimensions: Boolean(callbacks.onUnrotatedDimensions),
|
|
6754
|
+
videoCodec: Boolean(callbacks.onVideoCodec),
|
|
6755
|
+
...fields
|
|
6756
|
+
};
|
|
6757
|
+
return newFields;
|
|
6758
|
+
};
|
|
6759
|
+
|
|
6313
6760
|
// src/has-all-info.ts
|
|
6314
|
-
var getAvailableInfo = (
|
|
6315
|
-
|
|
6761
|
+
var getAvailableInfo = ({
|
|
6762
|
+
fieldsToFetch,
|
|
6763
|
+
structure,
|
|
6764
|
+
state
|
|
6765
|
+
}) => {
|
|
6766
|
+
const keys = Object.entries(fieldsToFetch).filter(([, value]) => value);
|
|
6316
6767
|
const infos = keys.map(([_key]) => {
|
|
6317
6768
|
const key = _key;
|
|
6318
6769
|
if (key === "structure") {
|
|
@@ -6345,13 +6796,16 @@ var getAvailableInfo = (options, structure, state) => {
|
|
|
6345
6796
|
if (key === "size") {
|
|
6346
6797
|
return true;
|
|
6347
6798
|
}
|
|
6799
|
+
if (key === "mimeType") {
|
|
6800
|
+
return true;
|
|
6801
|
+
}
|
|
6348
6802
|
if (key === "name") {
|
|
6349
6803
|
return true;
|
|
6350
6804
|
}
|
|
6351
6805
|
if (key === "container") {
|
|
6352
6806
|
return Boolean(structure && hasContainer(structure));
|
|
6353
6807
|
}
|
|
6354
|
-
if (key === "metadata") {
|
|
6808
|
+
if (key === "metadata" || key === "location") {
|
|
6355
6809
|
return false;
|
|
6356
6810
|
}
|
|
6357
6811
|
throw new Error(`Unknown key: ${key}`);
|
|
@@ -6368,7 +6822,11 @@ var hasAllInfo = ({
|
|
|
6368
6822
|
state,
|
|
6369
6823
|
structure
|
|
6370
6824
|
}) => {
|
|
6371
|
-
const availableInfo = getAvailableInfo(
|
|
6825
|
+
const availableInfo = getAvailableInfo({
|
|
6826
|
+
fieldsToFetch: fields ?? {},
|
|
6827
|
+
structure,
|
|
6828
|
+
state
|
|
6829
|
+
});
|
|
6372
6830
|
return Object.values(availableInfo).every(Boolean) && (state.maySkipVideoData() || state.canSkipTracksState.canSkipTracks());
|
|
6373
6831
|
};
|
|
6374
6832
|
|
|
@@ -10919,16 +11377,20 @@ var parseVideo = ({
|
|
|
10919
11377
|
options,
|
|
10920
11378
|
signal,
|
|
10921
11379
|
logLevel,
|
|
10922
|
-
fields
|
|
11380
|
+
fields,
|
|
11381
|
+
mimeType,
|
|
11382
|
+
contentLength,
|
|
11383
|
+
name
|
|
10923
11384
|
}) => {
|
|
10924
11385
|
if (iterator.bytesRemaining() === 0) {
|
|
10925
11386
|
return Promise.reject(new Error("no bytes"));
|
|
10926
11387
|
}
|
|
10927
|
-
|
|
11388
|
+
const fileType = iterator.detectFileType();
|
|
11389
|
+
if (fileType.type === "riff") {
|
|
10928
11390
|
Log.verbose(logLevel, "Detected RIFF container");
|
|
10929
11391
|
return Promise.resolve(parseRiff({ iterator, options, fields }));
|
|
10930
11392
|
}
|
|
10931
|
-
if (
|
|
11393
|
+
if (fileType.type === "iso-base-media") {
|
|
10932
11394
|
Log.verbose(logLevel, "Detected ISO Base Media container");
|
|
10933
11395
|
return parseIsoBaseMediaBoxes({
|
|
10934
11396
|
iterator,
|
|
@@ -10942,11 +11404,11 @@ var parseVideo = ({
|
|
|
10942
11404
|
fields
|
|
10943
11405
|
});
|
|
10944
11406
|
}
|
|
10945
|
-
if (
|
|
11407
|
+
if (fileType.type === "webm") {
|
|
10946
11408
|
Log.verbose(logLevel, "Detected Matroska container");
|
|
10947
11409
|
return parseWebm({ counter: iterator, parserContext: options, fields });
|
|
10948
11410
|
}
|
|
10949
|
-
if (
|
|
11411
|
+
if (fileType.type === "transport-stream") {
|
|
10950
11412
|
return parseTransportStream({
|
|
10951
11413
|
iterator,
|
|
10952
11414
|
parserContext: options,
|
|
@@ -10959,10 +11421,68 @@ var parseVideo = ({
|
|
|
10959
11421
|
nextPesHeaderStore: makeNextPesHeaderStore()
|
|
10960
11422
|
});
|
|
10961
11423
|
}
|
|
10962
|
-
if (
|
|
10963
|
-
return Promise.reject(new
|
|
10964
|
-
|
|
10965
|
-
|
|
11424
|
+
if (fileType.type === "mp3") {
|
|
11425
|
+
return Promise.reject(new IsAnUnsupportedAudioTypeError({
|
|
11426
|
+
message: "MP3 files are not yet supported",
|
|
11427
|
+
mimeType,
|
|
11428
|
+
sizeInBytes: contentLength,
|
|
11429
|
+
fileName: name,
|
|
11430
|
+
audioType: "mp3"
|
|
11431
|
+
}));
|
|
11432
|
+
}
|
|
11433
|
+
if (fileType.type === "wav") {
|
|
11434
|
+
return Promise.reject(new IsAnUnsupportedAudioTypeError({
|
|
11435
|
+
message: "WAV files are not yet supported",
|
|
11436
|
+
mimeType,
|
|
11437
|
+
sizeInBytes: contentLength,
|
|
11438
|
+
fileName: name,
|
|
11439
|
+
audioType: "wav"
|
|
11440
|
+
}));
|
|
11441
|
+
}
|
|
11442
|
+
if (fileType.type === "aac") {
|
|
11443
|
+
return Promise.reject(new IsAnUnsupportedAudioTypeError({
|
|
11444
|
+
message: "AAC files are not yet supported",
|
|
11445
|
+
mimeType,
|
|
11446
|
+
sizeInBytes: contentLength,
|
|
11447
|
+
fileName: name,
|
|
11448
|
+
audioType: "aac"
|
|
11449
|
+
}));
|
|
11450
|
+
}
|
|
11451
|
+
if (fileType.type === "gif") {
|
|
11452
|
+
return Promise.reject(new IsAGifError({
|
|
11453
|
+
message: "GIF files are not yet supported",
|
|
11454
|
+
mimeType,
|
|
11455
|
+
sizeInBytes: contentLength,
|
|
11456
|
+
fileName: name
|
|
11457
|
+
}));
|
|
11458
|
+
}
|
|
11459
|
+
if (fileType.type === "pdf") {
|
|
11460
|
+
return Promise.reject(new IsAPdfError({
|
|
11461
|
+
message: "GIF files are not supported",
|
|
11462
|
+
mimeType,
|
|
11463
|
+
sizeInBytes: contentLength,
|
|
11464
|
+
fileName: name
|
|
11465
|
+
}));
|
|
11466
|
+
}
|
|
11467
|
+
if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp") {
|
|
11468
|
+
return Promise.reject(new IsAnImageError({
|
|
11469
|
+
message: "Image files are not supported",
|
|
11470
|
+
imageType: fileType.type,
|
|
11471
|
+
dimensions: fileType.dimensions,
|
|
11472
|
+
mimeType,
|
|
11473
|
+
sizeInBytes: contentLength,
|
|
11474
|
+
fileName: name
|
|
11475
|
+
}));
|
|
11476
|
+
}
|
|
11477
|
+
if (fileType.type === "unknown") {
|
|
11478
|
+
return Promise.reject(new IsAnUnsupportedFileTypeError({
|
|
11479
|
+
message: "Unknown file format",
|
|
11480
|
+
mimeType,
|
|
11481
|
+
sizeInBytes: contentLength,
|
|
11482
|
+
fileName: name
|
|
11483
|
+
}));
|
|
11484
|
+
}
|
|
11485
|
+
return Promise.reject(new Error("Unknown video format " + fileType));
|
|
10966
11486
|
};
|
|
10967
11487
|
|
|
10968
11488
|
// src/state/can-skip-tracks.ts
|
|
@@ -10981,7 +11501,9 @@ var needsTracksField = {
|
|
|
10981
11501
|
tracks: true,
|
|
10982
11502
|
unrotatedDimensions: true,
|
|
10983
11503
|
videoCodec: true,
|
|
10984
|
-
metadata: true
|
|
11504
|
+
metadata: true,
|
|
11505
|
+
location: true,
|
|
11506
|
+
mimeType: false
|
|
10985
11507
|
};
|
|
10986
11508
|
var makeCanSkipTracksState = ({
|
|
10987
11509
|
hasAudioTrackHandlers,
|
|
@@ -11183,9 +11705,9 @@ var makeParserState = ({
|
|
|
11183
11705
|
};
|
|
11184
11706
|
|
|
11185
11707
|
// src/parse-media.ts
|
|
11186
|
-
var parseMedia = async ({
|
|
11708
|
+
var parseMedia = async function({
|
|
11187
11709
|
src,
|
|
11188
|
-
fields,
|
|
11710
|
+
fields: _fieldsInReturnValue,
|
|
11189
11711
|
reader: readerInterface = fetchReader,
|
|
11190
11712
|
onAudioTrack,
|
|
11191
11713
|
onVideoTrack,
|
|
@@ -11193,23 +11715,48 @@ var parseMedia = async ({
|
|
|
11193
11715
|
logLevel = "info",
|
|
11194
11716
|
onParseProgress,
|
|
11195
11717
|
...more
|
|
11196
|
-
})
|
|
11718
|
+
}) {
|
|
11197
11719
|
let iterator = null;
|
|
11198
11720
|
let parseResult = null;
|
|
11721
|
+
const fieldsInReturnValue = _fieldsInReturnValue ?? {};
|
|
11722
|
+
const fields = getFieldsFromCallback({
|
|
11723
|
+
fields: fieldsInReturnValue,
|
|
11724
|
+
callbacks: more
|
|
11725
|
+
});
|
|
11199
11726
|
const state = makeParserState({
|
|
11200
11727
|
hasAudioTrackHandlers: Boolean(onAudioTrack),
|
|
11201
11728
|
hasVideoTrackHandlers: Boolean(onVideoTrack),
|
|
11202
11729
|
signal,
|
|
11203
11730
|
getIterator: () => iterator,
|
|
11204
|
-
fields
|
|
11731
|
+
fields
|
|
11205
11732
|
});
|
|
11206
11733
|
const {
|
|
11207
11734
|
reader,
|
|
11208
11735
|
contentLength,
|
|
11209
11736
|
name,
|
|
11737
|
+
contentType,
|
|
11210
11738
|
supportsContentRange: readerSupportsContentRange
|
|
11211
11739
|
} = await readerInterface.read(src, null, signal);
|
|
11212
11740
|
let currentReader = reader;
|
|
11741
|
+
const emittedFields = {
|
|
11742
|
+
audioCodec: false,
|
|
11743
|
+
container: false,
|
|
11744
|
+
dimensions: false,
|
|
11745
|
+
durationInSeconds: false,
|
|
11746
|
+
fps: false,
|
|
11747
|
+
internalStats: false,
|
|
11748
|
+
isHdr: false,
|
|
11749
|
+
location: false,
|
|
11750
|
+
metadata: false,
|
|
11751
|
+
mimeType: false,
|
|
11752
|
+
name: false,
|
|
11753
|
+
rotation: false,
|
|
11754
|
+
size: false,
|
|
11755
|
+
structure: false,
|
|
11756
|
+
tracks: false,
|
|
11757
|
+
videoCodec: false,
|
|
11758
|
+
unrotatedDimensions: false
|
|
11759
|
+
};
|
|
11213
11760
|
const supportsContentRange = readerSupportsContentRange && !(typeof process !== "undefined" && typeof process.env !== "undefined" && process.env.DISABLE_CONTENT_RANGE === "true");
|
|
11214
11761
|
const returnValue = {};
|
|
11215
11762
|
const moreFields = more;
|
|
@@ -11222,15 +11769,22 @@ var parseMedia = async ({
|
|
|
11222
11769
|
nextTrackIndex: 0
|
|
11223
11770
|
};
|
|
11224
11771
|
const triggerInfoEmit = () => {
|
|
11225
|
-
const availableInfo = getAvailableInfo(
|
|
11772
|
+
const availableInfo = getAvailableInfo({
|
|
11773
|
+
fieldsToFetch: fields,
|
|
11774
|
+
structure: parseResult?.segments ?? null,
|
|
11775
|
+
state
|
|
11776
|
+
});
|
|
11226
11777
|
emitAvailableInfo({
|
|
11227
11778
|
hasInfo: availableInfo,
|
|
11228
|
-
moreFields,
|
|
11779
|
+
callbacks: moreFields,
|
|
11780
|
+
fieldsInReturnValue,
|
|
11229
11781
|
parseResult,
|
|
11230
11782
|
state,
|
|
11231
11783
|
returnValue,
|
|
11232
11784
|
contentLength,
|
|
11233
|
-
name
|
|
11785
|
+
name,
|
|
11786
|
+
mimeType: contentType,
|
|
11787
|
+
emittedFields
|
|
11234
11788
|
});
|
|
11235
11789
|
};
|
|
11236
11790
|
triggerInfoEmit();
|
|
@@ -11275,14 +11829,17 @@ var parseMedia = async ({
|
|
|
11275
11829
|
options,
|
|
11276
11830
|
signal: signal ?? null,
|
|
11277
11831
|
logLevel,
|
|
11278
|
-
fields
|
|
11832
|
+
fields,
|
|
11833
|
+
mimeType: contentType,
|
|
11834
|
+
contentLength,
|
|
11835
|
+
name
|
|
11279
11836
|
});
|
|
11280
11837
|
}
|
|
11281
11838
|
if (parseResult.status === "incomplete" && parseResult.skipTo !== null) {
|
|
11282
11839
|
state.increaseSkippedBytes(parseResult.skipTo - iterator.counter.getOffset());
|
|
11283
11840
|
}
|
|
11284
11841
|
if (hasAllInfo({
|
|
11285
|
-
fields
|
|
11842
|
+
fields,
|
|
11286
11843
|
structure: parseResult.segments,
|
|
11287
11844
|
state
|
|
11288
11845
|
})) {
|
|
@@ -11308,19 +11865,23 @@ var parseMedia = async ({
|
|
|
11308
11865
|
}
|
|
11309
11866
|
}
|
|
11310
11867
|
Log.verbose(logLevel, "Finished parsing file");
|
|
11868
|
+
const hasInfo = Object.keys(fields).reduce((acc, key) => {
|
|
11869
|
+
if (fields?.[key]) {
|
|
11870
|
+
acc[key] = true;
|
|
11871
|
+
}
|
|
11872
|
+
return acc;
|
|
11873
|
+
}, {});
|
|
11311
11874
|
emitAvailableInfo({
|
|
11312
|
-
hasInfo
|
|
11313
|
-
|
|
11314
|
-
|
|
11315
|
-
}
|
|
11316
|
-
return acc;
|
|
11317
|
-
}, {}),
|
|
11318
|
-
moreFields,
|
|
11875
|
+
hasInfo,
|
|
11876
|
+
callbacks: moreFields,
|
|
11877
|
+
fieldsInReturnValue,
|
|
11319
11878
|
parseResult,
|
|
11320
11879
|
state,
|
|
11321
11880
|
returnValue,
|
|
11322
11881
|
contentLength,
|
|
11323
|
-
|
|
11882
|
+
mimeType: contentType,
|
|
11883
|
+
name,
|
|
11884
|
+
emittedFields
|
|
11324
11885
|
});
|
|
11325
11886
|
currentReader.abort();
|
|
11326
11887
|
iterator?.destroy();
|
|
@@ -11342,5 +11903,10 @@ var MediaParserInternals = {
|
|
|
11342
11903
|
export {
|
|
11343
11904
|
parseMedia,
|
|
11344
11905
|
VERSION,
|
|
11345
|
-
MediaParserInternals
|
|
11906
|
+
MediaParserInternals,
|
|
11907
|
+
IsAnUnsupportedFileTypeError,
|
|
11908
|
+
IsAnUnsupportedAudioTypeError,
|
|
11909
|
+
IsAnImageError,
|
|
11910
|
+
IsAPdfError,
|
|
11911
|
+
IsAGifError
|
|
11346
11912
|
};
|