@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/core.js +1 -1
- package/dist/index.css +1197 -1197
- package/dist/index.js +131 -4
- package/dist/player.d.ts +6 -3
- package/lib/index.plugins.d.ts +1 -0
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +1 -0
- package/lib/plugins/big-mute-button/BigMuteButton.d.ts +1 -1
- package/lib/plugins/big-mute-button/BigMuteButton.d.ts.map +1 -1
- package/lib/plugins/big-mute-button/BigMuteButton.js +3 -2
- package/lib/plugins/cmcd-config/CmcdConfig.d.ts +45 -0
- package/lib/plugins/cmcd-config/CmcdConfig.d.ts.map +1 -0
- package/lib/plugins/cmcd-config/CmcdConfig.js +114 -0
- package/lib/plugins/cmcd-config/utils.d.ts +3 -0
- package/lib/plugins/cmcd-config/utils.d.ts.map +1 -0
- package/lib/plugins/cmcd-config/utils.js +12 -0
- package/lib/testUtils.d.ts +4 -1
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +3 -2
- package/package.json +1 -1
- package/src/index.plugins.ts +1 -0
- package/src/plugins/big-mute-button/BigMuteButton.ts +3 -2
- package/src/plugins/cmcd-config/CmcdConfig.ts +148 -0
- package/src/plugins/cmcd-config/__tests__/CmcdConfig.test.ts +162 -0
- package/src/plugins/cmcd-config/utils.ts +13 -0
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +4 -3
- package/src/testUtils.ts +3 -2
- package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js
CHANGED
|
@@ -43303,7 +43303,7 @@ class Player {
|
|
|
43303
43303
|
}
|
|
43304
43304
|
}
|
|
43305
43305
|
|
|
43306
|
-
var version$1 = "2.
|
|
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': '
|
|
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
|
-
|
|
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
|
|
299
|
-
private
|
|
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
|
/**
|
package/lib/index.plugins.d.ts
CHANGED
|
@@ -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"}
|
package/lib/index.plugins.js
CHANGED
|
@@ -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":"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;
|
|
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': '
|
|
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
|
-
|
|
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 @@
|
|
|
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
|
+
}
|
package/lib/testUtils.d.ts
CHANGED
|
@@ -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>;
|
package/lib/testUtils.d.ts.map
CHANGED
|
@@ -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
|
|
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
package/src/index.plugins.ts
CHANGED
|
@@ -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': '
|
|
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
|
|
203
|
+
private clicked(e: MouseEvent) {
|
|
203
204
|
const localVolume = Utils.Config.restore('volume')
|
|
204
205
|
const volume = !isNaN(localVolume) ? localVolume : 100
|
|
205
206
|
|