@gcorevideo/player 2.20.7 → 2.20.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.js +37 -13
- package/dist/index.css +1343 -1343
- package/dist/index.js +241 -217
- package/dist/plugins/index.css +475 -475
- package/dist/plugins/index.js +152 -154
- package/lib/playback/BasePlayback.d.ts +5 -0
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/BasePlayback.js +8 -0
- package/lib/playback/HTML5Video.d.ts +4 -0
- package/lib/playback/HTML5Video.d.ts.map +1 -0
- package/lib/playback/HTML5Video.js +3 -0
- package/lib/playback/dash-playback/DashPlayback.d.ts +1 -0
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +6 -2
- package/lib/playback/index.d.ts.map +1 -1
- package/lib/playback/index.js +2 -0
- package/lib/playback/types.d.ts +9 -0
- package/lib/playback/types.d.ts.map +1 -0
- package/lib/playback/types.js +9 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts +6 -11
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +5 -14
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +2 -2
- package/lib/plugins/dvr-controls/DvrControls.d.ts +1 -1
- package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
- package/lib/plugins/dvr-controls/DvrControls.js +27 -16
- package/lib/plugins/level-selector/LevelSelector.d.ts +2 -0
- package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
- package/lib/plugins/level-selector/LevelSelector.js +14 -3
- package/lib/plugins/media-control/MediaControl.d.ts +1 -0
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +5 -3
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +11 -10
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +83 -91
- package/package.json +1 -1
- package/src/playback/BasePlayback.ts +12 -4
- package/src/playback/HTML5Video.ts +3 -0
- package/src/playback/dash-playback/DashPlayback.ts +15 -11
- package/src/playback/index.ts +2 -1
- package/src/playback/types.ts +9 -0
- package/src/plugins/bottom-gear/BottomGear.ts +6 -15
- package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +3 -3
- package/src/plugins/dvr-controls/DvrControls.ts +87 -54
- package/src/plugins/level-selector/LevelSelector.ts +17 -5
- package/src/plugins/media-control/MediaControl.ts +9 -6
- package/src/plugins/playback-rate/PlaybackRate.ts +89 -105
- package/tsconfig.tsbuildinfo +1 -1
- package/assets/playback-rate/playback-rate-selector.ejs +0 -9
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { Events, UICorePlugin, Playback, template } from '@clappr/core';
|
|
2
|
+
import { trace } from '@gcorevideo/utils';
|
|
3
|
+
import assert from 'assert';
|
|
2
4
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
3
|
-
import pluginHtml from '../../../assets/playback-rate/playback-rate-selector.ejs';
|
|
4
5
|
import buttonHtml from '../../../assets/playback-rate/button.ejs';
|
|
5
6
|
import listHtml from '../../../assets/playback-rate/list.ejs';
|
|
6
7
|
import speedIcon from '../../../assets/icons/new/speed.svg';
|
|
7
8
|
import arrowRightIcon from '../../../assets/icons/new/arrow-right.svg';
|
|
8
9
|
import arrowLeftIcon from '../../../assets/icons/new/arrow-left.svg';
|
|
9
10
|
import checkIcon from '../../../assets/icons/new/check.svg';
|
|
11
|
+
import { PlaybackEvents } from '../../playback/types.js';
|
|
12
|
+
import { MediaControlEvents } from '../media-control/MediaControl.js';
|
|
10
13
|
const DEFAULT_PLAYBACK_RATES = [
|
|
11
14
|
{ value: '0.5', label: '0.5x' },
|
|
12
15
|
{ value: '0.75', label: '0.75x' },
|
|
@@ -17,10 +20,9 @@ const DEFAULT_PLAYBACK_RATES = [
|
|
|
17
20
|
{ value: '2.0', label: '2x' }
|
|
18
21
|
];
|
|
19
22
|
const DEFAULT_PLAYBACK_RATE = '1.0';
|
|
20
|
-
|
|
21
|
-
const MEDIACONTROL_PLAYBACKRATE = 'playbackRate';
|
|
23
|
+
const T = 'plugins.playback_rate';
|
|
22
24
|
/**
|
|
23
|
-
*
|
|
25
|
+
* PLUGIN that allows changing the playback speed of the video.
|
|
24
26
|
* @beta
|
|
25
27
|
*
|
|
26
28
|
* @remarks
|
|
@@ -30,12 +32,13 @@ const MEDIACONTROL_PLAYBACKRATE = 'playbackRate';
|
|
|
30
32
|
*
|
|
31
33
|
* - {@link BottomGear | bottom_gear}
|
|
32
34
|
*
|
|
33
|
-
* It renders a button in the gear menu, which opens a dropdown with the
|
|
35
|
+
* It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
|
|
34
36
|
*/
|
|
35
37
|
export class PlaybackRate extends UICorePlugin {
|
|
36
|
-
currentPlayback = null;
|
|
37
38
|
playbackRates = DEFAULT_PLAYBACK_RATES;
|
|
39
|
+
// Saved when an ad starts to restore after it finishes
|
|
38
40
|
prevSelectedRate;
|
|
41
|
+
rendered = false;
|
|
39
42
|
selectedRate = DEFAULT_PLAYBACK_RATE;
|
|
40
43
|
/**
|
|
41
44
|
* @internal
|
|
@@ -49,9 +52,13 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
49
52
|
get supportedVersion() {
|
|
50
53
|
return { min: CLAPPR_VERSION };
|
|
51
54
|
}
|
|
52
|
-
static template = template(pluginHtml);
|
|
53
55
|
static buttonTemplate = template(buttonHtml);
|
|
54
56
|
static listTemplate = template(listHtml);
|
|
57
|
+
constructor(core) {
|
|
58
|
+
super(core);
|
|
59
|
+
this.playbackRates = core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
|
|
60
|
+
this.selectedRate = core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
61
|
+
}
|
|
55
62
|
/**
|
|
56
63
|
* @internal
|
|
57
64
|
*/
|
|
@@ -75,27 +82,36 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
75
82
|
* @internal
|
|
76
83
|
*/
|
|
77
84
|
bindEvents() {
|
|
78
|
-
this.listenTo(this.core,
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
|
|
86
|
+
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
|
|
87
|
+
}
|
|
88
|
+
onCoreReady() {
|
|
89
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
90
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
91
|
+
const gear = this.core.getPlugin('bottom_gear');
|
|
92
|
+
assert(gear, 'bottom_gear plugin is required');
|
|
93
|
+
this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
|
|
94
|
+
}
|
|
95
|
+
onActiveContainerChange() {
|
|
96
|
+
this.listenTo(this.core.activePlayback, Events.PLAYBACK_STOP, this.onStop);
|
|
97
|
+
this.listenTo(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onPlay);
|
|
98
|
+
this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
|
|
99
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
|
|
100
|
+
}
|
|
101
|
+
onGearRendered() {
|
|
102
|
+
trace(`${T} onGearRendered`, {
|
|
103
|
+
rendered: this.rendered,
|
|
104
|
+
});
|
|
105
|
+
this.rendered = false;
|
|
106
|
+
this.render();
|
|
93
107
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
108
|
+
onDvrStateChanged(dvrEnabled) {
|
|
109
|
+
trace(`${T} onDvrStateChanged`, {
|
|
110
|
+
dvrEnabled,
|
|
111
|
+
});
|
|
112
|
+
if (dvrEnabled) {
|
|
113
|
+
this.render();
|
|
114
|
+
}
|
|
99
115
|
}
|
|
100
116
|
allRateElements() {
|
|
101
117
|
return this.$('ul.gear-sub-menu li');
|
|
@@ -103,68 +119,53 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
103
119
|
rateElement(rate = "1") {
|
|
104
120
|
return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
|
|
105
121
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
this.core.mediaControl.$el.addClass('dvr');
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
this.updatePlaybackRate(DEFAULT_PLAYBACK_RATE);
|
|
118
|
-
this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
|
|
119
|
-
this.core.mediaControl.$el.removeClass('dvr');
|
|
122
|
+
onPlaybackRateChange(playbackRate) {
|
|
123
|
+
const selectedRate = parseInt(this.selectedRate, 10);
|
|
124
|
+
if (playbackRate !== selectedRate) {
|
|
125
|
+
trace(`${T} onPlaybackRateChange setting target rate`, {
|
|
126
|
+
playbackRate,
|
|
127
|
+
selectedRate,
|
|
128
|
+
});
|
|
129
|
+
this.core.activePlayback?.setPlaybackRate(selectedRate);
|
|
120
130
|
}
|
|
121
131
|
}
|
|
122
|
-
reload() {
|
|
123
|
-
this.unBindEvents();
|
|
124
|
-
this.bindEvents();
|
|
125
|
-
}
|
|
126
132
|
shouldRender() {
|
|
127
133
|
if (!this.core.activeContainer) {
|
|
128
134
|
return false;
|
|
129
135
|
}
|
|
130
|
-
this.
|
|
131
|
-
|
|
136
|
+
if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return 'setPlaybackRate' in this.core.activePlayback;
|
|
132
140
|
}
|
|
133
141
|
/**
|
|
134
142
|
* @internal
|
|
135
143
|
*/
|
|
136
144
|
render() {
|
|
137
|
-
|
|
138
|
-
|
|
145
|
+
trace(`${T} render`, {
|
|
146
|
+
rendered: this.rendered,
|
|
147
|
+
shouldRender: this.shouldRender(),
|
|
148
|
+
});
|
|
149
|
+
if (!this.shouldRender()) {
|
|
139
150
|
return this;
|
|
140
151
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.playbackRates = cfg.options || DEFAULT_PLAYBACK_RATES;
|
|
144
|
-
}
|
|
145
|
-
if (!this.selectedRate) {
|
|
146
|
-
this.selectedRate = cfg.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
147
|
-
}
|
|
148
|
-
if (this.shouldRender()) {
|
|
149
|
-
const button = PlaybackRate.buttonTemplate({
|
|
150
|
-
title: this.getTitle(),
|
|
151
|
-
speedIcon,
|
|
152
|
-
arrowRightIcon,
|
|
153
|
-
});
|
|
154
|
-
this.$el.html(button);
|
|
155
|
-
// if (this.core.getPlaybackType() === Playback.LIVE) {
|
|
156
|
-
// this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
|
|
157
|
-
// }
|
|
158
|
-
// this.core.mediaControl.$playbackRate.append(this.el);
|
|
159
|
-
this.core.mediaControl.$el?.find('.gear-options-list [data-rate]').html(this.el);
|
|
160
|
-
// this.updateText();
|
|
152
|
+
if (this.rendered) {
|
|
153
|
+
return this;
|
|
161
154
|
}
|
|
155
|
+
const button = PlaybackRate.buttonTemplate({
|
|
156
|
+
title: this.getTitle(),
|
|
157
|
+
speedIcon,
|
|
158
|
+
arrowRightIcon,
|
|
159
|
+
});
|
|
160
|
+
this.$el.html(button);
|
|
161
|
+
this.core.getPlugin('bottom_gear')?.getElement('rate')?.html(this.el);
|
|
162
|
+
this.rendered = true;
|
|
162
163
|
return this;
|
|
163
164
|
}
|
|
164
165
|
onStartAd() {
|
|
165
166
|
this.prevSelectedRate = this.selectedRate;
|
|
166
|
-
this.
|
|
167
|
-
this.listenToOnce(this.
|
|
167
|
+
this.resetPlaybackRate();
|
|
168
|
+
this.listenToOnce(this.core.activePlayback, Events.PLAYBACK_PLAY, this.onFinishAd);
|
|
168
169
|
}
|
|
169
170
|
onFinishAd() {
|
|
170
171
|
if (this.prevSelectedRate) {
|
|
@@ -172,16 +173,16 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
172
173
|
}
|
|
173
174
|
}
|
|
174
175
|
onPlay() {
|
|
175
|
-
if (!this.core.
|
|
176
|
-
|
|
177
|
-
this.updatePlaybackRate(DEFAULT_PLAYBACK_RATE);
|
|
178
|
-
this.core.mediaControl.$playbackRate.addClass('playbackrate-enable');
|
|
179
|
-
}
|
|
176
|
+
if (this.core.getPlaybackType() === Playback.LIVE && !this.core.activePlayback.dvrEnabled) {
|
|
177
|
+
this.resetPlaybackRate();
|
|
180
178
|
}
|
|
181
179
|
else {
|
|
182
180
|
this.setSelectedRate(this.selectedRate);
|
|
183
181
|
}
|
|
184
182
|
}
|
|
183
|
+
resetPlaybackRate() {
|
|
184
|
+
this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
|
|
185
|
+
}
|
|
185
186
|
onStop() {
|
|
186
187
|
}
|
|
187
188
|
onRateSelect(event) {
|
|
@@ -199,30 +200,21 @@ export class PlaybackRate extends UICorePlugin {
|
|
|
199
200
|
arrowLeftIcon,
|
|
200
201
|
checkIcon,
|
|
201
202
|
}));
|
|
202
|
-
this.core.
|
|
203
|
+
this.core.getPlugin('bottom_gear')?.setContent(this.el);
|
|
203
204
|
this.highlightCurrentRate();
|
|
204
205
|
}
|
|
205
206
|
goBack() {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
this.setSelectedRate(rate);
|
|
207
|
+
setTimeout(() => {
|
|
208
|
+
this.core.getPlugin('bottom_gear').refresh();
|
|
209
|
+
}, 0);
|
|
210
210
|
}
|
|
211
211
|
setSelectedRate(rate) {
|
|
212
212
|
// Set <video playbackRate="..."
|
|
213
|
-
this.core
|
|
213
|
+
this.core.activePlayback?.setPlaybackRate(rate);
|
|
214
214
|
this.selectedRate = rate;
|
|
215
|
-
// TODO
|
|
216
|
-
// Player.player.trigger('playbackRateChanged', rate);
|
|
217
215
|
}
|
|
218
216
|
getTitle() {
|
|
219
|
-
|
|
220
|
-
this.playbackRates.forEach((r) => {
|
|
221
|
-
if (r.value === this.selectedRate) {
|
|
222
|
-
title = r.label;
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
return title;
|
|
217
|
+
return this.playbackRates.find((r) => r.value === this.selectedRate)?.label || this.selectedRate;
|
|
226
218
|
}
|
|
227
219
|
highlightCurrentRate() {
|
|
228
220
|
this.allRateElements().removeClass('current');
|
package/package.json
CHANGED
|
@@ -11,10 +11,10 @@ export class BasePlayback extends HTML5Video {
|
|
|
11
11
|
createError(errorData: any, options?: ErrorOptions) {
|
|
12
12
|
const i18n =
|
|
13
13
|
this.i18n ||
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
(this.core && this.core.i18n) ||
|
|
16
|
+
// @ts-ignore
|
|
17
|
+
(this.container && this.container.i18n)
|
|
18
18
|
|
|
19
19
|
if (
|
|
20
20
|
i18n &&
|
|
@@ -34,6 +34,14 @@ export class BasePlayback extends HTML5Video {
|
|
|
34
34
|
return super.createError(errorData, options)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Sets the playback rate.
|
|
39
|
+
* @param rate - The playback rate to set.
|
|
40
|
+
*/
|
|
41
|
+
setPlaybackRate(rate: number) {
|
|
42
|
+
;(this.el as HTMLMediaElement).playbackRate = rate
|
|
43
|
+
}
|
|
44
|
+
|
|
37
45
|
override _onPlaying() {
|
|
38
46
|
super._onPlaying()
|
|
39
47
|
this.trigger(Events.PLAYBACK_MEDIACONTROL_ENABLE)
|
|
@@ -17,7 +17,6 @@ import DASHJS, {
|
|
|
17
17
|
import {
|
|
18
18
|
PlaybackError,
|
|
19
19
|
PlaybackErrorCode,
|
|
20
|
-
PlayerComponentType,
|
|
21
20
|
QualityLevel,
|
|
22
21
|
TimePosition,
|
|
23
22
|
TimeUpdate,
|
|
@@ -25,6 +24,7 @@ import {
|
|
|
25
24
|
} from '../../playback.types.js'
|
|
26
25
|
import { isDashSource } from '../../utils/mediaSources.js'
|
|
27
26
|
import { BasePlayback } from '../BasePlayback.js'
|
|
27
|
+
import { PlaybackEvents } from '../types.js'
|
|
28
28
|
|
|
29
29
|
const AUTO = -1
|
|
30
30
|
|
|
@@ -300,8 +300,8 @@ export default class DashPlayback extends BasePlayback {
|
|
|
300
300
|
},
|
|
301
301
|
)
|
|
302
302
|
|
|
303
|
-
this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, () => {
|
|
304
|
-
this.trigger(
|
|
303
|
+
this._dash.on(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e: DASHJS.PlaybackRateChangedEvent) => {
|
|
304
|
+
this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate)
|
|
305
305
|
})
|
|
306
306
|
}
|
|
307
307
|
|
|
@@ -361,7 +361,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
361
361
|
return this._startTime
|
|
362
362
|
}
|
|
363
363
|
|
|
364
|
-
seekPercentage(percentage: number) {
|
|
364
|
+
override seekPercentage(percentage: number) {
|
|
365
365
|
let seekTo = this._duration
|
|
366
366
|
|
|
367
367
|
if (percentage > 0) {
|
|
@@ -376,7 +376,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
376
376
|
this.seek(seekTo)
|
|
377
377
|
}
|
|
378
378
|
|
|
379
|
-
seek(time: TimeValue) {
|
|
379
|
+
override seek(time: TimeValue) {
|
|
380
380
|
if (time < 0) {
|
|
381
381
|
// eslint-disable-next-line max-len
|
|
382
382
|
Log.warn(
|
|
@@ -478,7 +478,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
478
478
|
}, 10)
|
|
479
479
|
}
|
|
480
480
|
|
|
481
|
-
_onTimeUpdate() {
|
|
481
|
+
override _onTimeUpdate() {
|
|
482
482
|
if (this.startChangeQuality) {
|
|
483
483
|
return
|
|
484
484
|
}
|
|
@@ -499,7 +499,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
499
499
|
this.trigger(Events.PLAYBACK_TIMEUPDATE, update, this.name)
|
|
500
500
|
}
|
|
501
501
|
|
|
502
|
-
_onDurationChange() {
|
|
502
|
+
override _onDurationChange() {
|
|
503
503
|
const duration = this.getDuration()
|
|
504
504
|
|
|
505
505
|
if (this._lastDuration === duration) {
|
|
@@ -540,7 +540,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
540
540
|
this.trigger(Events.PLAYBACK_PROGRESS, progress, {})
|
|
541
541
|
}
|
|
542
542
|
|
|
543
|
-
play() {
|
|
543
|
+
override play() {
|
|
544
544
|
trace(`${T} play`, { dash: !!this._dash })
|
|
545
545
|
if (!this._dash) {
|
|
546
546
|
this._setup()
|
|
@@ -550,7 +550,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
550
550
|
this._startTimeUpdateTimer()
|
|
551
551
|
}
|
|
552
552
|
|
|
553
|
-
pause() {
|
|
553
|
+
override pause() {
|
|
554
554
|
if (!this._dash) {
|
|
555
555
|
return
|
|
556
556
|
}
|
|
@@ -560,7 +560,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
560
560
|
}
|
|
561
561
|
}
|
|
562
562
|
|
|
563
|
-
stop() {
|
|
563
|
+
override stop() {
|
|
564
564
|
if (this._dash) {
|
|
565
565
|
this._stopTimeUpdateTimer()
|
|
566
566
|
this._dash.reset()
|
|
@@ -569,7 +569,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
569
569
|
}
|
|
570
570
|
}
|
|
571
571
|
|
|
572
|
-
destroy() {
|
|
572
|
+
override destroy() {
|
|
573
573
|
this._stopTimeUpdateTimer()
|
|
574
574
|
if (this._dash) {
|
|
575
575
|
this._dash.off(DASHJS.MediaPlayer.events.ERROR, this._onDASHJSSError)
|
|
@@ -638,6 +638,10 @@ export default class DashPlayback extends BasePlayback {
|
|
|
638
638
|
assert.ok(ret, 'Invalid quality level')
|
|
639
639
|
return ret
|
|
640
640
|
}
|
|
641
|
+
|
|
642
|
+
setPlaybackRate(rate: number) {
|
|
643
|
+
this._dash?.setPlaybackRate(rate)
|
|
644
|
+
}
|
|
641
645
|
}
|
|
642
646
|
|
|
643
647
|
DashPlayback.canPlay = function (resource, mimeType) {
|
package/src/playback/index.ts
CHANGED
|
@@ -2,9 +2,10 @@ import { Loader } from '@clappr/core'
|
|
|
2
2
|
|
|
3
3
|
import DashPlayback from './dash-playback/DashPlayback.js'
|
|
4
4
|
import HlsPlayback from './hls-playback/HlsPlayback.js'
|
|
5
|
-
|
|
5
|
+
import HTML5Video from './HTML5Video.js'
|
|
6
6
|
// TODO consider allowing the variation of the order of playback modules
|
|
7
7
|
export function registerPlaybacks() {
|
|
8
|
+
Loader.registerPlayback(HTML5Video) // TODO check it overrides the default HTML5Video
|
|
8
9
|
Loader.registerPlayback(HlsPlayback)
|
|
9
10
|
Loader.registerPlayback(DashPlayback)
|
|
10
11
|
}
|
|
@@ -16,17 +16,6 @@ const VERSION = '2.19.12';
|
|
|
16
16
|
|
|
17
17
|
const T = 'plugins.bottom_gear';
|
|
18
18
|
|
|
19
|
-
/**
|
|
20
|
-
* Custom events emitted by the plugin
|
|
21
|
-
* @beta
|
|
22
|
-
*/
|
|
23
|
-
export enum GearEvents {
|
|
24
|
-
/**
|
|
25
|
-
* Emitted when the gear menu is rendered
|
|
26
|
-
*/
|
|
27
|
-
MEDIACONTROL_GEAR_RENDERED = 'mediacontrol:gear:rendered',
|
|
28
|
-
}
|
|
29
|
-
|
|
30
19
|
/**
|
|
31
20
|
* An element inside the gear menu
|
|
32
21
|
* @beta
|
|
@@ -96,7 +85,6 @@ export class BottomGear extends UICorePlugin {
|
|
|
96
85
|
assert(mediaControl, 'media_control plugin is required');
|
|
97
86
|
|
|
98
87
|
this.listenTo(this.core, ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
99
|
-
this.listenTo(this.core, 'gear:refresh', this.refresh); // TODO use direct plugin method call
|
|
100
88
|
this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_RENDERED, this.render);
|
|
101
89
|
this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_HIDE, this.hide); // TODO mediacontrol show as well
|
|
102
90
|
}
|
|
@@ -150,13 +138,16 @@ export class BottomGear extends UICorePlugin {
|
|
|
150
138
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
151
139
|
|
|
152
140
|
mediaControl.getElement('gear')?.html(this.el);
|
|
153
|
-
this.core.trigger('gear:rendered'); // @deprecated
|
|
154
|
-
mediaControl.trigger(GearEvents.MEDIACONTROL_GEAR_RENDERED); // TODO drop
|
|
155
141
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
156
142
|
return this;
|
|
157
143
|
}
|
|
158
144
|
|
|
159
|
-
|
|
145
|
+
/**
|
|
146
|
+
* Re-renders the gear menu.
|
|
147
|
+
* It fires the {@link MediaControlEvents.MEDIACONTROL_GEAR_RENDERED | MEDIACONTROL_GEAR_RENDERED} event,
|
|
148
|
+
* which the plugins that attach to the gear menu can listen to to re-render themselves.
|
|
149
|
+
*/
|
|
150
|
+
refresh() {
|
|
160
151
|
this.render();
|
|
161
152
|
this.$el.find('.gear-wrapper').show();
|
|
162
153
|
}
|
|
@@ -24,8 +24,8 @@ import '../../../assets/clappr-nerd-stats/clappr-nerd-stats.scss'
|
|
|
24
24
|
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
|
-
import { BottomGear
|
|
28
|
-
import { MediaControl } from '../media-control/MediaControl.js'
|
|
27
|
+
import { BottomGear } from '../bottom-gear/BottomGear.js'
|
|
28
|
+
import { MediaControl, MediaControlEvents } from '../media-control/MediaControl.js'
|
|
29
29
|
import assert from 'assert'
|
|
30
30
|
|
|
31
31
|
const qualityClasses = [
|
|
@@ -229,7 +229,7 @@ export class ClapprNerdStats extends UICorePlugin {
|
|
|
229
229
|
this.listenToOnce(this.core, Events.CORE_READY, this.init)
|
|
230
230
|
this.listenTo(
|
|
231
231
|
mediaControl,
|
|
232
|
-
|
|
232
|
+
MediaControlEvents.MEDIACONTROL_GEAR_RENDERED,
|
|
233
233
|
this.addToBottomGear,
|
|
234
234
|
)
|
|
235
235
|
}
|