@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/README.md
CHANGED
|
@@ -40,8 +40,8 @@ player.load({
|
|
|
40
40
|
PlayReady setup.
|
|
41
41
|
- [DRM Controller](./docs/DRM_CONTROLLER.md) — implementing custom license
|
|
42
42
|
acquisition.
|
|
43
|
-
- [
|
|
44
|
-
|
|
43
|
+
- [Customization Guide](./docs/CUSTOMIZATION_GUIDE.md) — timeline / DASH / HLS
|
|
44
|
+
transforms and parser rule extensions.
|
|
45
45
|
- [Auto Reset](./docs/AUTO_RESET.md) — recovering from terminal playback errors.
|
|
46
46
|
|
|
47
47
|
Browse the full docs and TypeDoc API reference at
|
package/dist/index.cjs
CHANGED
|
@@ -670,7 +670,11 @@ var AdControllerImpl = class extends import_vinyl_util2.EventHostImpl {
|
|
|
670
670
|
(0, import_vinyl_util2.logVerbose)(this, "nextAd");
|
|
671
671
|
try {
|
|
672
672
|
const ad = await adBreakState2.nextAd();
|
|
673
|
-
if (this.disposed
|
|
673
|
+
if (this.disposed) return;
|
|
674
|
+
if (adBreakState2.completedReason) {
|
|
675
|
+
if (!this.adBreakState) await nextBreak();
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
674
678
|
if (ad) {
|
|
675
679
|
this.startAd(ad);
|
|
676
680
|
} else {
|
|
@@ -804,12 +808,18 @@ var AdControllerImpl = class extends import_vinyl_util2.EventHostImpl {
|
|
|
804
808
|
const currProgress = pC.currentTimePercent;
|
|
805
809
|
const progressStart = adState.timeStart / pC.duration;
|
|
806
810
|
if (!adState.quartile.first && currProgress > 0.25 && progressStart < AD_START_TOLERANCE) {
|
|
811
|
+
adState.quartile.first = true;
|
|
812
|
+
(0, import_vinyl_util2.logDebug)(this, "adFirstQuartile", adState.ad);
|
|
807
813
|
this.dispatch("adFirstQuartile", createAdProgressEvent(adState));
|
|
808
814
|
}
|
|
809
815
|
if (!adState.quartile.midpoint && currProgress > 0.5 && progressStart < 0.25 + AD_START_TOLERANCE) {
|
|
816
|
+
adState.quartile.midpoint = true;
|
|
817
|
+
(0, import_vinyl_util2.logDebug)(this, "adMidpoint", adState.ad);
|
|
810
818
|
this.dispatch("adMidpoint", createAdProgressEvent(adState));
|
|
811
819
|
}
|
|
812
820
|
if (!adState.quartile.third && currProgress > 0.75 && progressStart < 0.5 + AD_START_TOLERANCE) {
|
|
821
|
+
adState.quartile.third = true;
|
|
822
|
+
(0, import_vinyl_util2.logDebug)(this, "adThirdQuartile", adState.ad);
|
|
813
823
|
this.dispatch("adThirdQuartile", createAdProgressEvent(adState));
|
|
814
824
|
}
|
|
815
825
|
}
|
|
@@ -1221,6 +1231,7 @@ async function resolveHlsAssetList({
|
|
|
1221
1231
|
const url = (0, import_vinyl_util5.resolveUrl)(assetListUrl, baseUrl);
|
|
1222
1232
|
const response = await (0, import_vinyl_util5.requestWithRetry)(url);
|
|
1223
1233
|
const json = await (0, import_vinyl_util5.readResponseBody)(response, "json");
|
|
1234
|
+
const assetListBaseUrl = response.url || url;
|
|
1224
1235
|
const assets = (_a = json.ASSETS) != null ? _a : [];
|
|
1225
1236
|
const ads = assets.map((asset, i) => {
|
|
1226
1237
|
var _a2;
|
|
@@ -1228,7 +1239,14 @@ async function resolveHlsAssetList({
|
|
|
1228
1239
|
id: `${rangeId}-${i}`,
|
|
1229
1240
|
startTime,
|
|
1230
1241
|
duration: (_a2 = asset.DURATION) != null ? _a2 : null,
|
|
1231
|
-
|
|
1242
|
+
// Each Asset-Description "URI" MUST be an absolute URI, so the base
|
|
1243
|
+
// only applies to non-conforming lists. As a leniency (not a spec
|
|
1244
|
+
// rule), resolve against the asset list the URI was read from, as
|
|
1245
|
+
// for any relative reference in a retrieved document (RFC 3986
|
|
1246
|
+
// §5.1.3): asset lists are commonly served by an ad server rather
|
|
1247
|
+
// than alongside the playlist.
|
|
1248
|
+
// @see https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-22#appendix-D.2
|
|
1249
|
+
uri: (0, import_vinyl_util5.resolveUrl)(asset.URI, assetListBaseUrl)
|
|
1232
1250
|
};
|
|
1233
1251
|
});
|
|
1234
1252
|
return { ads, skipControl: parseSkipControl(json["SKIP-CONTROL"]) };
|
|
@@ -1546,7 +1564,7 @@ var MsCommonMediaKeySession = class extends import_vinyl_util13.EventHostImpl {
|
|
|
1546
1564
|
__publicField(this, "_disposed", false);
|
|
1547
1565
|
__publicField(this, "messageHandler", (event) => {
|
|
1548
1566
|
this.dispatch("message", {
|
|
1549
|
-
message: event.message
|
|
1567
|
+
message: (0, import_vinyl_util13.bufferToArrayBuffer)(event.message)
|
|
1550
1568
|
});
|
|
1551
1569
|
});
|
|
1552
1570
|
__publicField(this, "errorHandler", () => {
|
|
@@ -1693,11 +1711,7 @@ var StandardCommonMediaKeySession = class extends import_vinyl_util15.EventHostI
|
|
|
1693
1711
|
return "StandardCommonMediaKeySession";
|
|
1694
1712
|
}
|
|
1695
1713
|
generateRequest() {
|
|
1696
|
-
|
|
1697
|
-
return this.session.generateRequest(
|
|
1698
|
-
this.initDataType,
|
|
1699
|
-
initData instanceof ArrayBuffer ? initData : initData.buffer
|
|
1700
|
-
).catch(createDrmErrorHandler());
|
|
1714
|
+
return this.session.generateRequest(this.initDataType, this.initData).catch(createDrmErrorHandler());
|
|
1701
1715
|
}
|
|
1702
1716
|
update(key) {
|
|
1703
1717
|
if (this.disposed) throw new import_vinyl_util15.DisposedError();
|
|
@@ -1806,7 +1820,7 @@ var WebKitCommonMediaKeySession = class extends import_vinyl_util16.EventHostImp
|
|
|
1806
1820
|
__publicField(this, "_disposed", false);
|
|
1807
1821
|
__publicField(this, "messageHandler", (event) => {
|
|
1808
1822
|
this.dispatch("message", {
|
|
1809
|
-
message: event.message
|
|
1823
|
+
message: (0, import_vinyl_util16.bufferToArrayBuffer)(event.message)
|
|
1810
1824
|
});
|
|
1811
1825
|
});
|
|
1812
1826
|
__publicField(this, "errorHandler", () => {
|
|
@@ -2057,7 +2071,7 @@ var import_vinyl_util20 = require("@amazon/vinyl-util");
|
|
|
2057
2071
|
var import_vinyl_util21 = require("@amazon/vinyl-util");
|
|
2058
2072
|
var import_vinyl_util22 = require("@amazon/vinyl-util");
|
|
2059
2073
|
function extractContentId(initData) {
|
|
2060
|
-
const bufferStr = (0, import_vinyl_util22.bufferToUtf16)(
|
|
2074
|
+
const bufferStr = (0, import_vinyl_util22.bufferToUtf16)((0, import_vinyl_util22.bufferToArrayBuffer)(initData));
|
|
2061
2075
|
const matches = bufferStr.match(/skd:\/\/(.+)$/);
|
|
2062
2076
|
if (!matches) {
|
|
2063
2077
|
throw new import_vinyl_util20.ValidationError("No contentId match", import_vinyl_util21.ErrorOrigin.MEDIA);
|
|
@@ -4463,14 +4477,16 @@ var BufferingControllerImpl = class extends import_vinyl_util46.EventHostImpl {
|
|
|
4463
4477
|
return;
|
|
4464
4478
|
}
|
|
4465
4479
|
const byteLength = streamingSegment.data.byteLength;
|
|
4466
|
-
|
|
4480
|
+
const remaining = byteLength - this.appendOffset;
|
|
4481
|
+
const firstAppend = this.appendOffset === 0;
|
|
4482
|
+
if (remaining > appendSize) {
|
|
4467
4483
|
const newOffset = this.appendOffset + appendSize;
|
|
4468
4484
|
const chunk = streamingSegment.data.slice(
|
|
4469
4485
|
this.appendOffset,
|
|
4470
4486
|
newOffset
|
|
4471
4487
|
);
|
|
4472
4488
|
await sourceBufferController.append(chunk);
|
|
4473
|
-
if (
|
|
4489
|
+
if (firstAppend) {
|
|
4474
4490
|
this.buffered.push(streamingSegment);
|
|
4475
4491
|
}
|
|
4476
4492
|
this.appendOffset = newOffset;
|
|
@@ -4479,9 +4495,13 @@ var BufferingControllerImpl = class extends import_vinyl_util46.EventHostImpl {
|
|
|
4479
4495
|
`appended chunk, this.appendOffset: ${this.appendOffset}`
|
|
4480
4496
|
);
|
|
4481
4497
|
} else {
|
|
4482
|
-
await sourceBufferController.append(
|
|
4483
|
-
|
|
4484
|
-
|
|
4498
|
+
await sourceBufferController.append(
|
|
4499
|
+
firstAppend ? streamingSegment.data : streamingSegment.data.slice(this.appendOffset)
|
|
4500
|
+
);
|
|
4501
|
+
this.appendOffset = byteLength;
|
|
4502
|
+
if (firstAppend) {
|
|
4503
|
+
this.buffered.push(streamingSegment);
|
|
4504
|
+
}
|
|
4485
4505
|
}
|
|
4486
4506
|
if (!tail) this.refreshHead();
|
|
4487
4507
|
}
|
|
@@ -4769,6 +4789,7 @@ var MediaSourceControllerImpl = class extends import_vinyl_util49.EventHostImpl
|
|
|
4769
4789
|
this.activateDisposer.dispose();
|
|
4770
4790
|
this.activateDisposer = null;
|
|
4771
4791
|
++this.durationToken;
|
|
4792
|
+
this.durationSet = false;
|
|
4772
4793
|
try {
|
|
4773
4794
|
URL.revokeObjectURL(this.objectUrl);
|
|
4774
4795
|
} catch (error) {
|
|
@@ -6598,10 +6619,16 @@ function discoverDashTextTracks(manifest, baseUrl) {
|
|
|
6598
6619
|
return out;
|
|
6599
6620
|
}
|
|
6600
6621
|
function isTextAdaptationSet(adaptationSet) {
|
|
6622
|
+
var _a;
|
|
6601
6623
|
if (adaptationSet.contentType === "text") return true;
|
|
6602
6624
|
const mt = adaptationSet.mimeType;
|
|
6603
6625
|
if (mt && mt.startsWith("text/")) return true;
|
|
6604
|
-
return
|
|
6626
|
+
return ((_a = adaptationSet.Representation) != null ? _a : []).some(
|
|
6627
|
+
(representation) => {
|
|
6628
|
+
var _a2;
|
|
6629
|
+
return (_a2 = representation.mimeType) == null ? void 0 : _a2.startsWith("text/");
|
|
6630
|
+
}
|
|
6631
|
+
);
|
|
6605
6632
|
}
|
|
6606
6633
|
function isSidecarTextMime(mimeType) {
|
|
6607
6634
|
if (mimeType == null) return true;
|
|
@@ -6861,7 +6888,7 @@ function parseWebVtt(input) {
|
|
|
6861
6888
|
const cues = [];
|
|
6862
6889
|
const styles = [];
|
|
6863
6890
|
let i = 1;
|
|
6864
|
-
while (i < lines.length && lines[i] !== "") i++;
|
|
6891
|
+
while (i < lines.length && lines[i] !== "" && !lines[i].includes("-->")) i++;
|
|
6865
6892
|
while (i < lines.length) {
|
|
6866
6893
|
if (lines[i] === "") {
|
|
6867
6894
|
i++;
|
|
@@ -9593,7 +9620,11 @@ function createHlsQualityData(deps, data3, baseUrl, playlistUri, metadata) {
|
|
|
9593
9620
|
async getSegment(time, affordance = 0) {
|
|
9594
9621
|
var _a;
|
|
9595
9622
|
const playlist = await data3.getMediaPlaylist(playlistUri);
|
|
9596
|
-
const playlistBaseUrl = (
|
|
9623
|
+
const playlistBaseUrl = getPlaylistBaseUrl(
|
|
9624
|
+
playlist,
|
|
9625
|
+
playlistUri,
|
|
9626
|
+
baseUrl
|
|
9627
|
+
);
|
|
9597
9628
|
const segments = buildSegmentTimeline(
|
|
9598
9629
|
deps,
|
|
9599
9630
|
playlistBaseUrl,
|
|
@@ -9640,9 +9671,13 @@ async function discoverAdsFromManifest(data3) {
|
|
|
9640
9671
|
const variant = data3.mainPlaylist.variants[0];
|
|
9641
9672
|
const media = await data3.getMediaPlaylist(variant.uri);
|
|
9642
9673
|
const contentDuration = media.ended ? media.segments.reduce((sum, s) => sum + s.duration, 0) : null;
|
|
9643
|
-
const playlistBaseUrl = (
|
|
9674
|
+
const playlistBaseUrl = getPlaylistBaseUrl(media, variant.uri, data3.baseUrl);
|
|
9644
9675
|
return discoverHlsInterstitials(media, playlistBaseUrl, contentDuration);
|
|
9645
9676
|
}
|
|
9677
|
+
function getPlaylistBaseUrl(playlist, playlistUri, mainBaseUrl) {
|
|
9678
|
+
var _a;
|
|
9679
|
+
return (_a = playlist.baseUrl) != null ? _a : (0, import_vinyl_util94.resolveUrl)(playlistUri, mainBaseUrl);
|
|
9680
|
+
}
|
|
9646
9681
|
|
|
9647
9682
|
// src/track/hls/createDefaultHlsManifestTransformer.ts
|
|
9648
9683
|
function createDefaultHlsManifestTransformer(deps) {
|
|
@@ -9782,8 +9817,11 @@ async function fetchMediaPlaylist(options) {
|
|
|
9782
9817
|
const variantUrl = (0, import_vinyl_util96.resolveUrl)(uri, baseUrl);
|
|
9783
9818
|
const response = await (0, import_vinyl_util96.requestWithRetry)(variantUrl, requestInit, { abort });
|
|
9784
9819
|
const text = await (0, import_vinyl_util96.readResponseBody)(response, "text");
|
|
9785
|
-
const
|
|
9786
|
-
|
|
9820
|
+
const playlistUrl = response.url || variantUrl;
|
|
9821
|
+
const queryParams = parseQueryParams(playlistUrl);
|
|
9822
|
+
return __spreadProps(__spreadValues({}, (0, import_vinyl_hls_parser3.parseMediaPlaylist)(text, defines, queryParams)), {
|
|
9823
|
+
baseUrl: playlistUrl
|
|
9824
|
+
});
|
|
9787
9825
|
}
|
|
9788
9826
|
function parseQueryParams(url) {
|
|
9789
9827
|
const queryStart = url.indexOf("?");
|
|
@@ -10236,6 +10274,9 @@ var TrackControllerImpl = class extends import_vinyl_util97.EventHostImpl {
|
|
|
10236
10274
|
for (const cachedTrack of this.trackCache.values()) {
|
|
10237
10275
|
cachedTrack.clearPrefetch();
|
|
10238
10276
|
}
|
|
10277
|
+
for (const adTracks of this.adTracksByParent.values()) {
|
|
10278
|
+
for (const adTrack of adTracks.values()) adTrack.clearPrefetch();
|
|
10279
|
+
}
|
|
10239
10280
|
}
|
|
10240
10281
|
clearQueue() {
|
|
10241
10282
|
this.setQueue(this._current, []);
|