@gcorevideo/player 2.28.28 → 2.28.30

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.
Files changed (39) hide show
  1. package/dist/core.js +128 -62
  2. package/dist/index.css +211 -211
  3. package/dist/index.embed.js +270 -190
  4. package/dist/index.js +241 -168
  5. package/lib/playback/BasePlayback.d.ts.map +1 -1
  6. package/lib/playback/dash-playback/DashPlayback.d.ts +22 -3
  7. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  8. package/lib/playback/dash-playback/DashPlayback.js +50 -5
  9. package/lib/playback/hls-playback/HlsPlayback.d.ts +32 -6
  10. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  11. package/lib/playback/hls-playback/HlsPlayback.js +78 -57
  12. package/lib/playback.types.d.ts +6 -0
  13. package/lib/playback.types.d.ts.map +1 -1
  14. package/lib/plugins/media-control/MediaControl.d.ts +5 -6
  15. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  16. package/lib/plugins/media-control/MediaControl.js +40 -38
  17. package/lib/plugins/subtitles/ClosedCaptions.d.ts +5 -0
  18. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  19. package/lib/plugins/subtitles/ClosedCaptions.js +56 -54
  20. package/lib/plugins/utils/mobile.d.ts +2 -0
  21. package/lib/plugins/utils/mobile.d.ts.map +1 -0
  22. package/lib/plugins/utils/mobile.js +4 -0
  23. package/lib/testUtils.d.ts +3 -0
  24. package/lib/testUtils.d.ts.map +1 -1
  25. package/lib/testUtils.js +3 -0
  26. package/package.json +1 -1
  27. package/src/playback/BasePlayback.ts +2 -1
  28. package/src/playback/dash-playback/DashPlayback.ts +68 -13
  29. package/src/playback/hls-playback/HlsPlayback.ts +89 -80
  30. package/src/playback.types.ts +7 -0
  31. package/src/plugins/media-control/MediaControl.ts +45 -43
  32. package/src/plugins/media-control/__tests__/MediaControl.test.ts +63 -35
  33. package/src/plugins/multi-camera/MultiCamera.ts +5 -5
  34. package/src/plugins/subtitles/ClosedCaptions.ts +64 -57
  35. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +195 -196
  36. package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +13 -1
  37. package/src/plugins/utils/mobile.ts +5 -0
  38. package/src/testUtils.ts +3 -0
  39. package/tsconfig.tsbuildinfo +1 -1
@@ -12692,6 +12692,7 @@ var PlaybackEvents;
12692
12692
  // https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
12693
12693
  const AUTO$1 = -1;
12694
12694
  const { now: now$2 } = Utils;
12695
+ const T$8 = 'playback.dash';
12695
12696
  class DashPlayback extends BasePlayback {
12696
12697
  _levels = [];
12697
12698
  _currentLevel = AUTO$1;
@@ -12728,6 +12729,8 @@ class DashPlayback extends BasePlayback {
12728
12729
  startChangeQuality = false;
12729
12730
  manifestInfo = null;
12730
12731
  _timeUpdateTimer = null;
12732
+ oncueenter = null;
12733
+ oncueexit = null;
12731
12734
  get name() {
12732
12735
  return 'dash';
12733
12736
  }
@@ -12770,6 +12773,7 @@ class DashPlayback extends BasePlayback {
12770
12773
  }
12771
12774
  }
12772
12775
  get _startTime() {
12776
+ // TODO review
12773
12777
  if (this._playbackType === Playback.LIVE &&
12774
12778
  this._playlistType !== 'EVENT') {
12775
12779
  return this._extrapolatedStartTime;
@@ -12824,12 +12828,12 @@ class DashPlayback extends BasePlayback {
12824
12828
  streaming: {
12825
12829
  text: {
12826
12830
  defaultEnabled: false,
12831
+ dispatchForManualRendering: true,
12827
12832
  },
12828
12833
  },
12829
12834
  }, this.options.dash);
12830
12835
  this._dash.updateSettings(settings);
12831
12836
  }
12832
- assert.ok(this.el instanceof HTMLMediaElement, 'el must be an HTMLMediaElement');
12833
12837
  this._dash.attachView(this.el);
12834
12838
  this._dash.setAutoPlay(false);
12835
12839
  this._dash.attachSource(this.options.src);
@@ -12873,6 +12877,19 @@ class DashPlayback extends BasePlayback {
12873
12877
  this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack$1(e.newMediaInfo));
12874
12878
  }
12875
12879
  });
12880
+ this._dash.on(_.events.CUE_ENTER, (e) => {
12881
+ this.oncueenter?.({
12882
+ end: e.end,
12883
+ id: e.id,
12884
+ start: e.start,
12885
+ text: e.text,
12886
+ });
12887
+ });
12888
+ this._dash.on(_.events.CUE_EXIT, (e) => {
12889
+ this.oncueexit?.({
12890
+ id: e.id,
12891
+ });
12892
+ });
12876
12893
  }
12877
12894
  render() {
12878
12895
  this._ready();
@@ -12961,6 +12978,7 @@ class DashPlayback extends BasePlayback {
12961
12978
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
12962
12979
  }
12963
12980
  _onPlaybackError = (event) => {
12981
+ trace(`${T$8} _onPlaybackError`, { type: event.type, code: event.error.code, message: event.error.message });
12964
12982
  };
12965
12983
  _onDASHJSSError = (event) => {
12966
12984
  this._stopTimeUpdateTimer();
@@ -13079,7 +13097,14 @@ class DashPlayback extends BasePlayback {
13079
13097
  this._dash.off(_.events.ERROR, this._onDASHJSSError);
13080
13098
  this._dash.off(_.events.PLAYBACK_ERROR, this._onPlaybackError);
13081
13099
  this._dash.off(_.events.MANIFEST_LOADED, this.getDuration);
13100
+ const tracks = this._dash.getTracksFor('text');
13101
+ tracks.forEach(track => {
13102
+ if (track.id) {
13103
+ this._dash.removeExternalSubtitleById(track.id);
13104
+ }
13105
+ });
13082
13106
  this._dash.reset();
13107
+ this._dash.destroy();
13083
13108
  this._dash = null;
13084
13109
  }
13085
13110
  }
@@ -13173,6 +13198,31 @@ class DashPlayback extends BasePlayback {
13173
13198
  super._handleTextTrackChange();
13174
13199
  this._dash?.setTextTrack(this.closedCaptionsTrackId);
13175
13200
  }
13201
+ setTextTrack(id) {
13202
+ this._dash?.setTextTrack(id);
13203
+ }
13204
+ /**
13205
+ * @override
13206
+ */
13207
+ get closedCaptionsTracks() {
13208
+ const tt = this.getTextTracks();
13209
+ return tt;
13210
+ }
13211
+ getTextTracks() {
13212
+ return this._dash?.getTracksFor('text').map((t, index) => ({
13213
+ id: index,
13214
+ name: getTextTrackLabel(t) || "",
13215
+ track: {
13216
+ id: index,
13217
+ label: getTextTrackLabel(t) || "",
13218
+ language: t.lang,
13219
+ mode: "hidden",
13220
+ },
13221
+ })) || [];
13222
+ }
13223
+ }
13224
+ function getTextTrackLabel(t) {
13225
+ return t.labels.find((l) => !l.lang || l.lang === t.lang)?.text;
13176
13226
  }
