@amazon/vinyl 3.2.2 → 3.2.3-next.20261001224604
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/README.md +2 -2
- package/dist/index.cjs +62 -21
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +65 -22
- package/dist/index.js.map +3 -3
- package/dist/test/benchmark.es5.js +7 -6
- package/dist/test/benchmark.js +35 -30
- package/dist/test/benchmark.js.map +3 -3
- package/dist/test/integ.es5.js +184 -171
- package/dist/test/integ.js +450 -165
- package/dist/test/integ.js.map +4 -4
- package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
- package/dist/types/current/ad/AdControllerImpl.js +15 -1
- package/dist/types/current/ad/discoverHlsInterstitials.js +13 -1
- package/dist/types/current/drm/commonEme/MsCommonEme.d.ts.map +1 -1
- package/dist/types/current/drm/commonEme/MsCommonEme.js +2 -2
- package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts.map +1 -1
- package/dist/types/current/drm/commonEme/StandardCommonEme.js +3 -2
- package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts.map +1 -1
- package/dist/types/current/drm/commonEme/WebKitCommonEme.js +2 -2
- package/dist/types/current/drm/dom/MSMediaKeys.d.ts +1 -1
- package/dist/types/current/drm/dom/MSMediaKeys.d.ts.map +1 -1
- package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts +1 -1
- package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts.map +1 -1
- package/dist/types/current/drm/util/extractContentId.js +2 -2
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/current/streaming/MediaQualityMetadata.d.ts +3 -1
- package/dist/types/current/streaming/MediaQualityMetadata.d.ts.map +1 -1
- package/dist/types/current/streaming/SegmentControllerImpl.d.ts +1 -1
- package/dist/types/current/streaming/buffering/BufferingController.d.ts +1 -1
- package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/BufferingController.js +14 -5
- package/dist/types/current/streaming/buffering/MediaSourceController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/MediaSourceController.js +4 -0
- package/dist/types/current/text/discoverDashTextTracks.d.ts +2 -2
- package/dist/types/current/text/discoverDashTextTracks.js +4 -3
- package/dist/types/current/text/parseWebVtt.d.ts.map +1 -1
- package/dist/types/current/text/parseWebVtt.js +3 -2
- package/dist/types/current/track/TrackController.d.ts.map +1 -1
- package/dist/types/current/track/TrackController.js +7 -0
- package/dist/types/current/track/hls/HlsManifestData.d.ts +14 -1
- package/dist/types/current/track/hls/HlsManifestData.d.ts.map +1 -1
- package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts.map +1 -1
- package/dist/types/current/track/hls/buildHlsMediaTimeline.js +10 -2
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +8 -3
- package/dist/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/ts3.7/streaming/MediaQualityMetadata.d.ts +3 -1
- package/dist/types/ts3.7/streaming/SegmentControllerImpl.d.ts +1 -1
- package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +1 -1
- package/dist/types/ts3.7/text/discoverDashTextTracks.d.ts +2 -2
- package/dist/types/ts3.7/track/hls/HlsManifestData.d.ts +14 -1
- package/dist/types/ts3.7/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
- package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/ts4.1/streaming/MediaQualityMetadata.d.ts +3 -1
- package/dist/types/ts4.1/streaming/SegmentControllerImpl.d.ts +1 -1
- package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +1 -1
- package/dist/types/ts4.1/text/discoverDashTextTracks.d.ts +2 -2
- package/dist/types/ts4.1/track/hls/HlsManifestData.d.ts +14 -1
- package/dist/types/ts4.1/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
- package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/ts4.7/streaming/MediaQualityMetadata.d.ts +3 -1
- package/dist/types/ts4.7/streaming/SegmentControllerImpl.d.ts +1 -1
- package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +1 -1
- package/dist/types/ts4.7/text/discoverDashTextTracks.d.ts +2 -2
- package/dist/types/ts4.7/track/hls/HlsManifestData.d.ts +14 -1
- package/dist/types/ts4.7/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
- package/dist/unit/types/current/ad/AdControllerImpl.test.js +66 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.js +29 -2
- package/dist/unit/types/current/drm/commonEme/StandardCommonEme.test.js +12 -4
- package/dist/unit/types/current/drm/util/extractContentId.test.js +7 -0
- package/dist/unit/types/current/index.d.ts +1 -0
- package/dist/unit/types/current/index.d.ts.map +1 -1
- package/dist/unit/types/current/index.js +1 -0
- package/dist/unit/types/current/streaming/MediaQualityMetadata.test.js +8 -0
- package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +26 -0
- package/dist/unit/types/current/streaming/buffering/MediaSourceController.test.js +29 -0
- package/dist/unit/types/current/text/TextTrack.test.d.ts +2 -0
- package/dist/unit/types/current/text/TextTrack.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/TextTrack.test.js +12 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.js +17 -0
- package/dist/unit/types/current/text/parseWebVtt.test.js +26 -0
- package/dist/unit/types/current/track/TrackController.test.js +15 -60
- package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +22 -0
- package/dist/unit/types/current/track/hls/createUrlHlsManifestProvider.test.js +23 -0
- package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
- package/docs/CUSTOMIZATION_GUIDE.md +310 -0
- package/package.json +10 -10
- package/docs/DASH_MANIFEST_TRANSFORM_GUIDE.md +0 -236
package/dist/index.js
CHANGED
|
@@ -383,7 +383,11 @@ var AdControllerImpl = class extends EventHostImpl {
|
|
|
383
383
|
logVerbose(this, "nextAd");
|
|
384
384
|
try {
|
|
385
385
|
const ad = await adBreakState2.nextAd();
|
|
386
|
-
if (this.disposed
|
|
386
|
+
if (this.disposed) return;
|
|
387
|
+
if (adBreakState2.completedReason) {
|
|
388
|
+
if (!this.adBreakState) await nextBreak();
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
387
391
|
if (ad) {
|
|
388
392
|
this.startAd(ad);
|
|
389
393
|
} else {
|
|
@@ -517,12 +521,18 @@ var AdControllerImpl = class extends EventHostImpl {
|
|
|
517
521
|
const currProgress = pC.currentTimePercent;
|
|
518
522
|
const progressStart = adState.timeStart / pC.duration;
|
|
519
523
|
if (!adState.quartile.first && currProgress > 0.25 && progressStart < AD_START_TOLERANCE) {
|
|
524
|
+
adState.quartile.first = true;
|
|
525
|
+
logDebug(this, "adFirstQuartile", adState.ad);
|
|
520
526
|
this.dispatch("adFirstQuartile", createAdProgressEvent(adState));
|
|
521
527
|
}
|
|
522
528
|
if (!adState.quartile.midpoint && currProgress > 0.5 && progressStart < 0.25 + AD_START_TOLERANCE) {
|
|
529
|
+
adState.quartile.midpoint = true;
|
|
530
|
+
logDebug(this, "adMidpoint", adState.ad);
|
|
523
531
|
this.dispatch("adMidpoint", createAdProgressEvent(adState));
|
|
524
532
|
}
|
|
525
533
|
if (!adState.quartile.third && currProgress > 0.75 && progressStart < 0.5 + AD_START_TOLERANCE) {
|
|
534
|
+
adState.quartile.third = true;
|
|
535
|
+
logDebug(this, "adThirdQuartile", adState.ad);
|
|
526
536
|
this.dispatch("adThirdQuartile", createAdProgressEvent(adState));
|
|
527
537
|
}
|
|
528
538
|
}
|
|
@@ -939,6 +949,7 @@ async function resolveHlsAssetList({
|
|
|
939
949
|
const url = resolveUrl(assetListUrl, baseUrl);
|
|
940
950
|
const response = await requestWithRetry2(url);
|
|
941
951
|
const json = await readResponseBody(response, "json");
|
|
952
|
+
const assetListBaseUrl = response.url || url;
|
|
942
953
|
const assets = (_a = json.ASSETS) != null ? _a : [];
|
|
943
954
|
const ads = assets.map((asset, i) => {
|
|
944
955
|
var _a2;
|
|
@@ -946,7 +957,14 @@ async function resolveHlsAssetList({
|
|
|
946
957
|
id: `${rangeId}-${i}`,
|
|
947
958
|
startTime,
|
|
948
959
|
duration: (_a2 = asset.DURATION) != null ? _a2 : null,
|
|
949
|
-
|
|
960
|
+
// Each Asset-Description "URI" MUST be an absolute URI, so the base
|
|
961
|
+
// only applies to non-conforming lists. As a leniency (not a spec
|
|
962
|
+
// rule), resolve against the asset list the URI was read from, as
|
|
963
|
+
// for any relative reference in a retrieved document (RFC 3986
|
|
964
|
+
// §5.1.3): asset lists are commonly served by an ad server rather
|
|
965
|
+
// than alongside the playlist.
|
|
966
|
+
// @see https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-22#appendix-D.2
|
|
967
|
+
uri: resolveUrl(asset.URI, assetListBaseUrl)
|
|
950
968
|
};
|
|
951
969
|
});
|
|
952
970
|
return { ads, skipControl: parseSkipControl(json["SKIP-CONTROL"]) };
|
|
@@ -1152,6 +1170,7 @@ var MediaKeySessionErrorType = /* @__PURE__ */ ((MediaKeySessionErrorType2) => {
|
|
|
1152
1170
|
|
|
1153
1171
|
// src/drm/commonEme/MsCommonEme.ts
|
|
1154
1172
|
import {
|
|
1173
|
+
bufferToArrayBuffer,
|
|
1155
1174
|
bufferToByteArray,
|
|
1156
1175
|
DisposedError,
|
|
1157
1176
|
ErrorOrigin as ErrorOrigin5,
|
|
@@ -1271,7 +1290,7 @@ var MsCommonMediaKeySession = class extends EventHostImpl2 {
|
|
|
1271
1290
|
__publicField(this, "_disposed", false);
|
|
1272
1291
|
__publicField(this, "messageHandler", (event) => {
|
|
1273
1292
|
this.dispatch("message", {
|
|
1274
|
-
message: event.message
|
|
1293
|
+
message: bufferToArrayBuffer(event.message)
|
|
1275
1294
|
});
|
|
1276
1295
|
});
|
|
1277
1296
|
__publicField(this, "errorHandler", () => {
|
|
@@ -1422,11 +1441,7 @@ var StandardCommonMediaKeySession = class extends EventHostImpl3 {
|
|
|
1422
1441
|
return "StandardCommonMediaKeySession";
|
|
1423
1442
|
}
|
|
1424
1443
|
generateRequest() {
|
|
1425
|
-
|
|
1426
|
-
return this.session.generateRequest(
|
|
1427
|
-
this.initDataType,
|
|
1428
|
-
initData instanceof ArrayBuffer ? initData : initData.buffer
|
|
1429
|
-
).catch(createDrmErrorHandler());
|
|
1444
|
+
return this.session.generateRequest(this.initDataType, this.initData).catch(createDrmErrorHandler());
|
|
1430
1445
|
}
|
|
1431
1446
|
update(key) {
|
|
1432
1447
|
if (this.disposed) throw new DisposedError2();
|
|
@@ -1445,6 +1460,7 @@ var StandardCommonMediaKeySession = class extends EventHostImpl3 {
|
|
|
1445
1460
|
|
|
1446
1461
|
// src/drm/commonEme/WebKitCommonEme.ts
|
|
1447
1462
|
import {
|
|
1463
|
+
bufferToArrayBuffer as bufferToArrayBuffer2,
|
|
1448
1464
|
bufferToByteArray as bufferToByteArray2,
|
|
1449
1465
|
DisposedError as DisposedError3,
|
|
1450
1466
|
ErrorOrigin as ErrorOrigin7,
|
|
@@ -1540,7 +1556,7 @@ var WebKitCommonMediaKeySession = class extends EventHostImpl4 {
|
|
|
1540
1556
|
__publicField(this, "_disposed", false);
|
|
1541
1557
|
__publicField(this, "messageHandler", (event) => {
|
|
1542
1558
|
this.dispatch("message", {
|
|
1543
|
-
message: event.message
|
|
1559
|
+
message: bufferToArrayBuffer2(event.message)
|
|
1544
1560
|
});
|
|
1545
1561
|
});
|
|
1546
1562
|
__publicField(this, "errorHandler", () => {
|
|
@@ -1842,9 +1858,9 @@ var defaultLicenseProvider = async (keySystem, serverOptions, challenge, abort)
|
|
|
1842
1858
|
// src/drm/util/extractContentId.ts
|
|
1843
1859
|
import { ValidationError as ValidationError2 } from "@amazon/vinyl-util";
|
|
1844
1860
|
import { ErrorOrigin as ErrorOrigin8 } from "@amazon/vinyl-util";
|
|
1845
|
-
import { bufferToUtf16 as bufferToUtf162 } from "@amazon/vinyl-util";
|
|
1861
|
+
import { bufferToArrayBuffer as bufferToArrayBuffer3, bufferToUtf16 as bufferToUtf162 } from "@amazon/vinyl-util";
|
|
1846
1862
|
function extractContentId(initData) {
|
|
1847
|
-
const bufferStr = bufferToUtf162(initData
|
|
1863
|
+
const bufferStr = bufferToUtf162(bufferToArrayBuffer3(initData));
|
|
1848
1864
|
const matches = bufferStr.match(/skd:\/\/(.+)$/);
|
|
1849
1865
|
if (!matches) {
|
|
1850
1866
|
throw new ValidationError2("No contentId match", ErrorOrigin8.MEDIA);
|
|
@@ -4339,14 +4355,16 @@ var BufferingControllerImpl = class extends EventHostImpl8 {
|
|
|
4339
4355
|
return;
|
|
4340
4356
|
}
|
|
4341
4357
|
const byteLength = streamingSegment.data.byteLength;
|
|
4342
|
-
|
|
4358
|
+
const remaining = byteLength - this.appendOffset;
|
|
4359
|
+
const firstAppend = this.appendOffset === 0;
|
|
4360
|
+
if (remaining > appendSize) {
|
|
4343
4361
|
const newOffset = this.appendOffset + appendSize;
|
|
4344
4362
|
const chunk = streamingSegment.data.slice(
|
|
4345
4363
|
this.appendOffset,
|
|
4346
4364
|
newOffset
|
|
4347
4365
|
);
|
|
4348
4366
|
await sourceBufferController.append(chunk);
|
|
4349
|
-
if (
|
|
4367
|
+
if (firstAppend) {
|
|
4350
4368
|
this.buffered.push(streamingSegment);
|
|
4351
4369
|
}
|
|
4352
4370
|
this.appendOffset = newOffset;
|
|
@@ -4355,9 +4373,13 @@ var BufferingControllerImpl = class extends EventHostImpl8 {
|
|
|
4355
4373
|
`appended chunk, this.appendOffset: ${this.appendOffset}`
|
|
4356
4374
|
);
|
|
4357
4375
|
} else {
|
|
4358
|
-
await sourceBufferController.append(
|
|
4359
|
-
|
|
4360
|
-
|
|
4376
|
+
await sourceBufferController.append(
|
|
4377
|
+
firstAppend ? streamingSegment.data : streamingSegment.data.slice(this.appendOffset)
|
|
4378
|
+
);
|
|
4379
|
+
this.appendOffset = byteLength;
|
|
4380
|
+
if (firstAppend) {
|
|
4381
|
+
this.buffered.push(streamingSegment);
|
|
4382
|
+
}
|
|
4361
4383
|
}
|
|
4362
4384
|
if (!tail) this.refreshHead();
|
|
4363
4385
|
}
|
|
@@ -4659,6 +4681,7 @@ var MediaSourceControllerImpl = class extends EventHostImpl9 {
|
|
|
4659
4681
|
this.activateDisposer.dispose();
|
|
4660
4682
|
this.activateDisposer = null;
|
|
4661
4683
|
++this.durationToken;
|
|
4684
|
+
this.durationSet = false;
|
|
4662
4685
|
try {
|
|
4663
4686
|
URL.revokeObjectURL(this.objectUrl);
|
|
4664
4687
|
} catch (error) {
|
|
@@ -6555,10 +6578,16 @@ function discoverDashTextTracks(manifest, baseUrl) {
|
|
|
6555
6578
|
return out;
|
|
6556
6579
|
}
|
|
6557
6580
|
function isTextAdaptationSet(adaptationSet) {
|
|
6581
|
+
var _a;
|
|
6558
6582
|
if (adaptationSet.contentType === "text") return true;
|
|
6559
6583
|
const mt = adaptationSet.mimeType;
|
|
6560
6584
|
if (mt && mt.startsWith("text/")) return true;
|
|
6561
|
-
return
|
|
6585
|
+
return ((_a = adaptationSet.Representation) != null ? _a : []).some(
|
|
6586
|
+
(representation) => {
|
|
6587
|
+
var _a2;
|
|
6588
|
+
return (_a2 = representation.mimeType) == null ? void 0 : _a2.startsWith("text/");
|
|
6589
|
+
}
|
|
6590
|
+
);
|
|
6562
6591
|
}
|
|
6563
6592
|
function isSidecarTextMime(mimeType) {
|
|
6564
6593
|
if (mimeType == null) return true;
|
|
@@ -6818,7 +6847,7 @@ function parseWebVtt(input) {
|
|
|
6818
6847
|
const cues = [];
|
|
6819
6848
|
const styles = [];
|
|
6820
6849
|
let i = 1;
|
|
6821
|
-
while (i < lines.length && lines[i] !== "") i++;
|
|
6850
|
+
while (i < lines.length && lines[i] !== "" && !lines[i].includes("-->")) i++;
|
|
6822
6851
|
while (i < lines.length) {
|
|
6823
6852
|
if (lines[i] === "") {
|
|
6824
6853
|
i++;
|
|
@@ -9649,7 +9678,11 @@ function createHlsQualityData(deps, data3, baseUrl, playlistUri, metadata) {
|
|
|
9649
9678
|
async getSegment(time, affordance = 0) {
|
|
9650
9679
|
var _a;
|
|
9651
9680
|
const playlist = await data3.getMediaPlaylist(playlistUri);
|
|
9652
|
-
const playlistBaseUrl =
|
|
9681
|
+
const playlistBaseUrl = getPlaylistBaseUrl(
|
|
9682
|
+
playlist,
|
|
9683
|
+
playlistUri,
|
|
9684
|
+
baseUrl
|
|
9685
|
+
);
|
|
9653
9686
|
const segments = buildSegmentTimeline(
|
|
9654
9687
|
deps,
|
|
9655
9688
|
playlistBaseUrl,
|
|
@@ -9696,9 +9729,13 @@ async function discoverAdsFromManifest(data3) {
|
|
|
9696
9729
|
const variant = data3.mainPlaylist.variants[0];
|
|
9697
9730
|
const media = await data3.getMediaPlaylist(variant.uri);
|
|
9698
9731
|
const contentDuration = media.ended ? media.segments.reduce((sum, s) => sum + s.duration, 0) : null;
|
|
9699
|
-
const playlistBaseUrl =
|
|
9732
|
+
const playlistBaseUrl = getPlaylistBaseUrl(media, variant.uri, data3.baseUrl);
|
|
9700
9733
|
return discoverHlsInterstitials(media, playlistBaseUrl, contentDuration);
|
|
9701
9734
|
}
|
|
9735
|
+
function getPlaylistBaseUrl(playlist, playlistUri, mainBaseUrl) {
|
|
9736
|
+
var _a;
|
|
9737
|
+
return (_a = playlist.baseUrl) != null ? _a : resolveUrl8(playlistUri, mainBaseUrl);
|
|
9738
|
+
}
|
|
9702
9739
|
|
|
9703
9740
|
// src/track/hls/createDefaultHlsManifestTransformer.ts
|
|
9704
9741
|
function createDefaultHlsManifestTransformer(deps) {
|
|
@@ -9849,8 +9886,11 @@ async function fetchMediaPlaylist(options) {
|
|
|
9849
9886
|
const variantUrl = resolveUrl9(uri, baseUrl);
|
|
9850
9887
|
const response = await requestWithRetry7(variantUrl, requestInit, { abort });
|
|
9851
9888
|
const text = await readResponseBody6(response, "text");
|
|
9852
|
-
const
|
|
9853
|
-
|
|
9889
|
+
const playlistUrl = response.url || variantUrl;
|
|
9890
|
+
const queryParams = parseQueryParams(playlistUrl);
|
|
9891
|
+
return __spreadProps(__spreadValues({}, parseMediaPlaylist2(text, defines, queryParams)), {
|
|
9892
|
+
baseUrl: playlistUrl
|
|
9893
|
+
});
|
|
9854
9894
|
}
|
|
9855
9895
|
function parseQueryParams(url) {
|
|
9856
9896
|
const queryStart = url.indexOf("?");
|
|
@@ -10318,6 +10358,9 @@ var TrackControllerImpl = class extends EventHostImpl17 {
|
|
|
10318
10358
|
for (const cachedTrack of this.trackCache.values()) {
|
|
10319
10359
|
cachedTrack.clearPrefetch();
|
|
10320
10360
|
}
|
|
10361
|
+
for (const adTracks of this.adTracksByParent.values()) {
|
|
10362
|
+
for (const adTrack of adTracks.values()) adTrack.clearPrefetch();
|
|
10363
|
+
}
|
|
10321
10364
|
}
|
|
10322
10365
|
clearQueue() {
|
|
10323
10366
|
this.setQueue(this._current, []);
|