@gcorevideo/player 2.22.4 → 2.22.5

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.
@@ -1,5 +1,5 @@
1
1
  import { Events, template, UICorePlugin } from '@clappr/core'
2
- import { reportError, trace } from '@gcorevideo/utils'
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.level_selector'
21
- const VERSION = '2.19.4'
20
+ const T = 'plugins.quality_levels'
21
+ const VERSION = 'v2.22.5'
22
22
 
23
23
  /**
24
- * Configuration options for the {@link LevelSelector | level selector} plugin.
24
+ * Configuration options for the {@link QualityLevels} plugin.
25
25
  * @beta
26
26
  */
27
- export interface LevelSelectorPluginSettings {
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 LevelSelectorPluginSettings}
55
+ * Configuration options - {@link QualityLevelsPluginSettings}
56
56
  *
57
57
  * @example
58
58
  * ```ts
59
59
  * new Player({
60
- * levelSelector: {
60
+ * qualityLevels: {
61
61
  * restrictResolution: 360,
62
62
  * labels: { 360: 'SD', 720: 'HD' },
63
63
  * },
64
64
  * })
65
65
  * ```
66
66
  */
67
- export class LevelSelector extends UICorePlugin {
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
- LevelSelector.listTemplate({
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
- LevelSelector.buttonTemplate({
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.core.options.levelSelector?.restrictResolution
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.core.options.levelSelector?.restrictResolution
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.core.options.levelSelector?.labels ?? {}
296
+ const labels = this.pluginOptions.labels ?? {}
291
297
  this.levelLabels = []
292
298
 
293
299
  for (const level of this.levels) {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
2
2
  import { Events } from '@clappr/core'
3
- import { LevelSelector } from '../LevelSelector.js'
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('LevelSelector', () => {
36
+ describe('QualityLevels', () => {
37
37
  let core: any
38
- let levelSelector: 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 LevelSelector(core)
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 LevelSelector(core)
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(async () => {
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[`LevelSelector > basically > auto > should render the selected level 1`] = `
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[`LevelSelector > basically > custom label > should render the selected level 1`] = `
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[`LevelSelector > basically > standard label > should render the selected level 1`] = `
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[`LevelSelector > options.restrictResolution > given vertical video format levels > should recognize vertical orientation 1`] = `
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[`LevelSelector > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
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
+ `;
@@ -223,7 +223,7 @@ export class VastAds extends UICorePlugin {
223
223
  )
224
224
  } else {
225
225
  this.countRepeatableRoll = this.findCloserAdvertisement(
226
- this.options.vastAds.repeatableroll,
226
+ this.options.vastAds.repeatableroll,
227
227
  'startTime',
228
228
  this.countRepeatableRoll,
229
229
  e,
@@ -519,8 +519,12 @@ export class VastAds extends UICorePlugin {
519
519
  this.stopListening(this.playback, Events.PLAYBACK_PAUSE)
520
520
  }
521
521
 
522
+ private get pluginOptions() {
523
+ return this.options.vastAds
524
+ }
525
+
522
526
  private _pauserollListeners() {
523
- if (!this._validateData(this._options.VastAds.pauseroll)) {
527
+ if (!this._validateData(this.pluginOptions.pauseroll)) {
524
528
  return
525
529
  }
526
530
  this._stopPauserollListeners()
@@ -781,12 +785,12 @@ export class VastAds extends UICorePlugin {
781
785
 
782
786
  this.destroyRoll()
783
787
  if (currentRoll === 'preroll') {
784
- this.options.vastAds[currentRoll] = []
788
+ this.pluginOptions[currentRoll] = []
785
789
  }
786
790
 
787
791
  this.currentState = ''
788
792
  this.$el.hide()
789
- if (!this.options.disableClickOnPause) {
793
+ if (!this.options.disableClickOnPause) { // TODO sort out
790
794
  this._clickToPausePlugin?.enable()
791
795
  }
792
796