@gcorevideo/player 2.22.13 → 2.22.15
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/assets/bottom-gear/gear.scss +20 -13
- package/assets/clappr-nerd-stats/button.ejs +2 -2
- package/assets/clappr-nerd-stats/clappr-nerd-stats.scss +0 -43
- package/assets/context-menu/context_menu.ejs +14 -6
- package/assets/context-menu/context_menu.scss +18 -4
- package/assets/level-selector/button.ejs +3 -3
- package/assets/level-selector/style.scss +0 -5
- package/assets/playback-rate/button.ejs +2 -2
- package/dist/core.js +5 -2
- package/dist/index.css +815 -834
- package/dist/index.js +79 -78
- package/dist/plugins/index.css +669 -688
- package/dist/plugins/index.js +73 -99
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +4 -1
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
- package/lib/plugins/click-to-pause/ClickToPause.js +1 -1
- package/lib/plugins/context-menu/ContextMenu.d.ts +33 -12
- package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/plugins/context-menu/ContextMenu.js +40 -37
- package/lib/plugins/media-control/MediaControl.d.ts +4 -1
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +30 -14
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +1 -22
- package/package.json +1 -1
- package/src/Player.ts +4 -3
- package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +0 -1
- package/src/plugins/click-to-pause/ClickToPause.ts +1 -1
- package/src/plugins/context-menu/ContextMenu.ts +72 -56
- package/src/plugins/level-selector/__tests__/__snapshots__/QualityLevels.test.ts.snap +3 -3
- package/src/plugins/media-control/MediaControl.ts +36 -15
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +101 -32
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +20 -20
- package/src/plugins/playback-rate/PlaybackRate.ts +1 -24
- package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +2 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/assets/clappr-nerd-stats/options-list.ejs +0 -9
- package/assets/clappr-nerd-stats/settings.ejs +0 -12
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { Events, template, $, UIContainerPlugin
|
|
1
|
+
import { Events, template, $, UIContainerPlugin } from '@clappr/core';
|
|
2
2
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
3
3
|
import '../../../assets/context-menu/context_menu.scss';
|
|
4
4
|
import templateHtml from '../../../assets/context-menu/context_menu.ejs';
|
|
5
|
-
|
|
5
|
+
const T = 'plugins.context_menu';
|
|
6
6
|
/**
|
|
7
7
|
* `PLUGIN` that displays a small context menu when clicked on the player container.
|
|
8
8
|
* @beta
|
|
9
9
|
* @remarks
|
|
10
10
|
* Configuration options - {@link ContextMenuPluginSettings}
|
|
11
|
+
*
|
|
12
|
+
* Should not be used together with {@link ClickToPause} plugin
|
|
11
13
|
*/
|
|
12
14
|
export class ContextMenu extends UIContainerPlugin {
|
|
13
|
-
|
|
14
|
-
_url = '';
|
|
15
|
-
menuOptions = [];
|
|
15
|
+
open = false;
|
|
16
16
|
/**
|
|
17
17
|
* @internal
|
|
18
18
|
*/
|
|
@@ -32,34 +32,16 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
32
32
|
return { class: 'context-menu' };
|
|
33
33
|
}
|
|
34
34
|
static template = template(templateHtml);
|
|
35
|
-
get label() {
|
|
36
|
-
return this._label || 'Gcore player ver. ' + version().gplayer;
|
|
37
|
-
}
|
|
38
|
-
get url() {
|
|
39
|
-
return this._url || 'https://gcore.com/';
|
|
40
|
-
}
|
|
41
|
-
get exposeVersion() {
|
|
42
|
-
return {
|
|
43
|
-
label: this.label,
|
|
44
|
-
name: 'version',
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
35
|
/**
|
|
48
36
|
* @internal
|
|
49
37
|
*/
|
|
50
38
|
get events() {
|
|
51
39
|
return {
|
|
52
|
-
'click [
|
|
40
|
+
'click [role="menuitem"]': 'runAction',
|
|
53
41
|
};
|
|
54
42
|
}
|
|
55
43
|
constructor(container) {
|
|
56
44
|
super(container);
|
|
57
|
-
if (this.options.contextMenu && this.options.contextMenu.label) {
|
|
58
|
-
this._label = this.options.contextMenu.label;
|
|
59
|
-
}
|
|
60
|
-
if (this.options.contextMenu && this.options.contextMenu.url) {
|
|
61
|
-
this._url = this.options.contextMenu.url;
|
|
62
|
-
}
|
|
63
45
|
this.render();
|
|
64
46
|
$('body').on('click', this.hideOnBodyClick);
|
|
65
47
|
}
|
|
@@ -67,8 +49,8 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
67
49
|
* @internal
|
|
68
50
|
*/
|
|
69
51
|
bindEvents() {
|
|
70
|
-
this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.
|
|
71
|
-
this.listenTo(this.container, Events.CONTAINER_CLICK, this.
|
|
52
|
+
this.listenTo(this.container, Events.CONTAINER_CONTEXTMENU, this.onContextMenu);
|
|
53
|
+
this.listenTo(this.container, Events.CONTAINER_CLICK, this.onContainerClick);
|
|
72
54
|
}
|
|
73
55
|
/**
|
|
74
56
|
* @internal
|
|
@@ -77,34 +59,55 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
77
59
|
$('body').off('click', this.hideOnBodyClick);
|
|
78
60
|
return super.destroy();
|
|
79
61
|
}
|
|
80
|
-
|
|
62
|
+
onContainerClick() {
|
|
63
|
+
this.hide();
|
|
64
|
+
}
|
|
65
|
+
onContextMenu(event) {
|
|
66
|
+
if (!this.options.contextMenu?.options?.length) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
81
69
|
event.preventDefault();
|
|
70
|
+
event.stopPropagation();
|
|
82
71
|
const offset = this.container?.$el.offset();
|
|
83
72
|
this.show(event.pageY - offset.top, event.pageX - offset.left);
|
|
84
73
|
}
|
|
85
74
|
show(top, left) {
|
|
86
|
-
this.
|
|
87
|
-
if (this.options.contextMenu &&
|
|
88
|
-
this.options.contextMenu.preventShowContextMenu) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
75
|
+
this.open = true;
|
|
91
76
|
this.$el.css({ top, left });
|
|
92
77
|
this.$el.show();
|
|
93
78
|
}
|
|
94
79
|
hide() {
|
|
80
|
+
this.open = false;
|
|
95
81
|
this.$el.hide();
|
|
96
82
|
}
|
|
97
|
-
|
|
98
|
-
|
|
83
|
+
runAction(event) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
event.stopPropagation();
|
|
86
|
+
const itemName = event.currentTarget.dataset.name;
|
|
87
|
+
if (!itemName) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const item = this.options.contextMenu?.options.find((option) => option.name === itemName);
|
|
91
|
+
if (item?.handler) {
|
|
92
|
+
item.handler();
|
|
93
|
+
}
|
|
94
|
+
this.hide();
|
|
99
95
|
}
|
|
100
96
|
/**
|
|
101
97
|
* @internal
|
|
102
98
|
*/
|
|
103
99
|
render() {
|
|
104
|
-
this.
|
|
105
|
-
|
|
100
|
+
if (!this.options.contextMenu?.options?.length) {
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
const options = this.options.contextMenu.options;
|
|
104
|
+
this.$el.html(ContextMenu.template({
|
|
105
|
+
options,
|
|
106
|
+
i18n: this.container.i18n,
|
|
107
|
+
iconic: options.some((option) => option.icon),
|
|
108
|
+
}));
|
|
106
109
|
this.container.$el.append(this.$el); // TODO append to the container, turn into a container plugin
|
|
107
|
-
this.hide();
|
|
110
|
+
this.$el.hide();
|
|
108
111
|
return this;
|
|
109
112
|
}
|
|
110
113
|
hideOnBodyClick = () => {
|
|
@@ -65,8 +65,10 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
65
65
|
private kibo;
|
|
66
66
|
private lastMouseX;
|
|
67
67
|
private lastMouseY;
|
|
68
|
-
private
|
|
68
|
+
private metadataLoaded;
|
|
69
|
+
private hasUpdate;
|
|
69
70
|
private persistConfig;
|
|
71
|
+
private renderTimerId;
|
|
70
72
|
private rendered;
|
|
71
73
|
private settings;
|
|
72
74
|
private userDisabled;
|
|
@@ -271,6 +273,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
271
273
|
* @internal
|
|
272
274
|
*/
|
|
273
275
|
destroy(): import("@clappr/core").UIObject;
|
|
276
|
+
private cancelRenderTimer;
|
|
274
277
|
private configure;
|
|
275
278
|
/**
|
|
276
279
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAI5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,UAAU,GACV,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -94,8 +94,10 @@ export class MediaControl extends UICorePlugin {
|
|
|
94
94
|
kibo;
|
|
95
95
|
lastMouseX = 0;
|
|
96
96
|
lastMouseY = 0;
|
|
97
|
-
|
|
97
|
+
metadataLoaded = false;
|
|
98
|
+
hasUpdate = false;
|
|
98
99
|
persistConfig;
|
|
100
|
+
renderTimerId = null;
|
|
99
101
|
rendered = false;
|
|
100
102
|
settings = INITIAL_SETTINGS;
|
|
101
103
|
userDisabled = false;
|
|
@@ -281,8 +283,10 @@ export class MediaControl extends UICorePlugin {
|
|
|
281
283
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
|
|
282
284
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
|
|
283
285
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
|
|
284
|
-
|
|
285
|
-
this.
|
|
286
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
|
|
287
|
+
this.listenTo(this.core, Events.CONTAINER_DESTROYED, () => {
|
|
288
|
+
this.cancelRenderTimer();
|
|
289
|
+
});
|
|
286
290
|
}
|
|
287
291
|
/**
|
|
288
292
|
* Hides the media control UI
|
|
@@ -325,13 +329,17 @@ export class MediaControl extends UICorePlugin {
|
|
|
325
329
|
// TODO sort out, use single utility function
|
|
326
330
|
this.fullScreenOnVideoTagSupported = true;
|
|
327
331
|
}
|
|
328
|
-
this.
|
|
329
|
-
|
|
330
|
-
this
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
332
|
+
this.renderTimerId = setTimeout(() => {
|
|
333
|
+
this.renderTimerId = null;
|
|
334
|
+
this.metadataLoaded = true;
|
|
335
|
+
this.render();
|
|
336
|
+
if (this.core.activeContainer.getPlaybackType() === Playback.LIVE) {
|
|
337
|
+
this.$el.addClass('live');
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
this.$el.removeClass('live');
|
|
341
|
+
}
|
|
342
|
+
}, 25);
|
|
335
343
|
}
|
|
336
344
|
updateVolumeUI() {
|
|
337
345
|
// this will be called after a render
|
|
@@ -555,6 +563,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
555
563
|
}
|
|
556
564
|
onActiveContainerChanged() {
|
|
557
565
|
this.fullScreenOnVideoTagSupported = false;
|
|
566
|
+
this.metadataLoaded = false;
|
|
558
567
|
// set the new container to match the volume of the last one
|
|
559
568
|
this.setInitialVolume();
|
|
560
569
|
this.changeTogglePlay();
|
|
@@ -776,7 +785,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
776
785
|
const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
|
|
777
786
|
if (settingsChanged) {
|
|
778
787
|
this.settings = newSettings;
|
|
779
|
-
this.
|
|
788
|
+
this.hasUpdate = true;
|
|
780
789
|
this.render();
|
|
781
790
|
}
|
|
782
791
|
}
|
|
@@ -1005,6 +1014,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1005
1014
|
* @internal
|
|
1006
1015
|
*/
|
|
1007
1016
|
destroy() {
|
|
1017
|
+
this.cancelRenderTimer();
|
|
1008
1018
|
$(document).unbind('mouseup', this.stopDrag);
|
|
1009
1019
|
$(document).unbind('mousemove', this.updateDrag);
|
|
1010
1020
|
$(document).unbind('touchend', this.stopDrag);
|
|
@@ -1012,6 +1022,12 @@ export class MediaControl extends UICorePlugin {
|
|
|
1012
1022
|
this.unbindKeyEvents();
|
|
1013
1023
|
return super.destroy();
|
|
1014
1024
|
}
|
|
1025
|
+
cancelRenderTimer() {
|
|
1026
|
+
if (this.renderTimerId) {
|
|
1027
|
+
clearTimeout(this.renderTimerId);
|
|
1028
|
+
this.renderTimerId = null;
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1015
1031
|
configure() {
|
|
1016
1032
|
this.trigger(Events.MEDIACONTROL_OPTIONS_CHANGE);
|
|
1017
1033
|
}
|
|
@@ -1019,8 +1035,8 @@ export class MediaControl extends UICorePlugin {
|
|
|
1019
1035
|
* @internal
|
|
1020
1036
|
*/
|
|
1021
1037
|
render() {
|
|
1022
|
-
trace(`${T} render`, { needsUpdate: this.
|
|
1023
|
-
if (!this.
|
|
1038
|
+
trace(`${T} render`, { needsUpdate: this.hasUpdate, metadataLoaded: this.metadataLoaded });
|
|
1039
|
+
if (!this.hasUpdate || !this.metadataLoaded) {
|
|
1024
1040
|
return this;
|
|
1025
1041
|
}
|
|
1026
1042
|
const timeout = this.options.hideMediaControlDelay || 2000;
|
|
@@ -1070,7 +1086,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1070
1086
|
this.core.$el.append(this.el);
|
|
1071
1087
|
this.rendered = true;
|
|
1072
1088
|
this.updateVolumeUI();
|
|
1073
|
-
this.
|
|
1089
|
+
this.hasUpdate = false;
|
|
1074
1090
|
// TODO setTimeout?
|
|
1075
1091
|
this.trigger(Events.MEDIACONTROL_RENDERED);
|
|
1076
1092
|
return this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/plugins/playback-rate/PlaybackRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAsB,IAAI,EAAK,MAAM,cAAc,CAAA;AAkBhF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAI5C,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,cAAc,CAAQ;
|
|
1
|
+
{"version":3,"file":"PlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/plugins/playback-rate/PlaybackRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAsB,IAAI,EAAK,MAAM,cAAc,CAAA;AAkBhF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAI5C,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,YAAY,CAAuB;IAE3C;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAE7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAE7C,IAAI,EAAE,IAAI;IAOtB,OAAO,KAAK,aAAa,GAExB;IAED;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,KAAK;IAsBb,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACM,MAAM;IAkBf;;OAEG;IACM,OAAO;IAwBhB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;CAM9B"}
|
|
@@ -57,7 +57,6 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
57
57
|
// private prevSelectedRate: string | undefined
|
|
58
58
|
selectedRate = DEFAULT_PLAYBACK_RATE;
|
|
59
59
|
metadataLoaded = false;
|
|
60
|
-
// private playbackSettingsUpdateReceived = false
|
|
61
60
|
mountTimerId = null;
|
|
62
61
|
/**
|
|
63
62
|
* @internal
|
|
@@ -118,14 +117,8 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
118
117
|
onActiveContainerChange() {
|
|
119
118
|
trace(`${T} onActiveContainerChange`);
|
|
120
119
|
this.metadataLoaded = false;
|
|
121
|
-
// this.playbackSettingsUpdateReceived = false
|
|
122
120
|
this.listenTo(this.core.activePlayback, Events.PLAYBACK_STOP, this.onStop);
|
|
123
121
|
this.listenTo(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onPlay);
|
|
124
|
-
// this.listenTo(
|
|
125
|
-
// this.core.activePlayback,
|
|
126
|
-
// Events.PLAYBACK_SETTINGSUPDATE,
|
|
127
|
-
// this.onSettingsUpdate,
|
|
128
|
-
// )
|
|
129
122
|
this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
|
|
130
123
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onMetaDataLoaded);
|
|
131
124
|
}
|
|
@@ -154,27 +147,13 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
154
147
|
i18n: this.core.i18n,
|
|
155
148
|
})));
|
|
156
149
|
}
|
|
157
|
-
// private onSettingsUpdate() {
|
|
158
|
-
// trace(`${T} onSettingsUpdate`, {
|
|
159
|
-
// playbackType: this.core.activePlayback.getPlaybackType(),
|
|
160
|
-
// dvrEnabled: this.core.activePlayback.dvrEnabled,
|
|
161
|
-
// })
|
|
162
|
-
// this.playbackSettingsUpdateReceived = true
|
|
163
|
-
// if (this.metadataLoaded) {
|
|
164
|
-
// if (this.mountTimerId) {
|
|
165
|
-
// clearTimeout(this.mountTimerId)
|
|
166
|
-
// this.mountTimerId = null
|
|
167
|
-
// }
|
|
168
|
-
// this.mount()
|
|
169
|
-
// }
|
|
170
|
-
// }
|
|
171
150
|
onMetaDataLoaded() {
|
|
172
151
|
trace(`${T} onMetaDataLoaded`, {
|
|
173
152
|
playbackType: this.core.activePlayback.getPlaybackType(),
|
|
174
153
|
dvrEnabled: this.core.activePlayback.dvrEnabled,
|
|
175
154
|
});
|
|
176
|
-
this.metadataLoaded = true;
|
|
177
155
|
this.mountTimerId = setTimeout(() => {
|
|
156
|
+
this.metadataLoaded = true;
|
|
178
157
|
this.mountTimerId = null;
|
|
179
158
|
this.mount();
|
|
180
159
|
}, 25);
|
package/package.json
CHANGED
package/src/Player.ts
CHANGED
|
@@ -159,6 +159,9 @@ export class Player {
|
|
|
159
159
|
* ```
|
|
160
160
|
*/
|
|
161
161
|
attachTo(playerElement: HTMLElement): void {
|
|
162
|
+
trace(`${T} attachTo`, {
|
|
163
|
+
player: !!this.player,
|
|
164
|
+
})
|
|
162
165
|
assert.ok(!this.player, 'Player already initialized')
|
|
163
166
|
assert.ok(playerElement, 'Player container element is required')
|
|
164
167
|
if (this.config.debug === 'all' || this.config.debug === 'clappr') {
|
|
@@ -398,11 +401,9 @@ export class Player {
|
|
|
398
401
|
trace(`${T} initPlayer`, {
|
|
399
402
|
autoPlay: coreOptions.autoPlay,
|
|
400
403
|
sources: coreOptions.sources,
|
|
404
|
+
player: !!this.player,
|
|
401
405
|
// TODO selected options
|
|
402
406
|
})
|
|
403
|
-
|
|
404
|
-
assert.ok(!this.player, 'Player already initialized')
|
|
405
|
-
|
|
406
407
|
const player = new PlayerClappr(coreOptions)
|
|
407
408
|
this.player = player
|
|
408
409
|
this.bindCoreListeners()
|
|
@@ -25,7 +25,6 @@ import pluginHtml from '../../../assets/clappr-nerd-stats/clappr-nerd-stats.ejs'
|
|
|
25
25
|
import buttonHtml from '../../../assets/clappr-nerd-stats/button.ejs'
|
|
26
26
|
import statsIcon from '../../../assets/icons/new/stats.svg'
|
|
27
27
|
import { BottomGear, GearEvents } from '../bottom-gear/BottomGear.js'
|
|
28
|
-
import { MediaControl } from '../media-control/MediaControl.js'
|
|
29
28
|
import assert from 'assert'
|
|
30
29
|
|
|
31
30
|
const qualityClasses = [
|
|
@@ -10,7 +10,7 @@ import { CLAPPR_VERSION } from '../../build.js'
|
|
|
10
10
|
|
|
11
11
|
type Timer = ReturnType<typeof setTimeout>
|
|
12
12
|
|
|
13
|
-
const T = 'plugins.
|
|
13
|
+
const T = 'plugins.click_to_pause'
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* A small `PLUGIN` that toggles the playback state on click over the video container
|
|
@@ -1,20 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Events,
|
|
3
|
-
template,
|
|
4
|
-
$,
|
|
5
|
-
Container,
|
|
6
|
-
UIContainerPlugin,
|
|
7
|
-
} from '@clappr/core'
|
|
1
|
+
import { Events, template, $, Container, UIContainerPlugin } from '@clappr/core'
|
|
8
2
|
|
|
9
3
|
import { CLAPPR_VERSION } from '../../build.js'
|
|
10
4
|
|
|
11
5
|
import '../../../assets/context-menu/context_menu.scss'
|
|
12
6
|
import templateHtml from '../../../assets/context-menu/context_menu.ejs'
|
|
13
|
-
import { version } from '../../version.js'
|
|
14
7
|
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @beta
|
|
10
|
+
*/
|
|
11
|
+
export type MenuOption = {
|
|
12
|
+
/**
|
|
13
|
+
* Menu item label text. One of `label` or `labelKey` must be specified.
|
|
14
|
+
*/
|
|
15
|
+
label?: string
|
|
16
|
+
/**
|
|
17
|
+
* Menu item label localisation key, if specified, the `label` will be ignored
|
|
18
|
+
*/
|
|
19
|
+
labelKey?: string
|
|
20
|
+
/**
|
|
21
|
+
* Menu item name. Must be unique.
|
|
22
|
+
*/
|
|
17
23
|
name: string
|
|
24
|
+
/**
|
|
25
|
+
* Menu item handler function
|
|
26
|
+
*/
|
|
27
|
+
handler?: () => void
|
|
28
|
+
/**
|
|
29
|
+
* Menu item icon, plain HTML string
|
|
30
|
+
*/
|
|
31
|
+
icon?: string
|
|
18
32
|
}
|
|
19
33
|
|
|
20
34
|
/**
|
|
@@ -22,23 +36,21 @@ type MenuOption = {
|
|
|
22
36
|
* @beta
|
|
23
37
|
*/
|
|
24
38
|
export interface ContextMenuPluginSettings {
|
|
25
|
-
|
|
26
|
-
url?: string
|
|
27
|
-
preventShowContextMenu?: boolean
|
|
39
|
+
options?: MenuOption[]
|
|
28
40
|
}
|
|
29
41
|
|
|
42
|
+
const T = 'plugins.context_menu'
|
|
43
|
+
|
|
30
44
|
/**
|
|
31
45
|
* `PLUGIN` that displays a small context menu when clicked on the player container.
|
|
32
46
|
* @beta
|
|
33
47
|
* @remarks
|
|
34
48
|
* Configuration options - {@link ContextMenuPluginSettings}
|
|
49
|
+
*
|
|
50
|
+
* Should not be used together with {@link ClickToPause} plugin
|
|
35
51
|
*/
|
|
36
52
|
export class ContextMenu extends UIContainerPlugin {
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
private _url: string = ''
|
|
40
|
-
|
|
41
|
-
private menuOptions: MenuOption[] = []
|
|
53
|
+
private open = false
|
|
42
54
|
|
|
43
55
|
/**
|
|
44
56
|
* @internal
|
|
@@ -63,38 +75,17 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
63
75
|
|
|
64
76
|
private static readonly template = template(templateHtml)
|
|
65
77
|
|
|
66
|
-
private get label() {
|
|
67
|
-
return this._label || 'Gcore player ver. ' + version().gplayer
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private get url() {
|
|
71
|
-
return this._url || 'https://gcore.com/'
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private get exposeVersion() {
|
|
75
|
-
return {
|
|
76
|
-
label: this.label,
|
|
77
|
-
name: 'version',
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
78
|
/**
|
|
82
79
|
* @internal
|
|
83
80
|
*/
|
|
84
81
|
override get events() {
|
|
85
82
|
return {
|
|
86
|
-
'click [
|
|
83
|
+
'click [role="menuitem"]': 'runAction',
|
|
87
84
|
}
|
|
88
85
|
}
|
|
89
86
|
|
|
90
87
|
constructor(container: Container) {
|
|
91
88
|
super(container)
|
|
92
|
-
if (this.options.contextMenu && this.options.contextMenu.label) {
|
|
93
|
-
this._label = this.options.contextMenu.label
|
|
94
|
-
}
|
|
95
|
-
if (this.options.contextMenu && this.options.contextMenu.url) {
|
|
96
|
-
this._url = this.options.contextMenu.url
|
|
97
|
-
}
|
|
98
89
|
this.render()
|
|
99
90
|
$('body').on('click', this.hideOnBodyClick)
|
|
100
91
|
}
|
|
@@ -106,9 +97,9 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
106
97
|
this.listenTo(
|
|
107
98
|
this.container,
|
|
108
99
|
Events.CONTAINER_CONTEXTMENU,
|
|
109
|
-
this.
|
|
100
|
+
this.onContextMenu,
|
|
110
101
|
)
|
|
111
|
-
this.listenTo(this.container, Events.CONTAINER_CLICK, this.
|
|
102
|
+
this.listenTo(this.container, Events.CONTAINER_CLICK, this.onContainerClick)
|
|
112
103
|
}
|
|
113
104
|
|
|
114
105
|
/**
|
|
@@ -119,41 +110,66 @@ export class ContextMenu extends UIContainerPlugin {
|
|
|
119
110
|
return super.destroy()
|
|
120
111
|
}
|
|
121
112
|
|
|
122
|
-
private
|
|
113
|
+
private onContainerClick() {
|
|
114
|
+
this.hide()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private onContextMenu(event: MouseEvent) {
|
|
118
|
+
if (!this.options.contextMenu?.options?.length) {
|
|
119
|
+
return
|
|
120
|
+
}
|
|
123
121
|
event.preventDefault()
|
|
124
|
-
|
|
122
|
+
event.stopPropagation()
|
|
125
123
|
|
|
124
|
+
const offset = this.container?.$el.offset()
|
|
126
125
|
this.show(event.pageY - offset.top, event.pageX - offset.left)
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
private show(top: number, left: number) {
|
|
130
|
-
this.
|
|
131
|
-
if (
|
|
132
|
-
this.options.contextMenu &&
|
|
133
|
-
this.options.contextMenu.preventShowContextMenu
|
|
134
|
-
) {
|
|
135
|
-
return
|
|
136
|
-
}
|
|
129
|
+
this.open = true
|
|
137
130
|
this.$el.css({ top, left })
|
|
138
131
|
this.$el.show()
|
|
139
132
|
}
|
|
140
133
|
|
|
141
134
|
private hide() {
|
|
135
|
+
this.open = false
|
|
142
136
|
this.$el.hide()
|
|
143
137
|
}
|
|
144
138
|
|
|
145
|
-
private
|
|
146
|
-
|
|
139
|
+
private runAction(event: MouseEvent) {
|
|
140
|
+
event.preventDefault()
|
|
141
|
+
event.stopPropagation()
|
|
142
|
+
|
|
143
|
+
const itemName = (event.currentTarget as HTMLButtonElement).dataset.name
|
|
144
|
+
if (!itemName) {
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
const item = this.options.contextMenu?.options.find(
|
|
148
|
+
(option: MenuOption) => option.name === itemName,
|
|
149
|
+
)
|
|
150
|
+
if (item?.handler) {
|
|
151
|
+
item.handler()
|
|
152
|
+
}
|
|
153
|
+
this.hide()
|
|
147
154
|
}
|
|
148
155
|
|
|
149
156
|
/**
|
|
150
157
|
* @internal
|
|
151
158
|
*/
|
|
152
159
|
override render() {
|
|
153
|
-
this.
|
|
154
|
-
|
|
160
|
+
if (!this.options.contextMenu?.options?.length) {
|
|
161
|
+
return this
|
|
162
|
+
}
|
|
163
|
+
const options = this.options.contextMenu.options
|
|
164
|
+
this.$el.html(
|
|
165
|
+
ContextMenu.template({
|
|
166
|
+
options,
|
|
167
|
+
i18n: this.container.i18n,
|
|
168
|
+
iconic: options.some((option: MenuOption) => option.icon),
|
|
169
|
+
}),
|
|
170
|
+
)
|
|
155
171
|
this.container.$el.append(this.$el) // TODO append to the container, turn into a container plugin
|
|
156
|
-
this.hide()
|
|
172
|
+
this.$el.hide()
|
|
157
173
|
|
|
158
174
|
return this
|
|
159
175
|
}
|
|
@@ -155,10 +155,10 @@ exports[`QualityLevels > options.restrictResolution > given vertical video forma
|
|
|
155
155
|
|
|
156
156
|
exports[`QualityLevels > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
|
|
157
157
|
"<button class="gplayer-lite-btn gcore-skin-text-color gear-option" aria-haspopup="menu">
|
|
158
|
-
<span class="gear-
|
|
159
|
-
<span>quality</span>
|
|
160
|
-
<span class="gear-option_arrow-right-icon">/assets/icons/new/arrow-right.svg</span>
|
|
158
|
+
<span class="gear-option_icon hidden">/assets/icons/new/hd.svg</span>
|
|
159
|
+
<span class="gear-option_label">quality</span>
|
|
161
160
|
<span class="gear-option_value">360p</span>
|
|
161
|
+
<span class="gear-option_arrow-right-icon">/assets/icons/new/arrow-right.svg</span>
|
|
162
162
|
</button>
|
|
163
163
|
"
|
|
164
164
|
`;
|