@gcorevideo/player 2.22.0 → 2.22.2
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/bottomgear copy.ejs +10 -0
- package/assets/bottom-gear/bottomgear.ejs +4 -8
- package/assets/bottom-gear/gear-sub-menu.scss +0 -1
- package/assets/bottom-gear/gear.scss +0 -1
- package/assets/clappr-nerd-stats/button.ejs +3 -3
- package/assets/level-selector/button.ejs +2 -4
- package/assets/level-selector/list.ejs +14 -10
- package/assets/level-selector/style.scss +9 -4
- package/assets/media-control/container.scss +1 -1
- package/assets/playback-rate/list.ejs +5 -5
- package/assets/spinner-three-bounce/spinner.scss +1 -1
- package/dist/core.js +1 -2
- package/dist/index.css +885 -884
- package/dist/index.js +3938 -3779
- package/dist/player.d.ts +246 -108
- package/dist/plugins/index.css +1230 -1229
- package/dist/plugins/index.js +4036 -3878
- package/docs/api/player.bottomgear.additem.md +95 -0
- package/docs/api/player.bottomgear.md +63 -19
- package/docs/api/player.bottomgear.refresh.md +5 -1
- package/docs/api/player.clapprnerdstats.md +0 -2
- package/docs/api/player.clicktopause.md +1 -1
- package/docs/api/player.closedcaptions.md +2 -2
- package/docs/api/player.closedcaptionspluginsettings.md +5 -0
- package/docs/api/player.errorscreen.md +18 -4
- package/docs/api/player.errorscreenpluginsettings.md +1 -4
- package/docs/api/player.errorscreensettings.md +15 -0
- package/docs/api/{player.mediacontrolevents.md → player.gearevents.md} +7 -7
- package/docs/api/player.levelselector.events.md +0 -1
- package/docs/api/player.levelselector.md +1 -1
- package/docs/api/player.md +33 -36
- package/docs/api/{player.bottomgear.setcontent.md → player.mediacontrol.handlecustomarea.md} +5 -9
- package/docs/api/player.mediacontrol.md +10 -24
- package/docs/api/player.mediacontrol.putelement.md +2 -2
- package/docs/api/{player.bottomgear.getelement.md → player.mediacontrol.toggleelement.md} +23 -9
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/player.playbackrate.md +22 -3
- package/docs/api/{player.gearoptionsitem.md → player.playbackrateoption.md} +6 -4
- package/docs/api/{player.mediacontrol.getcenterpanel.md → player.playbackratesettings.md} +8 -6
- package/docs/api/player.sourcecontroller._constructor_.md +49 -0
- package/docs/api/player.sourcecontroller.md +70 -7
- package/docs/api/player.spinnerevents.md +1 -4
- package/docs/api/player.spinnerthreebounce._constructor_.md +0 -3
- package/docs/api/player.spinnerthreebounce.hide.md +0 -3
- package/docs/api/player.spinnerthreebounce.md +5 -8
- package/docs/api/player.spinnerthreebounce.show.md +2 -5
- package/lib/internal.types.d.ts +5 -0
- package/lib/internal.types.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +0 -1
- package/lib/playback.types.d.ts +0 -5
- package/lib/playback.types.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts +93 -20
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +145 -37
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +2 -3
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +18 -15
- package/lib/plugins/click-to-pause/ClickToPause.d.ts +1 -1
- package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
- package/lib/plugins/click-to-pause/ClickToPause.js +3 -2
- package/lib/plugins/dvr-controls/DvrControls.js +1 -1
- package/lib/plugins/error-screen/ErrorScreen.d.ts +29 -4
- package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -1
- package/lib/plugins/error-screen/ErrorScreen.js +17 -2
- package/lib/plugins/level-selector/LevelSelector.d.ts +8 -11
- package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
- package/lib/plugins/level-selector/LevelSelector.js +66 -102
- package/lib/plugins/media-control/MediaControl.d.ts +6 -15
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +36 -30
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +7 -2
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +42 -14
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +101 -83
- package/lib/plugins/source-controller/SourceController.d.ts +40 -4
- package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
- package/lib/plugins/source-controller/SourceController.js +41 -4
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +8 -6
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +10 -6
- package/lib/plugins/subtitles/ClosedCaptions.d.ts +7 -7
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.js +3 -3
- package/lib/testUtils.d.ts +1 -0
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +13 -0
- package/package.json +1 -1
- package/src/internal.types.ts +6 -0
- package/src/playback/dash-playback/DashPlayback.ts +0 -1
- package/src/playback.types.ts +0 -5
- package/src/plugins/bottom-gear/BottomGear.ts +186 -77
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +21 -5
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +5 -12
- package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +27 -25
- package/src/plugins/click-to-pause/ClickToPause.ts +3 -2
- package/src/plugins/dvr-controls/DvrControls.ts +1 -1
- package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +1 -1
- package/src/plugins/error-screen/ErrorScreen.ts +30 -4
- package/src/plugins/level-selector/LevelSelector.ts +80 -120
- package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +69 -79
- package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +38 -71
- package/src/plugins/media-control/MediaControl.ts +50 -36
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +4 -4
- package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -2
- package/src/plugins/playback-rate/PlaybackRate.ts +136 -108
- package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +84 -37
- package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +55 -6
- package/src/plugins/source-controller/SourceController.ts +41 -4
- package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +10 -6
- package/src/plugins/subtitles/ClosedCaptions.ts +9 -10
- package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
- package/src/testUtils.ts +14 -0
- package/src/typings/vitest.d.ts +1 -0
- package/temp/player.api.json +303 -370
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.gearitemelement.md +0 -18
- package/docs/api/player.mediacontrol.getleftpanel.md +0 -22
- package/docs/api/player.mediacontrol.getrightpanel.md +0 -22
- package/docs/api/player.subtitlespluginsettings.md +0 -18
- package/docs/api/player.texttrackitem.id.md +0 -11
- package/docs/api/player.texttrackitem.md +0 -87
- package/docs/api/player.texttrackitem.name.md +0 -11
- package/docs/api/player.texttrackitem.track.md +0 -11
|
@@ -48,7 +48,8 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
48
48
|
private levelLabels;
|
|
49
49
|
private removeAuto;
|
|
50
50
|
private isHd;
|
|
51
|
-
private
|
|
51
|
+
private currentText;
|
|
52
|
+
private selectedLevelId;
|
|
52
53
|
private static readonly buttonTemplate;
|
|
53
54
|
private static readonly listTemplate;
|
|
54
55
|
/**
|
|
@@ -72,11 +73,8 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
72
73
|
class: string;
|
|
73
74
|
'data-level-selector': string;
|
|
74
75
|
};
|
|
75
|
-
private currentText;
|
|
76
|
-
private selectedLevelId;
|
|
77
76
|
get events(): {
|
|
78
77
|
'click .gear-sub-menu_btn': string;
|
|
79
|
-
'click .gear-option': string;
|
|
80
78
|
'click .go-back': string;
|
|
81
79
|
};
|
|
82
80
|
/**
|
|
@@ -85,30 +83,29 @@ export declare class LevelSelector extends UICorePlugin {
|
|
|
85
83
|
bindEvents(): void;
|
|
86
84
|
private onCoreReady;
|
|
87
85
|
private onGearRendered;
|
|
88
|
-
private
|
|
86
|
+
private onActiveContainerChange;
|
|
87
|
+
private updateHd;
|
|
89
88
|
private onStop;
|
|
90
89
|
private shouldRender;
|
|
91
90
|
/**
|
|
92
91
|
* @internal
|
|
93
92
|
*/
|
|
94
93
|
render(): this;
|
|
95
|
-
private renderButton;
|
|
96
94
|
private renderDropdown;
|
|
95
|
+
private updateButton;
|
|
97
96
|
private get maxLevel();
|
|
98
|
-
private
|
|
97
|
+
private onLevelsAvailable;
|
|
99
98
|
private makeLevelsLabels;
|
|
100
|
-
private
|
|
99
|
+
private onSelect;
|
|
101
100
|
private goBack;
|
|
102
101
|
private setLevel;
|
|
103
|
-
private onShowLevelSelectMenu;
|
|
104
102
|
private allLevelElements;
|
|
105
103
|
private levelElement;
|
|
106
104
|
private onLevelSwitchStart;
|
|
107
105
|
private onLevelSwitchEnd;
|
|
108
106
|
private updateText;
|
|
109
107
|
private getLevelLabel;
|
|
110
|
-
private
|
|
108
|
+
private onBitrate;
|
|
111
109
|
private highlightCurrentLevel;
|
|
112
|
-
private deferRender;
|
|
113
110
|
}
|
|
114
111
|
//# sourceMappingURL=LevelSelector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LevelSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/LevelSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAA;AAgB7D,OAAO,2CAA2C,CAAA;AAMlD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,UAAU,CAAQ;IAE1B,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"LevelSelector.d.ts","sourceRoot":"","sources":["../../../src/plugins/level-selector/LevelSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAA;AAgB7D,OAAO,2CAA2C,CAAA;AAMlD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,UAAU,CAAQ;IAE1B,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAChB;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAE3E;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED,IAAa,MAAM;;;MAKlB;IAED;;OAEG;IACM,UAAU;IASnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACM,MAAM;IAUf,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,YAAY;IAcpB,OAAO,KAAK,QAAQ,GASnB;IAED,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,qBAAqB;CAkB9B"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Events, template, UICorePlugin } from '@clappr/core';
|
|
2
|
-
import {
|
|
2
|
+
import { trace } from '@gcorevideo/utils';
|
|
3
3
|
import assert from 'assert';
|
|
4
4
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
5
|
+
import { GearEvents } from '../bottom-gear/BottomGear.js';
|
|
5
6
|
import buttonHtml from '../../../assets/level-selector/button.ejs';
|
|
6
7
|
import listHtml from '../../../assets/level-selector/list.ejs';
|
|
7
8
|
import hdIcon from '../../../assets/icons/new/hd.svg';
|
|
@@ -9,7 +10,6 @@ import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg';
|
|
|
9
10
|
import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg';
|
|
10
11
|
import checkIcon from '../../../assets/icons/new/check.svg';
|
|
11
12
|
import '../../../assets/level-selector/style.scss';
|
|
12
|
-
import { MediaControlEvents } from '../media-control/MediaControl.js';
|
|
13
13
|
const T = 'plugins.level_selector';
|
|
14
14
|
const VERSION = '2.19.4';
|
|
15
15
|
/**
|
|
@@ -42,7 +42,8 @@ export class LevelSelector extends UICorePlugin {
|
|
|
42
42
|
levelLabels = [];
|
|
43
43
|
removeAuto = false;
|
|
44
44
|
isHd = false;
|
|
45
|
-
|
|
45
|
+
currentText = '';
|
|
46
|
+
selectedLevelId = -1;
|
|
46
47
|
static buttonTemplate = template(buttonHtml);
|
|
47
48
|
static listTemplate = template(listHtml);
|
|
48
49
|
/**
|
|
@@ -72,12 +73,9 @@ export class LevelSelector extends UICorePlugin {
|
|
|
72
73
|
'data-level-selector': '',
|
|
73
74
|
};
|
|
74
75
|
}
|
|
75
|
-
currentText = 'Auto';
|
|
76
|
-
selectedLevelId = -1;
|
|
77
76
|
get events() {
|
|
78
77
|
return {
|
|
79
|
-
'click .gear-sub-menu_btn': '
|
|
80
|
-
'click .gear-option': 'onShowLevelSelectMenu',
|
|
78
|
+
'click .gear-sub-menu_btn': 'onSelect',
|
|
81
79
|
'click .go-back': 'goBack',
|
|
82
80
|
};
|
|
83
81
|
}
|
|
@@ -85,42 +83,48 @@ export class LevelSelector extends UICorePlugin {
|
|
|
85
83
|
* @internal
|
|
86
84
|
*/
|
|
87
85
|
bindEvents() {
|
|
88
|
-
this.
|
|
89
|
-
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.
|
|
86
|
+
this.listenToOnce(this.core, Events.CORE_READY, this.onCoreReady);
|
|
87
|
+
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
|
|
90
88
|
}
|
|
91
89
|
onCoreReady() {
|
|
92
90
|
trace(`${T} onCoreReady`);
|
|
93
|
-
const
|
|
94
|
-
assert(
|
|
95
|
-
this.
|
|
91
|
+
const gear = this.core.getPlugin('bottom_gear');
|
|
92
|
+
assert(gear, 'bottom_gear plugin is required');
|
|
93
|
+
this.currentText = this.core.i18n.t('auto');
|
|
94
|
+
this.listenTo(gear, GearEvents.RENDERED, this.onGearRendered);
|
|
96
95
|
}
|
|
97
96
|
onGearRendered() {
|
|
98
97
|
trace(`${T} onGearRendered`);
|
|
99
|
-
this.
|
|
98
|
+
this.render();
|
|
100
99
|
}
|
|
101
|
-
|
|
100
|
+
onActiveContainerChange() {
|
|
102
101
|
this.removeAuto = false;
|
|
103
102
|
this.isHd = false;
|
|
104
103
|
const activePlayback = this.core.activePlayback;
|
|
105
|
-
this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, this.
|
|
104
|
+
this.listenTo(activePlayback, Events.PLAYBACK_LEVELS_AVAILABLE, this.onLevelsAvailable);
|
|
106
105
|
this.listenTo(activePlayback, Events.PLAYBACK_LEVEL_SWITCH_START, this.onLevelSwitchStart);
|
|
107
106
|
this.listenTo(activePlayback, Events.PLAYBACK_LEVEL_SWITCH_END, this.onLevelSwitchEnd);
|
|
108
|
-
this.listenTo(activePlayback, Events.PLAYBACK_BITRATE, this.
|
|
107
|
+
this.listenTo(activePlayback, Events.PLAYBACK_BITRATE, this.onBitrate);
|
|
109
108
|
this.listenTo(activePlayback, Events.PLAYBACK_STOP, this.onStop);
|
|
110
109
|
this.listenTo(activePlayback, Events.PLAYBACK_HIGHDEFINITIONUPDATE, (isHd) => {
|
|
111
110
|
this.isHd = isHd;
|
|
112
|
-
this.
|
|
111
|
+
this.updateHd();
|
|
113
112
|
});
|
|
114
113
|
if (activePlayback.levels?.length > 0) {
|
|
115
|
-
this.
|
|
114
|
+
this.onLevelsAvailable(activePlayback.levels);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
updateHd() {
|
|
118
|
+
if (this.isHd) {
|
|
119
|
+
this.$el.find('.gear-option_hd-icon').removeClass('hidden');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.$el.find('.gear-option_hd-icon').addClass('hidden');
|
|
116
123
|
}
|
|
117
124
|
}
|
|
118
125
|
onStop() {
|
|
119
126
|
trace(`${T} onStop`);
|
|
120
127
|
this.listenToOnce(this.core.activePlayback, Events.PLAYBACK_PLAY, () => {
|
|
121
|
-
trace(`${T} on PLAYBACK_PLAY after stop`, {
|
|
122
|
-
selectedLevelId: this.selectedLevelId,
|
|
123
|
-
});
|
|
124
128
|
if (this.core.activePlayback.getPlaybackType() === 'live') {
|
|
125
129
|
if (this.selectedLevelId !== -1) {
|
|
126
130
|
this.core.activePlayback.currentLevel = this.selectedLevelId;
|
|
@@ -147,47 +151,42 @@ export class LevelSelector extends UICorePlugin {
|
|
|
147
151
|
if (!this.shouldRender()) {
|
|
148
152
|
return this;
|
|
149
153
|
}
|
|
150
|
-
this.
|
|
154
|
+
this.renderDropdown();
|
|
155
|
+
this.updateButton();
|
|
151
156
|
return this;
|
|
152
157
|
}
|
|
153
|
-
renderButton() {
|
|
154
|
-
if (!this.isOpen) {
|
|
155
|
-
const html = LevelSelector.buttonTemplate({
|
|
156
|
-
arrowRightIcon,
|
|
157
|
-
currentText: this.currentText,
|
|
158
|
-
isHd: this.isHd,
|
|
159
|
-
hdIcon,
|
|
160
|
-
});
|
|
161
|
-
this.$el.html(html);
|
|
162
|
-
const gear = this.core.getPlugin('bottom_gear');
|
|
163
|
-
if (!gear) {
|
|
164
|
-
trace(`${T} renderButton: bottom_gear plugin not found`);
|
|
165
|
-
}
|
|
166
|
-
gear?.getElement('quality')?.html(this.el);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
158
|
renderDropdown() {
|
|
170
|
-
|
|
159
|
+
this.$el.html(LevelSelector.listTemplate({
|
|
171
160
|
arrowLeftIcon,
|
|
172
161
|
checkIcon,
|
|
162
|
+
current: this.selectedLevelId,
|
|
173
163
|
labels: this.levelLabels,
|
|
174
164
|
levels: this.levels,
|
|
175
165
|
maxLevel: this.maxLevel,
|
|
176
166
|
removeAuto: this.removeAuto,
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
167
|
+
i18n: this.core.i18n,
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
updateButton() {
|
|
171
|
+
;
|
|
172
|
+
this.core.getPlugin('bottom_gear')
|
|
173
|
+
?.addItem('quality', this.$el)
|
|
174
|
+
.html(LevelSelector.buttonTemplate({
|
|
175
|
+
arrowRightIcon,
|
|
176
|
+
currentText: this.currentText,
|
|
177
|
+
isHd: this.isHd,
|
|
178
|
+
hdIcon,
|
|
179
|
+
i18n: this.core.i18n,
|
|
180
|
+
}));
|
|
182
181
|
}
|
|
183
182
|
get maxLevel() {
|
|
184
183
|
const maxRes = this.core.options.levelSelector?.restrictResolution;
|
|
185
184
|
return maxRes
|
|
186
|
-
? this.levels.
|
|
187
|
-
maxRes)
|
|
185
|
+
? this.levels.find((level) => (level.height > level.width ? level.width : level.height) ===
|
|
186
|
+
maxRes)?.level ?? -1
|
|
188
187
|
: -1;
|
|
189
188
|
}
|
|
190
|
-
|
|
189
|
+
onLevelsAvailable(levels) {
|
|
191
190
|
const maxResolution = this.core.options.levelSelector?.restrictResolution;
|
|
192
191
|
this.levels = levels;
|
|
193
192
|
this.makeLevelsLabels();
|
|
@@ -199,86 +198,60 @@ export class LevelSelector extends UICorePlugin {
|
|
|
199
198
|
.pop();
|
|
200
199
|
this.setLevel(initialLevel?.level ?? 0);
|
|
201
200
|
}
|
|
202
|
-
this.
|
|
201
|
+
this.render();
|
|
203
202
|
}
|
|
204
203
|
makeLevelsLabels() {
|
|
205
204
|
const labels = this.core.options.levelSelector?.labels ?? {};
|
|
206
205
|
this.levelLabels = [];
|
|
207
|
-
for (
|
|
208
|
-
const level = this.levels[i];
|
|
206
|
+
for (const level of this.levels) {
|
|
209
207
|
const ll = level.width > level.height ? level.height : level.width;
|
|
210
208
|
const label = labels[ll] || `${ll}p`;
|
|
211
209
|
this.levelLabels.push(label);
|
|
212
210
|
}
|
|
213
211
|
}
|
|
214
|
-
|
|
212
|
+
onSelect(event) {
|
|
215
213
|
const selectedLevel = parseInt(event.currentTarget?.dataset?.id ?? '-1', 10);
|
|
216
214
|
this.setLevel(selectedLevel);
|
|
217
215
|
event.stopPropagation();
|
|
216
|
+
event.preventDefault();
|
|
218
217
|
return false;
|
|
219
218
|
}
|
|
220
219
|
goBack() {
|
|
221
220
|
trace(`${T} goBack`);
|
|
222
|
-
this.
|
|
223
|
-
setTimeout(() => {
|
|
224
|
-
this.core.getPlugin('bottom_gear').refresh();
|
|
225
|
-
}, 0);
|
|
221
|
+
this.core.getPlugin('bottom_gear').refresh();
|
|
226
222
|
}
|
|
227
223
|
setLevel(index) {
|
|
228
|
-
trace(`${T} setIndexLevel`, { index });
|
|
229
224
|
this.selectedLevelId = index;
|
|
230
|
-
if (!this.core.activePlayback) {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
if (this.core.activePlayback.currentLevel === this.selectedLevelId) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
225
|
this.core.activePlayback.currentLevel = this.selectedLevelId;
|
|
237
|
-
try {
|
|
238
|
-
this.highlightCurrentLevel();
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
reportError(error);
|
|
242
|
-
}
|
|
243
|
-
this.deferRender();
|
|
244
|
-
}
|
|
245
|
-
onShowLevelSelectMenu() {
|
|
246
|
-
trace(`${T} onShowLevelSelectMenu`);
|
|
247
|
-
this.isOpen = true;
|
|
248
|
-
this.renderDropdown();
|
|
249
226
|
this.highlightCurrentLevel();
|
|
250
227
|
}
|
|
251
228
|
allLevelElements() {
|
|
252
|
-
return this.$('
|
|
229
|
+
return this.$('#level-selector-menu li');
|
|
253
230
|
}
|
|
254
231
|
levelElement(id = -1) {
|
|
255
|
-
return this.$(
|
|
232
|
+
return this.$(`#level-selector-menu a[data-id="${id}"]`).parent();
|
|
256
233
|
}
|
|
257
234
|
onLevelSwitchStart() {
|
|
258
|
-
this.core.activePlayback.trigger('playback:level:select:start');
|
|
259
235
|
this.levelElement(this.selectedLevelId).addClass('changing');
|
|
260
236
|
}
|
|
261
237
|
onLevelSwitchEnd() {
|
|
262
238
|
this.levelElement(this.selectedLevelId).removeClass('changing');
|
|
263
239
|
}
|
|
264
240
|
updateText(level) {
|
|
265
|
-
if (level === undefined || isNaN(level)) {
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
241
|
this.currentText = this.getLevelLabel(level);
|
|
269
|
-
this.
|
|
242
|
+
this.updateButton();
|
|
270
243
|
}
|
|
271
244
|
getLevelLabel(id) {
|
|
272
|
-
if (id
|
|
273
|
-
return '
|
|
245
|
+
if (id < 0) {
|
|
246
|
+
return this.core.i18n.t('auto');
|
|
274
247
|
}
|
|
275
248
|
const index = this.levels.findIndex((l) => l.level === id);
|
|
276
249
|
if (index < 0) {
|
|
277
|
-
return '
|
|
250
|
+
return this.core.i18n.t('auto');
|
|
278
251
|
}
|
|
279
252
|
return this.levelLabels[index] ?? formatLevelLabel(this.levels[index]);
|
|
280
253
|
}
|
|
281
|
-
|
|
254
|
+
onBitrate(info) {
|
|
282
255
|
trace(`${T} updateCurrentLevel`, { info });
|
|
283
256
|
this.highlightCurrentLevel();
|
|
284
257
|
}
|
|
@@ -286,28 +259,19 @@ export class LevelSelector extends UICorePlugin {
|
|
|
286
259
|
trace(`${T} highlightCurrentLevel`, {
|
|
287
260
|
selectedLevelId: this.selectedLevelId,
|
|
288
261
|
});
|
|
289
|
-
this.allLevelElements()
|
|
290
|
-
|
|
262
|
+
this.allLevelElements()
|
|
263
|
+
.removeClass('current')
|
|
264
|
+
.find('a')
|
|
265
|
+
.removeClass('gcore-skin-active');
|
|
291
266
|
const currentLevelElement = this.levelElement(this.selectedLevelId);
|
|
292
|
-
currentLevelElement
|
|
293
|
-
|
|
267
|
+
currentLevelElement
|
|
268
|
+
.addClass('current')
|
|
269
|
+
.find('a')
|
|
270
|
+
.addClass('gcore-skin-active');
|
|
294
271
|
this.updateText(this.selectedLevelId);
|
|
295
272
|
}
|
|
296
|
-
deferRender = debounce(() => this.render(), 0);
|
|
297
273
|
}
|
|
298
274
|
function formatLevelLabel(level) {
|
|
299
275
|
const h = level.width > level.height ? level.height : level.width;
|
|
300
276
|
return `${h}p`;
|
|
301
277
|
}
|
|
302
|
-
function debounce(fn, wait) {
|
|
303
|
-
let timerId = null;
|
|
304
|
-
return function () {
|
|
305
|
-
if (timerId !== null) {
|
|
306
|
-
clearTimeout(timerId);
|
|
307
|
-
}
|
|
308
|
-
timerId = setTimeout(() => {
|
|
309
|
-
timerId = null;
|
|
310
|
-
fn();
|
|
311
|
-
}, wait);
|
|
312
|
-
};
|
|
313
|
-
}
|
|
@@ -5,17 +5,7 @@ import '../../../assets/media-control/media-control.scss';
|
|
|
5
5
|
* Media control elements, mount points for additional plugins
|
|
6
6
|
* @beta
|
|
7
7
|
*/
|
|
8
|
-
export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'gear' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer';
|
|
9
|
-
/**
|
|
10
|
-
* Custom events emitted by the plugins to communicate with one another
|
|
11
|
-
* @beta
|
|
12
|
-
*/
|
|
13
|
-
export declare enum MediaControlEvents {
|
|
14
|
-
/**
|
|
15
|
-
* Emitted when the gear menu is rendered
|
|
16
|
-
*/
|
|
17
|
-
MEDIACONTROL_GEAR_RENDERED = "mediacontrol:gear:rendered"
|
|
18
|
-
}
|
|
8
|
+
export type MediaControlElement = 'audiotracks' | 'cc' | 'clipText' | 'dvr' | 'duration' | 'fullscreen' | 'gear' | 'multicamera' | 'pip' | 'playbackRate' | 'position' | 'seekBarContainer' | 'vr' | 'volume';
|
|
19
9
|
/**
|
|
20
10
|
* `PLUGIN` that provides basic playback controls UI and a foundation for developing custom UI.
|
|
21
11
|
* @beta
|
|
@@ -23,6 +13,8 @@ export declare enum MediaControlEvents {
|
|
|
23
13
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
24
14
|
*/
|
|
25
15
|
export declare class MediaControl extends UICorePlugin {
|
|
16
|
+
private customAreaElements;
|
|
17
|
+
private customAreaHandler?;
|
|
26
18
|
private buttonsColor;
|
|
27
19
|
private currentDurationValue;
|
|
28
20
|
private currentPositionValue;
|
|
@@ -47,13 +39,11 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
47
39
|
private userDisabled;
|
|
48
40
|
private userKeepVisible;
|
|
49
41
|
private verticalVolume;
|
|
50
|
-
private $audioTracksSelector;
|
|
51
42
|
private $clipText;
|
|
52
43
|
private $clipTextContainer;
|
|
53
44
|
private $duration;
|
|
54
45
|
private $fullscreenToggle;
|
|
55
46
|
private $multiCameraSelector;
|
|
56
|
-
private $pip;
|
|
57
47
|
private $playPauseToggle;
|
|
58
48
|
private $playStopToggle;
|
|
59
49
|
private $playbackRate;
|
|
@@ -226,13 +216,14 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
226
216
|
* ```
|
|
227
217
|
*/
|
|
228
218
|
getElement(name: MediaControlElement): ZeptoResult | null;
|
|
229
|
-
putElement(name: MediaControlElement, element:
|
|
219
|
+
putElement(name: MediaControlElement, element: ZeptoResult): void;
|
|
220
|
+
handleCustomArea(handler: (name: string, content: HTMLElement) => void): void;
|
|
230
221
|
/**
|
|
231
222
|
* Toggle the visibility of a media control element
|
|
232
223
|
* @param name - The name of the media control element
|
|
233
224
|
* @param show - Whether to show or hide the element
|
|
234
225
|
*/
|
|
235
|
-
toggleElement(
|
|
226
|
+
toggleElement(area: MediaControlElement, show: boolean): void;
|
|
236
227
|
private getRightPanel;
|
|
237
228
|
private getLeftPanel;
|
|
238
229
|
private getCenterPanel;
|
|
@@ -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;AAG5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,aAAa,GACb,IAAI,GACJ,UAAU,GACV,KAAK,GACL,UAAU,GACV,MAAM,GACN,KAAK,GACL,cAAc,GACd,UAAU,GACV,kBAAkB,
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,26 +21,23 @@ import fullscreenOffIcon from '../../../assets/icons/new/fullscreen-off.svg';
|
|
|
21
21
|
import fullscreenOnIcon from '../../../assets/icons/new/fullscreen-on.svg';
|
|
22
22
|
const DEFAULT_SETTINGS = {
|
|
23
23
|
left: [],
|
|
24
|
-
right: [
|
|
24
|
+
right: [
|
|
25
|
+
'fullscreen',
|
|
26
|
+
'pip',
|
|
27
|
+
'gear',
|
|
28
|
+
'cc',
|
|
29
|
+
'multicamera',
|
|
30
|
+
// 'playbackrate',
|
|
31
|
+
'vr',
|
|
32
|
+
'audiotracks',
|
|
33
|
+
],
|
|
25
34
|
default: [],
|
|
26
35
|
seekEnabled: true,
|
|
27
36
|
};
|
|
28
|
-
/**
|
|
29
|
-
* Custom events emitted by the plugins to communicate with one another
|
|
30
|
-
* @beta
|
|
31
|
-
*/
|
|
32
|
-
export var MediaControlEvents;
|
|
33
|
-
(function (MediaControlEvents) {
|
|
34
|
-
/**
|
|
35
|
-
* Emitted when the gear menu is rendered
|
|
36
|
-
*/
|
|
37
|
-
MediaControlEvents["MEDIACONTROL_GEAR_RENDERED"] = "mediacontrol:gear:rendered";
|
|
38
|
-
})(MediaControlEvents || (MediaControlEvents = {}));
|
|
39
37
|
const T = 'plugins.media_control';
|
|
40
38
|
const LEFT_ORDER = [
|
|
41
39
|
'playpause',
|
|
42
40
|
'playstop',
|
|
43
|
-
// 'live',
|
|
44
41
|
'dvr',
|
|
45
42
|
'volume',
|
|
46
43
|
'position',
|
|
@@ -61,6 +58,8 @@ function orderByOrderPattern(arr, order) {
|
|
|
61
58
|
*/
|
|
62
59
|
export class MediaControl extends UICorePlugin {
|
|
63
60
|
// private advertisementPlaying = false
|
|
61
|
+
customAreaElements = {};
|
|
62
|
+
customAreaHandler;
|
|
64
63
|
buttonsColor = null;
|
|
65
64
|
currentDurationValue = 0;
|
|
66
65
|
currentPositionValue = 0;
|
|
@@ -85,13 +84,11 @@ export class MediaControl extends UICorePlugin {
|
|
|
85
84
|
userDisabled = false;
|
|
86
85
|
userKeepVisible = false;
|
|
87
86
|
verticalVolume = false;
|
|
88
|
-
$audioTracksSelector = null;
|
|
89
87
|
$clipText = null;
|
|
90
88
|
$clipTextContainer = null;
|
|
91
89
|
$duration = null;
|
|
92
90
|
$fullscreenToggle = null;
|
|
93
91
|
$multiCameraSelector = null;
|
|
94
|
-
$pip = null;
|
|
95
92
|
$playPauseToggle = null;
|
|
96
93
|
$playStopToggle = null;
|
|
97
94
|
$playbackRate = null;
|
|
@@ -580,11 +577,13 @@ export class MediaControl extends UICorePlugin {
|
|
|
580
577
|
if (!this.$volumeBarContainer) {
|
|
581
578
|
return;
|
|
582
579
|
}
|
|
580
|
+
if (this.hideVolumeId) {
|
|
581
|
+
clearTimeout(this.hideVolumeId);
|
|
582
|
+
}
|
|
583
583
|
if (this.draggingVolumeBar) {
|
|
584
584
|
this.hideVolumeId = setTimeout(() => this.hideVolumeBar(), timeout);
|
|
585
585
|
}
|
|
586
586
|
else {
|
|
587
|
-
this.hideVolumeId && clearTimeout(this.hideVolumeId);
|
|
588
587
|
this.hideVolumeId = setTimeout(() => this.$volumeBarContainer?.addClass('volume-bar-hide'), timeout);
|
|
589
588
|
}
|
|
590
589
|
}
|
|
@@ -736,16 +735,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
736
735
|
newSettings.left.push('dvr');
|
|
737
736
|
}
|
|
738
737
|
// actual order of the items appear rendered is controlled by CSS
|
|
739
|
-
newSettings.right =
|
|
740
|
-
'fullscreen',
|
|
741
|
-
'pip',
|
|
742
|
-
'gear',
|
|
743
|
-
'cc',
|
|
744
|
-
'multicamera',
|
|
745
|
-
'playbackrate',
|
|
746
|
-
'vr',
|
|
747
|
-
'audiotracks',
|
|
748
|
-
];
|
|
738
|
+
newSettings.right = DEFAULT_SETTINGS.right;
|
|
749
739
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
750
740
|
!Fullscreen.fullscreenEnabled()) ||
|
|
751
741
|
this.options.fullscreenDisable) {
|
|
@@ -830,10 +820,10 @@ export class MediaControl extends UICorePlugin {
|
|
|
830
820
|
trace(`${T} putElement`, { name, panel: !!panel });
|
|
831
821
|
if (panel) {
|
|
832
822
|
const current = panel.find(`[data-${name}]`);
|
|
833
|
-
element.
|
|
823
|
+
element.attr(`data-${name}`, '');
|
|
834
824
|
// TODO test
|
|
835
825
|
if (current.length) {
|
|
836
|
-
if (current[0] === element) {
|
|
826
|
+
if (current[0] === element[0]) {
|
|
837
827
|
return;
|
|
838
828
|
}
|
|
839
829
|
current.replaceWith(element);
|
|
@@ -841,15 +831,23 @@ export class MediaControl extends UICorePlugin {
|
|
|
841
831
|
else {
|
|
842
832
|
panel.append(element);
|
|
843
833
|
}
|
|
834
|
+
return;
|
|
844
835
|
}
|
|
845
836
|
}
|
|
837
|
+
handleCustomArea(handler) {
|
|
838
|
+
this.customAreaHandler = handler;
|
|
839
|
+
Object.entries(this.customAreaElements).forEach(([name, element]) => {
|
|
840
|
+
handler(name, element);
|
|
841
|
+
});
|
|
842
|
+
this.customAreaElements = {};
|
|
843
|
+
}
|
|
846
844
|
/**
|
|
847
845
|
* Toggle the visibility of a media control element
|
|
848
846
|
* @param name - The name of the media control element
|
|
849
847
|
* @param show - Whether to show or hide the element
|
|
850
848
|
*/
|
|
851
|
-
toggleElement(
|
|
852
|
-
this.$el.find(`[data-${
|
|
849
|
+
toggleElement(area, show) {
|
|
850
|
+
this.$el.find(`[data-${area}]`).toggle(show);
|
|
853
851
|
}
|
|
854
852
|
getRightPanel() {
|
|
855
853
|
return this.$el.find('.media-control-right-panel');
|
|
@@ -1007,6 +1005,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1007
1005
|
* @internal
|
|
1008
1006
|
*/
|
|
1009
1007
|
render() {
|
|
1008
|
+
trace(`${T} render`);
|
|
1010
1009
|
const timeout = this.options.hideMediaControlDelay || 2000;
|
|
1011
1010
|
const html = MediaControl.template({ settings: this.settings ?? {} });
|
|
1012
1011
|
this.$el.html(html);
|
|
@@ -1055,6 +1054,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
1055
1054
|
this.core.$el.append(this.el);
|
|
1056
1055
|
this.rendered = true;
|
|
1057
1056
|
this.updateVolumeUI();
|
|
1057
|
+
// TODO setTimeout
|
|
1058
1058
|
this.trigger(Events.MEDIACONTROL_RENDERED);
|
|
1059
1059
|
return this;
|
|
1060
1060
|
}
|
|
@@ -1127,6 +1127,12 @@ export class MediaControl extends UICorePlugin {
|
|
|
1127
1127
|
return isFinite(this.core.activePlayback.getDuration());
|
|
1128
1128
|
}
|
|
1129
1129
|
getElementLocation(name) {
|
|
1130
|
+
trace(`${T} getElementLocation`, {
|
|
1131
|
+
name,
|
|
1132
|
+
right: this.settings.right,
|
|
1133
|
+
left: this.settings.left,
|
|
1134
|
+
default: this.settings.default,
|
|
1135
|
+
});
|
|
1130
1136
|
if (this.settings.right?.includes(name)) {
|
|
1131
1137
|
return this.getRightPanel();
|
|
1132
1138
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;AAOxD;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,cAAc,CAAwB;IAErD;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED,IAAa,UAAU;;MAItB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACM,UAAU;IAQnB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACM,MAAM;IAef,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;CAI7B"}
|
|
@@ -4,6 +4,7 @@ import { CLAPPR_VERSION } from '../../build.js';
|
|
|
4
4
|
import pipIcon from '../../../assets/icons/new/pip.svg';
|
|
5
5
|
import buttonHtml from '../../../assets/picture-in-picture/button.ejs';
|
|
6
6
|
import '../../../assets/picture-in-picture/button.scss';
|
|
7
|
+
import assert from 'assert';
|
|
7
8
|
const VERSION = '0.0.1';
|
|
8
9
|
const T = `plugins.pip`;
|
|
9
10
|
/**
|
|
@@ -56,7 +57,11 @@ export class PictureInPicture extends UICorePlugin {
|
|
|
56
57
|
* @internal
|
|
57
58
|
*/
|
|
58
59
|
bindEvents() {
|
|
59
|
-
this.
|
|
60
|
+
this.listenToOnce(this.core, Events.CORE_READY, () => {
|
|
61
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
62
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
63
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
|
|
64
|
+
});
|
|
60
65
|
}
|
|
61
66
|
isPiPSupported() {
|
|
62
67
|
trace(`${T} isPiPSupported`, {
|
|
@@ -75,7 +80,7 @@ export class PictureInPicture extends UICorePlugin {
|
|
|
75
80
|
this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
|
|
76
81
|
const mediaControl = this.core.getPlugin('media_control');
|
|
77
82
|
if (mediaControl) {
|
|
78
|
-
mediaControl.putElement('pip', this
|
|
83
|
+
mediaControl.putElement('pip', this.$el);
|
|
79
84
|
}
|
|
80
85
|
return this;
|
|
81
86
|
}
|