@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.
Files changed (92) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +62 -21
  3. package/dist/index.cjs.map +3 -3
  4. package/dist/index.js +65 -22
  5. package/dist/index.js.map +3 -3
  6. package/dist/test/benchmark.es5.js +7 -6
  7. package/dist/test/benchmark.js +35 -30
  8. package/dist/test/benchmark.js.map +3 -3
  9. package/dist/test/integ.es5.js +184 -171
  10. package/dist/test/integ.js +450 -165
  11. package/dist/test/integ.js.map +4 -4
  12. package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
  13. package/dist/types/current/ad/AdControllerImpl.js +15 -1
  14. package/dist/types/current/ad/discoverHlsInterstitials.js +13 -1
  15. package/dist/types/current/drm/commonEme/MsCommonEme.d.ts.map +1 -1
  16. package/dist/types/current/drm/commonEme/MsCommonEme.js +2 -2
  17. package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts.map +1 -1
  18. package/dist/types/current/drm/commonEme/StandardCommonEme.js +3 -2
  19. package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts.map +1 -1
  20. package/dist/types/current/drm/commonEme/WebKitCommonEme.js +2 -2
  21. package/dist/types/current/drm/dom/MSMediaKeys.d.ts +1 -1
  22. package/dist/types/current/drm/dom/MSMediaKeys.d.ts.map +1 -1
  23. package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts +1 -1
  24. package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts.map +1 -1
  25. package/dist/types/current/drm/util/extractContentId.js +2 -2
  26. package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -1
  27. package/dist/types/current/streaming/MediaQualityMetadata.d.ts +3 -1
  28. package/dist/types/current/streaming/MediaQualityMetadata.d.ts.map +1 -1
  29. package/dist/types/current/streaming/SegmentControllerImpl.d.ts +1 -1
  30. package/dist/types/current/streaming/buffering/BufferingController.d.ts +1 -1
  31. package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
  32. package/dist/types/current/streaming/buffering/BufferingController.js +14 -5
  33. package/dist/types/current/streaming/buffering/MediaSourceController.d.ts.map +1 -1
  34. package/dist/types/current/streaming/buffering/MediaSourceController.js +4 -0
  35. package/dist/types/current/text/discoverDashTextTracks.d.ts +2 -2
  36. package/dist/types/current/text/discoverDashTextTracks.js +4 -3
  37. package/dist/types/current/text/parseWebVtt.d.ts.map +1 -1
  38. package/dist/types/current/text/parseWebVtt.js +3 -2
  39. package/dist/types/current/track/TrackController.d.ts.map +1 -1
  40. package/dist/types/current/track/TrackController.js +7 -0
  41. package/dist/types/current/track/hls/HlsManifestData.d.ts +14 -1
  42. package/dist/types/current/track/hls/HlsManifestData.d.ts.map +1 -1
  43. package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts.map +1 -1
  44. package/dist/types/current/track/hls/buildHlsMediaTimeline.js +10 -2
  45. package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  46. package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
  47. package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +8 -3
  48. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  49. package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -1
  50. package/dist/types/ts3.7/streaming/MediaQualityMetadata.d.ts +3 -1
  51. package/dist/types/ts3.7/streaming/SegmentControllerImpl.d.ts +1 -1
  52. package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +1 -1
  53. package/dist/types/ts3.7/text/discoverDashTextTracks.d.ts +2 -2
  54. package/dist/types/ts3.7/track/hls/HlsManifestData.d.ts +14 -1
  55. package/dist/types/ts3.7/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  56. package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -1
  57. package/dist/types/ts4.1/streaming/MediaQualityMetadata.d.ts +3 -1
  58. package/dist/types/ts4.1/streaming/SegmentControllerImpl.d.ts +1 -1
  59. package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +1 -1
  60. package/dist/types/ts4.1/text/discoverDashTextTracks.d.ts +2 -2
  61. package/dist/types/ts4.1/track/hls/HlsManifestData.d.ts +14 -1
  62. package/dist/types/ts4.1/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  63. package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -1
  64. package/dist/types/ts4.7/streaming/MediaQualityMetadata.d.ts +3 -1
  65. package/dist/types/ts4.7/streaming/SegmentControllerImpl.d.ts +1 -1
  66. package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +1 -1
  67. package/dist/types/ts4.7/text/discoverDashTextTracks.d.ts +2 -2
  68. package/dist/types/ts4.7/track/hls/HlsManifestData.d.ts +14 -1
  69. package/dist/types/ts4.7/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  70. package/dist/unit/types/current/ad/AdControllerImpl.test.js +66 -0
  71. package/dist/unit/types/current/ad/discoverHlsInterstitials.test.js +29 -2
  72. package/dist/unit/types/current/drm/commonEme/StandardCommonEme.test.js +12 -4
  73. package/dist/unit/types/current/drm/util/extractContentId.test.js +7 -0
  74. package/dist/unit/types/current/index.d.ts +1 -0
  75. package/dist/unit/types/current/index.d.ts.map +1 -1
  76. package/dist/unit/types/current/index.js +1 -0
  77. package/dist/unit/types/current/streaming/MediaQualityMetadata.test.js +8 -0
  78. package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +26 -0
  79. package/dist/unit/types/current/streaming/buffering/MediaSourceController.test.js +29 -0
  80. package/dist/unit/types/current/text/TextTrack.test.d.ts +2 -0
  81. package/dist/unit/types/current/text/TextTrack.test.d.ts.map +1 -0
  82. package/dist/unit/types/current/text/TextTrack.test.js +12 -0
  83. package/dist/unit/types/current/text/discoverDashTextTracks.test.js +17 -0
  84. package/dist/unit/types/current/text/parseWebVtt.test.js +26 -0
  85. package/dist/unit/types/current/track/TrackController.test.js +15 -60
  86. package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +22 -0
  87. package/dist/unit/types/current/track/hls/createUrlHlsManifestProvider.test.js +23 -0
  88. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  89. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  90. package/docs/CUSTOMIZATION_GUIDE.md +310 -0
  91. package/package.json +10 -10
  92. 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
- - [DASH Manifest Transforms](./docs/DASH_MANIFEST_TRANSFORM_GUIDE.md) —
44
- rewriting manifests before parsing.
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 || adBreakState2.completedReason) return;
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
- uri: (0, import_vinyl_util5.resolveUrl)(asset.URI, baseUrl)
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.buffer
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
- const initData = this.initData;
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.buffer
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)(initData.buffer);
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
- if (byteLength > appendSize) {
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 (this.appendOffset === 0) {
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(streamingSegment.data);
4483
- this.appendOffset = streamingSegment.data.byteLength;
4484
- this.buffered.push(streamingSegment);
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 false;
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 = (0, import_vinyl_util94.resolveUrl)(playlistUri, baseUrl);
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 = (0, import_vinyl_util94.resolveUrl)(variant.uri, data3.baseUrl);
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 queryParams = parseQueryParams(response.url || variantUrl);
9786
- return (0, import_vinyl_hls_parser3.parseMediaPlaylist)(text, defines, queryParams);
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, []);