13177
13227
  DashPlayback.canPlay = function (resource, mimeType) {
13178
13228
  if (!isDashSource(resource, mimeType)) {
@@ -49827,11 +49877,9 @@ const CLAPPR_VERSION$1 = '0.13.0';
49827
49877
  const { now } = Utils;
49828
49878
  const AUTO = -1;
49829
49879
  const DEFAULT_RECOVER_ATTEMPTS = 16;
49830
- Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
49831
49880
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
49832
- const T$8 = 'playback.hls';
49881
+ const T$7 = 'playback.hls';
49833
49882
  class HlsPlayback extends BasePlayback {
49834
- _ccIsSetup = false;
49835
49883
  _ccTracksUpdated = false;
49836
49884
  _currentFragment = null;
49837
49885
  _currentLevel = null;
@@ -49855,6 +49903,10 @@ class HlsPlayback extends BasePlayback {
49855
49903
  _recoveredDecodingError = false;
49856
49904
  _segmentTargetDuration = null;
49857
49905
  _timeUpdateTimer = null;
49906
+ oncueenter = null;
49907
+ oncueexit = null;
49908
+ cues = []; // TODO check the list size and use BST if needed
49909
+ currentCueId = null;
49858
49910
  /**
49859
49911
  * @internal
49860
49912
  */
@@ -50049,7 +50101,7 @@ class HlsPlayback extends BasePlayback {
50049
50101
  return;
50050
50102
  }
50051
50103
  this._manifestParsed = false;
50052
- this._ccIsSetup = false;
50104
+ // this._ccIsSetup = false
50053
50105
  this._ccTracksUpdated = false;
50054
50106
  this._setInitialState();
50055
50107
  this._hls.destroy();
@@ -50060,6 +50112,7 @@ class HlsPlayback extends BasePlayback {
50060
50112
  maxBufferLength: 2,
50061
50113
  maxMaxBufferLength: 4,
50062
50114
  autoStartLoad: false,
50115
+ renderTextTracksNatively: false,
50063
50116
  }, this.options.playback.hlsjsConfig);
50064
50117
  this._hls = new Hls(config);
50065
50118
  }
@@ -50073,7 +50126,7 @@ class HlsPlayback extends BasePlayback {
50073
50126
  if (!this._hls) {
50074
50127
  return;
50075
50128
  }
50076
- this._hls.once(Hls.Events.MEDIA_ATTACHED, () => {
50129
+ this._hls.once(Events.MEDIA_ATTACHED, () => {
50077
50130
  assert.ok(this._hls, 'HLS.js is not initialized');
50078
50131
  this.options.hlsPlayback.preload && this._hls.loadSource(this.options.src);
50079
50132
  });
@@ -50088,25 +50141,29 @@ class HlsPlayback extends BasePlayback {
50088
50141
  this.el.removeEventListener('playing', onPlaying);
50089
50142
  };
50090
50143
  this.el.addEventListener('playing', onPlaying);
50091
- this._hls.on(Hls.Events.MANIFEST_PARSED, () => {
50144
+ this._hls.on(Events.MANIFEST_PARSED, () => {
50092
50145
  this._manifestParsed = true;
50093
- this._hls.startLoad(-1);
50146
+ this.reload();
50094
50147
  });
50095
- this._hls.on(Hls.Events.LEVEL_LOADED, (evt, data) => {
50148
+ this._hls.on(Events.LEVEL_LOADED, (evt, data) => {
50096
50149
  this._updatePlaybackType(evt, data);
50097
50150
  });
50098
- this._hls.on(Hls.Events.LEVEL_UPDATED, (evt, data) => this._onLevelUpdated(evt, data));
50099
- this._hls.on(Hls.Events.LEVEL_SWITCHING, (evt, data) => this._onLevelSwitch(evt, data));
50100
- this._hls.on(Hls.Events.LEVEL_SWITCHED, (evt, data) => this._onLevelSwitched(evt, data));
50101
- this._hls.on(Hls.Events.FRAG_CHANGED, (evt, data) => this._onFragmentChanged(evt, data));
50102
- this._hls.on(Hls.Events.FRAG_LOADED, (evt, data) => this._onFragmentLoaded(evt, data));
50103
- this._hls.on(Hls.Events.FRAG_PARSING_METADATA, (evt, data) => this._onFragmentParsingMetadata(evt, data));
50104
- this._hls.on(Hls.Events.ERROR, (evt, data) => this._onHLSJSError(evt, data));
50105
- // this._hls.on(HLSJS.Events.SUBTITLE_TRACK_LOADED, () =>
50106
- // this._onSubtitleLoaded(),
50107
- // )
50151
+ this._hls.on(Events.LEVEL_UPDATED, (evt, data) => this._onLevelUpdated(evt, data));
50152
+ this._hls.on(Events.LEVEL_SWITCHING, (evt, data) => this._onLevelSwitch(evt, data));
50153
+ this._hls.on(Events.LEVEL_SWITCHED, (evt, data) => this._onLevelSwitched(evt, data));
50154
+ this._hls.on(Events.ERROR, (evt, data) => this._onHLSJSError(evt, data));
50108
50155
  this._hls.on(Events.AUDIO_TRACKS_UPDATED, (evt, data) => this._onAudioTracksUpdated(evt, data));
50109
50156
  this._hls.on(Events.AUDIO_TRACK_SWITCHED, (evt, data) => this._onAudioTrackSwitched(evt, data));
50157
+ this._hls.on(Events.CUES_PARSED, (evt, data) => {
50158
+ data.cues?.forEach((cue) => {
50159
+ this.cues.push({
50160
+ id: cue.id,
50161
+ start: cue.startTime,
50162
+ end: cue.endTime,
50163
+ text: cue.text,
50164
+ });
50165
+ });
50166
+ });
50110
50167
  this.bindCustomListeners();
50111
50168
  }
50112
50169
  bindCustomListeners() {
@@ -50125,13 +50182,6 @@ class HlsPlayback extends BasePlayback {
50125
50182
  requestedEventName && this._hls.off(requestedEventName, item.callback);
50126
50183
  });
50127
50184
  }
50128
- _onFragmentParsingMetadata(evt, data) {
50129
- // @ts-ignore
50130
- this.trigger(Events$1.Custom.PLAYBACK_FRAGMENT_PARSING_METADATA, {
50131
- evt,
50132
- data,
50133
- });
50134
- }
50135
50185
  render() {
50136
50186
  this._ready();
50137
50187
  return super.render();
@@ -50153,7 +50203,7 @@ class HlsPlayback extends BasePlayback {
50153
50203
  }
50154
50204
  else {
50155
50205
  Log.error('hlsjs: failed to recover', { evt, data });
50156
- trace(`${T$8} _recover failed to recover`, {
50206
+ trace(`${T$7} _recover failed to recover`, {
50157
50207
  type: data.type,
50158
50208
  details: data.details,
50159
50209
  });
@@ -50213,6 +50263,7 @@ class HlsPlayback extends BasePlayback {
50213
50263
  this.dvrEnabled && this._updateDvr(time < this.getDuration() - 3);
50214
50264
  time += this._startTime;
50215
50265
  this.el.currentTime = time;
50266
+ this.triggerCues();
50216
50267
  }
50217
50268
  seekToLivePoint() {
50218
50269
  this.seek(this.getDuration());
@@ -50239,7 +50290,7 @@ class HlsPlayback extends BasePlayback {
50239
50290
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
50240
50291
  }
50241
50292
  _onHLSJSError(evt, data) {
50242
- trace(`${T$8} _onHLSJSError`, {
50293
+ trace(`${T$7} _onHLSJSError`, {
50243
50294
  fatal: data.fatal,
50244
50295
  type: data.type,
50245
50296
  details: data.details,
@@ -50261,20 +50312,20 @@ class HlsPlayback extends BasePlayback {
50261
50312
  if (this._recoverAttemptsRemaining > 0) {
50262
50313
  this._recoverAttemptsRemaining -= 1;
50263
50314
  switch (data.type) {
50264
- case Hls.ErrorTypes.NETWORK_ERROR:
50315
+ case ErrorTypes.NETWORK_ERROR:
50265
50316
  switch (data.details) {
50266
50317
  // The following network errors cannot be recovered with HLS.startLoad()
50267
50318
  // For more details, see https://github.com/video-dev/hls.js/blob/master/doc/design.md#error-detection-and-handling
50268
50319
  // For "level load" fatal errors, see https://github.com/video-dev/hls.js/issues/1138
50269
50320
  // TODO test handling of these errors
50270
- case Hls.ErrorDetails.MANIFEST_LOAD_ERROR:
50271
- case Hls.ErrorDetails.MANIFEST_LOAD_TIMEOUT:
50272
- case Hls.ErrorDetails.MANIFEST_PARSING_ERROR:
50321
+ case ErrorDetails.MANIFEST_LOAD_ERROR:
50322
+ case ErrorDetails.MANIFEST_LOAD_TIMEOUT:
50323
+ case ErrorDetails.MANIFEST_PARSING_ERROR:
50273
50324
  // TODO sort out the errors below, perhaps some of them are recoverable
50274
- case Hls.ErrorDetails.LEVEL_LOAD_ERROR:
50275
- case Hls.ErrorDetails.LEVEL_LOAD_TIMEOUT:
50276
- case Hls.ErrorDetails.FRAG_LOAD_ERROR:
50277
- case Hls.ErrorDetails.FRAG_LOAD_TIMEOUT:
50325
+ case ErrorDetails.LEVEL_LOAD_ERROR:
50326
+ case ErrorDetails.LEVEL_LOAD_TIMEOUT:
50327
+ case ErrorDetails.FRAG_LOAD_ERROR:
50328
+ case ErrorDetails.FRAG_LOAD_TIMEOUT:
50278
50329
  Log.error('hlsjs: unrecoverable network fatal error.', {
50279
50330
  evt,
50280
50331
  data,
@@ -50287,20 +50338,20 @@ class HlsPlayback extends BasePlayback {
50287
50338
  evt,
50288
50339
  data,
50289
50340
  });
50290
- trace(`${T$8} _onHLSJSError trying to recover from network error`, {
50341
+ trace(`${T$7} _onHLSJSError trying to recover from network error`, {
50291
50342
  details: data.details,
50292
50343
  });
50293
50344
  error.level = PlayerError.Levels.WARN;
50294
- this._hls?.startLoad();
50345
+ this.reload();
50295
50346
  break;
50296
50347
  }
50297
50348
  break;
50298
- case Hls.ErrorTypes.MEDIA_ERROR:
50349
+ case ErrorTypes.MEDIA_ERROR:
50299
50350
  Log.warn('hlsjs: trying to recover from media error.', {
50300
50351
  evt,
50301
50352
  data,
50302
50353
  });
50303
- trace(`${T$8} _onHLSJSError trying to recover from media error`, {
50354
+ trace(`${T$7} _onHLSJSError trying to recover from media error`, {
50304
50355
  details: data.details,
50305
50356
  });
50306
50357
  error.level = PlayerError.Levels.WARN;
@@ -50330,15 +50381,20 @@ class HlsPlayback extends BasePlayback {
50330
50381
  return;
50331
50382
  }
50332
50383
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
50333
- trace(`${T$8} _onHLSJSError non-fatal error occurred`, {
50384
+ trace(`${T$7} _onHLSJSError non-fatal error occurred`, {
50334
50385
  type: data.type,
50335
50386
  details: data.details,
50336
50387
  });
50337
50388
  }
50338
50389
  }
50390
+ reload() {
50391
+ this.cues = [];
50392
+ this.currentCueId = null;
50393
+ this._hls?.startLoad(-1);
50394
+ }
50339
50395
  _keyIsDenied(data) {
50340
- return (data.type === Hls.ErrorTypes.NETWORK_ERROR &&
50341
- data.details === Hls.ErrorDetails.KEY_LOAD_ERROR &&
50396
+ return (data.type === ErrorTypes.NETWORK_ERROR &&
50397
+ data.details === ErrorDetails.KEY_LOAD_ERROR &&
50342
50398
  data.response &&
50343
50399
  data.response.code &&
50344
50400
  data.response.code >= 400);
@@ -50356,6 +50412,7 @@ class HlsPlayback extends BasePlayback {
50356
50412
  }
50357
50413
  this._lastTimeUpdate = update;
50358
50414
  this.trigger(Events$1.PLAYBACK_TIMEUPDATE, update, this.name);
50415
+ this.triggerCues();
50359
50416
  }
50360
50417
  _onDurationChange() {
50361
50418
  const duration = this.getDuration();
@@ -50394,6 +50451,20 @@ class HlsPlayback extends BasePlayback {
50394
50451
  };
50395
50452
  this.trigger(Events$1.PLAYBACK_PROGRESS, progress, buffered);
50396
50453
  }
50454
+ triggerCues() {
50455
+ const currentTime = this.getCurrentTime();
50456
+ // const cues = Object.values(this.cues)
50457
+ // TODO build a search tree
50458
+ const cue = this.cues.find((cue) => currentTime >= cue.start && currentTime <= cue.end);
50459
+ if (cue) {
50460
+ this.currentCueId = cue.id;
50461
+ this.oncueenter?.(cue);
50462
+ }
50463
+ else if (this.currentCueId) {
50464
+ this.oncueexit?.({ id: this.currentCueId });
50465
+ this.currentCueId = null;
50466
+ }
50467
+ }
50397
50468
  load(url) {
50398
50469
  this._stopTimeUpdateTimer();
50399
50470
  this.options.src = url;
@@ -50585,26 +50656,6 @@ class HlsPlayback extends BasePlayback {
50585
50656
  durationChanged && this._onDurationChange();
50586
50657
  startTimeChanged && this._onProgress();
50587
50658
  }
50588
- _onFragmentChanged(evt, data) {
50589
- this._currentFragment = data.frag;
50590
- // @ts-ignore
50591
- this.trigger(Events$1.Custom.PLAYBACK_FRAGMENT_CHANGED, data);
50592
- }
50593
- _onFragmentLoaded(evt, data) {
50594
- this.trigger(Events$1.PLAYBACK_FRAGMENT_LOADED, data);
50595
- }
50596
- // _onSubtitleLoaded() {
50597
- // trace(`${T} _onSubtitleLoaded`)
50598
- // // This event may be triggered multiple times
50599
- // // Setup CC only once (disable CC by default)
50600
- // if (!this._ccIsSetup) {
50601
- // this.trigger(Events.PLAYBACK_SUBTITLE_AVAILABLE)
50602
- // const trackId =
50603
- // this._playbackType === Playback.LIVE ? -1 : this.closedCaptionsTrackId
50604
- // this.closedCaptionsTrackId = trackId
50605
- // this._ccIsSetup = true
50606
- // }
50607
- // }
50608
50659
  _onLevelSwitch(evt, data) {
50609
50660
  if (!this.levels.length) {
50610
50661
  this._fillLevels();
@@ -50675,6 +50726,26 @@ class HlsPlayback extends BasePlayback {
50675
50726
  const track = this._hls.audioTracks[data.id];
50676
50727
  this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
50677
50728
  }
50729
+ setTextTrack(id) {
50730
+ this._hls.subtitleTrack = id;
50731
+ }
50732
+ /**
50733
+ * @override
50734
+ */
50735
+ get closedCaptionsTracks() {
50736
+ return this.getTextTracks();
50737
+ }
50738
+ getTextTracks() {
50739
+ return this._hls?.subtitleTracks.map((t) => ({
50740
+ id: t.id,
50741
+ name: t.name,
50742
+ track: {
50743
+ id: t.id,
50744
+ label: t.name,
50745
+ language: t.lang,
50746
+ },
50747
+ })) || [];
50748
+ }
50678
50749
  }
50679
50750
  HlsPlayback.canPlay = function (resource, mimeType) {
50680
50751
  if (!isHlsSource(resource, mimeType)) {
@@ -50807,7 +50878,7 @@ function registerPlaybacks() {
50807
50878
  Loader.registerPlayback(DashPlayback);
50808
50879
  }
50809
50880
 
50810
- const T$7 = 'gplayer';
50881
+ const T$6 = 'gplayer';
50811
50882
  const DEFAULT_OPTIONS = {
50812
50883
  autoPlay: false,
50813
50884
  debug: 'none',
@@ -51157,7 +51228,7 @@ class Player {
51157
51228
  // TODO test
51158
51229
  events = {
51159
51230
  onReady: () => {
51160
- trace(`${T$7} onReady`, {
51231
+ trace(`${T$6} onReady`, {
51161
51232
  ready: this.ready,
51162
51233
  });
51163
51234
  if (this.ready) {
@@ -51589,23 +51660,9 @@ const FullscreenIOS = {
51589
51660
  },
51590
51661
  };
51591
51662
 
51592
- insertStyle("[data-player] {\n --bottom-panel: 40px;\n}\n\n.container .media-control-notransition {\n transition: none !important;\n}\n.container .player-poster .play-wrapper {\n opacity: 1;\n}\n.container.crop-video [data-html5-video] {\n object-fit: cover;\n}\n.container .player-poster .circle-poster {\n top: 50%;\n margin-top: -60px;\n left: 50%;\n margin-left: -60px;\n position: absolute;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n}\n.container .player-poster .circle-poster svg {\n margin-left: 5px;\n width: 80px;\n}\n.container .spinner-three-bounce[data-spinner] > div {\n background-color: #ff5700;\n}\n\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n transform: rotate(270deg);\n float: none;\n display: block;\n position: absolute;\n margin: 0;\n top: -40px;\n padding: 0;\n margin-left: -32px;\n margin-top: -3px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background-mask {\n position: absolute;\n width: 100%;\n height: 100%;\n left: -5px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n display: none;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background {\n margin-left: 11px;\n top: 7px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber {\n margin-left: 11px;\n top: 1px;\n}\n.media-control-skin-1.w270 .media-control-dd__popup {\n max-width: 114px;\n}\n\n.media-control-skin-1.w370 .media-control-cc {\n width: 28px;\n}\n.media-control-skin-1.w370 .media-control-cc svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container {\n top: calc(50% - 150px);\n left: calc(50% - 125px);\n width: 250px;\n height: calc(100% - 32px);\n max-height: 300px;\n transform: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header {\n border: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header .share-container-header--title {\n visibility: hidden;\n}\n.media-control-skin-1.w370 .media-control-quality {\n display: block;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera {\n margin-top: 0;\n margin-right: 10px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button svg {\n height: 17px;\n margin: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] {\n padding-left: 10px;\n padding-right: 12px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator {\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-duration] {\n font-size: 11px;\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button[data-fullscreen] {\n height: 33px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n line-height: 33px;\n font-size: 11px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n max-width: 50px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] {\n height: 32px;\n margin-right: 8px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 17px;\n margin-top: 5px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n display: none;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n width: 0;\n height: 12px;\n top: 9px;\n padding: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-button,\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-item {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-dd__popup {\n max-width: 150px;\n}\n\n:root {\n --font-size-media-controls: 14px;\n --font-size-media-controls-dropdown: 16px;\n --gplayer-mc-font-size-dropdown: 16px;\n --player-vod-color: #005aff;\n --player-dvr-color: #fff;\n --player-live-color: #ff0101;\n --player-seekbar-current-color: #ff5700;\n --player-seekbar-buffer-color: #fff;\n --gplayer-mc-text-color: #fff;\n --gplayer-mc-text-dim-color: #fffffe;\n --gplayer-mc-popup-border-color: rgb(255 255 255 / 10%);\n --gplayer-mc-popup-bg: rgb(74 74 74 / 60%);\n}\n\n.media-control-skin-1 {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 9999;\n pointer-events: none;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: var(--font-size-media-controls);\n}\n.media-control-skin-1.dragging {\n pointer-events: auto;\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1.dragging * {\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1 .media-control-icon {\n line-height: 0;\n letter-spacing: 0;\n speak: none;\n color: var(--gplayer-mc-text-color);\n vertical-align: middle;\n text-align: left;\n transition: all 0.1s ease;\n}\n.media-control-skin-1 .media-control-icon:hover {\n color: white;\n}\n.media-control-skin-1.media-control-hide .media-control-background[data-background] {\n opacity: 0;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] {\n bottom: -50px;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] .bar-scrubber[data-seekbar] {\n opacity: 0;\n}\n.media-control-skin-1 .media-control-layer[data-controls] {\n position: absolute;\n bottom: 0;\n width: 100%;\n padding: 0 12px 0 8px;\n height: var(--bottom-panel);\n vertical-align: middle;\n pointer-events: auto;\n transition: bottom 0.4s ease-out;\n display: flex;\n justify-content: space-between;\n}\n.media-control-skin-1 .media-control-left-panel {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n justify-content: flex-start;\n}\n.media-control-skin-1 .media-control-button,\n.media-control-skin-1 .media-control-indicator,\n.media-control-skin-1 .media-control-item {\n order: 50;\n}\n.media-control-skin-1 .media-control-item {\n display: flex;\n align-items: center;\n}\n.media-control-skin-1 [data-playpause],\n.media-control-skin-1 [data-playstop] {\n order: 1;\n}\n.media-control-skin-1 [data-volume] {\n order: 2;\n}\n.media-control-skin-1 [data-position] {\n order: 3;\n}\n.media-control-skin-1 [data-duration] {\n order: 3;\n}\n.media-control-skin-1 .media-control-center-panel {\n height: 100%;\n text-align: center;\n line-height: var(--bottom-panel);\n}\n.media-control-skin-1 .media-control-right-panel {\n display: flex;\n align-items: center;\n gap: 1rem;\n justify-content: flex-end;\n}\n@media (max-width: 420px) {\n .media-control-skin-1 .media-control-right-panel {\n gap: 0.5rem;\n }\n}\n.media-control-skin-1 button.media-control-button {\n background-color: transparent;\n border: 0;\n padding: 0;\n cursor: pointer;\n display: inline-block;\n height: 20px;\n width: 24px;\n}\n.media-control-skin-1 button.media-control-button svg {\n height: 20px;\n}\n.media-control-skin-1 button.media-control-button svg path {\n fill: white;\n}\n.media-control-skin-1 button.media-control-button:focus {\n outline: none;\n}\n.media-control-skin-1 button.media-control-button[data-play] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-pause] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-stop] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-fullscreen] {\n order: 100;\n background-color: transparent;\n border: 0;\n height: 40px;\n}\n.media-control-skin-1 button.media-control-button[data-hd-indicator] {\n background-color: transparent;\n border: 0;\n cursor: default;\n display: none !important;\n float: right;\n height: 100%;\n}\n.media-control-skin-1 .media-control-indicator[data-position], .media-control-skin-1 .media-control-indicator[data-duration] {\n display: flex;\n color: white;\n cursor: default;\n line-height: var(--bottom-panel);\n position: relative;\n}\n.media-control-skin-1 .media-control-indicator[data-position] {\n margin: 1px 0 0 7px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration]::before {\n content: \"|\";\n margin-right: 7px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration] {\n color: rgb(255, 255, 255);\n opacity: 0.5;\n margin-top: 1px;\n margin-right: 6px;\n}\n.media-control-skin-1 .bar-container[data-seekbar] {\n position: absolute;\n top: -11px;\n left: 0;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n height: 20px;\n cursor: pointer;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] {\n width: 100%;\n height: 3px;\n position: relative;\n top: 8px;\n background-color: #666;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-1[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-buffer-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-2[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-current-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar].seek-disabled {\n cursor: default;\n display: none;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] {\n position: absolute;\n transform: translateX(-50%);\n top: 0;\n left: 0;\n width: 20px;\n height: 20px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] .bar-scrubber-icon[data-seekbar] {\n position: absolute;\n left: 4.5px;\n top: 4.5px;\n width: 11px;\n height: 11px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] {\n display: flex;\n justify-content: flex-start;\n height: var(--bottom-panel);\n cursor: pointer;\n box-sizing: border-box;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] {\n bottom: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n background-color: transparent;\n border: 0;\n box-sizing: content-box;\n height: var(--bottom-panel);\n width: 20px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 20px;\n position: relative;\n top: 3px;\n margin-top: 7px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg path {\n fill: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume].muted svg {\n margin-left: 2px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] {\n position: relative;\n margin-left: 10px;\n top: 8px;\n width: 80px;\n height: 23px;\n padding: 3px 0;\n transition: width 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] {\n height: 3px;\n border-radius: 100px;\n position: relative;\n top: 7px;\n background-color: #666;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-1[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n border-radius: 100px;\n background-color: white;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-2[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-vod-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] {\n position: absolute;\n transform: translateX(-50%);\n top: 3px;\n margin-left: 3px;\n width: 16px;\n height: 16px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] .bar-scrubber-icon[data-volume] {\n position: absolute;\n left: 3px;\n top: 5px;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume] {\n float: left;\n width: 4px;\n padding-left: 2px;\n height: 12px;\n opacity: 0.5;\n box-shadow: inset 2px 0 0 white;\n transition: transform 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume].fill {\n box-shadow: inset 2px 0 0 #fff;\n opacity: 1;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:nth-of-type(1) {\n padding-left: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:hover {\n transform: scaleY(1.5);\n}\n.media-control-skin-1 .seek-time {\n height: 26px;\n line-height: 26px;\n bottom: 52px;\n border-radius: 3px;\n background-color: rgba(74, 74, 74, 0.7);\n}\n.media-control-skin-1 .seek-time span {\n letter-spacing: 0.8px;\n font-size: 14px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n}\n.media-control-skin-1 .seek-time .seek-time__pos {\n padding-left: 8px;\n padding-right: 8px;\n}\n.media-control-skin-1 .media-control-dd {\n display: flex;\n height: 32px;\n line-height: 32px;\n align-items: baseline;\n gap: 4px;\n vertical-align: baseline;\n padding: 0;\n background-color: transparent;\n color: var(--gplayer-mc-text-color);\n -webkit-font-smoothing: antialiased;\n border: none;\n cursor: pointer;\n}\n.media-control-skin-1 .media-control-dd__text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: 100px;\n}\n.media-control-skin-1 .media-control-dd.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.media-control-skin-1 .media-control-dd svg {\n fill: var(--gplayer-mc-text-color);\n}\n.media-control-skin-1 .media-control-dd__arrow {\n width: 9px;\n height: 6px;\n}\n.media-control-skin-1 .media-control-dd__wrap {\n position: relative;\n}\n.media-control-skin-1 .media-control-dd__popup {\n max-width: 200px;\n list-style-type: none;\n position: absolute;\n box-shadow: 0 0 1px 1px var(--gplayer-mc-popup-border-color);\n border: none;\n min-width: 60px;\n border-radius: 4px;\n bottom: 40px;\n right: -2px;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 5px 0;\n}\n.media-control-skin-1 .media-control-dd__popup li {\n font-size: var(--gplayer-mc-font-size-dropdown);\n text-align: right;\n height: 30px;\n}\n.media-control-skin-1 .media-control-dd__popup li a {\n display: block;\n text-decoration: none;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding: 5px 10px;\n line-height: 20px;\n color: #fffffe;\n}\n.media-control-skin-1 .media-control-dd__popup li a:hover {\n text-decoration: none;\n background-color: rgba(0, 0, 0, 0.4);\n color: var(--gplayer-mc-text-color);\n}\n.media-control-skin-1 .media-control-dd__popup li.current a {\n color: #f00;\n}\n.media-control-skin-1 .media-control-dd__popup li:first-child a {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-dd__popup li:last-child a {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n\n@keyframes pulse {\n 0% {\n color: #fff;\n }\n 50% {\n color: #ff0101;\n }\n 100% {\n color: #B80000;\n }\n}");
51593
-
51594
- const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\" || setting === \"clips\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if ([\"playpause\", \"playstop\", \"fullscreen\"].includes(setting)) {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
51595
-
51596
- const playIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1564)\">\n <path d=\"M6 3V20L19.3571 11.5L6 3Z\" fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1564\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
51597
-
51598
- const pauseIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M18.05 3H15.35C14.6057 3 14 3.6057 14 4.35V19.65C14 20.3943 14.6057 21 15.35 21H18.05C18.7943 21 19.4 20.3943 19.4 19.65V4.35C19.4 3.6057 18.7943 3 18.05 3ZM10.4 4.35V19.65C10.4 20.3943 9.7943 21 9.05 21H6.35C5.6057 21 5 20.3943 5 19.65V4.35C5 3.6057 5.6057 3 6.35 3H9.05C9.7943 3 10.4 3.6057 10.4 4.35Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
51599
-
51600
- const stopIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#C9C9C9\" d=\"M4.568 3.86h14.9v16.28h-14.9z\"/>\n</svg>\n";
51601
-
51602
- const volumeMaxIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.187 7.71405C13.759 8.06405 13.697 8.69307 14.046 9.12107C14.662 9.87207 15 10.8941 15 11.9961C15 13.0991 14.662 14.1201 14.046 14.8711C13.697 15.2991 13.759 15.9291 14.187 16.2781C14.373 16.4311 14.597 16.5051 14.82 16.5051C15.109 16.5051 15.396 16.3801 15.594 16.1391C16.501 15.0301 17 13.5601 17 11.9961C17 10.4331 16.501 8.96207 15.594 7.85407C15.245 7.42707 14.614 7.36405 14.187 7.71405ZM19.772 5.14408C19.443 4.70008 18.816 4.60907 18.374 4.94007C17.931 5.27007 17.839 5.89605 18.169 6.33905C19.367 7.94705 20 9.90307 20 11.9961C20 14.0891 19.367 16.0451 18.169 17.6531C17.839 18.0971 17.931 18.7231 18.374 19.0531C18.553 19.1871 18.762 19.2511 18.97 19.2511C19.275 19.2511 19.576 19.1121 19.772 18.8491C21.23 16.8921 22 14.5231 22 11.9961C22 9.47007 21.23 7.10108 19.772 5.14408ZM12 3.85108V20.1421C12 20.4881 11.793 20.7971 11.473 20.9291C11.368 20.9721 11.258 20.9921 11.149 20.9921C10.926 20.9921 10.708 20.9031 10.544 20.7371L6.317 16.4431C6.038 16.1591 5.648 15.9961 5.249 15.9961H3.5C2.673 15.9961 2 15.3231 2 14.4961V9.49607C2 8.66907 2.673 7.99607 3.5 7.99607H5.249C5.648 7.99607 6.038 7.83308 6.317 7.54908L10.544 3.25507C10.787 3.00807 11.151 2.93206 11.473 3.06406C11.793 3.19506 12 3.50408 12 3.85108Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
51603
-
51604
- const volumeMuteIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.50025 8.00025C4.67125 8.00025 4.00025 8.67225 4.00025 9.50025V14.5003C4.00025 15.3283 4.67125 16.0003 5.50025 16.0003H7.24824C7.65024 16.0003 8.03627 16.1613 8.31727 16.4483L12.5443 20.7413C12.7083 20.9073 12.9262 20.9963 13.1492 20.9963C13.2572 20.9963 13.3672 20.9763 13.4722 20.9333C13.7932 20.8013 14.0003 20.4923 14.0003 20.1462V16.3283C14.0003 16.1963 13.9473 16.0683 13.8543 15.9753L6.02528 8.14625C5.93228 8.05325 5.80425 8.00025 5.67225 8.00025H5.50025ZM14.0003 3.85426C14.0003 3.50826 13.7932 3.19927 13.4722 3.06727C13.1502 2.93627 12.7873 3.01226 12.5443 3.25926L9.33827 6.51527C9.14627 6.71127 9.14626 7.02625 9.34126 7.22025L13.5733 11.4522C13.7313 11.6102 14.0003 11.4982 14.0003 11.2752V3.85426ZM20.8543 20.8543C20.7563 20.9513 20.6283 21.0003 20.5003 21.0003C20.3723 21.0003 20.2442 20.9513 20.1462 20.8543L3.14625 3.85426C2.95125 3.65826 2.95125 3.34225 3.14625 3.14625C3.34225 2.95125 3.65826 2.95125 3.85426 3.14625L20.8543 20.1462C21.0493 20.3422 21.0493 20.6583 20.8543 20.8543Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
51605
-
51606
- const fullscreenOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M17.1999 4.85023H21.1498V8.80019C21.1498 9.0786 21.2604 9.34577 21.4574 9.54268C21.6283 9.71365 21.8523 9.81956 22.0906 9.84449L22.0965 9.85041H22.2001C22.4785 9.85041 22.7456 9.73981 22.9426 9.5429C23.1395 9.346 23.2501 9.07883 23.2501 8.80042V3.80024C23.2501 3.52182 23.1395 3.25465 22.9426 3.05775L22.7658 3.23453L22.9426 3.05775C22.7456 2.86085 22.4785 2.75024 22.2001 2.75024H17.1999C16.8247 2.75024 16.478 2.95039 16.2905 3.27526C16.103 3.6001 16.103 4.00037 16.2905 4.32521C16.478 4.65009 16.8247 4.85023 17.1999 4.85023Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n <path\n d=\"M1.79999 9.85017H1.90368L1.90961 9.84423C2.14785 9.81928 2.37176 9.71338 2.54271 9.54243C2.73961 9.34553 2.85021 9.07836 2.85021 8.79995V4.84999H6.80017C7.17536 4.84999 7.52201 4.64984 7.70953 4.32497C7.89703 4.00013 7.89703 3.59986 7.70953 3.27502C7.52201 2.95014 7.17537 2.75 6.80017 2.75H1.79999C1.52158 2.75 1.25441 2.8606 1.05751 3.05751C0.860605 3.25441 0.75 3.52158 0.75 3.79999V8.80017C0.75 9.07859 0.860605 9.34576 1.05751 9.54266C1.25441 9.73956 1.52158 9.85017 1.79999 9.85017Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n <path\n d=\"M21.1496 18.7498H17.1996C16.8245 18.7498 16.4778 18.95 16.2903 19.2748C16.1028 19.5997 16.1028 19.9999 16.2903 20.3248C16.4778 20.6497 16.8244 20.8498 17.1996 20.8498H21.5963L21.596 20.85H22.1996C22.478 20.85 22.7452 20.7394 22.9421 20.5425C23.139 20.3456 23.2496 20.0785 23.2496 19.8V14.7999C23.2496 14.4247 23.0494 14.078 22.7246 13.8905C22.3997 13.703 21.9995 13.703 21.6746 13.8905C21.3497 14.078 21.1496 14.4247 21.1496 14.7999V18.7498Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n <path\n d=\"M2.85003 18.7498H6.79999C7.17518 18.7498 7.52183 18.95 7.70935 19.2748C7.89685 19.5997 7.89685 19.9999 7.70935 20.3248C7.52183 20.6497 7.17519 20.8498 6.79999 20.8498H2.40337L2.40359 20.85H1.80004C1.52163 20.85 1.25446 20.7394 1.05756 20.5425C0.860653 20.3456 0.750049 20.0785 0.750049 19.8V14.7999C0.750049 14.4247 0.950194 14.078 1.27507 13.8905C1.5999 13.703 2.00018 13.703 2.32501 13.8905C2.64989 14.078 2.85003 14.4247 2.85003 14.7999V18.7498Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n</svg>\n";
51607
-
51608
- const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.1568 23.15C15.7408 23.15 16.2142 22.6766 16.2142 22.0926V17.1947C16.2142 16.7253 16.5948 16.3447 17.0642 16.3447H21.9621C22.5461 16.3447 23.0195 15.8713 23.0195 15.2873C23.0195 14.7034 22.5461 14.2299 21.9621 14.2299H16.0642C14.9832 14.2299 14.0995 15.1137 14.0995 16.1947V22.0926C14.0995 22.6766 14.5729 23.15 15.1568 23.15Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n <path\n d=\"M1.90739 10.7701H7.80528C8.88627 10.7701 9.77006 9.88627 9.77006 8.80528V2.90739C9.77006 2.32341 9.29665 1.85 8.71267 1.85C8.12869 1.85 7.65528 2.32341 7.65528 2.90739V7.80528C7.65528 8.27472 7.27472 8.65528 6.80528 8.65528H1.90739C1.32341 8.65528 0.85 9.12869 0.85 9.71267C0.85 10.2966 1.32341 10.7701 1.90739 10.7701Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n <path\n d=\"M8.71261 23.15C9.29659 23.15 9.77 22.6766 9.77 22.0926V16.1947C9.77 15.1137 8.88621 14.2299 7.80521 14.2299H1.90733C1.32335 14.2299 0.849939 14.7034 0.849939 15.2873C0.849939 15.8713 1.32335 16.3447 1.90733 16.3447H6.80521C7.27466 16.3447 7.65521 16.7253 7.65521 17.1947V22.0926C7.65521 22.6766 8.12862 23.15 8.71261 23.15Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n <path\n d=\"M21.9621 10.7701C22.5461 10.7701 23.0195 10.2966 23.0195 9.71267C23.0195 9.12869 22.5461 8.65528 21.9621 8.65528H17.0642C16.5948 8.65528 16.2142 8.27472 16.2142 7.80528V2.90739C16.2142 2.32341 15.7408 1.85 15.1568 1.85C14.5729 1.85 14.0995 2.32341 14.0995 2.90739V8.80528C14.0995 9.88627 14.9832 10.7701 16.0642 10.7701H21.9621Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n</svg>\n";
51663
+ function isMobile() {
51664
+ return Browser.isMobile;
51665
+ }
51609
51666
 
51610
51667
  /**
51611
51668
  *
@@ -51647,6 +51704,24 @@ function mediaControlClickaway(callback) {
51647
51704
  };
51648
51705
  }
51649
51706
 
51707
+ insertStyle("[data-player] {\n --bottom-panel: 40px;\n}\n\n.container .media-control-notransition {\n transition: none !important;\n}\n.container .player-poster .play-wrapper {\n opacity: 1;\n}\n.container.crop-video [data-html5-video] {\n object-fit: cover;\n}\n.container .player-poster .circle-poster {\n top: 50%;\n margin-top: -60px;\n left: 50%;\n margin-left: -60px;\n position: absolute;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n}\n.container .player-poster .circle-poster svg {\n margin-left: 5px;\n width: 80px;\n}\n.container .spinner-three-bounce[data-spinner] > div {\n background-color: #ff5700;\n}\n\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n transform: rotate(270deg);\n float: none;\n display: block;\n position: absolute;\n margin: 0;\n top: -40px;\n padding: 0;\n margin-left: -32px;\n margin-top: -3px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background-mask {\n position: absolute;\n width: 100%;\n height: 100%;\n left: -5px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n display: none;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background {\n margin-left: 11px;\n top: 7px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber {\n margin-left: 11px;\n top: 1px;\n}\n.media-control-skin-1.w270 .media-control-dd__popup {\n max-width: 114px;\n}\n\n.media-control-skin-1.w370 .media-control-cc {\n width: 28px;\n}\n.media-control-skin-1.w370 .media-control-cc svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container {\n top: calc(50% - 150px);\n left: calc(50% - 125px);\n width: 250px;\n height: calc(100% - 32px);\n max-height: 300px;\n transform: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header {\n border: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header .share-container-header--title {\n visibility: hidden;\n}\n.media-control-skin-1.w370 .media-control-quality {\n display: block;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera {\n margin-top: 0;\n margin-right: 10px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button svg {\n height: 17px;\n margin: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] {\n padding-left: 10px;\n padding-right: 12px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator {\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-duration] {\n font-size: 11px;\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button[data-fullscreen] {\n height: 33px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n line-height: 33px;\n font-size: 11px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n max-width: 50px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] {\n height: 32px;\n margin-right: 8px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 17px;\n margin-top: 5px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n display: none;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n width: 0;\n height: 12px;\n top: 9px;\n padding: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-button,\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-item {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-dd__popup {\n max-width: 150px;\n}\n\n:root {\n --font-size-media-controls: 14px;\n --font-size-media-controls-dropdown: 16px;\n --gplayer-mc-font-size-dropdown: 16px;\n --player-vod-color: #005aff;\n --player-dvr-color: #fff;\n --player-live-color: #ff0101;\n --player-seekbar-current-color: #ff5700;\n --player-seekbar-buffer-color: #fff;\n --gplayer-mc-text-color: #fff;\n --gplayer-mc-text-dim-color: #fffffe;\n --gplayer-mc-popup-border-color: rgb(255 255 255 / 10%);\n --gplayer-mc-popup-bg: rgb(74 74 74 / 60%);\n}\n\n.media-control-skin-1 {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 9999;\n pointer-events: none;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: var(--font-size-media-controls);\n}\n.media-control-skin-1.dragging {\n pointer-events: auto;\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1.dragging * {\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1 .media-control-icon {\n line-height: 0;\n letter-spacing: 0;\n speak: none;\n color: var(--gplayer-mc-text-color);\n vertical-align: middle;\n text-align: left;\n transition: all 0.1s ease;\n}\n.media-control-skin-1 .media-control-icon:hover {\n color: white;\n}\n.media-control-skin-1.media-control-hide .media-control-background[data-background] {\n opacity: 0;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] {\n bottom: -50px;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] .bar-scrubber[data-seekbar] {\n opacity: 0;\n}\n.media-control-skin-1 .media-control-layer[data-controls] {\n position: absolute;\n bottom: 0;\n width: 100%;\n padding: 0 12px 0 8px;\n height: var(--bottom-panel);\n vertical-align: middle;\n pointer-events: auto;\n transition: bottom 0.4s ease-out;\n display: flex;\n justify-content: space-between;\n}\n.media-control-skin-1 .media-control-left-panel {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n justify-content: flex-start;\n}\n.media-control-skin-1 .media-control-button,\n.media-control-skin-1 .media-control-indicator,\n.media-control-skin-1 .media-control-item {\n order: 50;\n}\n.media-control-skin-1 .media-control-item {\n display: flex;\n align-items: center;\n}\n.media-control-skin-1 [data-playpause],\n.media-control-skin-1 [data-playstop] {\n order: 1;\n}\n.media-control-skin-1 [data-volume] {\n order: 2;\n}\n.media-control-skin-1 [data-position] {\n order: 3;\n}\n.media-control-skin-1 [data-duration] {\n order: 3;\n}\n.media-control-skin-1 .media-control-center-panel {\n height: 100%;\n text-align: center;\n line-height: var(--bottom-panel);\n}\n.media-control-skin-1 .media-control-right-panel {\n display: flex;\n align-items: center;\n gap: 1rem;\n justify-content: flex-end;\n}\n@media (max-width: 420px) {\n .media-control-skin-1 .media-control-right-panel {\n gap: 0.5rem;\n }\n}\n.media-control-skin-1 button.media-control-button {\n background-color: transparent;\n border: 0;\n padding: 0;\n cursor: pointer;\n display: inline-block;\n height: 20px;\n width: 24px;\n}\n.media-control-skin-1 button.media-control-button svg {\n height: 20px;\n}\n.media-control-skin-1 button.media-control-button svg path {\n fill: white;\n}\n.media-control-skin-1 button.media-control-button:focus {\n outline: none;\n}\n.media-control-skin-1 button.media-control-button[data-play] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-pause] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-stop] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-fullscreen] {\n order: 100;\n background-color: transparent;\n border: 0;\n height: 40px;\n}\n.media-control-skin-1 button.media-control-button[data-hd-indicator] {\n background-color: transparent;\n border: 0;\n cursor: default;\n display: none !important;\n float: right;\n height: 100%;\n}\n.media-control-skin-1 .media-control-indicator[data-position], .media-control-skin-1 .media-control-indicator[data-duration] {\n display: flex;\n color: white;\n cursor: default;\n line-height: var(--bottom-panel);\n position: relative;\n}\n.media-control-skin-1 .media-control-indicator[data-position] {\n margin: 1px 0 0 7px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration]::before {\n content: \"|\";\n margin-right: 7px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration] {\n color: rgb(255, 255, 255);\n opacity: 0.5;\n margin-top: 1px;\n margin-right: 6px;\n}\n.media-control-skin-1 .bar-container[data-seekbar] {\n position: absolute;\n top: -11px;\n left: 0;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n height: 20px;\n cursor: pointer;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] {\n width: 100%;\n height: 3px;\n position: relative;\n top: 8px;\n background-color: #666;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-1[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-buffer-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-2[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-current-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar].seek-disabled {\n cursor: default;\n display: none;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] {\n position: absolute;\n transform: translateX(-50%);\n top: 0;\n left: 0;\n width: 20px;\n height: 20px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] .bar-scrubber-icon[data-seekbar] {\n position: absolute;\n left: 4.5px;\n top: 4.5px;\n width: 11px;\n height: 11px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] {\n display: flex;\n justify-content: flex-start;\n height: var(--bottom-panel);\n cursor: pointer;\n box-sizing: border-box;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] {\n bottom: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n background-color: transparent;\n border: 0;\n box-sizing: content-box;\n height: var(--bottom-panel);\n width: 20px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 20px;\n position: relative;\n top: 3px;\n margin-top: 7px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg path {\n fill: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume].muted svg {\n margin-left: 2px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] {\n position: relative;\n margin-left: 10px;\n top: 8px;\n width: 80px;\n height: 23px;\n padding: 3px 0;\n transition: width 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] {\n height: 3px;\n border-radius: 100px;\n position: relative;\n top: 7px;\n background-color: #666;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-1[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n border-radius: 100px;\n background-color: white;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-2[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-vod-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] {\n position: absolute;\n transform: translateX(-50%);\n top: 3px;\n margin-left: 3px;\n width: 16px;\n height: 16px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] .bar-scrubber-icon[data-volume] {\n position: absolute;\n left: 3px;\n top: 5px;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume] {\n float: left;\n width: 4px;\n padding-left: 2px;\n height: 12px;\n opacity: 0.5;\n box-shadow: inset 2px 0 0 white;\n transition: transform 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume].fill {\n box-shadow: inset 2px 0 0 #fff;\n opacity: 1;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:nth-of-type(1) {\n padding-left: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:hover {\n transform: scaleY(1.5);\n}\n.media-control-skin-1 .seek-time {\n height: 26px;\n line-height: 26px;\n bottom: 52px;\n border-radius: 3px;\n background-color: rgba(74, 74, 74, 0.7);\n}\n.media-control-skin-1 .seek-time span {\n letter-spacing: 0.8px;\n font-size: 14px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n}\n.media-control-skin-1 .seek-time .seek-time__pos {\n padding-left: 8px;\n padding-right: 8px;\n}\n.media-control-skin-1 .media-control-dd {\n display: flex;\n height: 32px;\n line-height: 32px;\n align-items: baseline;\n gap: 4px;\n vertical-align: baseline;\n padding: 0;\n background-color: transparent;\n color: var(--gplayer-mc-text-color);\n -webkit-font-smoothing: antialiased;\n border: none;\n cursor: pointer;\n}\n.media-control-skin-1 .media-control-dd__text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: 100px;\n}\n.media-control-skin-1 .media-control-dd.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.media-control-skin-1 .media-control-dd svg {\n fill: var(--gplayer-mc-text-color);\n}\n.media-control-skin-1 .media-control-dd__arrow {\n width: 9px;\n height: 6px;\n}\n.media-control-skin-1 .media-control-dd__wrap {\n position: relative;\n}\n.media-control-skin-1 .media-control-dd__popup {\n max-width: 200px;\n list-style-type: none;\n position: absolute;\n box-shadow: 0 0 1px 1px var(--gplayer-mc-popup-border-color);\n border: none;\n min-width: 60px;\n border-radius: 4px;\n bottom: 40px;\n right: -2px;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 5px 0;\n}\n.media-control-skin-1 .media-control-dd__popup li {\n font-size: var(--gplayer-mc-font-size-dropdown);\n text-align: right;\n height: 30px;\n}\n.media-control-skin-1 .media-control-dd__popup li a {\n display: block;\n text-decoration: none;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding: 5px 10px;\n line-height: 20px;\n color: #fffffe;\n}\n.media-control-skin-1 .media-control-dd__popup li a:hover {\n text-decoration: none;\n background-color: rgba(0, 0, 0, 0.4);\n color: var(--gplayer-mc-text-color);\n}\n.media-control-skin-1 .media-control-dd__popup li.current a {\n color: #f00;\n}\n.media-control-skin-1 .media-control-dd__popup li:first-child a {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-dd__popup li:last-child a {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n\n@keyframes pulse {\n 0% {\n color: #fff;\n }\n 50% {\n color: #ff0101;\n }\n 100% {\n color: #B80000;\n }\n}");
51708
+
51709
+ const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\" || setting === \"clips\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if ([\"playpause\", \"playstop\", \"fullscreen\"].includes(setting)) {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
51710
+
51711
+ const playIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1564)\">\n <path d=\"M6 3V20L19.3571 11.5L6 3Z\" fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1564\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
51712
+
51713
+ const pauseIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M18.05 3H15.35C14.6057 3 14 3.6057 14 4.35V19.65C14 20.3943 14.6057 21 15.35 21H18.05C18.7943 21 19.4 20.3943 19.4 19.65V4.35C19.4 3.6057 18.7943 3 18.05 3ZM10.4 4.35V19.65C10.4 20.3943 9.7943 21 9.05 21H6.35C5.6057 21 5 20.3943 5 19.65V4.35C5 3.6057 5.6057 3 6.35 3H9.05C9.7943 3 10.4 3.6057 10.4 4.35Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
51714
+
51715
+ const stopIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#C9C9C9\" d=\"M4.568 3.86h14.9v16.28h-14.9z\"/>\n</svg>\n";
51716
+
51717
+ const volumeMaxIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.187 7.71405C13.759 8.06405 13.697 8.69307 14.046 9.12107C14.662 9.87207 15 10.8941 15 11.9961C15 13.0991 14.662 14.1201 14.046 14.8711C13.697 15.2991 13.759 15.9291 14.187 16.2781C14.373 16.4311 14.597 16.5051 14.82 16.5051C15.109 16.5051 15.396 16.3801 15.594 16.1391C16.501 15.0301 17 13.5601 17 11.9961C17 10.4331 16.501 8.96207 15.594 7.85407C15.245 7.42707 14.614 7.36405 14.187 7.71405ZM19.772 5.14408C19.443 4.70008 18.816 4.60907 18.374 4.94007C17.931 5.27007 17.839 5.89605 18.169 6.33905C19.367 7.94705 20 9.90307 20 11.9961C20 14.0891 19.367 16.0451 18.169 17.6531C17.839 18.0971 17.931 18.7231 18.374 19.0531C18.553 19.1871 18.762 19.2511 18.97 19.2511C19.275 19.2511 19.576 19.1121 19.772 18.8491C21.23 16.8921 22 14.5231 22 11.9961C22 9.47007 21.23 7.10108 19.772 5.14408ZM12 3.85108V20.1421C12 20.4881 11.793 20.7971 11.473 20.9291C11.368 20.9721 11.258 20.9921 11.149 20.9921C10.926 20.9921 10.708 20.9031 10.544 20.7371L6.317 16.4431C6.038 16.1591 5.648 15.9961 5.249 15.9961H3.5C2.673 15.9961 2 15.3231 2 14.4961V9.49607C2 8.66907 2.673 7.99607 3.5 7.99607H5.249C5.648 7.99607 6.038 7.83308 6.317 7.54908L10.544 3.25507C10.787 3.00807 11.151 2.93206 11.473 3.06406C11.793 3.19506 12 3.50408 12 3.85108Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
51718
+
51719
+ const volumeMuteIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.50025 8.00025C4.67125 8.00025 4.00025 8.67225 4.00025 9.50025V14.5003C4.00025 15.3283 4.67125 16.0003 5.50025 16.0003H7.24824C7.65024 16.0003 8.03627 16.1613 8.31727 16.4483L12.5443 20.7413C12.7083 20.9073 12.9262 20.9963 13.1492 20.9963C13.2572 20.9963 13.3672 20.9763 13.4722 20.9333C13.7932 20.8013 14.0003 20.4923 14.0003 20.1462V16.3283C14.0003 16.1963 13.9473 16.0683 13.8543 15.9753L6.02528 8.14625C5.93228 8.05325 5.80425 8.00025 5.67225 8.00025H5.50025ZM14.0003 3.85426C14.0003 3.50826 13.7932 3.19927 13.4722 3.06727C13.1502 2.93627 12.7873 3.01226 12.5443 3.25926L9.33827 6.51527C9.14627 6.71127 9.14626 7.02625 9.34126 7.22025L13.5733 11.4522C13.7313 11.6102 14.0003 11.4982 14.0003 11.2752V3.85426ZM20.8543 20.8543C20.7563 20.9513 20.6283 21.0003 20.5003 21.0003C20.3723 21.0003 20.2442 20.9513 20.1462 20.8543L3.14625 3.85426C2.95125 3.65826 2.95125 3.34225 3.14625 3.14625C3.34225 2.95125 3.65826 2.95125 3.85426 3.14625L20.8543 20.1462C21.0493 20.3422 21.0493 20.6583 20.8543 20.8543Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
51720
+
51721
+ const fullscreenOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M17.1999 4.85023H21.1498V8.80019C21.1498 9.0786 21.2604 9.34577 21.4574 9.54268C21.6283 9.71365 21.8523 9.81956 22.0906 9.84449L22.0965 9.85041H22.2001C22.4785 9.85041 22.7456 9.73981 22.9426 9.5429C23.1395 9.346 23.2501 9.07883 23.2501 8.80042V3.80024C23.2501 3.52182 23.1395 3.25465 22.9426 3.05775L22.7658 3.23453L22.9426 3.05775C22.7456 2.86085 22.4785 2.75024 22.2001 2.75024H17.1999C16.8247 2.75024 16.478 2.95039 16.2905 3.27526C16.103 3.6001 16.103 4.00037 16.2905 4.32521C16.478 4.65009 16.8247 4.85023 17.1999 4.85023Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n <path\n d=\"M1.79999 9.85017H1.90368L1.90961 9.84423C2.14785 9.81928 2.37176 9.71338 2.54271 9.54243C2.73961 9.34553 2.85021 9.07836 2.85021 8.79995V4.84999H6.80017C7.17536 4.84999 7.52201 4.64984 7.70953 4.32497C7.89703 4.00013 7.89703 3.59986 7.70953 3.27502C7.52201 2.95014 7.17537 2.75 6.80017 2.75H1.79999C1.52158 2.75 1.25441 2.8606 1.05751 3.05751C0.860605 3.25441 0.75 3.52158 0.75 3.79999V8.80017C0.75 9.07859 0.860605 9.34576 1.05751 9.54266C1.25441 9.73956 1.52158 9.85017 1.79999 9.85017Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n <path\n d=\"M21.1496 18.7498H17.1996C16.8245 18.7498 16.4778 18.95 16.2903 19.2748C16.1028 19.5997 16.1028 19.9999 16.2903 20.3248C16.4778 20.6497 16.8244 20.8498 17.1996 20.8498H21.5963L21.596 20.85H22.1996C22.478 20.85 22.7452 20.7394 22.9421 20.5425C23.139 20.3456 23.2496 20.0785 23.2496 19.8V14.7999C23.2496 14.4247 23.0494 14.078 22.7246 13.8905C22.3997 13.703 21.9995 13.703 21.6746 13.8905C21.3497 14.078 21.1496 14.4247 21.1496 14.7999V18.7498Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n <path\n d=\"M2.85003 18.7498H6.79999C7.17518 18.7498 7.52183 18.95 7.70935 19.2748C7.89685 19.5997 7.89685 19.9999 7.70935 20.3248C7.52183 20.6497 7.17519 20.8498 6.79999 20.8498H2.40337L2.40359 20.85H1.80004C1.52163 20.85 1.25446 20.7394 1.05756 20.5425C0.860653 20.3456 0.750049 20.0785 0.750049 19.8V14.7999C0.750049 14.4247 0.950194 14.078 1.27507 13.8905C1.5999 13.703 2.00018 13.703 2.32501 13.8905C2.64989 14.078 2.85003 14.4247 2.85003 14.7999V18.7498Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.5\"/>\n</svg>\n";
51722
+
51723
+ const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.1568 23.15C15.7408 23.15 16.2142 22.6766 16.2142 22.0926V17.1947C16.2142 16.7253 16.5948 16.3447 17.0642 16.3447H21.9621C22.5461 16.3447 23.0195 15.8713 23.0195 15.2873C23.0195 14.7034 22.5461 14.2299 21.9621 14.2299H16.0642C14.9832 14.2299 14.0995 15.1137 14.0995 16.1947V22.0926C14.0995 22.6766 14.5729 23.15 15.1568 23.15Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n <path\n d=\"M1.90739 10.7701H7.80528C8.88627 10.7701 9.77006 9.88627 9.77006 8.80528V2.90739C9.77006 2.32341 9.29665 1.85 8.71267 1.85C8.12869 1.85 7.65528 2.32341 7.65528 2.90739V7.80528C7.65528 8.27472 7.27472 8.65528 6.80528 8.65528H1.90739C1.32341 8.65528 0.85 9.12869 0.85 9.71267C0.85 10.2966 1.32341 10.7701 1.90739 10.7701Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n <path\n d=\"M8.71261 23.15C9.29659 23.15 9.77 22.6766 9.77 22.0926V16.1947C9.77 15.1137 8.88621 14.2299 7.80521 14.2299H1.90733C1.32335 14.2299 0.849939 14.7034 0.849939 15.2873C0.849939 15.8713 1.32335 16.3447 1.90733 16.3447H6.80521C7.27466 16.3447 7.65521 16.7253 7.65521 17.1947V22.0926C7.65521 22.6766 8.12862 23.15 8.71261 23.15Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n <path\n d=\"M21.9621 10.7701C22.5461 10.7701 23.0195 10.2966 23.0195 9.71267C23.0195 9.12869 22.5461 8.65528 21.9621 8.65528H17.0642C16.5948 8.65528 16.2142 8.27472 16.2142 7.80528V2.90739C16.2142 2.32341 15.7408 1.85 15.1568 1.85C14.5729 1.85 14.0995 2.32341 14.0995 2.90739V8.80528C14.0995 9.88627 14.9832 10.7701 16.0642 10.7701H21.9621Z\"\n fill=\"#C9C9C9\" stroke=\"#C9C9C9\" stroke-width=\"0.3\"/>\n</svg>\n";
51724
+
51650
51725
  // This is a derived work from the {@link https://github.com/clappr/clappr-plugins/tree/ffaa9d27005fa5a8a7c243ffc47eb5655b84b371/src/plugins/media_control | Clappr MediaControl plugin}
51651
51726
  // It is redistributed under the terms of the {@link ../../../../../LICENSE | Apache 2.0} license.
51652
51727
  // Copyright 2014 Globo.com Player authors. All rights reserved.
@@ -51681,7 +51756,7 @@ const INITIAL_SETTINGS = {
51681
51756
  default: [],
51682
51757
  seekEnabled: false,
51683
51758
  };
51684
- const T$6 = 'plugins.media_control';
51759
+ const T$5 = 'plugins.media_control';
51685
51760
  /**
51686
51761
  * Extended events for the {@link MediaControl} plugin
51687
51762
  * @public
@@ -51862,8 +51937,6 @@ class MediaControl extends UICorePlugin {
51862
51937
  'touchmove .bar-container[data-seekbar]': 'mousemoveOnSeekBar',
51863
51938
  'mouseleave .bar-container[data-seekbar]': 'mouseleaveOnSeekBar',
51864
51939
  'touchend .bar-container[data-seekbar]': 'mouseleaveOnSeekBar',
51865
- 'mouseenter .media-control-layer[data-controls]': 'setUserKeepVisible',
51866
- 'mouseleave .media-control-layer[data-controls]': 'resetUserKeepVisible',
51867
51940
  };
51868
51941
  }
51869
51942
  get currentSeekPos() {
@@ -51945,7 +52018,6 @@ class MediaControl extends UICorePlugin {
51945
52018
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PAUSE, this.changeTogglePlay);
51946
52019
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_STOP, this.changeTogglePlay);
51947
52020
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_DBLCLICK, this.toggleFullscreen);
51948
- this.listenTo(this.core.activeContainer, Events$1.CONTAINER_CLICK, () => this.clickaway(this.core.activeContainer.$el[0]));
51949
52021
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
51950
52022
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PROGRESS, this.updateProgressBar);
51951
52023
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_SETTINGSUPDATE, this.updateSettings);
@@ -51959,12 +52031,10 @@ class MediaControl extends UICorePlugin {
51959
52031
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
51960
52032
  this.listenTo(this.core, Events$1.CONTAINER_DESTROYED, () => {
51961
52033
  this.cancelRenderTimer();
52034
+ this.setKeepVisible(false);
51962
52035
  });
51963
52036
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_MOUSE_ENTER, this.show);
51964
52037
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_MOUSE_LEAVE, this.delayHide);
51965
- this.listenTo(this.core.activeContainer, Events$1.CONTAINER_DESTROYED, () => {
51966
- this.clickaway(null);
51967
- });
51968
52038
  }
51969
52039
  /**
51970
52040
  * Hides the media control UI
@@ -51979,7 +52049,7 @@ class MediaControl extends UICorePlugin {
51979
52049
  * Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
51980
52050
  */
51981
52051
  enable() {
51982
- trace(`${T$6} enable`, {
52052
+ trace(`${T$5} enable`, {
51983
52053
  chromeless: this.options.chromeless,
51984
52054
  userDisabled: this.userDisabled,
51985
52055
  });
@@ -52095,7 +52165,7 @@ class MediaControl extends UICorePlugin {
52095
52165
  this.$playPauseToggle?.append(playIcon);
52096
52166
  this.$playStopToggle?.append(playIcon);
52097
52167
  this.trigger(Events$1.MEDIACONTROL_NOTPLAYING);
52098
- if (Browser.isMobile) {
52168
+ if (isMobile()) {
52099
52169
  this.show();
52100
52170
  }
52101
52171
  }
@@ -52136,7 +52206,7 @@ class MediaControl extends UICorePlugin {
52136
52206
  this.$el.removeClass('w370');
52137
52207
  this.$el.removeClass('w270');
52138
52208
  this.verticalVolume = false;
52139
- trace(`${T$6} playerResize`, {
52209
+ trace(`${T$5} playerResize`, {
52140
52210
  width: this.container.$el.width(),
52141
52211
  height: this.container.$el.height(),
52142
52212
  hideVolumeBar: this.options.hideVolumeBar});
@@ -52145,7 +52215,7 @@ class MediaControl extends UICorePlugin {
52145
52215
  if (skinWidth <= 370 || this.options.hideVolumeBar) {
52146
52216
  this.$el.addClass('w370');
52147
52217
  }
52148
- if (skinWidth <= 270 && !Browser.isMobile) {
52218
+ if (skinWidth <= 270 && !isMobile()) {
52149
52219
  this.verticalVolume = true;
52150
52220
  this.$el.addClass('w270');
52151
52221
  }
@@ -52157,6 +52227,15 @@ class MediaControl extends UICorePlugin {
52157
52227
  this.container.isPlaying() ? this.container.pause() : this.container.play();
52158
52228
  return false;
52159
52229
  }
52230
+ play() {
52231
+ this.container && this.container.play();
52232
+ }
52233
+ pause() {
52234
+ this.container && this.container.pause();
52235
+ }
52236
+ stop() {
52237
+ this.container && this.container.stop();
52238
+ }
52160
52239
  togglePlayStop() {
52161
52240
  this.container.isPlaying()
52162
52241
  ? this.container.stop({ ui: true })
@@ -52257,11 +52336,11 @@ class MediaControl extends UICorePlugin {
52257
52336
  }
52258
52337
  }
52259
52338
  toggleFullscreen() {
52260
- if (!Browser.isMobile) {
52339
+ if (!isMobile()) {
52261
52340
  this.trigger(Events$1.MEDIACONTROL_FULLSCREEN, this.name);
52262
52341
  this.core.activeContainer.fullscreen();
52263
52342
  this.core.toggleFullscreen();
52264
- this.resetUserKeepVisible();
52343
+ // this.resetUserKeepVisible()
52265
52344
  }
52266
52345
  }
52267
52346
  onActiveContainerChanged() {
@@ -52382,13 +52461,6 @@ class MediaControl extends UICorePlugin {
52382
52461
  this.core.activeContainer && this.core.activeContainer.seekPercentage(pos);
52383
52462
  this.setSeekPercentage(pos);
52384
52463
  }
52385
- setUserKeepVisible(e) {
52386
- this.userKeepVisible = true;
52387
- this.clickaway(this.core.activeContainer.$el[0]);
52388
- }
52389
- resetUserKeepVisible = (e) => {
52390
- this.userKeepVisible = false;
52391
- };
52392
52464
  isVisible() {
52393
52465
  return !this.$el.hasClass('media-control-hide');
52394
52466
  }
@@ -52396,7 +52468,6 @@ class MediaControl extends UICorePlugin {
52396
52468
  if (this.disabled || this.options.disableControlPanel) {
52397
52469
  return;
52398
52470
  }
52399
- const timeout = DEFAULT_HIDE_DELAY;
52400
52471
  const mousePointerMoved = event &&
52401
52472
  event.clientX !== this.lastMouseX &&
52402
52473
  event.clientY !== this.lastMouseY;
@@ -52405,26 +52476,25 @@ class MediaControl extends UICorePlugin {
52405
52476
  clearTimeout(this.hideId);
52406
52477
  this.hideId = null;
52407
52478
  }
52479
+ this.hideId = setTimeout(() => this.hide(), DEFAULT_HIDE_DELAY);
52408
52480
  this.$el.show();
52409
52481
  this.trigger(Events$1.MEDIACONTROL_SHOW, this.name);
52410
52482
  this.core.activeContainer?.trigger(Events$1.CONTAINER_MEDIACONTROL_SHOW, this.name);
52411
52483
  this.$el.removeClass('media-control-hide');
52412
- this.hideId = setTimeout(() => this.hide(), timeout);
52413
52484
  if (event) {
52414
52485
  this.lastMouseX = event.clientX;
52415
52486
  this.lastMouseY = event.clientY;
52416
52487
  }
52417
52488
  }
52418
- const showing = true;
52419
- this.updateCursorStyle(showing);
52489
+ this.updateCursorStyle(true);
52420
52490
  }
52421
52491
  hide(delay = 0) {
52422
52492
  if (!this.isVisible()) {
52423
52493
  return;
52424
52494
  }
52425
- const timeout = delay || 2000;
52426
52495
  if (this.hideId !== null) {
52427
52496
  clearTimeout(this.hideId);
52497
+ this.hideId = null;
52428
52498
  }
52429
52499
  if (!this.disabled && this.options.hideMediaControl === false) {
52430
52500
  return;
@@ -52433,7 +52503,7 @@ class MediaControl extends UICorePlugin {
52433
52503
  const hasDraggingAction = this.draggingSeekBar || this.draggingVolumeBar;
52434
52504
  if (!this.disabled &&
52435
52505
  (delay || hasKeepVisibleRequested || hasDraggingAction)) {
52436
- this.hideId = setTimeout(() => this.hide(), timeout);
52506
+ this.hideId = setTimeout(() => this.hide(), delay || 2000);
52437
52507
  }
52438
52508
  else {
52439
52509
  if (!this.options.controlsDontHide || isFullscreen(this.container.el)) {
@@ -52568,19 +52638,13 @@ class MediaControl extends UICorePlugin {
52568
52638
  /**
52569
52639
  * Set or reset the keep visibility state
52570
52640
  *
52571
- * Keep visibility state controls whether the media control is hidden automatically after a delay.
52572
- * Keep visibility prevents the the auto-hide behaviour
52641
+ * Keep visibility state controls whether the media control is hidden automatically after a delay, which is a default behaviour.
52573
52642
  *
52574
52643
  * @param keepVisible - The state
52575
52644
  */
52576
52645
  setKeepVisible(keepVisible) {
52577
52646
  this.keepVisible = keepVisible;
52578
- if (keepVisible) {
52579
- this.clickaway(this.core.activeContainer.$el[0]);
52580
- }
52581
- else {
52582
- this.clickaway(null);
52583
- }
52647
+ this.clickaway(keepVisible ? this.core.activeContainer.$el[0] : null);
52584
52648
  }
52585
52649
  getMountParent(name) {
52586
52650
  switch (name) {
@@ -52661,7 +52725,7 @@ class MediaControl extends UICorePlugin {
52661
52725
  });
52662
52726
  }
52663
52727
  bindKeyEvents() {
52664
- if (Browser.isMobile || this.options.disableKeyboardShortcuts) {
52728
+ if (isMobile() || this.options.disableKeyboardShortcuts) {
52665
52729
  return;
52666
52730
  }
52667
52731
  this.unbindKeyEvents();
@@ -52748,6 +52812,7 @@ class MediaControl extends UICorePlugin {
52748
52812
  * @internal
52749
52813
  */
52750
52814
  destroy() {
52815
+ this.cancelTimers();
52751
52816
  this.cancelRenderTimer();
52752
52817
  $(document).unbind('mouseup', this.stopDrag);
52753
52818
  $(document).unbind('mousemove', this.updateDrag);
@@ -52756,6 +52821,17 @@ class MediaControl extends UICorePlugin {
52756
52821
  this.unbindKeyEvents();
52757
52822
  return super.destroy();
52758
52823
  }
52824
+ cancelTimers() {
52825
+ if (this.hideId !== null) {
52826
+ clearTimeout(this.hideId);
52827
+ this.hideId = null;
52828
+ }
52829
+ if (this.hideVolumeId !== null) {
52830
+ clearTimeout(this.hideVolumeId);
52831
+ this.hideVolumeId = null;
52832
+ }
52833
+ this.cancelRenderTimer();
52834
+ }
52759
52835
  cancelRenderTimer() {
52760
52836
  if (this.renderTimerId) {
52761
52837
  clearTimeout(this.renderTimerId);
@@ -52785,7 +52861,7 @@ class MediaControl extends UICorePlugin {
52785
52861
  }
52786
52862
  // Video volume cannot be changed with Safari on mobile devices
52787
52863
  // Display mute/unmute icon only if Safari version >= 10
52788
- if (Browser.isSafari && Browser.isMobile) {
52864
+ if (Browser.isSafari && isMobile()) {
52789
52865
  if (Browser.version < 10) {
52790
52866
  this.$volumeContainer?.css({ display: 'none' });
52791
52867
  }
@@ -52802,7 +52878,7 @@ class MediaControl extends UICorePlugin {
52802
52878
  setTimeout(() => {
52803
52879
  !this.settings.seekEnabled &&
52804
52880
  this.$seekBarContainer?.addClass('seek-disabled');
52805
- !Browser.isMobile &&
52881
+ !isMobile() &&
52806
52882
  !this.options.disableKeyboardShortcuts &&
52807
52883
  this.bindKeyEvents();
52808
52884
  this.playerResize({
@@ -52826,6 +52902,7 @@ class MediaControl extends UICorePlugin {
52826
52902
  this.container.fullscreen();
52827
52903
  // TODO: fix after it full screen will be fixed on iOS
52828
52904
  if (Browser.isiOS) {
52905
+ // TODO use isFullscreen utility function
52829
52906
  if (this.core.isFullscreen()) {
52830
52907
  Fullscreen.cancelFullscreen(this.core.el);
52831
52908
  }
@@ -52836,7 +52913,6 @@ class MediaControl extends UICorePlugin {
52836
52913
  else {
52837
52914
  this.core.toggleFullscreen();
52838
52915
  }
52839
- this.resetUserKeepVisible();
52840
52916
  }
52841
52917
  static getPageX(event) {
52842
52918
  return getPageX(event);
@@ -52881,7 +52957,7 @@ class MediaControl extends UICorePlugin {
52881
52957
  delayHide() {
52882
52958
  this.hide(this.options.hideMediaControlDelay || DEFAULT_HIDE_DELAY);
52883
52959
  }
52884
- clickaway = mediaControlClickaway(() => this.resetUserKeepVisible());
52960
+ clickaway = mediaControlClickaway(() => this.setKeepVisible(false));
52885
52961
  }
52886
52962
  MediaControl.extend = function (properties) {
52887
52963
  return extend(MediaControl, properties);
@@ -53130,7 +53206,7 @@ const templateHtml$2 = "<div class=\"big-mute-icon-wrapper\" data-big-mute id=\"
53130
53206
 
53131
53207
  insertStyle(".big-mute-icon-wrapper[data-big-mute] {\n position: absolute;\n z-index: 9998;\n background-color: transparent;\n display: flex;\n justify-content: center;\n width: 100%;\n height: calc(100% - 50px);\n margin: 0 auto;\n opacity: 0.75;\n transition: opacity 0.1s ease;\n pointer-events: auto;\n}\n.big-mute-icon-wrapper[data-big-mute].hide {\n display: none;\n}\n.big-mute-icon-wrapper[data-big-mute]:hover {\n cursor: pointer;\n}\n\n.big-mute-icon[data-big-mute-icon] {\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: center;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n background: rgba(240, 243, 247, 0.9411764706);\n z-index: 10000;\n}\n.big-mute-icon[data-big-mute-icon] svg {\n margin-left: 5px;\n width: 80px;\n height: 80px;\n}\n.big-mute-icon[data-big-mute-icon] svg path {\n fill: #1f1e1e !important;\n}\n.big-mute-icon[data-big-mute-icon]:hover {\n background: rgba(240, 243, 247, 0.8784313725);\n}\n.big-mute-icon[data-big-mute-icon]:hover svg path {\n fill: #151515 !important;\n}");
53132
53208
 
53133
- const T$5 = 'plugins.big_mute_button';
53209
+ const T$4 = 'plugins.big_mute_button';
53134
53210
  // TODO rewrite as a container plugin
53135
53211
  /**
53136
53212
  * `PLUGIN` that displays a big mute button over the video when it's being played muted.
@@ -53193,7 +53269,7 @@ class BigMuteButton extends UICorePlugin {
53193
53269
  if (autoPlay) {
53194
53270
  this.autoPlay = true;
53195
53271
  }
53196
- trace(`${T$5} onPlay`, {
53272
+ trace(`${T$4} onPlay`, {
53197
53273
  autoPlay: this.autoPlay});
53198
53274
  if (this.autoPlay && !wasMuted && volume === 0) {
53199
53275
  this.mount();
@@ -55909,7 +55985,7 @@ const PLAYBACK_NAMES = {
55909
55985
  hls: 'HLS.js',
55910
55986
  html5_video: 'Native',
55911
55987
  };
55912
- const T$4 = 'plugins.nerd_stats';
55988
+ const T$3 = 'plugins.nerd_stats';
55913
55989
  /**
55914
55990
  * `PLUGIN` that displays useful statistics regarding the playback as well as the network quality estimation.
55915
55991
  * @public
@@ -56046,7 +56122,7 @@ class NerdStats extends UICorePlugin {
56046
56122
  return super.destroy();
56047
56123
  }
56048
56124
  toggle = () => {
56049
- trace(`${T$4} toggle`, {
56125
+ trace(`${T$3} toggle`, {
56050
56126
  open: this.open,
56051
56127
  });
56052
56128
  if (this.open) {
@@ -56940,7 +57016,7 @@ const buttonHtml$2 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\"
56940
57016
  insertStyle(".media-control-skin-1 .media-control-item.media-control-pip {\n order: 95;\n}\n.media-control-skin-1 .media-control-item.media-control-pip button {\n height: 20px;\n}\n.media-control-skin-1 .media-control-item.media-control-pip button svg {\n height: 20px;\n}");
56941
57017
 
56942
57018
  const VERSION$3 = '0.0.1';
56943
- const T$3 = `plugins.pip`;
57019
+ const T$2 = `plugins.pip`;
56944
57020
  /**
56945
57021
  * `PLUGIN` that enables picture-in-picture mode.
56946
57022
  * @public
@@ -57024,7 +57100,7 @@ class PictureInPicture extends UICorePlugin {
57024
57100
  }
57025
57101
  }
57026
57102
  requestPictureInPicture() {
57027
- trace(`${T$3} requestPictureInPicture`, {
57103
+ trace(`${T$2} requestPictureInPicture`, {
57028
57104
  videoElement: !!this.videoElement,
57029
57105
  });
57030
57106
  this.videoElement.requestPictureInPicture();
@@ -57056,7 +57132,7 @@ const DEFAULT_PLAYBACK_RATES = [
57056
57132
  { value: 2.0, label: '2x' },
57057
57133
  ];
57058
57134
  const DEFAULT_PLAYBACK_RATE = 1;
57059
- const T$2 = 'plugins.playback_rate';
57135
+ const T$1 = 'plugins.playback_rate';
57060
57136
  /**
57061
57137
  * `PLUGIN` that allows changing the playback speed of the video.
57062
57138
  * @public
@@ -57163,7 +57239,7 @@ class PlaybackRate extends UICorePlugin {
57163
57239
  this.mount();
57164
57240
  }
57165
57241
  mount() {
57166
- trace(`${T$2} mount`, {
57242
+ trace(`${T$1} mount`, {
57167
57243
  shouldMount: this.shouldMount(),
57168
57244
  });
57169
57245
  if (!this.shouldMount()) {
@@ -57180,7 +57256,7 @@ class PlaybackRate extends UICorePlugin {
57180
57256
  })));
57181
57257
  }
57182
57258
  onMetaDataLoaded() {
57183
- trace(`${T$2} onMetaDataLoaded`, {
57259
+ trace(`${T$1} onMetaDataLoaded`, {
57184
57260
  playbackType: this.core.activePlayback.getPlaybackType(),
57185
57261
  dvrEnabled: this.core.activePlayback.dvrEnabled,
57186
57262
  });
@@ -57202,7 +57278,7 @@ class PlaybackRate extends UICorePlugin {
57202
57278
  this.core.activePlayback?.setPlaybackRate(this.selectedRate);
57203
57279
  }
57204
57280
  else {
57205
- trace(`${T$2} onPlaybackRateChange not steering to the selected rate, it is seemingly a catchup algorithm working`, {
57281
+ trace(`${T$1} onPlaybackRateChange not steering to the selected rate, it is seemingly a catchup algorithm working`, {
57206
57282
  selectedRate: this.selectedRate,
57207
57283
  });
57208
57284
  }
@@ -57264,13 +57340,13 @@ class PlaybackRate extends UICorePlugin {
57264
57340
  }
57265
57341
  }
57266
57342
  syncRate() {
57267
- trace(`${T$2} syncRate`, {
57343
+ trace(`${T$1} syncRate`, {
57268
57344
  selectedRate: this.selectedRate,
57269
57345
  });
57270
57346
  this.core.activePlayback?.setPlaybackRate(this.selectedRate);
57271
57347
  }
57272
57348
  resetPlaybackRate() {
57273
- trace(`${T$2} resetPlaybackRate`, {
57349
+ trace(`${T$1} resetPlaybackRate`, {
57274
57350
  selectedRate: this.selectedRate,
57275
57351
  });
57276
57352
  this.core.activePlayback?.setPlaybackRate(DEFAULT_PLAYBACK_RATE);
@@ -57305,7 +57381,7 @@ class PlaybackRate extends UICorePlugin {
57305
57381
  ?.label || `x${rate}`);
57306
57382
  }
57307
57383
  highlightCurrentRate() {
57308
- trace(`${T$2} highlightCurrentRate`, {
57384
+ trace(`${T$1} highlightCurrentRate`, {
57309
57385
  selectedRate: this.selectedRate,
57310
57386
  });
57311
57387
  this.allRateElements().removeClass('current');
@@ -58219,7 +58295,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
58219
58295
  }
58220
58296
  }
58221
58297
 
58222
- const T$1 = 'plugins.source_controller';
58298
+ const T = 'plugins.source_controller';
58223
58299
  const INITIAL_RETRY_DELAY = 1000;
58224
58300
  const MAX_RETRY_DELAY = 5000;
58225
58301
  const RETRY_DELAY_BLUR = 500;
@@ -58392,7 +58468,7 @@ class SourceController extends CorePlugin {
58392
58468
  }
58393
58469
  bindContainerEventListeners() {
58394
58470
  this.core.activePlayback.on(Events$1.PLAYBACK_ERROR, (error) => {
58395
- trace(`${T$1} on PLAYBACK_ERROR`, {
58471
+ trace(`${T} on PLAYBACK_ERROR`, {
58396
58472
  error: {
58397
58473
  code: error?.code,
58398
58474
  description: error?.description,
@@ -58416,7 +58492,7 @@ class SourceController extends CorePlugin {
58416
58492
  }
58417
58493
  });
58418
58494
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAY, (_, { autoPlay }) => {
58419
- trace(`${T$1} onContainerPlay`, {
58495
+ trace(`${T} onContainerPlay`, {
58420
58496
  currentSource: this.sourcesList[this.currentSourceIndex],
58421
58497
  retrying: this.active,
58422
58498
  });
@@ -58433,7 +58509,7 @@ class SourceController extends CorePlugin {
58433
58509
  this.sourcesDelay = {};
58434
58510
  }
58435
58511
  retryPlayback() {
58436
- trace(`${T$1} retryPlayback enter`, {
58512
+ trace(`${T} retryPlayback enter`, {
58437
58513
  currentSourceIndex: this.currentSourceIndex,
58438
58514
  currentSource: this.sourcesList[this.currentSourceIndex],
58439
58515
  });
@@ -58446,7 +58522,7 @@ class SourceController extends CorePlugin {
58446
58522
  this.switching = false;
58447
58523
  this.core.load(nextSource.source, nextSource.mimeType);
58448
58524
  setTimeout(() => {
58449
- trace(`${T$1} retryPlayback playing`, {
58525
+ trace(`${T} retryPlayback playing`, {
58450
58526
  autoPlay: this.autoPlay});
58451
58527
  this.core.activeContainer.play({
58452
58528
  autoPlay: this.autoPlay,
@@ -58485,7 +58561,6 @@ const stringHTML = "<div class=\"gplayer-cc-line\" id=\"gplayer-cc-line\">\n <p
58485
58561
 
58486
58562
  const VERSION = '2.19.14';
58487
58563
  const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
58488
- const T = 'plugins.cc';
58489
58564
  /**
58490
58565
  * `PLUGIN` that provides a UI to select the subtitles when available.
58491
58566
  * @public
@@ -58580,6 +58655,7 @@ class ClosedCaptions extends UICorePlugin {
58580
58655
  bindEvents() {
58581
58656
  this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
58582
58657
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
58658
+ this.listenTo(this.core, Events$1.PLAYBACK_READY, this.onPlaybackReady);
58583
58659
  }
58584
58660
  onCoreReady() {
58585
58661
  const mediaControl = this.core.getPlugin('media_control');
@@ -58593,18 +58669,15 @@ class ClosedCaptions extends UICorePlugin {
58593
58669
  this.hideMenu();
58594
58670
  }
58595
58671
  });
58672
+ this.onPlaybackReady();
58596
58673
  }
58597
58674
  onContainerChanged() {
58675
+ this.tracks = [];
58598
58676
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_FULLSCREEN, this.onContainerResize);
58599
58677
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_RESIZE, this.onContainerResize);
58600
58678
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_DESTROYED, () => {
58601
58679
  this.clickaway(null);
58602
58680
  });
58603
- // this.listenTo(
58604
- // this.core.activeContainer,
58605
- // 'container:advertisement:start',
58606
- // this.onStartAd,
58607
- // )
58608
58681
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
58609
58682
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
58610
58683
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_CLICK, () => {
@@ -58626,23 +58699,32 @@ class ClosedCaptions extends UICorePlugin {
58626
58699
  });
58627
58700
  this.isPreselectedApplied = false;
58628
58701
  }
58702
+ onPlaybackReady() {
58703
+ this.core.activePlayback.oncueenter = (e) => {
58704
+ this.setSubtitleText(e.text);
58705
+ };
58706
+ this.core.activePlayback.oncueexit = () => {
58707
+ this.clearSubtitleText();
58708
+ };
58709
+ }
58629
58710
  onSubtitleAvailable() {
58630
- trace(`${T} onSubtitleAvailable`, {
58631
- tracks: this.core.activePlayback.closedCaptionsTracks.length,
58632
- });
58633
58711
  this.applyTracks();
58634
58712
  this.mount();
58635
58713
  }
58636
58714
  onSubtitleChanged({ id: changedId }) {
58637
58715
  // ignoring the subtitle selected by the playback engine or user agent
58638
- const id = this.track?.id ?? -1;
58716
+ const id = this.currentTrack?.id ?? -1;
58639
58717
  if (id === -1) {
58640
58718
  this.clearSubtitleText();
58641
58719
  }
58642
58720
  this.activateTrack(id);
58643
58721
  }
58644
58722
  activateTrack(id) {
58645
- for (const track of this.tracks) {
58723
+ if (['dash', 'hls'].includes(this.core.activePlayback?.name)) {
58724
+ this.core.activePlayback.setTextTrack(id);
58725
+ return;
58726
+ }
58727
+ for (const track of this.currentTracks) {
58646
58728
  if (track.id === id) {
58647
58729
  if (this.useNativeSubtitles) {
58648
58730
  track.track.mode = 'showing';
@@ -58666,43 +58748,26 @@ class ClosedCaptions extends UICorePlugin {
58666
58748
  };
58667
58749
  }
58668
58750
  else {
58669
- track.track.oncuechange = null;
58751
+ track.track.oncuechange = () => { };
58670
58752
  track.track.mode = 'disabled';
58671
58753
  }
58672
58754
  }
58673
58755
  }
58674
58756
  applyTracks() {
58675
58757
  try {
58676
- this.tracks = this.core.activePlayback.closedCaptionsTracks;
58758
+ // TODO ensure to apply only once
58759
+ this.currentTracks = this.core.activePlayback.closedCaptionsTracks;
58677
58760
  this.applyPreselectedSubtitles();
58678
58761
  this.render();
58679
58762
  }
58680
58763
  catch (error) {
58681
58764
  }
58682
58765
  }
58683
- // private onStartAd() {
58684
- // if (this.active && this.core.activeContainer) {
58685
- // this.hide()
58686
- // this.listenTo(
58687
- // this.core.activeContainer,
58688
- // 'container:advertisement:finish',
58689
- // this.onFinishAd,
58690
- // )
58691
- // }
58692
- // }
58693
- // private onFinishAd() {
58694
- // this.show()
58695
- // this.stopListening(
58696
- // this.core.activeContainer,
58697
- // 'container:advertisement:finish',
58698
- // this.onFinishAd,
58699
- // )
58700
- // }
58701
58766
  onContainerResize() {
58702
58767
  const shouldShow = this.core.activeContainer &&
58703
58768
  isFullscreen(this.core.activeContainer.el) &&
58704
- this.track &&
58705
- this.track.track.mode &&
58769
+ this.currentTrack &&
58770
+ this.currentTrack.track.mode &&
58706
58771
  Browser.isiOS &&
58707
58772
  this.active;
58708
58773
  if (shouldShow) {
@@ -58725,10 +58790,8 @@ class ClosedCaptions extends UICorePlugin {
58725
58790
  this.$el.find('#gplayer-cc-menu').hide();
58726
58791
  this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
58727
58792
  this.$line.hide();
58728
- if (this.tracks) {
58729
- for (const t of this.tracks) {
58730
- t.track.mode = 'hidden';
58731
- }
58793
+ for (const track of this.currentTracks) {
58794
+ track.track.mode = 'hidden';
58732
58795
  }
58733
58796
  }
58734
58797
  /**
@@ -58739,18 +58802,19 @@ class ClosedCaptions extends UICorePlugin {
58739
58802
  this.renderIcon();
58740
58803
  if (this.core.activeContainer &&
58741
58804
  isFullscreen(this.core.activeContainer.el) &&
58742
- this.track &&
58743
- this.track.track.mode &&
58805
+ this.currentTrack &&
58806
+ // this.currentTrack.track.mode &&
58744
58807
  (Browser.isiOS || this.useNativeSubtitles)) {
58745
58808
  this.$line.hide();
58746
- this.track.track.mode = 'showing';
58809
+ this.currentTrack.track.mode = 'showing';
58747
58810
  }
58748
58811
  else {
58749
58812
  this.$line.show();
58750
58813
  }
58751
58814
  }
58752
58815
  shouldRender() {
58753
- return this.tracks?.length > 0;
58816
+ // this might not have been fully initialized yet since `render` is called from the parent class constructor
58817
+ return this.currentTracks?.length > 0;
58754
58818
  }
58755
58819
  resizeFont() {
58756
58820
  if (!this.$line) {
@@ -58763,13 +58827,16 @@ class ClosedCaptions extends UICorePlugin {
58763
58827
  * @internal
58764
58828
  */
58765
58829
  render() {
58830
+ if (!this.shouldRender()) {
58831
+ return this;
58832
+ }
58766
58833
  if (!this.core.activeContainer) {
58767
58834
  return this;
58768
58835
  }
58769
58836
  this.$el.html(ClosedCaptions.templateControl({
58770
- tracks: this.tracks ?? [],
58837
+ tracks: this.currentTracks,
58771
58838
  i18n: this.core.i18n,
58772
- current: this.track?.id ?? -1,
58839
+ current: this.currentTrack?.id ?? -1,
58773
58840
  }));
58774
58841
  this.$el.find('#gplayer-cc-menu').hide();
58775
58842
  this.open = false;
@@ -58783,11 +58850,11 @@ class ClosedCaptions extends UICorePlugin {
58783
58850
  return this;
58784
58851
  }
58785
58852
  findById(id) {
58786
- return this.tracks.find((track) => track.id === id) ?? null;
58853
+ return this.currentTracks.find((track) => track.id === id) || null;
58787
58854
  }
58788
58855
  selectItem(item) {
58789
58856
  this.clearSubtitleText();
58790
- this.track = item;
58857
+ this.currentTrack = item;
58791
58858
  const trackId = item?.id ?? -1;
58792
58859
  this.core.activePlayback.closedCaptionsTrackId = trackId;
58793
58860
  this.updateSelection();
@@ -58844,7 +58911,7 @@ class ClosedCaptions extends UICorePlugin {
58844
58911
  return this.$el.find('#gplayer-cc-menu li'); // TODO fix semantically
58845
58912
  }
58846
58913
  selectSubtitles() {
58847
- const trackId = this.track ? this.track.id : -1;
58914
+ const trackId = this.currentTrack?.id ?? -1;
58848
58915
  // TODO find out if this is needed
58849
58916
  this.core.activePlayback.closedCaptionsTrackId = trackId;
58850
58917
  // this.core.activePlayback.closedCaptionsTrackId = -1
@@ -58870,7 +58937,7 @@ class ClosedCaptions extends UICorePlugin {
58870
58937
  this.setSubtitleText('');
58871
58938
  }
58872
58939
  updateSelection() {
58873
- if (!this.track) {
58940
+ if (!this.currentTrack) {
58874
58941
  this.hide();
58875
58942
  }
58876
58943
  else {
@@ -58885,7 +58952,7 @@ class ClosedCaptions extends UICorePlugin {
58885
58952
  .find('a')
58886
58953
  .removeClass('gcore-skin-active')
58887
58954
  .attr('aria-checked', 'false');
58888
- const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
58955
+ const currentLevelElement = this.itemElement(this.currentTrack?.id ?? -1);
58889
58956
  currentLevelElement
58890
58957
  .addClass('current')
58891
58958
  .find('a')
@@ -58910,15 +58977,28 @@ class ClosedCaptions extends UICorePlugin {
58910
58977
  }
58911
58978
  }
58912
58979
  get useNativeSubtitles() {
58913
- if (this.core.activePlayback?.name === 'dash') {
58914
- return true;
58915
- }
58916
58980
  const mode = this.core.options.cc?.mode ??
58917
58981
  this.core.options.subtitles?.mode ??
58918
58982
  'custom';
58919
58983
  // TODO or Safari? or iOS?
58920
58984
  return mode === 'native';
58921
58985
  }
58986
+ get currentTracks() {
58987
+ return this.tracks;
58988
+ }
58989
+ get currentTrack() {
58990
+ return this.track;
58991
+ }
58992
+ set currentTrack(track) {
58993
+ this.track = track;
58994
+ }
58995
+ set currentTracks(tracks) {
58996
+ this.tracks = tracks.map(track => ({
58997
+ id: track.id,
58998
+ name: !track.name || track.name === "null" ? track.track.language : track.name,
58999
+ track: track.track,
59000
+ }));
59001
+ }
58922
59002
  clickaway = mediaControlClickaway(() => this.hideMenu());
58923
59003
  }
58924
59004