dasha 4.3.1 → 4.4.0
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/index.d.mts +49 -6
- package/dist/index.mjs +193 -7
- package/package.json +7 -7
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import * as _$mediabunny from "mediabunny";
|
|
2
1
|
import { AudioCodec as AudioCodec$1, DurationMetadataRequestOptions, EncodedPacket, FilePathSource, HLS, HLS_FORMATS, Input as Input$1, InputAudioTrack as InputAudioTrack$1, InputFormat, InputOptions, InputTrack as InputTrack$2, InputTrackQuery, InputTrackQuery as InputTrackQuery$1, InputVideoTrack as InputVideoTrack$1, MP3, MP4, MaybePromise, MediaCodec as MediaCodec$1, MetadataTags, PacketRetrievalOptions, PathedSource, Source, SourceRef, SubtitleCodec as SubtitleCodec$1, TrackDisposition, UrlSource, VideoCodec as VideoCodec$1, asc, desc, prefer } from "mediabunny";
|
|
3
|
-
import * as _$_xmldom_xmldom0 from "@xmldom/xmldom";
|
|
4
2
|
|
|
5
3
|
//#region src/mediabunny.d.ts
|
|
6
4
|
type Segment$1 = {
|
|
@@ -104,7 +102,7 @@ declare const ROLE_TYPE: {
|
|
|
104
102
|
type RoleType = (typeof ROLE_TYPE)[keyof typeof ROLE_TYPE];
|
|
105
103
|
//#endregion
|
|
106
104
|
//#region src/dash/dash-misc.d.ts
|
|
107
|
-
type Element =
|
|
105
|
+
type Element = import('@xmldom/xmldom').Element;
|
|
108
106
|
type DashTrackType = 'video' | 'audio' | 'subtitle';
|
|
109
107
|
type DashEncryptionData = {
|
|
110
108
|
method: string;
|
|
@@ -231,7 +229,7 @@ declare class DashSegmentedInput {
|
|
|
231
229
|
firstTrackPromise: Promise<TrackWithBacking> | null;
|
|
232
230
|
packetInfos: WeakMap<EncodedPacket, PacketInfo>;
|
|
233
231
|
firstSegmentFirstTimestamps: WeakMap<DashSegment, number>;
|
|
234
|
-
firstTimestampCache: WeakMap<Input$1<
|
|
232
|
+
firstTimestampCache: WeakMap<Input$1<import("mediabunny").Source>, number>;
|
|
235
233
|
constructor(internalTrack: DashInternalTrack);
|
|
236
234
|
runUpdateSegments(): Promise<void>;
|
|
237
235
|
updateSegments(): Promise<void>;
|
|
@@ -582,6 +580,14 @@ type InputSubtitleTrackMetadata = {
|
|
|
582
580
|
name?: string | null;
|
|
583
581
|
pairWith?: InputVideoTrack | Iterable<InputVideoTrack>;
|
|
584
582
|
};
|
|
583
|
+
type InputAudioSource = Source | SourceRef<Source>;
|
|
584
|
+
type InputAudioTrackPairing = InputVideoTrack | Iterable<InputVideoTrack> | 'all' | 'primary' | false;
|
|
585
|
+
type InputAudioTracksOptions = {
|
|
586
|
+
filter?: InputTrackQuery$1<InputAudioTrack>['filter'];
|
|
587
|
+
formats?: readonly InputFormat[];
|
|
588
|
+
pairWith?: InputAudioTrackPairing;
|
|
589
|
+
sortBy?: InputTrackQuery$1<InputAudioTrack>['sortBy'];
|
|
590
|
+
};
|
|
585
591
|
type SegmentableBacking = {
|
|
586
592
|
getId(): number;
|
|
587
593
|
getNumber(): number;
|
|
@@ -607,11 +613,46 @@ type TrackBacking = NativeTrackBacking | SegmentableBacking;
|
|
|
607
613
|
declare const BACKING_TYPE_SUBTITLE = "subtitle";
|
|
608
614
|
declare const BACKING_TYPE_AUDIO = "audio";
|
|
609
615
|
declare const BACKING_TYPE_VIDEO = "video";
|
|
616
|
+
declare class ImportedAudioTrackBacking {
|
|
617
|
+
#private;
|
|
618
|
+
constructor(params: {
|
|
619
|
+
backing: SegmentableBacking;
|
|
620
|
+
id: number;
|
|
621
|
+
number: number;
|
|
622
|
+
source: Source;
|
|
623
|
+
});
|
|
624
|
+
getType(): string;
|
|
625
|
+
getId(): number;
|
|
626
|
+
getNumber(): number;
|
|
627
|
+
getCodec(): MediaCodec$1 | Promise<MediaCodec$1 | null> | null;
|
|
628
|
+
getInternalCodecId(): string | number | Uint8Array<ArrayBufferLike> | Promise<string | number | Uint8Array<ArrayBufferLike> | null> | null;
|
|
629
|
+
getName(): string | Promise<string | null> | null;
|
|
630
|
+
getLanguageCode(): string | Promise<string>;
|
|
631
|
+
getTimeResolution(): number | Promise<number>;
|
|
632
|
+
isRelativeToUnixEpoch(): boolean | Promise<boolean>;
|
|
633
|
+
getDisposition(): {};
|
|
634
|
+
getPairingMask(): bigint;
|
|
635
|
+
getBitrate(): number | Promise<number | null> | null;
|
|
636
|
+
getAverageBitrate(): number | Promise<number | null> | null;
|
|
637
|
+
getDurationFromMetadata(options: unknown): Promise<number | null>;
|
|
638
|
+
getLiveRefreshInterval(): Promise<number | null>;
|
|
639
|
+
getHasOnlyKeyPackets(): boolean;
|
|
640
|
+
getDecoderConfig(): Promise<VideoDecoderConfig | AudioDecoderConfig | null>;
|
|
641
|
+
getMetadataCodecParameterString(): string | Promise<string | null> | null;
|
|
642
|
+
getNumberOfChannels(): number | Promise<number>;
|
|
643
|
+
getSampleRate(): number | Promise<number>;
|
|
644
|
+
getFirstPacket(options: unknown): Promise<EncodedPacket | null>;
|
|
645
|
+
getPacket(timestamp: number, options: unknown): Promise<EncodedPacket | null>;
|
|
646
|
+
getNextPacket(packet: EncodedPacket, options: unknown): Promise<EncodedPacket | null>;
|
|
647
|
+
getKeyPacket(timestamp: number, options: unknown): Promise<EncodedPacket | null>;
|
|
648
|
+
getNextKeyPacket(packet: EncodedPacket, options: unknown): Promise<EncodedPacket | null>;
|
|
649
|
+
getSegmentedInput(): any;
|
|
650
|
+
}
|
|
610
651
|
declare const preserveSubtitleBackingsOnInput: (input: Input$1) => Input$1<Source>;
|
|
611
652
|
declare class SegmentedMediabunnyInput<S extends Source = Source> extends Input$1<S> {
|
|
612
653
|
#private;
|
|
613
654
|
_wrapBackingAsTrack(backing: TrackBacking): InputTrack$1;
|
|
614
|
-
_getSyntheticTrackBackings(type?: typeof BACKING_TYPE_VIDEO | typeof BACKING_TYPE_AUDIO | typeof BACKING_TYPE_SUBTITLE): Promise<(ExternalSubtitleTrackBacking | HlsSubtitleTrackBacking)[]>;
|
|
655
|
+
_getSyntheticTrackBackings(type?: typeof BACKING_TYPE_VIDEO | typeof BACKING_TYPE_AUDIO | typeof BACKING_TYPE_SUBTITLE): Promise<(ImportedAudioTrackBacking | ExternalSubtitleTrackBacking | HlsSubtitleTrackBacking)[]>;
|
|
615
656
|
getTracks(query?: InputTrackQuery$1<InputTrack$1>): Promise<InputTrack$1[]>;
|
|
616
657
|
getVideoTracks(query?: InputTrackQuery$1<InputVideoTrack>): Promise<InputVideoTrack[]>;
|
|
617
658
|
getAudioTracks(query?: InputTrackQuery$1<InputAudioTrack>): Promise<InputAudioTrack[]>;
|
|
@@ -619,6 +660,8 @@ declare class SegmentedMediabunnyInput<S extends Source = Source> extends Input$
|
|
|
619
660
|
getPrimaryVideoTrack(query?: InputTrackQuery$1<InputVideoTrack>): Promise<InputVideoTrack | null>;
|
|
620
661
|
getPrimaryAudioTrack(query?: InputTrackQuery$1<InputAudioTrack>): Promise<InputAudioTrack | null>;
|
|
621
662
|
addSubtitleTrack(source: InputSubtitleSource, metadata?: InputSubtitleTrackMetadata): InputSubtitleTrack;
|
|
663
|
+
addAudioTracks(source: InputAudioSource, options?: InputAudioTracksOptions): Promise<InputAudioTrack[]>;
|
|
664
|
+
dispose(): void;
|
|
622
665
|
}
|
|
623
666
|
//#endregion
|
|
624
667
|
//#region src/index.d.ts
|
|
@@ -633,4 +676,4 @@ declare class Input<S extends Source = Source> extends SegmentedMediabunnyInput<
|
|
|
633
676
|
declare const isInput: (value: unknown) => value is Input;
|
|
634
677
|
declare const ALL_FORMATS: InputFormat[];
|
|
635
678
|
//#endregion
|
|
636
|
-
export { ALL_FORMATS, type AudioCodec, DASH, DASH_FORMATS, type DashSegment, type DashSegmentedInput, FilePathSource, HLS, HLS_FORMATS, type HlsSegment, type HlsSegmentedInput, Input, type InputAudioTrack, InputSegment, InputSegmentedInput, type InputSubtitleSource, type InputSubtitleTrack, type InputSubtitleTrackMetadata, type InputTrack$1 as InputTrack, type InputTrackQuery, type InputTrackWithBacking, type InputVideoTrack, MP3, MP4, type MaybePromise, type MediaCodec, type SubtitleCodec, UrlSource, type VideoCodec, type VideoDynamicRange, asc, desc, isInput, prefer, preserveSubtitleBackingsOnInput };
|
|
679
|
+
export { ALL_FORMATS, type AudioCodec, DASH, DASH_FORMATS, type DashSegment, type DashSegmentedInput, FilePathSource, HLS, HLS_FORMATS, type HlsSegment, type HlsSegmentedInput, Input, type InputAudioSource, type InputAudioTrack, type InputAudioTrackPairing, type InputAudioTracksOptions, InputSegment, InputSegmentedInput, type InputSubtitleSource, type InputSubtitleTrack, type InputSubtitleTrackMetadata, type InputTrack$1 as InputTrack, type InputTrackQuery, type InputTrackWithBacking, type InputVideoTrack, MP3, MP4, type MaybePromise, type MediaCodec, type SubtitleCodec, UrlSource, type VideoCodec, type VideoDynamicRange, asc, desc, isInput, prefer, preserveSubtitleBackingsOnInput };
|
package/dist/index.mjs
CHANGED
|
@@ -1237,6 +1237,7 @@ const getHlsSubtitleTrackBackings = (input) => {
|
|
|
1237
1237
|
//#endregion
|
|
1238
1238
|
//#region src/mediabunny-input.ts
|
|
1239
1239
|
const CUSTOM_SUBTITLE_TRACK_ID_OFFSET = 1e9;
|
|
1240
|
+
const CUSTOM_AUDIO_TRACK_ID_OFFSET = 2e9;
|
|
1240
1241
|
const CUSTOM_PAIRING_BIT_START = 1024n;
|
|
1241
1242
|
const EXTRA_PAIRING_MASK = Symbol.for("dasha.extra-pairing-mask");
|
|
1242
1243
|
const ORIGINAL_GET_PAIRING_MASK = Symbol.for("dasha.original-get-pairing-mask");
|
|
@@ -1382,6 +1383,131 @@ const BACKING_TYPE_AUDIO = "audio";
|
|
|
1382
1383
|
const BACKING_TYPE_VIDEO = "video";
|
|
1383
1384
|
const BASE_INPUT_PATCHED = Symbol.for("dasha.base-mediabunny-input-patched");
|
|
1384
1385
|
const PRESERVE_SUBTITLE_BACKINGS = Symbol.for("dasha.preserve-subtitle-backings");
|
|
1386
|
+
const getDefaultAudioTrackFormats = (source) => {
|
|
1387
|
+
return isLikelyDashPath(source instanceof SourceRef ? source.source : source) ? [DASH, ...ALL_FORMATS$1] : [...ALL_FORMATS$1, DASH];
|
|
1388
|
+
};
|
|
1389
|
+
var WholeResourceAudioSegmentedInput = class {
|
|
1390
|
+
segments = [];
|
|
1391
|
+
#source;
|
|
1392
|
+
constructor(source) {
|
|
1393
|
+
this.#source = source;
|
|
1394
|
+
}
|
|
1395
|
+
async runUpdateSegments() {
|
|
1396
|
+
if (this.segments.length > 0) return;
|
|
1397
|
+
const sourceWithRootPath = this.#source;
|
|
1398
|
+
if (typeof sourceWithRootPath.rootPath !== "string") return;
|
|
1399
|
+
const segment = {
|
|
1400
|
+
timestamp: 0,
|
|
1401
|
+
duration: 0,
|
|
1402
|
+
relativeToUnixEpoch: false,
|
|
1403
|
+
firstSegment: null,
|
|
1404
|
+
sequenceNumber: 0,
|
|
1405
|
+
location: {
|
|
1406
|
+
path: sourceWithRootPath.rootPath,
|
|
1407
|
+
offset: 0,
|
|
1408
|
+
length: null
|
|
1409
|
+
},
|
|
1410
|
+
encryption: null,
|
|
1411
|
+
initSegment: null,
|
|
1412
|
+
lastProgramDateTimeSeconds: null
|
|
1413
|
+
};
|
|
1414
|
+
segment.firstSegment = segment;
|
|
1415
|
+
this.segments = [segment];
|
|
1416
|
+
}
|
|
1417
|
+
};
|
|
1418
|
+
var ImportedAudioTrackBacking = class {
|
|
1419
|
+
#backing;
|
|
1420
|
+
#id;
|
|
1421
|
+
#number;
|
|
1422
|
+
#wholeResourceSegmentedInput;
|
|
1423
|
+
constructor(params) {
|
|
1424
|
+
this.#backing = params.backing;
|
|
1425
|
+
this.#id = params.id;
|
|
1426
|
+
this.#number = params.number;
|
|
1427
|
+
this.#wholeResourceSegmentedInput = new WholeResourceAudioSegmentedInput(params.source);
|
|
1428
|
+
}
|
|
1429
|
+
getType() {
|
|
1430
|
+
return BACKING_TYPE_AUDIO;
|
|
1431
|
+
}
|
|
1432
|
+
getId() {
|
|
1433
|
+
return this.#id;
|
|
1434
|
+
}
|
|
1435
|
+
getNumber() {
|
|
1436
|
+
return this.#number;
|
|
1437
|
+
}
|
|
1438
|
+
getCodec() {
|
|
1439
|
+
return this.#backing.getCodec();
|
|
1440
|
+
}
|
|
1441
|
+
getInternalCodecId() {
|
|
1442
|
+
return this.#backing.getInternalCodecId?.() ?? null;
|
|
1443
|
+
}
|
|
1444
|
+
getName() {
|
|
1445
|
+
return this.#backing.getName?.() ?? null;
|
|
1446
|
+
}
|
|
1447
|
+
getLanguageCode() {
|
|
1448
|
+
return this.#backing.getLanguageCode?.() ?? "und";
|
|
1449
|
+
}
|
|
1450
|
+
getTimeResolution() {
|
|
1451
|
+
return this.#backing.getTimeResolution?.() ?? 1e3;
|
|
1452
|
+
}
|
|
1453
|
+
isRelativeToUnixEpoch() {
|
|
1454
|
+
return this.#backing.isRelativeToUnixEpoch?.() ?? false;
|
|
1455
|
+
}
|
|
1456
|
+
getDisposition() {
|
|
1457
|
+
return this.#backing.getDisposition?.() ?? {};
|
|
1458
|
+
}
|
|
1459
|
+
getPairingMask() {
|
|
1460
|
+
return 0n;
|
|
1461
|
+
}
|
|
1462
|
+
getBitrate() {
|
|
1463
|
+
return this.#backing.getBitrate?.() ?? null;
|
|
1464
|
+
}
|
|
1465
|
+
getAverageBitrate() {
|
|
1466
|
+
return this.#backing.getAverageBitrate?.() ?? null;
|
|
1467
|
+
}
|
|
1468
|
+
getDurationFromMetadata(options) {
|
|
1469
|
+
return this.#backing.getDurationFromMetadata?.(options) ?? Promise.resolve(null);
|
|
1470
|
+
}
|
|
1471
|
+
getLiveRefreshInterval() {
|
|
1472
|
+
return this.#backing.getLiveRefreshInterval?.() ?? Promise.resolve(null);
|
|
1473
|
+
}
|
|
1474
|
+
getHasOnlyKeyPackets() {
|
|
1475
|
+
return true;
|
|
1476
|
+
}
|
|
1477
|
+
getDecoderConfig() {
|
|
1478
|
+
return this.#backing.getDecoderConfig?.() ?? Promise.resolve(null);
|
|
1479
|
+
}
|
|
1480
|
+
getMetadataCodecParameterString() {
|
|
1481
|
+
return this.#backing.getMetadataCodecParameterString?.() ?? null;
|
|
1482
|
+
}
|
|
1483
|
+
getNumberOfChannels() {
|
|
1484
|
+
return this.#backing.getNumberOfChannels?.() ?? 0;
|
|
1485
|
+
}
|
|
1486
|
+
getSampleRate() {
|
|
1487
|
+
return this.#backing.getSampleRate?.() ?? 0;
|
|
1488
|
+
}
|
|
1489
|
+
getFirstPacket(options) {
|
|
1490
|
+
return this.#backing.getFirstPacket?.(options) ?? Promise.resolve(null);
|
|
1491
|
+
}
|
|
1492
|
+
getPacket(timestamp, options) {
|
|
1493
|
+
return this.#backing.getPacket?.(timestamp, options) ?? Promise.resolve(null);
|
|
1494
|
+
}
|
|
1495
|
+
getNextPacket(packet, options) {
|
|
1496
|
+
return this.#backing.getNextPacket?.(packet, options) ?? Promise.resolve(null);
|
|
1497
|
+
}
|
|
1498
|
+
getKeyPacket(timestamp, options) {
|
|
1499
|
+
return this.#backing.getKeyPacket?.(timestamp, options) ?? Promise.resolve(null);
|
|
1500
|
+
}
|
|
1501
|
+
getNextKeyPacket(packet, options) {
|
|
1502
|
+
return this.#backing.getNextKeyPacket?.(packet, options) ?? Promise.resolve(null);
|
|
1503
|
+
}
|
|
1504
|
+
getSegmentedInput() {
|
|
1505
|
+
if (this.#backing.getSegmentedInput) return this.#backing.getSegmentedInput();
|
|
1506
|
+
const hlsBacking = this.#backing;
|
|
1507
|
+
if (hlsBacking.internalTrack?.demuxer?.getSegmentedInputForPath) return hlsBacking.internalTrack.demuxer.getSegmentedInputForPath(hlsBacking.internalTrack.fullPath);
|
|
1508
|
+
return this.#wholeResourceSegmentedInput;
|
|
1509
|
+
}
|
|
1510
|
+
};
|
|
1385
1511
|
const getBackingType = (backing) => backing.getType?.();
|
|
1386
1512
|
const queryWrappedTracks = (input, backings, query) => {
|
|
1387
1513
|
return queryTracks(backings.map((backing) => input._wrapBackingAsTrack(backing)), query);
|
|
@@ -1479,13 +1605,17 @@ const preserveSubtitleBackingsOnInput = (input) => {
|
|
|
1479
1605
|
Object.assign(input, { [PRESERVE_SUBTITLE_BACKINGS]: true });
|
|
1480
1606
|
return input;
|
|
1481
1607
|
};
|
|
1482
|
-
var SegmentedMediabunnyInput = class extends Input$1 {
|
|
1608
|
+
var SegmentedMediabunnyInput = class SegmentedMediabunnyInput extends Input$1 {
|
|
1483
1609
|
#trackCache = /* @__PURE__ */ new WeakMap();
|
|
1484
1610
|
#subtitleTrackCache = /* @__PURE__ */ new WeakMap();
|
|
1485
1611
|
#hlsSubtitleBackingsPromise = null;
|
|
1486
1612
|
#customSubtitleBackings = [];
|
|
1613
|
+
#customAudioBackings = [];
|
|
1614
|
+
#audioInputs = [];
|
|
1487
1615
|
#nextCustomSubtitleTrackId = CUSTOM_SUBTITLE_TRACK_ID_OFFSET;
|
|
1488
1616
|
#nextCustomSubtitleTrackNumber = CUSTOM_SUBTITLE_TRACK_ID_OFFSET;
|
|
1617
|
+
#nextCustomAudioTrackId = CUSTOM_AUDIO_TRACK_ID_OFFSET;
|
|
1618
|
+
#nextCustomAudioTrackNumber = CUSTOM_AUDIO_TRACK_ID_OFFSET;
|
|
1489
1619
|
#nextPairingBitIndex = null;
|
|
1490
1620
|
async #queryTracks(query, type) {
|
|
1491
1621
|
const internalInput = this;
|
|
@@ -1500,9 +1630,11 @@ var SegmentedMediabunnyInput = class extends Input$1 {
|
|
|
1500
1630
|
return wrapped;
|
|
1501
1631
|
}
|
|
1502
1632
|
async _getSyntheticTrackBackings(type) {
|
|
1503
|
-
if (type
|
|
1504
|
-
const
|
|
1505
|
-
|
|
1633
|
+
if (type === BACKING_TYPE_VIDEO) return [];
|
|
1634
|
+
const audioBackings = type !== BACKING_TYPE_SUBTITLE ? [...this.#customAudioBackings] : [];
|
|
1635
|
+
const backings = type !== BACKING_TYPE_AUDIO ? [...this.#customSubtitleBackings] : [];
|
|
1636
|
+
if (type === BACKING_TYPE_AUDIO) return audioBackings;
|
|
1637
|
+
if (await this.getFormat() !== HLS$1) return [...audioBackings, ...backings];
|
|
1506
1638
|
if (!this.#hlsSubtitleBackingsPromise) {
|
|
1507
1639
|
const promise = getHlsSubtitleTrackBackings(this).catch((error) => {
|
|
1508
1640
|
if (this.#hlsSubtitleBackingsPromise === promise) this.#hlsSubtitleBackingsPromise = null;
|
|
@@ -1510,7 +1642,11 @@ var SegmentedMediabunnyInput = class extends Input$1 {
|
|
|
1510
1642
|
});
|
|
1511
1643
|
this.#hlsSubtitleBackingsPromise = promise;
|
|
1512
1644
|
}
|
|
1513
|
-
return [
|
|
1645
|
+
return [
|
|
1646
|
+
...audioBackings,
|
|
1647
|
+
...backings,
|
|
1648
|
+
...await this.#hlsSubtitleBackingsPromise
|
|
1649
|
+
];
|
|
1514
1650
|
}
|
|
1515
1651
|
#wrapSubtitleBacking(backing) {
|
|
1516
1652
|
const existing = this.#subtitleTrackCache.get(backing);
|
|
@@ -1556,6 +1692,31 @@ var SegmentedMediabunnyInput = class extends Input$1 {
|
|
|
1556
1692
|
this.#customSubtitleBackings.push(backing);
|
|
1557
1693
|
return this._wrapBackingAsTrack(backing);
|
|
1558
1694
|
}
|
|
1695
|
+
async addAudioTracks(source, options = {}) {
|
|
1696
|
+
const audioInput = new SegmentedMediabunnyInput({
|
|
1697
|
+
source,
|
|
1698
|
+
formats: [...options.formats ?? getDefaultAudioTrackFormats(source)]
|
|
1699
|
+
});
|
|
1700
|
+
this.#audioInputs.push(audioInput);
|
|
1701
|
+
const audioTracks = await audioInput.getAudioTracks({
|
|
1702
|
+
filter: options.filter,
|
|
1703
|
+
sortBy: options.sortBy
|
|
1704
|
+
});
|
|
1705
|
+
const pairWith = await this.#getAudioPairingVideoTracks(options.pairWith);
|
|
1706
|
+
const importedTracks = [];
|
|
1707
|
+
for (const audioTrack of audioTracks) {
|
|
1708
|
+
const backing = new ImportedAudioTrackBacking({
|
|
1709
|
+
id: this.#nextCustomAudioTrackId++,
|
|
1710
|
+
number: this.#nextCustomAudioTrackNumber++,
|
|
1711
|
+
backing: getTrackBacking(audioTrack),
|
|
1712
|
+
source: audioInput.source
|
|
1713
|
+
});
|
|
1714
|
+
this.#pairAudioBacking(backing, pairWith);
|
|
1715
|
+
this.#customAudioBackings.push(backing);
|
|
1716
|
+
importedTracks.push(this._wrapBackingAsTrack(backing));
|
|
1717
|
+
}
|
|
1718
|
+
return importedTracks;
|
|
1719
|
+
}
|
|
1559
1720
|
#takeSubtitleSourceRef(source) {
|
|
1560
1721
|
const rawSource = source instanceof SourceRef ? source.source : source;
|
|
1561
1722
|
if (!(rawSource instanceof Object) || !("rootPath" in rawSource) || !("ref" in rawSource) || typeof rawSource.ref !== "function") throw new TypeError("source must be a pathed source such as UrlSource or FilePathSource.");
|
|
@@ -1572,13 +1733,28 @@ var SegmentedMediabunnyInput = class extends Input$1 {
|
|
|
1572
1733
|
}
|
|
1573
1734
|
return tracks;
|
|
1574
1735
|
}
|
|
1736
|
+
async #getAudioPairingVideoTracks(pairWith) {
|
|
1737
|
+
if (pairWith === false) return [];
|
|
1738
|
+
if (!pairWith || pairWith === "all") return this.getVideoTracks();
|
|
1739
|
+
if (pairWith === "primary") {
|
|
1740
|
+
const primaryVideoTrack = await this.getPrimaryVideoTrack();
|
|
1741
|
+
return primaryVideoTrack ? [primaryVideoTrack] : [];
|
|
1742
|
+
}
|
|
1743
|
+
return this.#toPairableVideoTracks(pairWith);
|
|
1744
|
+
}
|
|
1575
1745
|
#isIterable(value) {
|
|
1576
1746
|
return typeof value === "object" && value !== null && Symbol.iterator in value;
|
|
1577
1747
|
}
|
|
1578
1748
|
#pairSubtitleBacking(subtitleBacking, videoTracks) {
|
|
1749
|
+
this.#pairBackingWithVideoTracks(subtitleBacking, videoTracks);
|
|
1750
|
+
}
|
|
1751
|
+
#pairAudioBacking(audioBacking, videoTracks) {
|
|
1752
|
+
this.#pairBackingWithVideoTracks(audioBacking, videoTracks);
|
|
1753
|
+
}
|
|
1754
|
+
#pairBackingWithVideoTracks(backing, videoTracks) {
|
|
1579
1755
|
for (const track of videoTracks) {
|
|
1580
1756
|
const bit = this.#allocatePairingBit();
|
|
1581
|
-
this.#appendPairingMask(
|
|
1757
|
+
this.#appendPairingMask(backing, bit);
|
|
1582
1758
|
this.#appendPairingMask(track._backing, bit);
|
|
1583
1759
|
}
|
|
1584
1760
|
}
|
|
@@ -1590,7 +1766,11 @@ var SegmentedMediabunnyInput = class extends Input$1 {
|
|
|
1590
1766
|
#getInitialPairingBitIndex() {
|
|
1591
1767
|
const loadedBackings = [...this._trackBackingsCache ?? []];
|
|
1592
1768
|
let maxBitIndex = -1n;
|
|
1593
|
-
for (const backing of [
|
|
1769
|
+
for (const backing of [
|
|
1770
|
+
...loadedBackings,
|
|
1771
|
+
...this.#customSubtitleBackings,
|
|
1772
|
+
...this.#customAudioBackings
|
|
1773
|
+
]) {
|
|
1594
1774
|
const mask = backing.getPairingMask?.() ?? 0n;
|
|
1595
1775
|
if (mask === 0n) continue;
|
|
1596
1776
|
const bitIndex = BigInt(mask.toString(2).length - 1);
|
|
@@ -1605,6 +1785,12 @@ var SegmentedMediabunnyInput = class extends Input$1 {
|
|
|
1605
1785
|
patchedBacking[ORIGINAL_GET_PAIRING_MASK] = backing.getPairingMask?.bind(backing) ?? (() => 0n);
|
|
1606
1786
|
Object.assign(backing, { getPairingMask: () => (patchedBacking[ORIGINAL_GET_PAIRING_MASK]?.() ?? 0n) | (patchedBacking[EXTRA_PAIRING_MASK] ?? 0n) });
|
|
1607
1787
|
}
|
|
1788
|
+
dispose() {
|
|
1789
|
+
if (this.disposed) return;
|
|
1790
|
+
super.dispose();
|
|
1791
|
+
for (const input of this.#audioInputs) input.dispose();
|
|
1792
|
+
this.#audioInputs.length = 0;
|
|
1793
|
+
}
|
|
1608
1794
|
};
|
|
1609
1795
|
//#endregion
|
|
1610
1796
|
//#region src/dash/dash-segmented-input.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dasha",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"description": "Streaming manifest parser",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
}
|
|
46
46
|
],
|
|
47
47
|
"engines": {
|
|
48
|
-
"node": ">=22.
|
|
48
|
+
"node": ">=22.19"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@xmldom/xmldom": "^0.9.10",
|
|
@@ -55,12 +55,12 @@
|
|
|
55
55
|
"mediabunny": "^1.45.2"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@types/node": "^25.
|
|
59
|
-
"oxfmt": "^0.
|
|
60
|
-
"oxlint": "^1.
|
|
61
|
-
"tsdown": "^0.22.
|
|
58
|
+
"@types/node": "^25.9.1",
|
|
59
|
+
"oxfmt": "^0.52.0",
|
|
60
|
+
"oxlint": "^1.67.0",
|
|
61
|
+
"tsdown": "^0.22.1",
|
|
62
62
|
"typescript": "^6.0.3",
|
|
63
|
-
"vitest": "^4.1.
|
|
63
|
+
"vitest": "^4.1.7"
|
|
64
64
|
},
|
|
65
65
|
"scripts": {
|
|
66
66
|
"test": "vitest",
|