@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,132 +2,154 @@ import Plyr from "plyr";
2
2
  import {LTPlayerPosterPreload} from "./poster/LTPlayerPosterPreload";
3
3
  import {LTPlayerPosterPreloadEvents} from "./poster/LTPlayerPosterPreloadEvents";
4
4
  import {LTPlayer} from "./LTPlayerType";
5
+ import {LTPlayerSettingsManager} from "./LTPlayerSettingsManager";
5
6
 
6
7
  export namespace LTPlayerDevMethode {
7
8
 
8
- export class Player {
9
+ export class Player {
9
10
 
10
11
  player: Plyr
11
- instance : LTPlayer.PortraitType | LTPlayer.LandscapeType
12
+ instance: LTPlayer.PortraitType | LTPlayer.LandscapeType
13
+ settingsManager: LTPlayerSettingsManager
12
14
 
13
15
  constructor(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
14
16
  this.player = instance.plyr;
15
- this.instance = instance
17
+ this.instance = instance;
18
+ this.settingsManager = new LTPlayerSettingsManager(instance);
16
19
  }
17
20
 
18
- play() {
19
- let playerContainer = this.player.elements.container;
20
- const disablePoster = () => {
21
- let poster = playerContainer.querySelector(`.lt-player__poster`);
21
+ play(isFirst?: boolean) {
22
+ console.log('is it the first video? ' + isFirst);
23
+ const playerContainer = this.player.elements.container;
22
24
 
23
- if (poster) {
24
- poster.classList.add('d-none');
25
- }
25
+ if(isFirst) {
26
+ this.player.muted = true;
27
+ this.player.volume = 0;
28
+ this.settingsManager.setGlobalSettings();
29
+ }
30
+
31
+ playerContainer.addEventListener('ratechange', () => {
32
+ this.settingsManager.setGlobalSettings();
33
+ });
26
34
 
27
- let controls = playerContainer.querySelector('.player__controls');
35
+ playerContainer.addEventListener('volumechange', () => {
36
+ this.settingsManager.setGlobalSettings();
37
+ });
28
38
 
29
- if (controls) {
30
- controls.classList.remove('d-none');
31
- }
32
- }
39
+ this.settingsManager.applyGlobalSettings();
33
40
 
34
- if (!this.player.playing) {
35
- this.player.play();
36
- }
41
+ const disablePoster = () => {
42
+ let poster = playerContainer.querySelector(`.lt-player__poster`);
37
43
 
38
- disablePoster();
39
- }
44
+ if (poster) {
45
+ poster.classList.add('d-none');
46
+ }
40
47
 
41
- pause() {
42
- this.player.pause();
43
- }
48
+ let controls = playerContainer.querySelector('.player__controls');
44
49
 
45
- stop() {
46
- let playerContainer = this.player.elements.container;
50
+ if (controls) {
51
+ controls.classList.remove('d-none');
52
+ }
53
+ }
47
54
 
48
- const enablePoster = () => {
55
+ if (!this.player.playing) {
56
+ this.player.play();
57
+ }
49
58
 
50
- const customPoster = playerContainer.querySelector('.lt-player__poster');
51
- const controls = playerContainer.querySelector('.plyr__controls');
59
+ disablePoster();
60
+ }
52
61
 
53
- playerContainer.classList.add('plyr--stopped')
54
- customPoster.classList.remove('d-none');
55
- controls.classList.add('d-none');
56
- }
62
+ pause() {
63
+ this.player.pause();
64
+ }
57
65
 
58
- const disableSettings = () => {
66
+ stop() {
67
+ const playerContainer = this.player.elements.container;
59
68
 
60
- const settingsBody = playerContainer.querySelector('.settings-controllers');
69
+ this.settingsManager.setGlobalSettings();
61
70
 
62
- if (settingsBody.classList.contains('settings-controllers-enable')) {
71
+ const enablePoster = () => {
63
72
 
64
- const settingsBody = playerContainer.querySelector('.settings-controllers');
65
- this.player.elements.controls.classList.remove('plyr__controls-enable-settings')
73
+ const customPoster = playerContainer.querySelector('.lt-player__poster');
74
+ const controls = playerContainer.querySelector('.plyr__controls');
66
75
 
67
- settingsBody.classList.remove('settings-controllers-enable');
76
+ playerContainer.classList.add('plyr--stopped')
77
+ customPoster.classList.remove('d-none');
78
+ controls.classList.add('d-none');
79
+ }
68
80
 
69
- const background = document.querySelector('.settings-controllers-enable__background');
81
+ const disableSettings = () => {
70
82
 
71
- if (!background.classList.contains('d-none')) {
72
- background.classList.add('d-none');
73
- }
83
+ const settingsBody = playerContainer.querySelector('.settings-controllers');
74
84
 
75
- }
76
- }
85
+ if (settingsBody && settingsBody.classList.contains('settings-controllers-enable')) {
77
86
 
78
- const exitMiniPLayer = () => {
79
- let miniPlayer = {
80
- controls : playerContainer.querySelector('.lt-player-mini-player-controls'),
81
- background: playerContainer.querySelector('.lt-player-mini-player-background'),
82
- enable: playerContainer.querySelector('.lt-player-mini-enable'),
83
- size_land: playerContainer.querySelector(`.lt-player-mini-1`),
84
- size_port: playerContainer.querySelector(`.lt-player-mini-2`)
85
- };
87
+ const settingsBody = playerContainer.querySelector('.settings-controllers');
88
+ this.player.elements.controls.classList.remove('plyr__controls-enable-settings')
86
89
 
87
- if (miniPlayer.controls) {
88
- miniPlayer.controls.remove();
89
- }
90
+ settingsBody.classList.remove('settings-controllers-enable');
90
91
 
91
- if (miniPlayer.background) {
92
- miniPlayer.background.remove();
93
- }
92
+ const background = document.querySelector('.settings-controllers-enable__background');
94
93
 
95
- if (miniPlayer.size_land) {
96
- miniPlayer.size_land.classList.remove(`lt-player-mini-1`)
97
- }
94
+ if (!background.classList.contains('d-none')) {
95
+ background.classList.add('d-none');
96
+ }
98
97
 
99
- if (miniPlayer.size_port) {
100
- miniPlayer.size_port.classList.remove(`lt-player-mini-2`)
101
- }
98
+ }
99
+ }
102
100
 
103
- if (miniPlayer.enable) {
104
- miniPlayer.enable.classList.remove('lt-player-mini-enable')
105
- }
106
- }
101
+ const exitMiniPLayer = () => {
102
+ const miniPlayer = {
103
+ controls: playerContainer.querySelector('.lt-player-mini-player-controls'),
104
+ background: playerContainer.querySelector('.lt-player-mini-player-background'),
105
+ enable: playerContainer.querySelector('.lt-player-mini-enable'),
106
+ size_land: playerContainer.querySelector(`.lt-player-mini-1`),
107
+ size_port: playerContainer.querySelector(`.lt-player-mini-2`)
108
+ };
109
+
110
+ if (miniPlayer.controls) {
111
+ miniPlayer.controls.remove();
112
+ }
113
+
114
+ if (miniPlayer.background) {
115
+ miniPlayer.background.remove();
116
+ }
117
+
118
+ if (miniPlayer.size_land) {
119
+ miniPlayer.size_land.classList.remove(`lt-player-mini-1`)
120
+ }
121
+
122
+ if (miniPlayer.size_port) {
123
+ miniPlayer.size_port.classList.remove(`lt-player-mini-2`)
124
+ }
125
+
126
+ if (miniPlayer.enable) {
127
+ miniPlayer.enable.classList.remove('lt-player-mini-enable')
128
+ }
129
+ }
107
130
 
108
- const exitFullScreen = () => {
109
- if (this.player.fullscreen.active) {
110
- this.player.fullscreen.exit();
111
- }
112
- }
131
+ const exitFullScreen = () => {
132
+ if (this.player.fullscreen.active) {
133
+ this.player.fullscreen.exit();
134
+ }
135
+ }
113
136
 
114
- this.player.stop()
115
- enablePoster();
116
- disableSettings();
117
- exitMiniPLayer();
118
- exitFullScreen();
137
+ this.player.stop()
138
+ enablePoster();
139
+ disableSettings();
140
+ exitMiniPLayer();
141
+ exitFullScreen();
119
142
 
120
- }
143
+ }
121
144
 
122
145
  enterMiniPlayer() {
123
146
  this.instance.miniPlayer.enterMiniPlayer();
124
- }
147
+ }
125
148
 
126
- exitMiniPlayer() {
127
- this.instance.miniPlayer.exitMiniPlayer(this.player);
128
- }
149
+ exitMiniPlayer() {
150
+ this.instance.miniPlayer.exitMiniPlayer(this.player);
151
+ }
129
152
  }
130
-
131
153
  export class Preload {
132
154
 
133
155
  instance: LTPlayer.PortraitType | LTPlayer.LandscapeType;
@@ -202,6 +202,22 @@ export class LTPlayerManager {
202
202
  }
203
203
  }
204
204
 
205
+ getPlayerByExternalId(id: string | number): null | LTPlayer.LandscapeType | LTPlayer.PortraitType {
206
+ if (this.players.length === 0) {
207
+ return null;
208
+ }
209
+
210
+ let response = null;
211
+
212
+ this.players.forEach(instance => {
213
+ if (instance.playerConfig.getConfigData().externalId == id) {
214
+ response = instance;
215
+ }
216
+ })
217
+
218
+ return response;
219
+ }
220
+
205
221
  /**
206
222
  * Pause all players
207
223
  */
@@ -0,0 +1,117 @@
1
+ import {LTPlayer} from "./LTPlayerType";
2
+ import Plyr from "plyr";
3
+ import {LTPlayerStorage} from "./LTPlayerStorage";
4
+ import {settings} from "json-schema-library";
5
+
6
+ export class LTPlayerSettingsManager {
7
+ instance: LTPlayer.PortraitType | LTPlayer.LandscapeType
8
+ player: Plyr
9
+ storage: LTPlayerStorage
10
+ constructor(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
11
+ this.player = instance.plyr;
12
+ this.instance = instance;
13
+ this.storage = new LTPlayerStorage();
14
+ }
15
+
16
+ applyGlobalSettings() {
17
+ const settings = this.storage.getSettings();
18
+ this.player.speed = settings.speed;
19
+ this.player.volume = settings.volume;
20
+ this.player.muted = settings.muted;
21
+ this.volumeIconsChange();
22
+ this.speedButtonChange(this.player.elements.container);
23
+ }
24
+
25
+ setGlobalSettings() {
26
+ const settings = {
27
+ speed: this.player.speed,
28
+ volume: this.player.volume,
29
+ muted: this.player.muted
30
+ }
31
+ console.log(settings.volume);
32
+ console.log(settings.muted);
33
+
34
+ this.storage.setSettings(settings);
35
+ }
36
+
37
+ speedButtonChange(container: HTMLElement) {
38
+ const storage = new LTPlayerStorage();
39
+ const speed = storage.getSpeed();
40
+ const displaySpeed = Math.floor(speed * 10) / 10;
41
+ const speedSpan = container.querySelector('.plyr__control.plyr__controls_speed-button > span');
42
+ if(speedSpan) {
43
+ speedSpan.innerHTML = displaySpeed + "X";
44
+ speedSpan.className = '';
45
+ speedSpan.classList.add('playback-speed--' + speed + 'X');
46
+ }
47
+ }
48
+
49
+ volumeIconsChange() {
50
+ if (this.instance.playerConfig.getDevice() === 'desktop') {
51
+ this.volumeItemsDesktop();
52
+ } else {
53
+ this.volumeIconsMobile();
54
+ }
55
+ }
56
+
57
+ volumeIconsMobile() {
58
+ if (this.storage.getMutedState() === false) {
59
+ this.player.volume = 1;
60
+ this.storage.setVolume(1);
61
+ }
62
+ const playerControlsContainer = this.player.elements.controls;
63
+ const volume: HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
64
+
65
+ if (volume) {
66
+ const volumeUnmute = volume.querySelector('.volume-max');
67
+ const volumeMute = volume.querySelector('.volume-mute');
68
+
69
+ if (this.player.muted) {
70
+ volumeUnmute.classList.remove('d-none');
71
+ volumeMute.classList.remove('d-none');
72
+ volumeUnmute.classList.add('d-none');
73
+ } else {
74
+ volumeUnmute.classList.remove('d-none');
75
+ volumeMute.classList.remove('d-none');
76
+ volumeMute.classList.add('d-none');
77
+ }
78
+ }
79
+ }
80
+
81
+ volumeItemsDesktop() {
82
+ const range = this.storage.getVolume().toString()
83
+ const playerControlsContainer = this.player.elements.controls;
84
+ const volumeMax: HTMLElement = playerControlsContainer.querySelector('.volume-max');
85
+ const volume75: HTMLElement = playerControlsContainer.querySelector('.volume-75');
86
+ const volume50: HTMLElement = playerControlsContainer.querySelector('.volume-50');
87
+ const volumeMute: HTMLElement = playerControlsContainer.querySelector('.volume-mute');
88
+ const volumeBody: HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
89
+ const volumeIconsManager = (item: HTMLElement) => {
90
+
91
+ const rangeVolumesItems: NodeListOf<HTMLElement> = volumeBody.querySelectorAll('.volume-max, .volume-75, .volume-50, .volume-mute');
92
+
93
+ rangeVolumesItems.forEach(function (value) {
94
+ if (item.dataset.rangeValue === value.dataset.rangeValue) {
95
+ value.classList.remove('d-none');
96
+ } else {
97
+ value.classList.add('d-none')
98
+ }
99
+ })
100
+ }
101
+
102
+
103
+ const volumeThresholds = [
104
+ { threshold: 1, element: volumeMax },
105
+ { threshold: 0.65, element: volume75 },
106
+ { threshold: 0.35, element: volume50 },
107
+ { threshold: 0, element: volumeMute }
108
+ ];
109
+
110
+ for (let i = 0; i < volumeThresholds.length; i++) {
111
+ if (range >= volumeThresholds[i].threshold) {
112
+ volumeIconsManager(volumeThresholds[i].element);
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ }
@@ -14,17 +14,9 @@ export class LTPlayerSetup {
14
14
 
15
15
  checkIfPlayerExists(playerConfig?: playerConfigType): boolean
16
16
  {
17
- let response: boolean = false;
18
-
17
+ let response = false;
19
18
  if (playerConfig.body.playerContainer instanceof HTMLElement) {
20
- response = true;
21
- if (window.Player !== undefined) {
22
- window.Player.players.forEach(player => {
23
- if (player.playerConfig.getPlayerElementContainer() === playerConfig.body.playerContainer) {
24
- response = false;
25
- }
26
- })
27
- }
19
+ response = !playerConfig.body.playerContainer.classList.contains('is-loaded');
28
20
  }
29
21
  return response;
30
22
  }
@@ -77,6 +69,7 @@ export class LTPlayerSetup {
77
69
  const playerContainer = playerConfig.body.playerContainer;
78
70
 
79
71
  playerContainer.classList.add(`lt-player`);
72
+ playerContainer.classList.add(`is-loaded`);
80
73
 
81
74
  this.setAdditionalInfo(playerConfig);
82
75
 
@@ -0,0 +1,76 @@
1
+ import {LTPlayerController} from "../global/controllers/LTPlayerController";
2
+
3
+ export class LTPlayerStatusFeedback {
4
+
5
+ player: LTPlayerController
6
+ element: HTMLElement
7
+
8
+ constructor(player: LTPlayerController) {
9
+ this.player = player;
10
+ }
11
+
12
+ private getElement(): HTMLElement {
13
+ if (!this.element) {
14
+ if (this.player.playerConfig) {
15
+ this.element = this.player.playerConfig.getPlayerElementContainer()
16
+ } else {
17
+ console.error("Failed to get element from playerConfig")
18
+ }
19
+ }
20
+ return this.element
21
+ }
22
+
23
+ private addClass(name: string) {
24
+ const element = this.getElement()
25
+ if (element && !element.classList.contains(name)) {
26
+ element.classList.add(name)
27
+ }
28
+ }
29
+
30
+ private removeClass(name: string) {
31
+ const element = this.getElement()
32
+ if (element && element.classList.contains(name)) {
33
+ element.classList.remove(name)
34
+ }
35
+ }
36
+
37
+ setLoading() {
38
+ this.addClass("lt-state-loader-active")
39
+ }
40
+
41
+ setLoadingSeek() {
42
+ this.addClass("lt-state-seeking")
43
+ this.setLoading()
44
+ }
45
+
46
+ clearLoading() {
47
+ this.removeClass("lt-state-loader-active")
48
+ this.removeClass("lt-state-seeking")
49
+ }
50
+
51
+ setFullscreen() {
52
+ this.addClass("lt-state-fullscreen")
53
+ }
54
+
55
+ clearFullscreen() {
56
+ this.removeClass("lt-state-fullscreen")
57
+ }
58
+
59
+ setControlsVisible() {
60
+ this.addClass("lt-state-controls-visible")
61
+ }
62
+
63
+ clearControlsVisible() {
64
+ this.removeClass("lt-state-controls-visible")
65
+ }
66
+
67
+ setCaptionsEnabled() {
68
+ this.addClass("lt-state-captions-enabled")
69
+ }
70
+
71
+ clearCaptionsEnabled() {
72
+ this.removeClass("lt-state-captions-enabled")
73
+ }
74
+
75
+ }
76
+
@@ -0,0 +1,58 @@
1
+ export class LTPlayerStorage {
2
+
3
+ constructor() {
4
+ if (!localStorage.getItem('lt-player')) {
5
+ this.createStorage();
6
+ }
7
+ }
8
+
9
+ createStorage() {
10
+ const defaultSettings = {
11
+ speed: 1,
12
+ volume: 1,
13
+ muted: false
14
+ };
15
+ localStorage.setItem('lt-player', JSON.stringify(defaultSettings));
16
+ }
17
+
18
+ setSettings(settings: object) {
19
+ localStorage.setItem('lt-player', JSON.stringify(settings));
20
+ }
21
+
22
+ getSettings() {
23
+ return JSON.parse(localStorage.getItem('lt-player'));
24
+ }
25
+
26
+ getSpeed() {
27
+ const settings = JSON.parse(localStorage.getItem('lt-player'));
28
+ return settings ? settings.speed : 1;
29
+ }
30
+
31
+ setSpeed(speed: number) {
32
+ const settings = JSON.parse(localStorage.getItem('lt-player')) || {};
33
+ settings.speed = speed;
34
+ localStorage.setItem('lt-player', JSON.stringify(settings));
35
+ }
36
+
37
+ getVolume() {
38
+ const settings = JSON.parse(localStorage.getItem('lt-player'));
39
+ return settings ? settings.volume : 1;
40
+ }
41
+
42
+ setVolume(volume: number) {
43
+ const settings = JSON.parse(localStorage.getItem('lt-player')) || {};
44
+ settings.volume = volume;
45
+ localStorage.setItem('lt-player', JSON.stringify(settings));
46
+ }
47
+
48
+ getMutedState() {
49
+ const settings = JSON.parse(localStorage.getItem('lt-player'));
50
+ return settings ? settings.muted : false;
51
+ }
52
+
53
+ setMutedState(state: boolean) {
54
+ const settings = JSON.parse(localStorage.getItem('lt-player')) || {};
55
+ settings.muted = state;
56
+ localStorage.setItem('lt-player', JSON.stringify(settings));
57
+ }
58
+ }
@@ -10,6 +10,7 @@ import {LTPLayerAddInfo} from "./addInfo/LTPlayerAddInfoManager";
10
10
  import {LTPlayerEvents} from "./events/LTPlayer";
11
11
  import {Helper} from "../services/Helper";
12
12
  import {LTPlayerHls} from "./LTPlayerHls";
13
+ import {LTPlayerUpdate} from "./LTPlayerUpdate";
13
14
 
14
15
  export namespace LTPlayer {
15
16
 
@@ -19,6 +20,7 @@ export namespace LTPlayer {
19
20
  export class PortraitType extends LTPlayerController implements TypeInterface {
20
21
 
21
22
  pausedPlayer: Plyr;
23
+ updateManager: LTPlayerUpdate;
22
24
 
23
25
  /**
24
26
  * Create a new Player instance root element
@@ -52,6 +54,7 @@ export namespace LTPlayer {
52
54
  }
53
55
 
54
56
  this.setEvents();
57
+ this.updateManager = new LTPlayerUpdate(this);
55
58
 
56
59
  return true;
57
60
  }
@@ -125,6 +128,7 @@ export namespace LTPlayer {
125
128
 
126
129
  if (this.playerConfig.getFullscreenMode()) {
127
130
  Object.assign(playerSettings, this.playerConfig.getFullscreenMode());
131
+ this.playerConfig.getPlayerElementContainer().classList.add('fullscreen-disabled');
128
132
  }
129
133
 
130
134
  const element = this.playerConfig.getPlayerElementContainer().querySelector('.embed_player');
@@ -156,8 +160,8 @@ export namespace LTPlayer {
156
160
  }
157
161
  }
158
162
 
159
- play() {
160
- this.devMethodePlayer.play();
163
+ play(isFirst?: boolean) {
164
+ this.devMethodePlayer.play(isFirst);
161
165
  }
162
166
 
163
167
  pause() {
@@ -235,6 +239,10 @@ export namespace LTPlayer {
235
239
 
236
240
  this.setEvents();
237
241
 
242
+ if (this.playerConfig.getCaptionsEnabled() === true) {
243
+ this.statusFeedbackService.setCaptionsEnabled()
244
+ }
245
+
238
246
  return true;
239
247
  }
240
248
 
@@ -0,0 +1,61 @@
1
+ import {LTPlayer} from "./LTPlayerType";
2
+ import {defaultType} from "../global/types/ModuleTypes";
3
+ import {LTPLayerAddInfo} from "./addInfo/LTPlayerAddInfoManager";
4
+ import Hls from "hls.js";
5
+
6
+ export class LTPlayerUpdate {
7
+
8
+ player: LTPlayer.PortraitType;
9
+
10
+ constructor(player: LTPlayer.PortraitType) {
11
+ this.player = player;
12
+ }
13
+
14
+ updatePlayer(config: defaultType) {
15
+ console.log(config)
16
+ this.updateVideo(config.body.videoUrl, config.body.posterImage);
17
+ this.updateTitle(config.body.videoParagraph);
18
+ this.updateAuthor(config.body.videoTitle);
19
+ this.updateSubtitles(config.body.defaultConfig?.captions.url ?? null);
20
+ this.updateChapters(config);
21
+ this.player.additionalInfoService.setConfig(config.body.additionalInfo);
22
+ return;
23
+ }
24
+
25
+ updateChapters(config: defaultType) {
26
+ this.player.playerControl.initChapters(config.body.chapters);
27
+ }
28
+
29
+ updateVideo(videoUrl: string, poster: string) {
30
+ const video = document.querySelector('video');
31
+ video.poster = poster;
32
+ this.player.playerConfig.setPosterImage(poster);
33
+ this.player.posterManager.poster.setImage();
34
+ const coverImage = document.querySelector('.lt-player__poster__img--set-custom') as HTMLImageElement;
35
+ coverImage.src = poster;
36
+
37
+ if (Hls.isSupported()) {
38
+ this.player.hls.hlsInstance.detachMedia();
39
+ this.player.hls.hlsInstance.loadSource(videoUrl);
40
+ this.player.hls.hlsInstance.attachMedia(video);
41
+ } else {
42
+ document.querySelector('video').src = videoUrl;
43
+ }
44
+ }
45
+
46
+ updateTitle(title: string) {
47
+ const titleHeader = document.querySelector('.poster-title');
48
+ titleHeader.textContent = '';
49
+ titleHeader.textContent = title;
50
+ }
51
+
52
+ updateAuthor(author: string) {
53
+ const authorParagraph = document.querySelector('.poster-paragraph__content');
54
+ authorParagraph.textContent = '';
55
+ authorParagraph.textContent = author;
56
+ }
57
+
58
+ updateSubtitles(src: string|null) {
59
+ this.player.captionsService.setCaptions(src)
60
+ }
61
+ }