@gcorevideo/player 2.23.3 → 2.24.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.js CHANGED
@@ -43303,7 +43303,7 @@ class Player {
43303
43303
  }
43304
43304
  }
43305
43305
 
43306
- var version$1 = "2.23.3";
43306
+ var version$1 = "2.24.0";
43307
43307
 
43308
43308
  var packages = {
43309
43309
  "node_modules/@clappr/core": {
@@ -44966,7 +44966,7 @@ class BigMuteButton extends UICorePlugin {
44966
44966
  */
44967
44967
  get events() {
44968
44968
  return {
44969
- 'click .big-mute-icon': 'handleBigMuteBtnClick',
44969
+ 'click .big-mute-icon': 'clicked',
44970
44970
  'click .big-mute-icon-wrapper': 'destroyBigMuteBtn',
44971
44971
  };
44972
44972
  }
@@ -44980,6 +44980,7 @@ class BigMuteButton extends UICorePlugin {
44980
44980
  trace(`${T$h} bindEvents`, {
44981
44981
  mediacontrol: !!this.core.mediaControl,
44982
44982
  });
44983
+ // TOOD use core.getPlugin('media_control')
44983
44984
  this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mediaControlRendered);
44984
44985
  }
44985
44986
  onCoreReady() {
@@ -45073,7 +45074,7 @@ class BigMuteButton extends UICorePlugin {
45073
45074
  }
45074
45075
  this.destroy();
45075
45076
  }
45076
- handleBigMuteBtnClick(e) {
45077
+ clicked(e) {
45077
45078
  const localVolume = Utils.Config.restore('volume');
45078
45079
  const volume = !isNaN(localVolume) ? localVolume : 100;
45079
45080
  // TODO use container.setVolume() instead
@@ -45699,6 +45700,132 @@ class ClapprStats extends ContainerPlugin {
45699
45700
  }
45700
45701
  }
45701
45702
 
45703
+ function generateSessionId() {
45704
+ return window.crypto.randomUUID();
45705
+ }
45706
+ function generateContentId(sourceUrl) {
45707
+ return window.crypto.subtle.digest('SHA-1', new TextEncoder().encode(sourceUrl))
45708
+ .then(buffer => {
45709
+ const hex = Array.from(new Uint8Array(buffer))
45710
+ .map(b => b.toString(16).padStart(2, '0'))
45711
+ .join('');
45712
+ return hex;
45713
+ });
45714
+ }
45715
+
45716
+ const CMCD_KEYS = [
45717
+ 'br',
45718
+ 'd',
45719
+ 'ot',
45720
+ 'tb',
45721
+ 'bl',
45722
+ 'dl',
45723
+ 'mtp',
45724
+ 'nor',
45725
+ 'nrr',
45726
+ 'su',
45727
+ 'bs',
45728
+ 'rtp',
45729
+ 'cid',
45730
+ 'pr',
45731
+ 'sf',
45732
+ 'sid',
45733
+ 'st',
45734
+ 'v',
45735
+ ];
45736
+ /**
45737
+ * A `PLUGIN` that configures CMCD for playback
45738
+ * @beta
45739
+ * @remarks
45740
+ * Configuration options
45741
+ * `cmcd`: {@link CmcdConfigPluginSettings}
45742
+ */
45743
+ class CmcdConfig extends CorePlugin {
45744
+ sid;
45745
+ cid = '';
45746
+ /**
45747
+ * @inheritdocs
45748
+ */
45749
+ get name() {
45750
+ return 'cmcd';
45751
+ }
45752
+ constructor(core) {
45753
+ super(core);
45754
+ this.sid = this.options.cmcd?.sessionId ?? generateSessionId();
45755
+ }
45756
+ /**
45757
+ * @inheritdocs
45758
+ */
45759
+ bindEvents() {
45760
+ this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, () => this.updateSettings());
45761
+ }
45762
+ async getIds() {
45763
+ return {
45764
+ sid: this.sid,
45765
+ cid: await this.ensureContentId(),
45766
+ };
45767
+ }
45768
+ updateSettings() {
45769
+ switch (this.core.activeContainer.playback.name) {
45770
+ case 'dash':
45771
+ this.updateDashjsSettings();
45772
+ break;
45773
+ case 'hls':
45774
+ this.updateHlsjsSettings();
45775
+ break;
45776
+ }
45777
+ }
45778
+ async updateDashjsSettings() {
45779
+ const { cid, sid } = await this.getIds();
45780
+ const options = this.core.activePlayback.options;
45781
+ this.core.activePlayback.options = {
45782
+ ...options,
45783
+ dash: {
45784
+ ...(options.dash ?? {}),
45785
+ cmcd: {
45786
+ enabled: true,
45787
+ enabledKeys: CMCD_KEYS,
45788
+ sid,
45789
+ cid,
45790
+ },
45791
+ },
45792
+ };
45793
+ }
45794
+ async updateHlsjsSettings() {
45795
+ const { cid, sid } = await this.getIds();
45796
+ const options = this.core.activePlayback.options;
45797
+ this.core.activePlayback.options = {
45798
+ ...options,
45799
+ playback: {
45800
+ hlsjsConfig: {
45801
+ ...(options.playback?.hlsjsConfig ?? {}),
45802
+ cmcd: {
45803
+ includeKeys: CMCD_KEYS,
45804
+ sessionId: sid,
45805
+ contentId: cid,
45806
+ },
45807
+ },
45808
+ },
45809
+ };
45810
+ }
45811
+ async ensureContentId() {
45812
+ if (!this.cid) {
45813
+ this.cid = await this.evalContentId();
45814
+ }
45815
+ return this.cid;
45816
+ }
45817
+ async evalContentId() {
45818
+ if (!this.core.activeContainer.options.cmcd?.contentId) {
45819
+ return generateContentId(this.core.activePlayback.options.src);
45820
+ }
45821
+ const contentId = this.core.activeContainer.options.cmcd.contentId;
45822
+ if (typeof contentId === 'string') {
45823
+ return contentId;
45824
+ }
45825
+ return Promise.resolve(contentId(this.core.activePlayback.options.src));
45826
+ }
45827
+ }
45828
+
45702
45829
  var mousetrap = {exports: {}};
45703
45830
 
45704
45831
  /*global define:false */
@@ -52472,4 +52599,4 @@ class VolumeFade extends UICorePlugin {
52472
52599
  }
52473
52600
  }
52474
52601
 
52475
- export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents, ClickToPause, Clips, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, ExtendedEvents, Favicon, GearEvents, GoogleAnalytics, QualityLevels as LevelSelector, LogTracer, Logger, Logo, MediaControl, MultiCamera, NerdStats, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, QualityLevels, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerThreeBounce as Spinner, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };
52602
+ export { AudioTracks as AudioSelector, AudioTracks, BigMuteButton, BottomGear, NerdStats as ClapprNerdStats, ClapprStats, ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents, ClickToPause, Clips, ClosedCaptions, CmcdConfig, ContextMenu, DvrControls, ErrorScreen, ExtendedEvents, Favicon, GearEvents, GoogleAnalytics, QualityLevels as LevelSelector, LogTracer, Logger, Logo, MediaControl, MultiCamera, NerdStats, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, QualityLevels, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerThreeBounce as Spinner, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };
package/dist/player.d.ts CHANGED
@@ -228,6 +228,8 @@ export declare class BigMuteButton extends UICorePlugin {
228
228
  */
229
229
  export declare class BottomGear extends UICorePlugin {
230
230
  private hd;
231
+ private numItems;
232
+ private collapsed;
231
233
  /**
232
234
  * @internal
233
235
  */
@@ -282,7 +284,6 @@ export declare class BottomGear extends UICorePlugin {
282
284
  * ```
283
285
  */
284
286
  addItem(name: string, $subMenu?: ZeptoResult): ZeptoResult;
285
- private onActiveContainerChanged;
286
287
  private bindContainerEvents;
287
288
  private highDefinitionUpdate;
288
289
  /**
@@ -295,10 +296,12 @@ export declare class BottomGear extends UICorePlugin {
295
296
  * Should be called by the UI plugin that added a gear item with a submenu when the latter is closed (e.g., when a "back" button is clicked).
296
297
  */
297
298
  refresh(): void;
298
- private toggleGearMenu;
299
- private hide;
299
+ private collapseSubmenus;
300
+ private toggleMenu;
301
+ private collapse;
300
302
  private onCoreReady;
301
303
  private onMediaControlRendered;
304
+ private mount;
302
305
  }
303
306
 
304
307
  /**
@@ -4,6 +4,7 @@ export { AudioTracks as AudioSelector } from "./plugins/audio-selector/AudioTrac
4
4
  export * from "./plugins/big-mute-button/BigMuteButton.js";
5
5
  export * from "./plugins/bottom-gear/BottomGear.js";
6
6
  export * from "./plugins/clappr-stats/ClapprStats.js";
7
+ export * from "./plugins/cmcd-config/CmcdConfig.js";
7
8
  export * from "./plugins/clappr-nerd-stats/NerdStats.js";
8
9
  export { NerdStats as ClapprNerdStats } from "./plugins/clappr-nerd-stats/NerdStats.js";
9
10
  export * from "./plugins/click-to-pause/ClickToPause.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.plugins.d.ts","sourceRoot":"","sources":["../src/index.plugins.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AAEnC,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACvF,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,0CAA0C,CAAC;AACxF,cAAc,0CAA0C,CAAC;AACzD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wBAAwB,CAAC;AACvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC3F,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sDAAsD,CAAC;AACrE,OAAO,EAAE,kBAAkB,IAAI,OAAO,EAAE,MAAM,sDAAsD,CAAC;AACrG,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,OAAO,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACpF,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.plugins.d.ts","sourceRoot":"","sources":["../src/index.plugins.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AAEnC,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACvF,cAAc,4CAA4C,CAAC;AAC3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,0CAA0C,CAAC;AACxF,cAAc,0CAA0C,CAAC;AACzD,cAAc,0BAA0B,CAAC;AACzC,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wBAAwB,CAAC;AACvC,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kDAAkD,CAAC;AACjE,cAAc,yCAAyC,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2CAA2C,CAAC;AAC1D,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC3F,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sDAAsD,CAAC;AACrE,OAAO,EAAE,kBAAkB,IAAI,OAAO,EAAE,MAAM,sDAAsD,CAAC;AACrG,cAAc,iDAAiD,CAAC;AAChE,cAAc,uCAAuC,CAAC;AACtD,OAAO,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACpF,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AAGnD,cAAc,qCAAqC,CAAC"}
@@ -4,6 +4,7 @@ export { AudioTracks as AudioSelector } from "./plugins/audio-selector/AudioTrac
4
4
  export * from "./plugins/big-mute-button/BigMuteButton.js";
5
5
  export * from "./plugins/bottom-gear/BottomGear.js";
6
6
  export * from "./plugins/clappr-stats/ClapprStats.js";
7
+ export * from "./plugins/cmcd-config/CmcdConfig.js";
7
8
  export * from "./plugins/clappr-nerd-stats/NerdStats.js";
8
9
  export { NerdStats as ClapprNerdStats } from "./plugins/clappr-nerd-stats/NerdStats.js";
9
10
  export * from "./plugins/click-to-pause/ClickToPause.js";
@@ -47,6 +47,6 @@ export declare class BigMuteButton extends UICorePlugin {
47
47
  private hideBigMuteBtn;
48
48
  private showBigMuteBtn;
49
49
  private destroyBigMuteBtn;
50
- private handleBigMuteBtnClick;
50
+ private clicked;
51
51
  }
52
52
  //# sourceMappingURL=BigMuteButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BigMuteButton.d.ts","sourceRoot":"","sources":["../../../src/plugins/big-mute-button/BigMuteButton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAS,MAAM,cAAc,CAAA;AAQpE,OAAO,sDAAsD,CAAA;AAM7D;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,qBAAqB,CAAQ;IAErC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,cAAc,CAA2B;IAEjD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IAcnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACM,MAAM;IAuBf,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,qBAAqB;CAS9B"}
1
+ {"version":3,"file":"BigMuteButton.d.ts","sourceRoot":"","sources":["../../../src/plugins/big-mute-button/BigMuteButton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAS,MAAM,cAAc,CAAA;AAQpE,OAAO,sDAAsD,CAAA;AAM7D;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,qBAAqB,CAAQ;IAErC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,cAAc,CAA2B;IAEjD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IAenB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACM,MAAM;IAuBf,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,OAAO;CAShB"}
@@ -34,7 +34,7 @@ export class BigMuteButton extends UICorePlugin {
34
34
  */
35
35
  get events() {
36
36
  return {
37
- 'click .big-mute-icon': 'handleBigMuteBtnClick',
37
+ 'click .big-mute-icon': 'clicked',
38
38
  'click .big-mute-icon-wrapper': 'destroyBigMuteBtn',
39
39
  };
40
40
  }
@@ -48,6 +48,7 @@ export class BigMuteButton extends UICorePlugin {
48
48
  trace(`${T} bindEvents`, {
49
49
  mediacontrol: !!this.core.mediaControl,
50
50
  });
51
+ // TOOD use core.getPlugin('media_control')
51
52
  this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_RENDERED, this.mediaControlRendered);
52
53
  }
53
54
  onCoreReady() {
@@ -141,7 +142,7 @@ export class BigMuteButton extends UICorePlugin {
141
142
  }
142
143
  this.destroy();
143
144
  }
144
- handleBigMuteBtnClick(e) {
145
+ clicked(e) {
145
146
  const localVolume = Utils.Config.restore('volume');
146
147
  const volume = !isNaN(localVolume) ? localVolume : 100;
147
148
  // TODO use container.setVolume() instead
@@ -0,0 +1,45 @@
1
+ import { Core, CorePlugin } from '@clappr/core';
2
+ /**
3
+ * @beta
4
+ */
5
+ export type CmcdConfigPluginSettings = {
6
+ /**
7
+ * Session ID. If ommitted, a random UUID will be generated
8
+ */
9
+ sessionId: string;
10
+ /**
11
+ * Content ID, either constant or derived from current source.
12
+ * If ommitted, a SHA-1 hash of current source URL will be used
13
+ */
14
+ contentId?: string | ((sourceUrl: string, mimeType?: string) => (string | Promise<string>));
15
+ };
16
+ /**
17
+ * A `PLUGIN` that configures CMCD for playback
18
+ * @beta
19
+ * @remarks
20
+ * Configuration options
21
+ * `cmcd`: {@link CmcdConfigPluginSettings}
22
+ */
23
+ export declare class CmcdConfig extends CorePlugin {
24
+ private sid;
25
+ private cid;
26
+ /**
27
+ * @inheritdocs
28
+ */
29
+ get name(): string;
30
+ constructor(core: Core);
31
+ /**
32
+ * @inheritdocs
33
+ */
34
+ bindEvents(): void;
35
+ getIds(): Promise<{
36
+ sid: string;
37
+ cid: string;
38
+ }>;
39
+ private updateSettings;
40
+ private updateDashjsSettings;
41
+ private updateHlsjsSettings;
42
+ private ensureContentId;
43
+ private evalContentId;
44
+ }
45
+ //# sourceMappingURL=CmcdConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CmcdConfig.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/CmcdConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EAEX,MAAM,cAAc,CAAA;AAyBrB;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;CAC5F,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAO,CAAC,GAAG,CAAQ;IAEnB,OAAO,CAAC,GAAG,CAAK;IAEhB;;OAEG;IACH,IAAI,IAAI,WAEP;gBAEW,IAAI,EAAE,IAAI;IAKtB;;OAEG;IACM,UAAU;IAMb,MAAM,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAOrD,OAAO,CAAC,cAAc;YAWR,oBAAoB;YAiBpB,mBAAmB;YAkBnB,eAAe;YAOf,aAAa;CAU5B"}
@@ -0,0 +1,114 @@
1
+ import { CorePlugin, Events, } from '@clappr/core';
2
+ import { generateContentId, generateSessionId } from './utils';
3
+ const CMCD_KEYS = [
4
+ 'br',
5
+ 'd',
6
+ 'ot',
7
+ 'tb',
8
+ 'bl',
9
+ 'dl',
10
+ 'mtp',
11
+ 'nor',
12
+ 'nrr',
13
+ 'su',
14
+ 'bs',
15
+ 'rtp',
16
+ 'cid',
17
+ 'pr',
18
+ 'sf',
19
+ 'sid',
20
+ 'st',
21
+ 'v',
22
+ ];
23
+ /**
24
+ * A `PLUGIN` that configures CMCD for playback
25
+ * @beta
26
+ * @remarks
27
+ * Configuration options
28
+ * `cmcd`: {@link CmcdConfigPluginSettings}
29
+ */
30
+ export class CmcdConfig extends CorePlugin {
31
+ sid;
32
+ cid = '';
33
+ /**
34
+ * @inheritdocs
35
+ */
36
+ get name() {
37
+ return 'cmcd';
38
+ }
39
+ constructor(core) {
40
+ super(core);
41
+ this.sid = this.options.cmcd?.sessionId ?? generateSessionId();
42
+ }
43
+ /**
44
+ * @inheritdocs
45
+ */
46
+ bindEvents() {
47
+ this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, () => this.updateSettings());
48
+ }
49
+ async getIds() {
50
+ return {
51
+ sid: this.sid,
52
+ cid: await this.ensureContentId(),
53
+ };
54
+ }
55
+ updateSettings() {
56
+ switch (this.core.activeContainer.playback.name) {
57
+ case 'dash':
58
+ this.updateDashjsSettings();
59
+ break;
60
+ case 'hls':
61
+ this.updateHlsjsSettings();
62
+ break;
63
+ }
64
+ }
65
+ async updateDashjsSettings() {
66
+ const { cid, sid } = await this.getIds();
67
+ const options = this.core.activePlayback.options;
68
+ this.core.activePlayback.options = {
69
+ ...options,
70
+ dash: {
71
+ ...(options.dash ?? {}),
72
+ cmcd: {
73
+ enabled: true,
74
+ enabledKeys: CMCD_KEYS,
75
+ sid,
76
+ cid,
77
+ },
78
+ },
79
+ };
80
+ }
81
+ async updateHlsjsSettings() {
82
+ const { cid, sid } = await this.getIds();
83
+ const options = this.core.activePlayback.options;
84
+ this.core.activePlayback.options = {
85
+ ...options,
86
+ playback: {
87
+ hlsjsConfig: {
88
+ ...(options.playback?.hlsjsConfig ?? {}),
89
+ cmcd: {
90
+ includeKeys: CMCD_KEYS,
91
+ sessionId: sid,
92
+ contentId: cid,
93
+ },
94
+ },
95
+ },
96
+ };
97
+ }
98
+ async ensureContentId() {
99
+ if (!this.cid) {
100
+ this.cid = await this.evalContentId();
101
+ }
102
+ return this.cid;
103
+ }
104
+ async evalContentId() {
105
+ if (!this.core.activeContainer.options.cmcd?.contentId) {
106
+ return generateContentId(this.core.activePlayback.options.src);
107
+ }
108
+ const contentId = this.core.activeContainer.options.cmcd.contentId;
109
+ if (typeof contentId === 'string') {
110
+ return contentId;
111
+ }
112
+ return Promise.resolve(contentId(this.core.activePlayback.options.src));
113
+ }
114
+ }
@@ -0,0 +1,3 @@
1
+ export declare function generateSessionId(): string;
2
+ export declare function generateContentId(sourceUrl: string): Promise<string>;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQpE"}
@@ -0,0 +1,12 @@
1
+ export function generateSessionId() {
2
+ return window.crypto.randomUUID();
3
+ }
4
+ export function generateContentId(sourceUrl) {
5
+ return window.crypto.subtle.digest('SHA-1', new TextEncoder().encode(sourceUrl))
6
+ .then(buffer => {
7
+ const hex = Array.from(new Uint8Array(buffer))
8
+ .map(b => b.toString(16).padStart(2, '0'))
9
+ .join('');
10
+ return hex;
11
+ });
12
+ }
@@ -28,7 +28,7 @@ export declare function createSpinnerPlugin(): Events<string | symbol, any> & {
28
28
  show: import("vitest").Mock<(...args: any[]) => any>;
29
29
  hide: import("vitest").Mock<(...args: any[]) => any>;
30
30
  };
31
- export declare function createMockPlayback(name?: string): Events<string | symbol, any> & {
31
+ export declare function createMockPlayback(name?: string, options?: Record<string, unknown>): Events<string | symbol, any> & {
32
32
  name: string;
33
33
  currentLevel: number;
34
34
  el: HTMLVideoElement;
@@ -36,6 +36,9 @@ export declare function createMockPlayback(name?: string): Events<string | symbo
36
36
  dvrInUse: boolean;
37
37
  isAudioOnly: boolean;
38
38
  levels: never[];
39
+ options: {
40
+ [x: string]: unknown;
41
+ };
39
42
  consent: import("vitest").Mock<(...args: any[]) => any>;
40
43
  play: import("vitest").Mock<(...args: any[]) => any>;
41
44
  pause: import("vitest").Mock<(...args: any[]) => any>;
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;EAqB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC/C;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAA0B;;;;;;;;;;;;;;;;;;;;;;;;EA6BrC;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAiB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;EAqB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCtF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAAgD;;;;;;;;;;;;;;;;;;;;;;;;EA6B3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAiB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
package/lib/testUtils.js CHANGED
@@ -34,7 +34,7 @@ export function createSpinnerPlugin() {
34
34
  hide: vi.fn(),
35
35
  });
36
36
  }
37
- export function createMockPlayback(name = 'mock') {
37
+ export function createMockPlayback(name = 'mock', options = {}) {
38
38
  const emitter = new Events();
39
39
  return Object.assign(emitter, {
40
40
  name,
@@ -44,6 +44,7 @@ export function createMockPlayback(name = 'mock') {
44
44
  dvrInUse: false,
45
45
  isAudioOnly: false,
46
46
  levels: [],
47
+ options: { ...options },
47
48
  consent: vi.fn(),
48
49
  play: vi.fn(),
49
50
  pause: vi.fn(),
@@ -70,7 +71,7 @@ export function createMockPlayback(name = 'mock') {
70
71
  trigger: emitter.emit,
71
72
  });
72
73
  }
73
- export function createMockContainer(options = {}, playback = createMockPlayback()) {
74
+ export function createMockContainer(options = {}, playback = createMockPlayback('html5_video', options)) {
74
75
  const el = playback.el;
75
76
  const emitter = new Events();
76
77
  return Object.assign(emitter, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.23.3",
3
+ "version": "2.24.0",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -5,6 +5,7 @@ export { AudioTracks as AudioSelector } from "./plugins/audio-selector/AudioTrac
5
5
  export * from "./plugins/big-mute-button/BigMuteButton.js";
6
6
  export * from "./plugins/bottom-gear/BottomGear.js";
7
7
  export * from "./plugins/clappr-stats/ClapprStats.js";
8
+ export * from "./plugins/cmcd-config/CmcdConfig.js";
8
9
  export * from "./plugins/clappr-nerd-stats/NerdStats.js";
9
10
  export { NerdStats as ClapprNerdStats } from "./plugins/clappr-nerd-stats/NerdStats.js";
10
11
  export * from "./plugins/click-to-pause/ClickToPause.js";
@@ -47,7 +47,7 @@ export class BigMuteButton extends UICorePlugin {
47
47
  */
48
48
  override get events() {
49
49
  return {
50
- 'click .big-mute-icon': 'handleBigMuteBtnClick',
50
+ 'click .big-mute-icon': 'clicked',
51
51
  'click .big-mute-icon-wrapper': 'destroyBigMuteBtn',
52
52
  }
53
53
  }
@@ -62,6 +62,7 @@ export class BigMuteButton extends UICorePlugin {
62
62
  trace(`${T} bindEvents`, {
63
63
  mediacontrol: !!this.core.mediaControl,
64
64
  })
65
+ // TOOD use core.getPlugin('media_control')
65
66
  this.listenTo(
66
67
  this.core.mediaControl,
67
68
  Events.MEDIACONTROL_RENDERED,
@@ -199,7 +200,7 @@ export class BigMuteButton extends UICorePlugin {
199
200
  this.destroy()
200
201
  }
201
202
 
202
- private handleBigMuteBtnClick(e: MouseEvent) {
203
+ private clicked(e: MouseEvent) {
203
204
  const localVolume = Utils.Config.restore('volume')
204
205
  const volume = !isNaN(localVolume) ? localVolume : 100
205
206