bigscreen-player 8.2.1 → 8.2.3

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.
@@ -1,5 +1,5 @@
1
1
  import { fromXML, generateISD, renderHTML } from 'smp-imsc';
2
- import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-b47cafcf.js';
2
+ import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-73f2cc27.js';
3
3
 
4
4
  const SEGMENTS_BUFFER_SIZE = 3;
5
5
  const LOAD_ERROR_COUNT_MAX = 3;
@@ -1,4 +1,4 @@
1
- import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-b47cafcf.js';
1
+ import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-73f2cc27.js';
2
2
 
3
3
  /**
4
4
  * Safely checks if an attribute exists on an element.
@@ -722,8 +722,6 @@ class DebugViewController {
722
722
  case EntryCategory.TRACE:
723
723
  formattedData = this.serialiseTrace(entry);
724
724
  break;
725
- default:
726
- throw new TypeError(`Unrecognised Entry Category: ${category}`);
727
725
  }
728
726
  const sessionTime = new Date(entry.sessionTime);
729
727
  const formatedSessionTime = `${formatDate(sessionTime)}.${zeroPadMs(sessionTime.getUTCMilliseconds())}`;
@@ -738,8 +736,6 @@ class DebugViewController {
738
736
  return `Info: ${data}`;
739
737
  case "warning":
740
738
  return `Warning: ${data}`;
741
- default:
742
- throw new TypeError(`Unrecognised message level '${kind}'`);
743
739
  }
744
740
  }
745
741
  serialiseTime(time) {
@@ -750,6 +746,11 @@ class DebugViewController {
750
746
  var _a;
751
747
  const { currentElementTime, kind, data } = trace;
752
748
  switch (kind) {
749
+ case "apicall": {
750
+ const { functionName, functionArgs } = data;
751
+ const argsPart = functionArgs.length === 0 ? "" : ` with args [${functionArgs.join(", ")}]`;
752
+ return `Called '${functionName}${argsPart}'`;
753
+ }
753
754
  case "buffered-ranges": {
754
755
  const buffered = data.buffered.map(([start, end]) => `${start.toFixed(2)} - ${end.toFixed(2)}`).join(", ");
755
756
  return `Buffered ${data.kind}: [${buffered}] at current time ${currentElementTime.toFixed(2)}`;
@@ -760,14 +761,20 @@ class DebugViewController {
760
761
  const { eventType, eventTarget } = data;
761
762
  return `Event: '${eventType}' from ${eventTarget}`;
762
763
  }
764
+ case "gap": {
765
+ const { from, to } = data;
766
+ return `Gap from ${from} to ${to}`;
767
+ }
763
768
  case "session-start":
764
769
  return `Playback session started at ${new Date(data).toISOString().replace("T", " ")}`;
765
770
  case "session-end":
766
771
  return `Playback session ended at ${new Date(data).toISOString().replace("T", " ")}`;
772
+ case "quota-exceeded": {
773
+ const { bufferLevel, time } = data;
774
+ return `Quota exceeded with buffer level ${bufferLevel} at chunk start time ${time}`;
775
+ }
767
776
  case "state-change":
768
777
  return `Event: ${invertedMediaState[data]}`;
769
- default:
770
- throw new TypeError(`Unrecognised trace kind: ${kind}`);
771
778
  }
772
779
  }
773
780
  serialiseStaticEntry(entry) {
@@ -808,7 +815,7 @@ class DebugViewController {
808
815
  const [qualityIndex, bitrate] = data;
809
816
  return `${qualityIndex} (${bitrate} kbps)`;
810
817
  }
811
- return data.join(", ");
818
+ return data.join(", ");
812
819
  }
813
820
  render() {
814
821
  DebugView.render({
@@ -903,8 +910,7 @@ function DebugTool() {
903
910
  chronicle.setCurrentElementTime(seconds);
904
911
  }
905
912
  function apicall(functionName, functionArgs = []) {
906
- const argsPart = functionArgs.length === 0 ? "" : ` with args [${functionArgs.join(", ")}]`;
907
- debug(`Called '${functionName}${argsPart}'`);
913
+ chronicle.trace("apicall", { functionName, functionArgs });
908
914
  }
909
915
  function buffered(kind, buffered) {
910
916
  chronicle.trace("buffered-ranges", { kind, buffered });
@@ -1118,6 +1124,8 @@ function LegacyPlayerAdapter(mediaSources, windowType, playbackElement, isUHD, p
1118
1124
  }
1119
1125
 
1120
1126
  function onTimeUpdate(event) {
1127
+ DebugToolInstance.updateElementTime(event.currentTime);
1128
+
1121
1129
  isPaused = false;
1122
1130
 
1123
1131
  // Note: Multiple consecutive CDN failover logic
@@ -1130,6 +1138,7 @@ function LegacyPlayerAdapter(mediaSources, windowType, playbackElement, isUHD, p
1130
1138
  // Must publish this time update before checkSeekSucceded - which could cause a pause event
1131
1139
  // This is a device specific event ordering issue.
1132
1140
  publishTimeUpdate();
1141
+
1133
1142
  if ((handleErrorOnExitingSeek || delayPauseOnExitSeek) && exitingSeek) {
1134
1143
  checkSeekSucceeded(event.seekableRange.start, event.currentTime);
1135
1144
  }
@@ -5679,14 +5688,16 @@ function BasicStrategy(mediaSources, windowType, mediaKind, playbackElement) {
5679
5688
  }
5680
5689
 
5681
5690
  function load(_mimeType, startTime) {
5682
- if (!mediaElement) {
5691
+ if (mediaElement == null) {
5683
5692
  setUpMediaElement(startTime);
5684
5693
  setUpMediaListeners();
5685
- } else {
5686
- mediaElement.src = mediaSources.currentSource();
5687
- setStartTime(startTime);
5688
- mediaElement.load();
5694
+
5695
+ return
5689
5696
  }
5697
+
5698
+ mediaElement.src = mediaSources.currentSource();
5699
+ setStartTime(startTime);
5700
+ mediaElement.load();
5690
5701
  }
5691
5702
 
5692
5703
  function setUpMediaElement(startTime) {
@@ -5756,6 +5767,8 @@ function BasicStrategy(mediaSources, windowType, mediaKind, playbackElement) {
5756
5767
  }
5757
5768
 
5758
5769
  function onTimeUpdate() {
5770
+ DebugToolInstance.updateElementTime(mediaElement.currentTime);
5771
+
5759
5772
  publishTimeUpdate();
5760
5773
  }
5761
5774
 
@@ -5928,7 +5941,7 @@ BasicStrategy.getLiveSupport = () => LiveSupport.SEEKABLE;
5928
5941
  function StrategyPicker() {
5929
5942
  return new Promise((resolve, reject) => {
5930
5943
  if (window.bigscreenPlayer.playbackStrategy === PlaybackStrategy.MSE) {
5931
- return import('./msestrategy-ee4a8101.js')
5944
+ return import('./msestrategy-1d2f62f6.js')
5932
5945
  .then(({ default: MSEStrategy }) => resolve(MSEStrategy))
5933
5946
  .catch(() => {
5934
5947
  reject({ error: "strategyDynamicLoadError" });
@@ -6375,7 +6388,7 @@ function CallCallbacks(callbacks, data) {
6375
6388
  }
6376
6389
  }
6377
6390
 
6378
- var Version = "8.2.1";
6391
+ var Version = "8.2.3";
6379
6392
 
6380
6393
  var sourceList;
6381
6394
  var source;
@@ -7726,7 +7739,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
7726
7739
 
7727
7740
  if (available()) {
7728
7741
  if (useLegacySubs) {
7729
- import('./legacysubtitles-9a2eaf33.js')
7742
+ import('./legacysubtitles-01c656c7.js')
7730
7743
  .then(({ default: LegacySubtitles }) => {
7731
7744
  subtitlesContainer = LegacySubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
7732
7745
  callback(subtitlesEnabled);
@@ -7735,7 +7748,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
7735
7748
  Plugins.interface.onSubtitlesDynamicLoadError();
7736
7749
  });
7737
7750
  } else {
7738
- import('./imscsubtitles-5bdbcdb9.js')
7751
+ import('./imscsubtitles-1ea8981b.js')
7739
7752
  .then(({ default: IMSCSubtitles }) => {
7740
7753
  subtitlesContainer = IMSCSubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
7741
7754
  callback(subtitlesEnabled);
@@ -7857,8 +7870,6 @@ function BigscreenPlayer() {
7857
7870
 
7858
7871
  function mediaStateUpdateCallback(evt) {
7859
7872
  if (evt.timeUpdate) {
7860
- DebugToolInstance.updateElementTime(evt.data.currentTime);
7861
-
7862
7873
  CallCallbacks(timeUpdateCallbacks, {
7863
7874
  currentTime: evt.data.currentTime,
7864
7875
  endOfStream,
@@ -481,6 +481,7 @@ type FramesDropped = CreateMetric<"frames-dropped", number>;
481
481
  type InitialPlaybackTime = CreateMetric<"initial-playback-time", number>;
482
482
  type MediaElementEnded = CreateMetric<"ended", HTMLMediaElement["ended"]>;
483
483
  type MediaElementPaused = CreateMetric<"paused", HTMLMediaElement["paused"]>;
484
+ type MediaElementPlaybackRate = CreateMetric<"playback-rate", HTMLMediaElement["playbackRate"]>;
484
485
  type MediaElementReadyState = CreateMetric<"ready-state", HTMLMediaElement["readyState"]>;
485
486
  type MediaElementSeeking = CreateMetric<"seeking", HTMLMediaElement["seeking"]>;
486
487
  type PlaybackStrategy = CreateMetric<"strategy", string>;
@@ -490,7 +491,7 @@ type SeekableRange = CreateMetric<"seekable-range", [start: number, end: number]
490
491
  type SubtitleCDNsAvailable = CreateMetric<"subtitle-cdns-available", string[]>;
491
492
  type SubtitleCurrentUrl = CreateMetric<"subtitle-current-url", string>;
492
493
  type Version = CreateMetric<"version", string>;
493
- type Metric = AutoResume | BitRate | BufferLength | CDNsAvailable | CurrentUrl | Duration | FramesDropped | InitialPlaybackTime | MediaElementEnded | MediaElementPaused | MediaElementReadyState | MediaElementSeeking | PlaybackStrategy | RepresentationAudio | RepresentationVideo | SeekableRange | SubtitleCDNsAvailable | SubtitleCurrentUrl | Version;
494
+ type Metric = AutoResume | BitRate | BufferLength | CDNsAvailable | CurrentUrl | Duration | FramesDropped | InitialPlaybackTime | MediaElementEnded | MediaElementPaused | MediaElementPlaybackRate | MediaElementReadyState | MediaElementSeeking | PlaybackStrategy | RepresentationAudio | RepresentationVideo | SeekableRange | SubtitleCDNsAvailable | SubtitleCurrentUrl | Version;
494
495
  type MetricKind = Metric["kind"];
495
496
  type MetricForKind<Kind extends MetricKind> = Extract<Metric, {
496
497
  kind: Kind;
@@ -501,6 +502,10 @@ type CreateTrace<Kind extends string, Data extends Primitives | Record<string, P
501
502
  kind: Kind;
502
503
  data: Data;
503
504
  };
505
+ type ApiCall = CreateTrace<"apicall", {
506
+ functionName: string;
507
+ functionArgs: any[];
508
+ }>;
504
509
  type BufferedRanges = CreateTrace<"buffered-ranges", {
505
510
  kind: MediaKinds;
506
511
  buffered: [start: number, end: number][];
@@ -524,7 +529,7 @@ type QuotaExceeded = CreateTrace<"quota-exceeded", {
524
529
  type SessionStart = CreateTrace<"session-start", number>;
525
530
  type SessionEnd = CreateTrace<"session-end", number>;
526
531
  type StateChange = CreateTrace<"state-change", MediaState>;
527
- type Trace = BufferedRanges | Error | Event | Gap | QuotaExceeded | SessionStart | SessionEnd | StateChange;
532
+ type Trace = ApiCall | BufferedRanges | Error | Event | Gap | QuotaExceeded | SessionStart | SessionEnd | StateChange;
528
533
  type TraceKind = Trace["kind"];
529
534
  type TraceForKind<Kind extends TraceKind> = Extract<Trace, {
530
535
  kind: Kind;
@@ -576,8 +581,8 @@ declare const DebugToolInstance: {
576
581
  info: (...parts: any[]) => void;
577
582
  statechange: (value: MediaState) => void;
578
583
  warn: (...parts: any[]) => void;
579
- dynamicMetric: <Kind extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind, data: MetricForKind<Kind>["data"]) => void;
580
- staticMetric: <Kind_1 extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind_1, data: MetricForKind<Kind_1>["data"]) => void;
584
+ dynamicMetric: <Kind extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "playback-rate" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind, data: MetricForKind<Kind>["data"]) => void;
585
+ staticMetric: <Kind_1 extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "playback-rate" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind_1, data: MetricForKind<Kind_1>["data"]) => void;
581
586
  hide: () => void;
582
587
  show: () => void;
583
588
  setRootElement: (element: HTMLElement) => void;
package/dist/esm/main.js CHANGED
@@ -1 +1 @@
1
- export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as MediaKinds, M as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-b47cafcf.js';
1
+ export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as MediaKinds, M as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-73f2cc27.js';
@@ -1,5 +1,5 @@
1
1
  import { MediaPlayer } from 'dashjs/index_mediaplayerOnly';
2
- import { W as WindowTypes, U as Utils, D as DOMHelpers, b as LiveSupport, a as DebugToolInstance, M as MediaState, P as Plugins, c as MediaKinds, d as TimeUtils, e as DynamicWindowUtils } from './main-b47cafcf.js';
2
+ import { W as WindowTypes, U as Utils, D as DOMHelpers, b as LiveSupport, a as DebugToolInstance, M as MediaState, P as Plugins, c as MediaKinds, d as TimeUtils, e as DynamicWindowUtils } from './main-73f2cc27.js';
3
3
 
4
4
  function filter(manifest, representationOptions) {
5
5
  const constantFps = representationOptions.constantFps;
@@ -325,13 +325,6 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
325
325
  onBuffering();
326
326
  }
327
327
 
328
- function onStalled() {
329
- DebugToolInstance.event("stalled", "MediaElement");
330
- DebugToolInstance.dynamicMetric("ready-state", mediaElement.readyState);
331
-
332
- getBufferedRanges().map(({ kind, buffered }) => DebugToolInstance.buffered(kind, buffered));
333
- }
334
-
335
328
  function onEnded() {
336
329
  DebugToolInstance.event("ended", "MediaElement");
337
330
  DebugToolInstance.dynamicMetric("ended", mediaElement.ended);
@@ -341,7 +334,13 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
341
334
  publishMediaState(MediaState.ENDED);
342
335
  }
343
336
 
337
+ function onRateChange() {
338
+ DebugToolInstance.dynamicMetric("playback-rate", mediaElement.playbackRate);
339
+ }
340
+
344
341
  function onTimeUpdate() {
342
+ DebugToolInstance.updateElementTime(mediaElement.currentTime);
343
+
345
344
  const currentMpdTimeSeconds =
346
345
  windowType === WindowTypes.SLIDING
347
346
  ? mediaPlayer.getDashMetrics().getCurrentDVRInfo(mediaKind)?.time
@@ -368,7 +367,8 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
368
367
  }
369
368
 
370
369
  if (event.error && event.error.message) {
371
- DebugToolInstance.info(`MSE Error: ${event.error.message} Code: ${event.error.code}`);
370
+ DebugToolInstance.error(`${event.error.message} (code: ${event.error.code})`);
371
+
372
372
  lastError = event.error;
373
373
 
374
374
  // Don't raise an error on fragment download error
@@ -648,6 +648,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
648
648
  function setUpMediaListeners() {
649
649
  DebugToolInstance.dynamicMetric("ended", mediaElement.ended);
650
650
  DebugToolInstance.dynamicMetric("paused", mediaElement.paused);
651
+ DebugToolInstance.dynamicMetric("playback-rate", mediaElement.playbackRate);
651
652
  DebugToolInstance.dynamicMetric("ready-state", mediaElement.readyState);
652
653
  DebugToolInstance.dynamicMetric("seeking", mediaElement.seeking);
653
654
 
@@ -661,7 +662,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
661
662
  mediaElement.addEventListener("seeking", onSeeking);
662
663
  mediaElement.addEventListener("seeked", onSeeked);
663
664
  mediaElement.addEventListener("ended", onEnded);
664
- mediaElement.addEventListener("stalled", onStalled);
665
+ mediaElement.addEventListener("ratechange", onRateChange);
665
666
  mediaPlayer.on(DashJSEvents.ERROR, onError);
666
667
  mediaPlayer.on(DashJSEvents.MANIFEST_LOADED, onManifestLoaded);
667
668
  mediaPlayer.on(DashJSEvents.STREAM_INITIALIZED, onStreamInitialised);
@@ -793,7 +794,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
793
794
  mediaElement.removeEventListener("seeking", onSeeking);
794
795
  mediaElement.removeEventListener("seeked", onSeeked);
795
796
  mediaElement.removeEventListener("ended", onEnded);
796
- mediaElement.removeEventListener("stalled", onStalled);
797
+ mediaElement.removeEventListener("ratechange", onRateChange);
797
798
  mediaPlayer.off(DashJSEvents.ERROR, onError);
798
799
  mediaPlayer.off(DashJSEvents.MANIFEST_LOADED, onManifestLoaded);
799
800
  mediaPlayer.off(DashJSEvents.MANIFEST_VALIDITY_CHANGED, onManifestValidityChange);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigscreen-player",
3
- "version": "8.2.1",
3
+ "version": "8.2.3",
4
4
  "type": "module",
5
5
  "description": "Simplified media playback for bigscreen devices.",
6
6
  "main": "dist/esm/main.js",