@latest-thinking/lt-player 1.1.0 → 1.2.0-b

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 (98) hide show
  1. package/ README.md +126 -0
  2. package/dist/css/lt-player-main.css +1 -1
  3. package/dist/css/lt-player-main.css.map +1 -1
  4. package/dist/js/lt-player-main.js +1 -1
  5. package/dist/js/lt-player-main.js.map +1 -1
  6. package/examples/basic.html +35 -0
  7. package/examples/lt-page-with-player.html +3529 -0
  8. package/examples/lt-page-with-player_files/Weiskopf_Coverphoto.jpg +0 -0
  9. package/examples/lt-page-with-player_files/ajax-progress.module.css +49 -0
  10. package/examples/lt-page-with-player_files/align.module.css +32 -0
  11. package/examples/lt-page-with-player_files/announce.js +49 -0
  12. package/examples/lt-page-with-player_files/autocomplete-loading.module.css +22 -0
  13. package/examples/lt-page-with-player_files/autocomplete.css +16 -0
  14. package/examples/lt-page-with-player_files/bootstrap.css +22691 -0
  15. package/examples/lt-page-with-player_files/clearfix.module.css +15 -0
  16. package/examples/lt-page-with-player_files/container-inline.module.css +16 -0
  17. package/examples/lt-page-with-player_files/cookiesjsr.min.css +10 -0
  18. package/examples/lt-page-with-player_files/core.css +97 -0
  19. package/examples/lt-page-with-player_files/details.module.css +10 -0
  20. package/examples/lt-page-with-player_files/fieldgroup.module.css +9 -0
  21. package/examples/lt-page-with-player_files/hidden.module.css +53 -0
  22. package/examples/lt-page-with-player_files/himme-alexander-beyond_0.jpg +0 -0
  23. package/examples/lt-page-with-player_files/item-list.module.css +19 -0
  24. package/examples/lt-page-with-player_files/js.module.css +22 -0
  25. package/examples/lt-page-with-player_files/latest_thinking.style.css +6496 -0
  26. package/examples/lt-page-with-player_files/logo-small.png +0 -0
  27. package/examples/lt-page-with-player_files/menu.css +64 -0
  28. package/examples/lt-page-with-player_files/nowrap.module.css +8 -0
  29. package/examples/lt-page-with-player_files/paragraphs.unpublished.css +3 -0
  30. package/examples/lt-page-with-player_files/position-container.module.css +8 -0
  31. package/examples/lt-page-with-player_files/progress.module.css +51 -0
  32. package/examples/lt-page-with-player_files/radix.style.css +1 -0
  33. package/examples/lt-page-with-player_files/reset-appearance.module.css +15 -0
  34. package/examples/lt-page-with-player_files/resize.module.css +21 -0
  35. package/examples/lt-page-with-player_files/search_api_autocomplete.css +41 -0
  36. package/examples/lt-page-with-player_files/sticky-header.module.css +13 -0
  37. package/examples/lt-page-with-player_files/system-status-counter.css +30 -0
  38. package/examples/lt-page-with-player_files/system-status-report-counters.css +27 -0
  39. package/examples/lt-page-with-player_files/system-status-report-general-info.css +14 -0
  40. package/examples/lt-page-with-player_files/tabledrag.module.css +98 -0
  41. package/examples/lt-page-with-player_files/tablesort.module.css +19 -0
  42. package/examples/lt-page-with-player_files/theme.css +446 -0
  43. package/examples/lt-page-with-player_files/thumbnail_MPI_CBS_Eingangsbereich.jpg +0 -0
  44. package/examples/lt-page-with-player_files/tree-child.module.css +18 -0
  45. package/examples/lt-page-with-player_files/widget-min.js +10 -0
  46. package/examples/lt-website.html +76 -0
  47. package/examples/portrait-with-subtitles.html +81 -0
  48. package/examples/samples/vtt/Pahl-Kerstin-Maria-MAIN-20230320.vtt +765 -0
  49. package/examples/samples/vtt/Sobolev-Anton-Subtitles-20230518_0.vtt +352 -0
  50. package/examples/samples/vtt/demo.vtt +7 -0
  51. package/package.json +1 -1
  52. package/src/assets/sass/abstracts/_mixins.scss +1 -1
  53. package/src/assets/sass/abstracts/_variables.scss +1 -1
  54. package/src/assets/sass/app.scss +19 -0
  55. package/src/assets/sass/components/_all.scss +1 -1
  56. package/src/assets/sass/components/_loader.scss +187 -0
  57. package/src/assets/sass/components/_modal.scss +6 -0
  58. package/src/assets/sass/core/_player.scss +23 -5
  59. package/src/assets/sass/sections/_additional-info.scss +1 -1
  60. package/src/assets/sass/sections/_control.scss +0 -1
  61. package/src/assets/sass/sections/_poster.scss +1 -0
  62. package/src/assets/sass/sections/_settings.scss +36 -53
  63. package/src/assets/sass/sections/_subtitles.scss +78 -23
  64. package/src/assets/sass/sections/controllers/_botom.scss +59 -36
  65. package/src/assets/sass/sections/controllers/_notification-rewind-forward.scss +29 -14
  66. package/src/assets/sass/sections/controllers/_top.scss +1 -1
  67. package/src/components/LTPlayerDevMethode.ts +106 -84
  68. package/src/components/LTPlayerManager.ts +16 -0
  69. package/src/components/LTPlayerSettingsManager.ts +117 -0
  70. package/src/components/LTPlayerSetup.ts +3 -10
  71. package/src/components/LTPlayerStatusFeedback.ts +76 -0
  72. package/src/components/LTPlayerStorage.ts +58 -0
  73. package/src/components/LTPlayerType.ts +10 -2
  74. package/src/components/LTPlayerUpdate.ts +61 -0
  75. package/src/components/captions/LTPlayerCaptions.ts +80 -0
  76. package/src/components/config/LTPlayerConfig.ts +43 -0
  77. package/src/components/config/LTPlayerConfigProcessor.ts +110 -56
  78. package/src/components/controls/LTPlayerChapters.ts +8 -4
  79. package/src/components/controls/LTPlayerControls.ts +2 -0
  80. package/src/components/controls/LTPlayerControlsEvents.ts +231 -83
  81. package/src/components/controls/settings/LTPlayerCommonSettingsControllers.ts +9 -1
  82. package/src/components/controls/settings/LTPlayerDesktopSettingsControllers.ts +17 -14
  83. package/src/components/controls/settings/LTPlayerMobileSettingsControllers.ts +50 -44
  84. package/src/components/events/LTPlayer.ts +24 -21
  85. package/src/components/events/LTPlayerCommon.ts +94 -20
  86. package/src/components/events/LTPlayerDesktop.ts +21 -7
  87. package/src/components/events/LTPlayerMobile.ts +22 -10
  88. package/src/global/controllers/LTPlayerController.ts +7 -0
  89. package/src/services/Helper.ts +6 -1
  90. package/src/services/ResizeService.ts +35 -30
  91. package/src/services/TemplateService.ts +7 -0
  92. package/src/views/additionalInfo.handlebars +18 -18
  93. package/src/views/controls.handlebars +14 -3
  94. package/src/views/poster.handlebars +2 -2
  95. package/src/views/settings.handlebars +1 -1
  96. package/src/views/settings.mobile.handlebars +22 -0
  97. package/src/views/template.handlebars +4 -1
  98. package/src/assets/sass/components/_spinner.scss +0 -46
