@gcorevideo/player 2.22.4 → 2.22.7
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/level-selector/button.ejs +1 -1
- package/assets/level-selector/list.ejs +10 -4
- package/assets/level-selector/style.scss +8 -3
- package/assets/media-control/media-control.ejs +1 -2
- package/dist/core.js +2 -2
- package/dist/index.css +916 -912
- package/dist/index.js +452 -413
- package/dist/plugins/index.css +668 -664
- package/dist/plugins/index.js +514 -474
- package/lib/index.plugins.d.ts +2 -1
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +2 -1
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +1 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +2 -2
- package/lib/plugins/level-selector/LevelSelector.d.ts +6 -5
- package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
- package/lib/plugins/level-selector/LevelSelector.js +11 -8
- package/lib/plugins/level-selector/QualityLevels.d.ts +112 -0
- package/lib/plugins/level-selector/QualityLevels.d.ts.map +1 -0
- package/lib/plugins/level-selector/QualityLevels.js +280 -0
- package/lib/plugins/media-control/MediaControl.d.ts +37 -6
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +54 -36
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +5 -4
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +46 -24
- package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
- package/lib/plugins/utils/fullscreen.d.ts +4 -0
- package/lib/plugins/utils/fullscreen.d.ts.map +1 -0
- package/lib/plugins/utils/fullscreen.js +30 -0
- package/lib/plugins/utils.d.ts +0 -1
- package/lib/plugins/utils.d.ts.map +1 -1
- package/lib/plugins/utils.js +0 -28
- package/lib/plugins/vast-ads/VastAds.d.ts +1 -0
- package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -1
- package/lib/plugins/vast-ads/VastAds.js +6 -3
- package/lib/utils/fullscreen.d.ts +3 -0
- package/lib/utils/fullscreen.d.ts.map +1 -0
- package/lib/utils/fullscreen.js +2 -0
- package/package.json +1 -1
- package/src/index.plugins.ts +2 -1
- package/src/playback/dash-playback/DashPlayback.ts +1 -4
- package/src/plugins/bottom-gear/BottomGear.ts +2 -2
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +15 -3
- package/src/plugins/level-selector/{LevelSelector.ts → QualityLevels.ts} +19 -13
- package/src/plugins/level-selector/__tests__/{LevelSelector.test.ts → QualityLevels.test.ts} +20 -6
- package/src/plugins/level-selector/__tests__/__snapshots__/{LevelSelector.test.ts.snap → QualityLevels.test.ts.snap} +58 -25
- package/src/plugins/media-control/MediaControl.ts +111 -62
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +118 -8
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +149 -5
- package/src/plugins/playback-rate/PlaybackRate.ts +48 -26
- package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +125 -55
- package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +1 -1
- package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
- package/src/plugins/utils/fullscreen.ts +34 -0
- package/src/plugins/utils.ts +0 -31
- package/src/plugins/vast-ads/VastAds.ts +8 -4
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VastAds.d.ts","sourceRoot":"","sources":["../../../src/plugins/vast-ads/VastAds.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,EAIJ,QAAQ,EAER,YAAY,EAEb,MAAM,cAAc,CAAA;AAarB,OAAO,qCAAqC,CAAA;AAQ5C,qBAAa,OAAQ,SAAQ,YAAY;IACvC,OAAO,CAAC,mBAAmB,CAAiC;IAE5D,OAAO,CAAC,qBAAqB,CAAwC;IAErE,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,eAAe,CAAI;IAE3B,OAAO,CAAC,mBAAmB,CAAI;IAE/B,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,SAAS,CAAyB;IAE1C,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,IAAI,CAA2B;IAEvC,OAAO,CAAC,OAAO,CAAK;IAEpB,OAAO,CAAC,uBAAuB,CAAI;IAEnC,OAAO,CAAC,0BAA0B,CAAI;IAEtC,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,UAAU,CAA2B;IAE7C,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,YAAY,CAA2B;IAE/C,IAAI,IAAI,WAEP;IAED,IAAI,gBAAgB;;MAEnB;IAED,MAAM,KAAK,OAAO,WAEjB;IAED,IAAI,YAAY,QAEf;IAED,IAAa,UAAU;;;MAKtB;gBAEW,IAAI,EAAE,IAAI;IAqEb,UAAU;IA8FnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,oBAAoB;IAkE5B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,qBAAqB;IAwD7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,mBAAmB;IAiD3B,YAAY;IASZ,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IA6BpB,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAG3B;IAED,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAE9B;IAED,OAAO,CAAC,kBAAkB;IAU1B,gBAAgB,CAAC,CAAC,EAAE,MAAM;IAQ1B,cAAc;IAsBd,eAAe;IAkBf,WAAW;IAiBX,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,iBAAiB;IAiHhB,MAAM;IAqBf,OAAO,CAAC,QAAQ;CAGjB"}
|
|
1
|
+
{"version":3,"file":"VastAds.d.ts","sourceRoot":"","sources":["../../../src/plugins/vast-ads/VastAds.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,EAIJ,QAAQ,EAER,YAAY,EAEb,MAAM,cAAc,CAAA;AAarB,OAAO,qCAAqC,CAAA;AAQ5C,qBAAa,OAAQ,SAAQ,YAAY;IACvC,OAAO,CAAC,mBAAmB,CAAiC;IAE5D,OAAO,CAAC,qBAAqB,CAAwC;IAErE,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,eAAe,CAAI;IAE3B,OAAO,CAAC,mBAAmB,CAAI;IAE/B,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,SAAS,CAAyB;IAE1C,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,IAAI,CAA2B;IAEvC,OAAO,CAAC,OAAO,CAAK;IAEpB,OAAO,CAAC,uBAAuB,CAAI;IAEnC,OAAO,CAAC,0BAA0B,CAAI;IAEtC,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,UAAU,CAA2B;IAE7C,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,YAAY,CAA2B;IAE/C,IAAI,IAAI,WAEP;IAED,IAAI,gBAAgB;;MAEnB;IAED,MAAM,KAAK,OAAO,WAEjB;IAED,IAAI,YAAY,QAEf;IAED,IAAa,UAAU;;;MAKtB;gBAEW,IAAI,EAAE,IAAI;IAqEb,UAAU;IA8FnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,oBAAoB;IAkE5B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,qBAAqB;IAwD7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,CAAC,mBAAmB;IAiD3B,YAAY;IASZ,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IA6BpB,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAG3B;IAED,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAE9B;IAED,OAAO,CAAC,kBAAkB;IAU1B,gBAAgB,CAAC,CAAC,EAAE,MAAM;IAQ1B,cAAc;IAsBd,eAAe;IAkBf,WAAW;IAiBX,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,iBAAiB;IAiHhB,MAAM;IAqBf,OAAO,CAAC,QAAQ;CAGjB"}
|
|
@@ -345,8 +345,11 @@ export class VastAds extends UICorePlugin {
|
|
|
345
345
|
// @ts-ignore
|
|
346
346
|
this.stopListening(this.playback, Events.PLAYBACK_PAUSE);
|
|
347
347
|
}
|
|
348
|
+
get pluginOptions() {
|
|
349
|
+
return this.options.vastAds;
|
|
350
|
+
}
|
|
348
351
|
_pauserollListeners() {
|
|
349
|
-
if (!this._validateData(this.
|
|
352
|
+
if (!this._validateData(this.pluginOptions.pauseroll)) {
|
|
350
353
|
return;
|
|
351
354
|
}
|
|
352
355
|
this._stopPauserollListeners();
|
|
@@ -571,11 +574,11 @@ export class VastAds extends UICorePlugin {
|
|
|
571
574
|
// const currentRoll = type;
|
|
572
575
|
this.destroyRoll();
|
|
573
576
|
if (currentRoll === 'preroll') {
|
|
574
|
-
this.
|
|
577
|
+
this.pluginOptions[currentRoll] = [];
|
|
575
578
|
}
|
|
576
579
|
this.currentState = '';
|
|
577
580
|
this.$el.hide();
|
|
578
|
-
if (!this.options.disableClickOnPause) {
|
|
581
|
+
if (!this.options.disableClickOnPause) { // TODO sort out
|
|
579
582
|
this._clickToPausePlugin?.enable();
|
|
580
583
|
}
|
|
581
584
|
try {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullscreen.d.ts","sourceRoot":"","sources":["../../src/utils/fullscreen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,eAAO,MAAM,iBAAiB,2CAAqC,CAAA"}
|
package/package.json
CHANGED
package/src/index.plugins.ts
CHANGED
|
@@ -14,13 +14,14 @@ export * from "./plugins/error-screen/ErrorScreen.js";
|
|
|
14
14
|
export * from "./plugins/favicon/Favicon.js";
|
|
15
15
|
// _ ga-events
|
|
16
16
|
export * from "./plugins/google-analytics/GoogleAnalytics.js";
|
|
17
|
-
export * from "./plugins/level-selector/LevelSelector.js";
|
|
18
17
|
export * from "./plugins/logo/Logo.js";
|
|
19
18
|
export * from "./plugins/media-control/MediaControl.js";
|
|
20
19
|
export * from "./plugins/multi-camera/MultiCamera.js";
|
|
21
20
|
export * from "./plugins/picture-in-picture/PictureInPicture.js";
|
|
22
21
|
export * from "./plugins/playback-rate/PlaybackRate.js";
|
|
23
22
|
export * from "./plugins/poster/Poster.js";
|
|
23
|
+
export * from "./plugins/level-selector/QualityLevels.js";
|
|
24
|
+
export { QualityLevels as LevelSelector } from "./plugins/level-selector/QualityLevels.js";
|
|
24
25
|
export * from "./plugins/seek-time/SeekTime.js";
|
|
25
26
|
export * from "./plugins/share/Share.js";
|
|
26
27
|
export * from "./plugins/skip-time/SkipTime.js";
|
|
@@ -604,11 +604,8 @@ export default class DashPlayback extends BasePlayback {
|
|
|
604
604
|
}
|
|
605
605
|
|
|
606
606
|
_updatePlaybackType() {
|
|
607
|
-
assert.ok(
|
|
608
|
-
this._dash,
|
|
609
|
-
'An instance of dashjs MediaPlayer is required to update the playback type',
|
|
610
|
-
)
|
|
611
607
|
const prevPlaybackType = this._playbackType
|
|
608
|
+
// @ts-ignore
|
|
612
609
|
this._playbackType = this._dash.isDynamic() ? Playback.LIVE : Playback.VOD
|
|
613
610
|
if (prevPlaybackType !== this._playbackType) {
|
|
614
611
|
this._updateSettings()
|
|
@@ -235,7 +235,6 @@ export class BottomGear extends UICorePlugin {
|
|
|
235
235
|
.hide()
|
|
236
236
|
|
|
237
237
|
// TODO make non-clickable when there are no items
|
|
238
|
-
mediaControl.putElement('gear', this.$el)
|
|
239
238
|
|
|
240
239
|
setTimeout(() => {
|
|
241
240
|
this.trigger(GearEvents.RENDERED)
|
|
@@ -276,6 +275,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
276
275
|
|
|
277
276
|
private onMediaControlRendered() {
|
|
278
277
|
trace(`${T} onMediaControlRendered`)
|
|
279
|
-
this.
|
|
278
|
+
const mediaControl = this.core.getPlugin('media_control')
|
|
279
|
+
mediaControl.putElement('gear', this.$el)
|
|
280
280
|
}
|
|
281
281
|
}
|
|
@@ -2,6 +2,7 @@ import { MockedFunction, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
2
2
|
|
|
3
3
|
import { BottomGear, GearEvents } from '../BottomGear'
|
|
4
4
|
import { createMockCore, createMockMediaControl } from '../../../testUtils'
|
|
5
|
+
import { Events } from '@clappr/core'
|
|
5
6
|
|
|
6
7
|
describe('BottomGear', () => {
|
|
7
8
|
let mediaControl: any
|
|
@@ -20,13 +21,11 @@ describe('BottomGear', () => {
|
|
|
20
21
|
onGearRendered = vi.fn()
|
|
21
22
|
bottomGear.on(GearEvents.RENDERED, onGearRendered, null)
|
|
22
23
|
bottomGear.render()
|
|
24
|
+
core.emit(Events.CORE_READY)
|
|
23
25
|
})
|
|
24
26
|
it('should render', () => {
|
|
25
27
|
expect(bottomGear.el.innerHTML).toMatchSnapshot()
|
|
26
28
|
})
|
|
27
|
-
it('should attach to media control', () => {
|
|
28
|
-
expect(mediaControl.putElement).toHaveBeenCalledWith('gear', bottomGear.$el)
|
|
29
|
-
})
|
|
30
29
|
it('should emit event in the next cycle', async () => {
|
|
31
30
|
expect(onGearRendered).not.toHaveBeenCalled()
|
|
32
31
|
await new Promise((resolve) => setTimeout(resolve, 0))
|
|
@@ -37,6 +36,19 @@ describe('BottomGear', () => {
|
|
|
37
36
|
'none',
|
|
38
37
|
)
|
|
39
38
|
})
|
|
39
|
+
describe('until media control is rendered', () => {
|
|
40
|
+
it('should not attach to media control', () => {
|
|
41
|
+
expect(mediaControl.putElement).not.toHaveBeenCalledWith('gear', expect.anything())
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
describe('when media control is rendered', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
mediaControl.trigger(Events.MEDIACONTROL_RENDERED)
|
|
47
|
+
})
|
|
48
|
+
it('should attach to media control', () => {
|
|
49
|
+
expect(mediaControl.putElement).toHaveBeenCalledWith('gear', bottomGear.$el)
|
|
50
|
+
})
|
|
51
|
+
})
|
|
40
52
|
describe('when clicked', () => {
|
|
41
53
|
beforeEach(() => {
|
|
42
54
|
bottomGear.$el.find('#gear-button').click()
|
|
@@ -1,5 +1,5 @@
|
|
|
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
|
|
|
5
5
|
import { type QualityLevel } from '../../playback.types.js'
|
|
@@ -17,14 +17,14 @@ import checkIcon from '../../../assets/icons/new/check.svg'
|
|
|
17
17
|
import '../../../assets/level-selector/style.scss'
|
|
18
18
|
import { MediaControl } from '../media-control/MediaControl.js'
|
|
19
19
|
|
|
20
|
-
const T = 'plugins.
|
|
21
|
-
const VERSION = '
|
|
20
|
+
const T = 'plugins.quality_levels'
|
|
21
|
+
const VERSION = 'v2.22.5'
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
* Configuration options for the {@link
|
|
24
|
+
* Configuration options for the {@link QualityLevels} plugin.
|
|
25
25
|
* @beta
|
|
26
26
|
*/
|
|
27
|
-
export interface
|
|
27
|
+
export interface QualityLevelsPluginSettings {
|
|
28
28
|
/**
|
|
29
29
|
* The maximum resolution to allow in the level selector.
|
|
30
30
|
*/
|
|
@@ -52,19 +52,19 @@ export interface LevelSelectorPluginSettings {
|
|
|
52
52
|
*
|
|
53
53
|
* The plugin is rendered as an item in the gear menu, which, when clicked, shows a list of quality levels to choose from.
|
|
54
54
|
*
|
|
55
|
-
* Configuration options - {@link
|
|
55
|
+
* Configuration options - {@link QualityLevelsPluginSettings}
|
|
56
56
|
*
|
|
57
57
|
* @example
|
|
58
58
|
* ```ts
|
|
59
59
|
* new Player({
|
|
60
|
-
*
|
|
60
|
+
* qualityLevels: {
|
|
61
61
|
* restrictResolution: 360,
|
|
62
62
|
* labels: { 360: 'SD', 720: 'HD' },
|
|
63
63
|
* },
|
|
64
64
|
* })
|
|
65
65
|
* ```
|
|
66
66
|
*/
|
|
67
|
-
export class
|
|
67
|
+
export class QualityLevels extends UICorePlugin {
|
|
68
68
|
private levels: QualityLevel[] = []
|
|
69
69
|
|
|
70
70
|
private levelLabels: string[] = []
|
|
@@ -230,7 +230,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
230
230
|
|
|
231
231
|
private renderDropdown() {
|
|
232
232
|
this.$el.html(
|
|
233
|
-
|
|
233
|
+
QualityLevels.listTemplate({
|
|
234
234
|
arrowLeftIcon,
|
|
235
235
|
checkIcon,
|
|
236
236
|
current: this.selectedLevelId,
|
|
@@ -247,7 +247,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
247
247
|
;(this.core.getPlugin('bottom_gear') as BottomGear)
|
|
248
248
|
?.addItem('quality', this.$el)
|
|
249
249
|
.html(
|
|
250
|
-
|
|
250
|
+
QualityLevels.buttonTemplate({
|
|
251
251
|
arrowRightIcon,
|
|
252
252
|
currentText: this.currentText,
|
|
253
253
|
isHd: this.isHd,
|
|
@@ -257,8 +257,14 @@ export class LevelSelector extends UICorePlugin {
|
|
|
257
257
|
)
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
+
private get pluginOptions(): QualityLevelsPluginSettings {
|
|
261
|
+
return (
|
|
262
|
+
this.core.options.qualityLevels || this.core.options.levelSelector || {}
|
|
263
|
+
)
|
|
264
|
+
}
|
|
265
|
+
|
|
260
266
|
private get maxLevel() {
|
|
261
|
-
const maxRes = this.
|
|
267
|
+
const maxRes = this.pluginOptions.restrictResolution
|
|
262
268
|
return maxRes
|
|
263
269
|
? this.levels.find(
|
|
264
270
|
(level) =>
|
|
@@ -269,7 +275,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
269
275
|
}
|
|
270
276
|
|
|
271
277
|
private onLevelsAvailable(levels: QualityLevel[]) {
|
|
272
|
-
const maxResolution = this.
|
|
278
|
+
const maxResolution = this.pluginOptions.restrictResolution
|
|
273
279
|
this.levels = levels
|
|
274
280
|
this.makeLevelsLabels()
|
|
275
281
|
if (maxResolution) {
|
|
@@ -287,7 +293,7 @@ export class LevelSelector extends UICorePlugin {
|
|
|
287
293
|
}
|
|
288
294
|
|
|
289
295
|
private makeLevelsLabels() {
|
|
290
|
-
const labels = this.
|
|
296
|
+
const labels = this.pluginOptions.labels ?? {}
|
|
291
297
|
this.levelLabels = []
|
|
292
298
|
|
|
293
299
|
for (const level of this.levels) {
|
package/src/plugins/level-selector/__tests__/{LevelSelector.test.ts → QualityLevels.test.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
2
2
|
import { Events } from '@clappr/core'
|
|
3
|
-
import {
|
|
3
|
+
import { QualityLevels } from '../QualityLevels.js'
|
|
4
4
|
import {
|
|
5
5
|
createMockBottomGear,
|
|
6
6
|
createMockCore,
|
|
@@ -33,9 +33,9 @@ const LEVELS = [
|
|
|
33
33
|
},
|
|
34
34
|
]
|
|
35
35
|
|
|
36
|
-
describe('
|
|
36
|
+
describe('QualityLevels', () => {
|
|
37
37
|
let core: any
|
|
38
|
-
let levelSelector:
|
|
38
|
+
let levelSelector: QualityLevels
|
|
39
39
|
let mediaControl: any
|
|
40
40
|
let bottomGear: any
|
|
41
41
|
describe('basically', () => {
|
|
@@ -57,7 +57,7 @@ describe('LevelSelector', () => {
|
|
|
57
57
|
})
|
|
58
58
|
mediaControl = createMockMediaControl(core)
|
|
59
59
|
bottomGear = createMockBottomGear(core)
|
|
60
|
-
levelSelector = new
|
|
60
|
+
levelSelector = new QualityLevels(core)
|
|
61
61
|
})
|
|
62
62
|
describe('initially', () => {
|
|
63
63
|
beforeEach(() => {
|
|
@@ -123,13 +123,13 @@ describe('LevelSelector', () => {
|
|
|
123
123
|
})
|
|
124
124
|
mediaControl = createMockMediaControl(core)
|
|
125
125
|
bottomGear = createMockBottomGear(core)
|
|
126
|
-
levelSelector = new
|
|
126
|
+
levelSelector = new QualityLevels(core)
|
|
127
127
|
core.emit(Events.CORE_READY)
|
|
128
128
|
core.emit(Events.CORE_ACTIVE_CONTAINER_CHANGED, core.activeContainer)
|
|
129
129
|
bottomGear.trigger(GearEvents.RENDERED)
|
|
130
130
|
})
|
|
131
131
|
describe('initially', () => {
|
|
132
|
-
beforeEach(
|
|
132
|
+
beforeEach(() => {
|
|
133
133
|
core.activePlayback.emit(Events.PLAYBACK_LEVELS_AVAILABLE, LEVELS)
|
|
134
134
|
})
|
|
135
135
|
it('should render the restricted quality level label', () => {
|
|
@@ -143,6 +143,20 @@ describe('LevelSelector', () => {
|
|
|
143
143
|
// @ts-ignore
|
|
144
144
|
).toMatchQualityLevelOption('360p')
|
|
145
145
|
})
|
|
146
|
+
describe('when opened', () => {
|
|
147
|
+
beforeEach(() => {
|
|
148
|
+
bottomGear.$el.find('[data-quality]').click()
|
|
149
|
+
})
|
|
150
|
+
it('should render the restricted level items disabled', () => {
|
|
151
|
+
expect(levelSelector.el.innerHTML).toMatchSnapshot()
|
|
152
|
+
const allItems = levelSelector.$el.find('#level-selector-menu li')
|
|
153
|
+
expect(allItems.length).toBe(3)
|
|
154
|
+
const unrestrictedItems = allItems.filter(':not(.disabled)')
|
|
155
|
+
expect(unrestrictedItems.length).toBe(1)
|
|
156
|
+
// @ts-ignore
|
|
157
|
+
expect(unrestrictedItems.text()).toMatchQualityLevelOption('360p')
|
|
158
|
+
})
|
|
159
|
+
})
|
|
146
160
|
})
|
|
147
161
|
describe('given vertical video format levels', () => {
|
|
148
162
|
beforeEach(() => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`
|
|
3
|
+
exports[`QualityLevels > basically > auto > should render the selected level 1`] = `
|
|
4
4
|
"<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
|
|
5
5
|
<span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
|
|
6
6
|
quality
|
|
7
7
|
</button>
|
|
8
|
-
<ul class="gear-sub-menu" id="level-selector-menu">
|
|
8
|
+
<ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
|
|
9
9
|
|
|
10
10
|
<li class="current">
|
|
11
11
|
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="-1" id="level_selector_auto">
|
|
@@ -16,21 +16,21 @@ exports[`LevelSelector > basically > auto > should render the selected level 1`]
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
<li class="">
|
|
19
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
|
|
19
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_1080">
|
|
20
20
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
21
21
|
Full HD
|
|
22
22
|
</a>
|
|
23
23
|
</li>
|
|
24
24
|
|
|
25
25
|
<li class="">
|
|
26
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" id="level_selector_720">
|
|
26
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_720">
|
|
27
27
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
28
28
|
HD
|
|
29
29
|
</a>
|
|
30
30
|
</li>
|
|
31
31
|
|
|
32
32
|
<li class="">
|
|
33
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" id="level_selector_360">
|
|
33
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_360">
|
|
34
34
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
35
35
|
360p
|
|
36
36
|
</a>
|
|
@@ -40,12 +40,12 @@ exports[`LevelSelector > basically > auto > should render the selected level 1`]
|
|
|
40
40
|
"
|
|
41
41
|
`;
|
|
42
42
|
|
|
43
|
-
exports[`
|
|
43
|
+
exports[`QualityLevels > basically > custom label > should render the selected level 1`] = `
|
|
44
44
|
"<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
|
|
45
45
|
<span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
|
|
46
46
|
quality
|
|
47
47
|
</button>
|
|
48
|
-
<ul class="gear-sub-menu" id="level-selector-menu">
|
|
48
|
+
<ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
|
|
49
49
|
|
|
50
50
|
<li class="">
|
|
51
51
|
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="-1" id="level_selector_auto">
|
|
@@ -56,21 +56,21 @@ exports[`LevelSelector > basically > custom label > should render the selected l
|
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
<li class="">
|
|
59
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
|
|
59
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_1080">
|
|
60
60
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
61
61
|
Full HD
|
|
62
62
|
</a>
|
|
63
63
|
</li>
|
|
64
64
|
|
|
65
65
|
<li class="current">
|
|
66
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="1" id="level_selector_720">
|
|
66
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="1" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_720">
|
|
67
67
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
68
68
|
HD
|
|
69
69
|
</a>
|
|
70
70
|
</li>
|
|
71
71
|
|
|
72
72
|
<li class="">
|
|
73
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" id="level_selector_360">
|
|
73
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_360">
|
|
74
74
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
75
75
|
360p
|
|
76
76
|
</a>
|
|
@@ -80,12 +80,12 @@ exports[`LevelSelector > basically > custom label > should render the selected l
|
|
|
80
80
|
"
|
|
81
81
|
`;
|
|
82
82
|
|
|
83
|
-
exports[`
|
|
83
|
+
exports[`QualityLevels > basically > standard label > should render the selected level 1`] = `
|
|
84
84
|
"<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
|
|
85
85
|
<span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
|
|
86
86
|
quality
|
|
87
87
|
</button>
|
|
88
|
-
<ul class="gear-sub-menu" id="level-selector-menu">
|
|
88
|
+
<ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
|
|
89
89
|
|
|
90
90
|
<li class="">
|
|
91
91
|
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="-1" id="level_selector_auto">
|
|
@@ -96,21 +96,21 @@ exports[`LevelSelector > basically > standard label > should render the selected
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
<li class="">
|
|
99
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
|
|
99
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_1080">
|
|
100
100
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
101
101
|
Full HD
|
|
102
102
|
</a>
|
|
103
103
|
</li>
|
|
104
104
|
|
|
105
105
|
<li class="">
|
|
106
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" id="level_selector_720">
|
|
106
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_720">
|
|
107
107
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
108
108
|
HD
|
|
109
109
|
</a>
|
|
110
110
|
</li>
|
|
111
111
|
|
|
112
112
|
<li class="current">
|
|
113
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" id="level_selector_360">
|
|
113
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_360">
|
|
114
114
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
115
115
|
360p
|
|
116
116
|
</a>
|
|
@@ -120,30 +120,30 @@ exports[`LevelSelector > basically > standard label > should render the selected
|
|
|
120
120
|
"
|
|
121
121
|
`;
|
|
122
122
|
|
|
123
|
-
exports[`
|
|
123
|
+
exports[`QualityLevels > options.restrictResolution > given vertical video format levels > should recognize vertical orientation 1`] = `
|
|
124
124
|
"<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
|
|
125
125
|
<span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
|
|
126
126
|
quality
|
|
127
127
|
</button>
|
|
128
|
-
<ul class="gear-sub-menu" id="level-selector-menu">
|
|
128
|
+
<ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
|
|
129
129
|
|
|
130
130
|
|
|
131
|
-
<li class="disabled
|
|
132
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
|
|
131
|
+
<li class=" disabled">
|
|
132
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_1080">
|
|
133
133
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
134
134
|
1080p
|
|
135
135
|
</a>
|
|
136
136
|
</li>
|
|
137
137
|
|
|
138
|
-
<li class="disabled
|
|
139
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" id="level_selector_720">
|
|
138
|
+
<li class=" disabled">
|
|
139
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_720">
|
|
140
140
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
141
141
|
720p
|
|
142
142
|
</a>
|
|
143
143
|
</li>
|
|
144
144
|
|
|
145
|
-
<li class="current
|
|
146
|
-
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" id="level_selector_360">
|
|
145
|
+
<li class=" current">
|
|
146
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" data-disabled="false" data-checked="true" role="menuitemradio" id="level_selector_360">
|
|
147
147
|
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
148
148
|
360p
|
|
149
149
|
</a>
|
|
@@ -153,8 +153,8 @@ exports[`LevelSelector > options.restrictResolution > given vertical video forma
|
|
|
153
153
|
"
|
|
154
154
|
`;
|
|
155
155
|
|
|
156
|
-
exports[`
|
|
157
|
-
"<button class="gplayer-lite-btn gcore-skin-text-color gear-option">
|
|
156
|
+
exports[`QualityLevels > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
|
|
157
|
+
"<button class="gplayer-lite-btn gcore-skin-text-color gear-option" aria-haspopup="menu">
|
|
158
158
|
<span class="gear-option_hd-icon hidden">/assets/icons/new/hd.svg</span>
|
|
159
159
|
<span>quality</span>
|
|
160
160
|
<span class="gear-option_arrow-right-icon">/assets/icons/new/arrow-right.svg</span>
|
|
@@ -162,3 +162,36 @@ exports[`LevelSelector > options.restrictResolution > initially > should render
|
|
|
162
162
|
</button>
|
|
163
163
|
"
|
|
164
164
|
`;
|
|
165
|
+
|
|
166
|
+
exports[`QualityLevels > options.restrictResolution > initially > when opened > should render the restricted level items disabled 1`] = `
|
|
167
|
+
"<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
|
|
168
|
+
<span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
|
|
169
|
+
quality
|
|
170
|
+
</button>
|
|
171
|
+
<ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
<li class=" disabled">
|
|
175
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_1080">
|
|
176
|
+
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
177
|
+
1080p
|
|
178
|
+
</a>
|
|
179
|
+
</li>
|
|
180
|
+
|
|
181
|
+
<li class=" disabled">
|
|
182
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_720">
|
|
183
|
+
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
184
|
+
720p
|
|
185
|
+
</a>
|
|
186
|
+
</li>
|
|
187
|
+
|
|
188
|
+
<li class=" current">
|
|
189
|
+
<a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" data-disabled="false" data-checked="true" role="menuitemradio" id="level_selector_360">
|
|
190
|
+
<span class="check-icon">/assets/icons/new/check.svg</span>
|
|
191
|
+
360p
|
|
192
|
+
</a>
|
|
193
|
+
</li>
|
|
194
|
+
|
|
195
|
+
</ul>
|
|
196
|
+
"
|
|
197
|
+
`;
|