@@ -2,7 +2,7 @@ import {LTPlayer} from "../LTPlayerType";
2
2
  import {plyr} from "../../global/types/ModuleTypes";
3
3
  import * as events from "events";
4
4
 
5
- export namespace LTPlayerControlsEvents {
5
+ export namespace LTPlayerControlsEvents {
6
6
 
7
7
  export class Common {
8
8
 
@@ -10,31 +10,31 @@ export namespace LTPlayerControlsEvents {
10
10
 
11
11
  getSelectors(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
12
12
 
13
- let selectors = {
14
- playerContainer: instance.plyr.elements.container,
15
- playerControlsContainer: instance.plyr.elements.controls,
16
- forwardArea: instance.plyr.elements.controls.querySelector('.lt-player-forward-area'),
17
- rewindArea: instance.plyr.elements.controls.querySelector('.lt-player-rewind-area'),
18
- forwardAnimation: instance.plyr.elements.controls.querySelector('.lt-player-forward'),
19
- rewindAnimation: instance.plyr.elements.controls.querySelector('.lt-player-rewind'),
20
- forwardAreaBackground: null as Element,
21
- rewindAreaBackground: null as Element,
22
- forwardAnimationBackground: null as Element,
23
- rewindAnimationBackground: null as Element,
24
-
25
- }
26
-
27
- if (instance.playerConfig.getDevice() === 'mobile') {
28
- selectors.forwardAreaBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-forward-area')
29
- selectors.rewindAreaBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-rewind-area')
30
- selectors.forwardAnimationBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-forward')
31
- selectors.rewindAnimationBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-rewind')
32
- }
33
-
34
- return selectors
13
+ let selectors = {
14
+ playerContainer: instance.plyr.elements.container,
15
+ playerControlsContainer: instance.plyr.elements.controls,
16
+ forwardArea: instance.plyr.elements.controls.querySelector('.lt-player-forward-area'),
17
+ rewindArea: instance.plyr.elements.controls.querySelector('.lt-player-rewind-area'),
18
+ forwardAnimation: instance.plyr.elements.controls.querySelector('.lt-player-forward'),
19
+ rewindAnimation: instance.plyr.elements.controls.querySelector('.lt-player-rewind'),
20
+ forwardAreaBackground: null as Element,
21
+ rewindAreaBackground: null as Element,
22
+ forwardAnimationBackground: null as Element,
23
+ rewindAnimationBackground: null as Element,
24
+
25
+ }
26
+
27
+ if (instance.playerConfig.getDevice() === 'mobile') {
28
+ selectors.forwardAreaBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-forward-area')
29
+ selectors.rewindAreaBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-rewind-area')
30
+ selectors.forwardAnimationBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-forward')
31
+ selectors.rewindAnimationBackground = instance.plyr.elements.container.querySelector('.plyr__controls__mobile-background').querySelector('.lt-player-rewind')
32
+ }
33
+
34
+ return selectors
35
35
  },
36
36
 
37
- updateCurrentTime(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType ,time: number) {
37
+ updateCurrentTime(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, time: number) {
38
38
  if (Math.sign(time)) {
39
39
  instance.plyr.currentTime += time;
40
40
  } else {
@@ -44,7 +44,7 @@ export namespace LTPlayerControlsEvents {
44
44
 
45
45
  playPause(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
46
46
 
47
- const icons = instance.iconService.getIconsByComponent('playPause') as {play : string, pause: string};
47
+ const icons = instance.iconService.getIconsByComponent('playPause') as { play: string, pause: string };
48
48
  const playerStateInfo = instance.plyr.elements.controls.querySelector('.player-state');
49
49
  const iconSelector: HTMLImageElement = playerStateInfo.querySelector('.player-state__icon');
50
50
 
@@ -199,38 +199,145 @@ export namespace LTPlayerControlsEvents {
199
199
  captions.classList.add('d-none');
200
200
  }
201
201
  }
202
+ }
203
+
204
+ showHideText(visible: boolean, controls: HTMLElement) {
205
+ const textControlsElement = controls.querySelector('.lt-player-video-content');
206
+
207
+ if (textControlsElement) {
208
+ if (visible) {
209
+ if (!textControlsElement.classList.contains('lt-player-video-content-enable')) {
210
+ textControlsElement.classList.add('lt-player-video-content-enable')
211
+ }
212
+ } else {
213
+ textControlsElement.classList.remove('lt-player-video-content-enable')
214
+ }
215
+ }
216
+ }
217
+
218
+ showHideSeekBar(visible: boolean, controls: HTMLElement) {
219
+ const seekBarControlsElement = controls.querySelector('.plyr__progress--wrapper');
220
+
221
+ if (seekBarControlsElement) {
222
+ if (visible) {
223
+ if (!seekBarControlsElement.classList.contains('plyr__progress--wrapper-enable')) {
224
+ seekBarControlsElement.classList.add('plyr__progress--wrapper-enable')
225
+ }
226
+ } else {
227
+ seekBarControlsElement.classList.remove('plyr__progress--wrapper-enable')
228
+ }
229
+ }
230
+ }
202
231
 
232
+ showHideBottomControls(visible: boolean, controls: HTMLElement) {
233
+ const bottomControlsElement = controls.querySelector('.bottom-controller');
203
234
 
235
+ if (bottomControlsElement) {
236
+ if (visible) {
237
+ if (!bottomControlsElement.classList.contains('bottom-controller-enable')) {
238
+ bottomControlsElement.classList.add('bottom-controller-enable')
239
+ }
240
+ } else {
241
+ bottomControlsElement.classList.remove('bottom-controller-enable')
242
+ }
243
+ }
204
244
  }
245
+
246
+ showHideAllControls(visible: boolean, controls: HTMLElement) {
247
+ this.showHideText(visible, controls);
248
+ this.showHideSeekBar(visible, controls);
249
+ this.showHideBottomControls(visible, controls);
250
+ }
251
+
205
252
  }
206
253
 
207
254
  export class Desktop {
208
255
 
209
256
  common: Common
257
+
210
258
  constructor() {
211
259
  this.common = new Common();
212
260
  }
261
+
213
262
  titleLineBreak(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
214
- this.common.checkTitleBreakWord(instance)
263
+ return;
264
+ /*Remove title break*/
265
+ // this.common.checkTitleBreakWord(instance);
266
+ /**/
215
267
  }
216
268
 
217
269
 
218
270
  showHide(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
219
271
  const controls = instance.plyr.elements.controls;
220
- const eventsInstance = this;
272
+ const commonInstance = this.common;
273
+ controls.classList.add('plyr__controls-enable');
274
+ instance.statusFeedbackService.setControlsVisible()
275
+
276
+ commonInstance.showHideText(true, controls);
277
+ commonInstance.showHideSeekBar(true, controls);
278
+ commonInstance.showHideBottomControls(true, controls);
279
+
280
+ let timerText: NodeJS.Timeout = null;
281
+ let timerSeekBar: NodeJS.Timeout = null;
282
+ let timerBottomControls: NodeJS.Timeout = null;
221
283
 
222
284
  controls.addEventListener('mouseover', function () {
223
- controls.classList.add('plyr__controls-enable');
224
- eventsInstance.common.subtitlesHide(instance);
285
+
286
+ if (timerText) {
287
+ clearTimeout(timerText);
288
+ }
289
+
290
+ if (timerSeekBar) {
291
+ clearTimeout(timerSeekBar);
292
+ }
293
+
294
+ if (timerBottomControls) {
295
+ clearTimeout(timerBottomControls);
296
+ }
297
+
298
+ if (instance.plyr.paused) {
299
+ commonInstance.showHideAllControls(true, controls);
300
+ return;
301
+ }
302
+
303
+ if (!instance.playerConfig.isPinTextControls()) {
304
+ commonInstance.showHideText(true, controls);
305
+ }
306
+
307
+ if (!instance.playerConfig.isPinSeekBarControls()) {
308
+ commonInstance.showHideSeekBar(true, controls);
309
+ }
310
+
311
+ if (!instance.playerConfig.isPinBottomControls()) {
312
+ commonInstance.showHideBottomControls(true, controls);
313
+ }
314
+
225
315
  })
226
316
 
227
317
 
228
318
  controls.addEventListener('mouseleave', function () {
229
- if (!controls.classList.contains('plyr__controls-enable-settings')) {
230
- controls.classList.remove('plyr__controls-enable');
231
- setTimeout(()=>{
232
- eventsInstance.common.subtitlesShow(instance);
233
- }, 100)
319
+ if (instance.plyr.paused) {
320
+ commonInstance.showHideAllControls(true, controls);
321
+ return;
322
+ }
323
+
324
+ if (!instance.playerConfig.isPinTextControls()) {
325
+ timerText = setTimeout(() => {
326
+ commonInstance.showHideText(false, controls);
327
+ }, 5000)
328
+ }
329
+
330
+ if (!instance.playerConfig.isPinSeekBarControls()) {
331
+ timerSeekBar = setTimeout(() => {
332
+ commonInstance.showHideSeekBar(false, controls);
333
+
334
+ }, 5000)
335
+ }
336
+ if (!instance.playerConfig.isPinBottomControls()) {
337
+ timerBottomControls = setTimeout(() => {
338
+ instance.statusFeedbackService.clearControlsVisible()
339
+ commonInstance.showHideBottomControls(false, controls);
340
+ }, 5000)
234
341
  }
235
342
  })
236
343
  }
@@ -248,7 +355,7 @@ export namespace LTPlayerControlsEvents {
248
355
  }
249
356
  }
250
357
 
251
- fullscreenIcon(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string){
358
+ fullscreenIcon(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string) {
252
359
 
253
360
  let playerControls = instance.plyr.elements.controls;
254
361
  const fullScreenButtonContainer = playerControls.querySelector('.fullscreen-custom-control');
@@ -271,8 +378,8 @@ export namespace LTPlayerControlsEvents {
271
378
  let common = this.common;
272
379
  switch (type) {
273
380
  case 'timeupdate':
274
- this.common.playPauseIconTimeUpdate(instance);
275
- break
381
+ this.common.playPauseIconTimeUpdate(instance);
382
+ break
276
383
  case 'ready':
277
384
  const playButton = instance.plyr.elements.controls.querySelector('.play-button');
278
385
  if (playButton) {
@@ -395,13 +502,18 @@ export namespace LTPlayerControlsEvents {
395
502
  let playerControlsContainer = instance.plyr.elements.controls;
396
503
 
397
504
 
398
- const volume:HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
505
+ const volume: HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
399
506
  const openVolumeButton: HTMLElement = playerControlsContainer.querySelector('.volume_control__volume-button');
400
507
  const muteUnmuteVolumeButton: HTMLElement = playerControlsContainer.querySelector('.volume_control__volume-button-close');
401
508
  const volumeControl: HTMLElement = playerControlsContainer.querySelector('.volume_control__background__area');
402
509
  const volumeBackground: HTMLElement = playerControlsContainer.querySelector('.volume_control__background');
403
510
  const volumeRangeControl: HTMLElement = playerControlsContainer.querySelector('.volume_control__background__area__range');
404
- const rangeVolumesItems: NodeListOf<HTMLElement>= volume.querySelectorAll('.volume-max, .volume-75, .volume-50, .volume-mute');
511
+ const rangeVolumesItems: NodeListOf<HTMLElement> = volume.querySelectorAll('.volume-max, .volume-75, .volume-50, .volume-mute');
512
+
513
+ const itemsDataSet: string[] = [];
514
+ rangeVolumesItems.forEach(item => {
515
+ itemsDataSet.push(item.dataset.rangeValue)
516
+ })
405
517
 
406
518
  openVolumeButton.addEventListener('mouseover', (event) => {
407
519
  volumeControl.classList.remove('d-none');
@@ -437,28 +549,39 @@ export namespace LTPlayerControlsEvents {
437
549
  volumeIcons(1)
438
550
  })
439
551
 
440
- const volumeIcons = (range: any) => {
552
+ const getClosest = (curr: any, prev: any, range: any) => {
553
+ return (Math.abs(curr - range) < Math.abs(prev - range) ? curr : prev);
554
+ }
441
555
 
442
- if (typeof range == 'number') {
443
- range = range.toString()
444
- }
556
+ const volumeMax: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-max');
557
+ const volume75: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-75');
558
+ const volume50: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-50');
559
+ const volumeMute: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-mute');
560
+ const volumeBody: HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
561
+ const volumeIconsManger = (item: HTMLElement) => {
445
562
 
446
- const volumeMax: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-max');
447
- const volume75: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-75');
448
- const volume50: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-50');
449
- const volumeMute: HTMLElement = muteUnmuteVolumeButton.querySelector('.volume-mute');
450
- const volumeBody: HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
451
- const volumeIconsManger = (item: HTMLElement) => {
563
+ const rangeVolumesItems: NodeListOf<HTMLElement> = volumeBody.querySelectorAll('.volume-max, .volume-75, .volume-50, .volume-mute');
452
564
 
453
- const rangeVolumesItems: NodeListOf<HTMLElement>= volumeBody.querySelectorAll('.volume-max, .volume-75, .volume-50, .volume-mute');
565
+ rangeVolumesItems.forEach(function (value) {
566
+ if (item.dataset.rangeValue === value.dataset.rangeValue) {
567
+ value.classList.remove('d-none');
568
+ } else {
569
+ value.classList.add('d-none')
570
+ }
571
+ })
572
+ }
454
573
 
455
- rangeVolumesItems.forEach(function (value) {
456
- if (item.dataset.rangeValue === value.dataset.rangeValue){
457
- value.classList.remove('d-none');
458
- } else {
459
- value.classList.add('d-none')
460
- }
461
- })
574
+ const volumeIcons = (level: any) => {
575
+ if (itemsDataSet.length === 0) {
576
+ return;
577
+ }
578
+
579
+ let range = itemsDataSet.reduce(function (prev, curr) {
580
+ return getClosest(curr, prev, level);
581
+ });
582
+
583
+ if (typeof range == 'number') {
584
+ range = range.toString()
462
585
  }
463
586
 
464
587
  switch (range) {
@@ -478,26 +601,7 @@ export namespace LTPlayerControlsEvents {
478
601
  }
479
602
 
480
603
  volumeRangeControl.addEventListener('input', function () {
481
-
482
- let itemsDataSet: string[] = [];
483
-
484
- rangeVolumesItems.forEach(item => {
485
- itemsDataSet.push(item.dataset.rangeValue)
486
- })
487
-
488
- if (itemsDataSet.length === 0) {
489
- return;
490
- }
491
-
492
- const getClosest = (curr: any, prev: any, range: any) => {
493
- return (Math.abs(curr - range) < Math.abs(prev - range) ? curr : prev);
494
- }
495
-
496
-
497
- let closest = itemsDataSet.reduce(function(prev, curr) {
498
- return getClosest(curr, prev, (volumeRangeControl as HTMLInputElement).value);
499
- });
500
- volumeIcons(closest);
604
+ volumeIcons((volumeRangeControl as HTMLInputElement).value);
501
605
  })
502
606
 
503
607
  instance.plyr.volume = 1;
@@ -557,9 +661,12 @@ export namespace LTPlayerControlsEvents {
557
661
  const playerContainer = instance.plyr.elements.container;
558
662
  const playerControlsContainer = instance.plyr.elements.controls;
559
663
  const eventsInstance = this;
664
+ const commonInstance = this.common;
560
665
 
561
666
  let playerControlsBackground = playerContainer.querySelector('.plyr__controls__mobile-background');
562
667
 
668
+ instance.statusFeedbackService.setControlsVisible()
669
+
563
670
  if (playerContainer.classList.contains('plyr--hide-controls')) {
564
671
  playerContainer.classList.remove('plyr--hide-controls');
565
672
  }
@@ -580,6 +687,16 @@ export namespace LTPlayerControlsEvents {
580
687
  clearTimeout(this.controlsTimeOut);
581
688
  }
582
689
 
690
+ commonInstance.showHideText(true, playerControlsContainer);
691
+ commonInstance.showHideSeekBar(true, playerControlsContainer);
692
+ commonInstance.showHideBottomControls(true, playerControlsContainer);
693
+
694
+
695
+ if (instance.plyr.paused) {
696
+ commonInstance.showHideAllControls(true, playerControlsContainer);
697
+ return;
698
+ }
699
+
583
700
  this.hideControls(instance, false);
584
701
  }
585
702
 
@@ -587,24 +704,55 @@ export namespace LTPlayerControlsEvents {
587
704
  const playerContainer = instance.plyr.elements.container;
588
705
  const playerControlsContainer = instance.plyr.elements.controls;
589
706
  const eventsInstance = this;
707
+ const commonInstance = this.common;
590
708
  let playerControlsBackground = playerContainer.querySelector('.plyr__controls__mobile-background');
591
709
 
710
+ const showHideControls = () => {
711
+ instance.statusFeedbackService.clearControlsVisible()
712
+
713
+ if (!instance.playerConfig.isPinTextControls()) {
714
+ commonInstance.showHideText(false, playerControlsContainer);
715
+ }
716
+
717
+ if (!instance.playerConfig.isPinSeekBarControls()) {
718
+ commonInstance.showHideSeekBar(false, playerControlsContainer);
719
+ }
720
+ if (!instance.playerConfig.isPinBottomControls()) {
721
+ commonInstance.showHideBottomControls(false, playerControlsContainer);
722
+ }
723
+ }
724
+
725
+
592
726
  if (!playerControlsContainer.classList.contains('plyr__controls-enable-addInfo')) {
593
727
 
594
728
  if (now) {
595
- playerControlsContainer.classList.remove('plyr__controls-enable');
596
- playerContainer.classList.add('plyr--hide-controls');
729
+
730
+ if (instance.plyr.paused) {
731
+ commonInstance.showHideAllControls(true, playerControlsContainer);
732
+ return;
733
+ }
734
+
735
+ showHideControls();
736
+ // playerControlsContainer.classList.remove('plyr__controls-enable');
737
+ // playerContainer.classList.add('plyr--hide-controls');
597
738
  if (!playerControlsContainer.classList.contains('player-lt__modal__mobile-show-modal')) {
598
739
  playerControlsBackground.classList.remove('d-none');
599
740
  }
600
741
  } else {
601
742
  this.controlsTimeOut = setTimeout(() => {
602
- playerControlsContainer.classList.remove('plyr__controls-enable');
603
- playerContainer.classList.add('plyr--hide-controls');
604
- if (!playerControlsContainer.classList.contains('player-lt__modal__mobile-show-modal')) {
743
+ // playerControlsContainer.classList.remove('plyr__controls-enable');
744
+ // playerContainer.classList.add('plyr--hide-controls');
745
+
746
+ if (instance.plyr.paused) {
747
+ commonInstance.showHideAllControls(true, playerControlsContainer);
748
+ return;
749
+ }
750
+
751
+ showHideControls();
752
+ if (playerControlsBackground && !playerControlsContainer.classList.contains('player-lt__modal__mobile-show-modal')) {
605
753
  playerControlsBackground.classList.remove('d-none');
606
754
  }
607
- }, 4000);
755
+ }, 5000);
608
756
  }
609
757
  eventsInstance.common.subtitlesShow(instance);
610
758
  }
@@ -9,7 +9,15 @@ export class LTPlayerCommonSettingsControllers {
9
9
  }
10
10
 
11
11
  addSettingsTemplate(string: 'mobile' | 'desktop') {
12
- const settingsTemplate = this.instance.templateService.getSettings({id : this.instance.playerConfig.getPlayerId(), [string] : true});
12
+ const settingsTemplate = this.instance.templateService.getSettings(
13
+ {
14
+ id : this.instance.playerConfig.getPlayerId(),
15
+ [string] : true,
16
+ captions_enabled: this.instance.playerConfig.getCaptionsEnabled() &&
17
+ this.instance.playerConfig.hasCaptionsUrl(),
18
+ captions_missing: !this.instance.playerConfig.hasCaptionsUrl()
19
+ }
20
+ );
13
21
  const lastElement = this.instance.plyr.elements.controls.lastElementChild;
14
22
 
15
23
  if (lastElement) {
@@ -1,6 +1,7 @@
1
1
  import {LTPlayerSettingsControlsManager} from "../LTPlayerSettingsControlsManager";
2
2
  import {SettingsControlsInterfaces} from "../../../global/interfaces/SettingsControlsInterfaces";
3
3
  import {defaultType} from "../../../global/types/ModuleTypes";
4
+ import {LTPlayerStorage} from "../../LTPlayerStorage";
4
5
 
5
6
  export class LTPlayerDesktopSettingsControllers implements SettingsControlsInterfaces {
6
7
  settingsInstance: LTPlayerSettingsControlsManager
@@ -32,18 +33,17 @@ export class LTPlayerDesktopSettingsControllers implements SettingsControlsInter
32
33
 
33
34
  const selectors = this.settingsInstance.common.getSelectors();
34
35
 
35
- const checkBox = selectors.playerControlsContainer.querySelector(`#captions-lt-player-${this.settingsInstance.playerInstance.playerConfig.getPlayerId()}`) as HTMLInputElement;
36
+ const checkBox = selectors.playerControlsContainer.querySelector(`.subtitles-body__input-switch`) as HTMLInputElement;
36
37
 
37
38
  if (checkBox) {
38
39
  checkBox.addEventListener('change', () => {
39
40
 
40
41
  if (!checkBox.checked) {
41
- this.settingsInstance.player.toggleCaptions(false);
42
- return
42
+ this.settingsInstance.playerInstance.captionsService.disableCaptions();
43
+ } else {
44
+ this.settingsInstance.playerInstance.captionsService.enableCaptions();
43
45
  }
44
46
 
45
- this.settingsInstance.player.toggleCaptions(true);
46
-
47
47
  })
48
48
  }
49
49
  }
@@ -87,20 +87,23 @@ export class LTPlayerDesktopSettingsControllers implements SettingsControlsInter
87
87
  }
88
88
 
89
89
  setButtonSpeed() {
90
- let playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
91
- let playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
92
- let plyr = this.settingsInstance.playerInstance.plyr;
93
- let instance = this.settingsInstance.playerInstance;
90
+ const playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
91
+ const playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
92
+ const plyr = this.settingsInstance.playerInstance.plyr;
93
+ const instance = this.settingsInstance.playerInstance;
94
+ const storage = new LTPlayerStorage();
94
95
 
95
96
  if (playerSpeedButton) {
96
- let speedSpan = document.createElement('span');
97
+ const speedSpan = document.createElement('span');
97
98
  playerSpeedButton.appendChild(speedSpan);
98
- speedSpan.innerHTML = `1X`;
99
+
100
+ const displaySpeed = Math.floor(plyr.speed * 10) / 10;
101
+ speedSpan.innerHTML = displaySpeed + "X";
99
102
  speedSpan.className = '';
100
- speedSpan.classList.add('playback-speed--1X');
103
+ speedSpan.classList.add('playback-speed--' + plyr.speed + 'X');
101
104
 
102
105
  playerSpeedButton.addEventListener('click', function(event) {
103
- let playSpeed = plyr.speed + 0.25;
106
+ const playSpeed = plyr.speed + 0.25;
104
107
 
105
108
  if (playSpeed > 2) {
106
109
  speedSpan.innerHTML = `1X`;
@@ -111,7 +114,7 @@ export class LTPlayerDesktopSettingsControllers implements SettingsControlsInter
111
114
  }
112
115
 
113
116
  if (playSpeed === 1.75) {
114
- plyr.speed = playSpeed + 0.25
117
+ plyr.speed = playSpeed + 0.25;
115
118
  speedSpan.innerHTML = `2X`;
116
119
  speedSpan.className = '';
117
120
  speedSpan.classList.add('playback-speed--2X');