@latest-thinking/lt-player 1.0.6 → 1.0.7-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 (40) hide show
  1. package/dist/css/lt-player-main.css +1 -1
  2. package/dist/css/lt-player-main.css.map +1 -1
  3. package/dist/js/lt-player-main.js +1 -1
  4. package/dist/js/lt-player-main.js.map +1 -1
  5. package/package.json +2 -1
  6. package/src/assets/sass/abstracts/_mixins.scss +11 -0
  7. package/src/assets/sass/abstracts/_variables.scss +3 -0
  8. package/src/assets/sass/app.scss +14 -1
  9. package/src/assets/sass/components/_modal.scss +1 -1
  10. package/src/assets/sass/sections/_settings.scss +255 -82
  11. package/src/assets/sass/sections/_share.scss +132 -21
  12. package/src/assets/sass/sections/controllers/_botom.scss +296 -303
  13. package/src/assets/sass/sections/controllers/_notification-rewind-forward.scss +36 -66
  14. package/src/assets/sass/sections/controllers/_top.scss +94 -113
  15. package/src/components/LTPlayerSetup.ts +0 -1
  16. package/src/components/LTPlayerType.ts +12 -12
  17. package/src/components/addInfo/LTPlayerAddInfoDesktop.ts +99 -0
  18. package/src/components/addInfo/LTPlayerAddInfoManager.ts +6 -6
  19. package/src/components/addInfo/LTPlayerAddInfoMobile.ts +110 -0
  20. package/src/components/config/LTPlayerConfig.ts +25 -11
  21. package/src/components/controls/LTPlayerControlsEvents.ts +141 -95
  22. package/src/components/controls/settings/LTPlayerDesktopSettingsControllers.ts +0 -1
  23. package/src/components/controls/settings/LTPlayerMobileSettingsControllers.ts +166 -30
  24. package/src/components/events/LTPlayer.ts +8 -0
  25. package/src/components/events/LTPlayerCommon.ts +27 -35
  26. package/src/components/events/LTPlayerDesktop.ts +4 -0
  27. package/src/components/events/LTPlayerMobile.ts +4 -2
  28. package/src/components/share/LTPlayerShareDesktop.ts +131 -0
  29. package/src/components/share/LTPlayerShareEvents.ts +30 -132
  30. package/src/components/share/{LTPlayerShare.ts → LTPlayerShareManager.ts} +26 -8
  31. package/src/components/share/LTPlayerShareMobile.ts +154 -0
  32. package/src/components/video/LTPlayerVideo.ts +49 -0
  33. package/src/global/controllers/LTPlayerController.ts +6 -3
  34. package/src/index.ts +7 -6
  35. package/src/services/ResizeService.ts +7 -7
  36. package/src/views/additionalInfo.handlebars +4 -8
  37. package/src/views/controls.handlebars +45 -41
  38. package/src/views/settings.handlebars +11 -14
  39. package/src/views/share.handlebars +36 -33
  40. package/src/components/addInfo/LTPlayerAdditionalInfoEvents.ts +0 -247
@@ -1,6 +1,5 @@
1
1
  import {LTPlayerSettingsControlsManager} from "../LTPlayerSettingsControlsManager";
2
2
  import {SettingsControlsInterfaces} from "../../../global/interfaces/SettingsControlsInterfaces";
3
- import {defaultType} from "../../../global/types/ModuleTypes";
4
3
 
5
4
  export class LTPlayerMobileSettingsControllers implements SettingsControlsInterfaces {
6
5
  settingsInstance: LTPlayerSettingsControlsManager
@@ -10,48 +9,185 @@ export class LTPlayerMobileSettingsControllers implements SettingsControlsInterf
10
9
  }
11
10
 
12
11
  init() {
13
- this.settingsInstance.common.addSettingsTemplate(this.settingsInstance.playerInstance.playerConfig.getDevice());
14
- this.setDefaultSpeed();
15
- this.setButtonSpeed();
12
+ this.addOpenSettingsEventButton();
16
13
  }
17
14
 
18
- setDefaultSpeed() {
19
- this.settingsInstance.playerInstance.plyr.speed = 1;
15
+ addOpenSettingsEventButton() {
16
+ const settingsButton = this.settingsInstance.playerInstance.plyr.elements.controls.querySelector('.plyr__controls_settings-button');
17
+ const instance = this;
18
+ if (settingsButton) {
19
+ let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(settingsButton);
20
+ if (mobileEvent) {
21
+ mobileEvent.on('singletap', function LTPlayerMobileSettingsButton() {
22
+ instance.settingsInstance.playerInstance.playerControl.mobileEvents.showControls(instance.settingsInstance.playerInstance);
23
+ instance.createModal();
24
+ instance.setActiveModal();
25
+ instance.initCaptionsEvent();
26
+ instance.initSpeedVideoEvent();
27
+ instance.initSaveButton();
28
+ setTimeout(() => {
29
+ instance.setInactiveTouchModal();
30
+ }, 100)
31
+ })
32
+ }
33
+ }
20
34
  }
21
35
 
22
- setButtonSpeed() {
23
- let playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
24
- let playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
25
- playerSpeedButton.innerHTML = `${this.settingsInstance.playerInstance.plyr.speed}X`;
26
- let plyr = this.settingsInstance.playerInstance.plyr;
27
- let instance = this.settingsInstance.playerInstance;
36
+ setInactiveTouchModal() {
37
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
38
+ const background = modal.querySelector('.settings-controllers-enable__background');
39
+ const settingsContainerHeader = modal.querySelector('.settings-controllers-header')
40
+ const instance = this;
28
41
 
29
- if (playerSpeedButton) {
30
- let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(playerSpeedButton);
42
+ if (background) {
43
+ let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(background);
31
44
  if (mobileEvent) {
32
- mobileEvent.on('singletap', function LTPlayerMobileSpeedButton() {
45
+ mobileEvent.on('singletap', function LTPlayerMobileSettingsBackground(event) {
46
+ instance.settingsInstance.playerInstance.playerControl.mobileEvents.showControls(instance.settingsInstance.playerInstance);
47
+ event.preventDefault();
48
+ let target = event.target as HTMLElement;
49
+ if (!target.classList.contains('settings-controllers')) {
50
+ instance.setInactiveModal();
51
+ }
52
+ })
53
+ }
54
+ }
33
55
 
34
- let playSpeed = plyr.speed + 0.25;
56
+ if (settingsContainerHeader) {
57
+ let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(settingsContainerHeader);
58
+ if (mobileEvent) {
59
+ mobileEvent.on('pan', function LTPlayerMobileSettingsHeader(event) {
60
+ instance.settingsInstance.playerInstance.playerControl.mobileEvents.showControls(instance.settingsInstance.playerInstance);
61
+ event.preventDefault();
62
+ let target = event.target as HTMLElement;
63
+ instance.setInactiveModal();
64
+ })
65
+ }
66
+ }
35
67
 
36
- if (playSpeed > 2) {
37
- playerSpeedButton.innerHTML = `1x`;
38
- plyr.speed = 1;
39
- return;
40
- }
68
+ }
41
69
 
42
- if (playSpeed === 1.75) {
43
- plyr.speed = playSpeed + 0.25
44
- playerSpeedButton.innerHTML = `${playSpeed + 0.25}X`;
45
- return;
46
- }
70
+ createModal() {
71
+ let modalTemplate = this.settingsInstance.playerInstance.templateService.getSettings({id : this.settingsInstance.playerInstance.playerConfig.getPlayerId()});
47
72
 
48
- plyr.speed = playSpeed;
49
- playerSpeedButton.innerHTML = `${playSpeed}X`;
73
+ const modal = document.createElement('div');
74
+ modal.classList.add('lt-player-mobile-settings-modal')
75
+ modal.innerHTML = modalTemplate;
50
76
 
51
- instance.playerControl.mobileEvents.showControls(instance);
52
- })
77
+ const body = document.querySelector('body');
78
+
79
+ if (body) {
80
+ body.appendChild(modal);
81
+ }
82
+ }
83
+
84
+ setActiveModal() {
85
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
86
+ const background = modal.querySelector('.settings-controllers-enable__background');
87
+
88
+ if (background) {
89
+ if (background.classList.contains('d-none')) {
90
+ background.classList.remove('d-none')
53
91
  }
54
92
  }
55
93
  }
56
94
 
95
+ setInactiveModal() {
96
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
97
+ if (modal) {
98
+ modal.remove();
99
+ }
100
+ }
101
+ initCaptionsEvent() {
102
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
103
+ const checkBox = modal.querySelector(`#captions-lt-player-${this.settingsInstance.playerInstance.playerConfig.getPlayerId()}`) as HTMLInputElement;
104
+ const instance = this;
105
+ if (checkBox) {
106
+ checkBox.addEventListener('change', () => {
107
+ instance.settingsInstance.playerInstance.playerControl.mobileEvents.showControls(instance.settingsInstance.playerInstance);
108
+
109
+ if (!checkBox.checked) {
110
+ this.settingsInstance.player.toggleCaptions(false);
111
+ return
112
+ }
113
+
114
+ this.settingsInstance.player.toggleCaptions(true);
115
+
116
+ })
117
+ }
118
+ }
119
+ initSpeedVideoEvent() {
120
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
121
+ const playerInstance = this.settingsInstance.playerInstance;
122
+ const player = this.settingsInstance.player;
123
+ const rangeInput: HTMLInputElement = modal.querySelector('.speed-range-input');
124
+
125
+
126
+ const myRange: HTMLInputElement = modal.querySelector(`#speed-range-${playerInstance.playerConfig.getPlayerId()}`);
127
+
128
+ myRange.value = String(0);
129
+
130
+ const myValue: HTMLElement = modal.querySelector(`#speed-range-value-${playerInstance.playerConfig.getPlayerId()}`);
131
+
132
+ myValue.style.top = "-20px";
133
+
134
+ let values:any = [1,1.25,1.50,2];
135
+
136
+ const instance = this;
137
+ myRange.oninput = function() {
138
+ instance.settingsInstance.playerInstance.playerControl.mobileEvents.showControls(instance.settingsInstance.playerInstance);
139
+ player.speed = parseFloat(values[rangeInput.value]);
140
+ myValue.innerHTML = `${values[rangeInput.value]}X`;
141
+ };
142
+
143
+ player.speed = parseFloat(String(values[0]));
144
+ myValue.innerHTML = `${values[0]}X`;
145
+ }
146
+ initSaveButton() {
147
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
148
+ const instance = this;
149
+
150
+ const saveButton = modal.querySelector('.button-save');
151
+
152
+ saveButton.addEventListener('click', function (event) {
153
+ instance.settingsInstance.playerInstance.playerControl.mobileEvents.showControls(instance.settingsInstance.playerInstance);
154
+ event.preventDefault();
155
+ instance.setInactiveModal();
156
+ })
157
+ }
158
+ // setButtonSpeed() {
159
+ // let playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
160
+ // let playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
161
+ // playerSpeedButton.innerHTML = `${this.settingsInstance.playerInstance.plyr.speed}X`;
162
+ // let plyr = this.settingsInstance.playerInstance.plyr;
163
+ // let instance = this.settingsInstance.playerInstance;
164
+ //
165
+ // if (playerSpeedButton) {
166
+ // let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(playerSpeedButton);
167
+ // if (mobileEvent) {
168
+ // mobileEvent.on('singletap', function LTPlayerMobileSpeedButton() {
169
+ //
170
+ // let playSpeed = plyr.speed + 0.25;
171
+ //
172
+ // if (playSpeed > 2) {
173
+ // playerSpeedButton.innerHTML = `1x`;
174
+ // plyr.speed = 1;
175
+ // return;
176
+ // }
177
+ //
178
+ // if (playSpeed === 1.75) {
179
+ // plyr.speed = playSpeed + 0.25
180
+ // playerSpeedButton.innerHTML = `${playSpeed + 0.25}X`;
181
+ // return;
182
+ // }
183
+ //
184
+ // plyr.speed = playSpeed;
185
+ // playerSpeedButton.innerHTML = `${playSpeed}X`;
186
+ //
187
+ // instance.playerControl.mobileEvents.showControls(instance);
188
+ // })
189
+ // }
190
+ // }
191
+ // }
192
+
57
193
  }
@@ -116,6 +116,14 @@ export namespace LTPlayerEvents {
116
116
  const settingsBody = playerContainer.querySelector('.settings-controllers');
117
117
 
118
118
  if (!settingsBody) {
119
+
120
+ const modal = document.querySelector('.lt-player-mobile-settings-modal');
121
+
122
+ if (modal) {
123
+ modal.remove();
124
+ }
125
+
126
+
119
127
  return;
120
128
  }
121
129
 
@@ -27,33 +27,26 @@ export class LTPlayerCommon {
27
27
 
28
28
  instance.plyr.speed = 1;
29
29
 
30
-
31
- if (instance.playerConfig.getDevice() === 'desktop') {
32
- instance.plyr.toggleCaptions(false);
33
- return;
34
- }
35
-
36
- if (instance.playerConfig.getPreload()) {
37
- instance.plyr.toggleCaptions(false);
38
- return;
39
- }
40
-
41
- if (instance.plyr.isEmbed) {
42
- instance.plyr.embed.getTextTracks().then( (response: string | any[]) => {
43
- if (response.length !== 0) {
44
- instance.plyr.toggleCaptions(true);
45
- } else {
46
- instance.plyr.toggleCaptions(false);
47
- }
48
- })
49
- } else {
50
-
51
- let checkCaptions = (instance.plyr as plyr).captions;
52
-
53
- if (checkCaptions.currentTrack >= 0) {
54
- instance.plyr.toggleCaptions(true);
55
- }
56
- }
30
+ instance.plyr.toggleCaptions(false);
31
+ return;
32
+
33
+ //
34
+ // if (instance.plyr.isEmbed) {
35
+ // instance.plyr.embed.getTextTracks().then( (response: string | any[]) => {
36
+ // if (response.length !== 0) {
37
+ // instance.plyr.toggleCaptions(true);
38
+ // } else {
39
+ // instance.plyr.toggleCaptions(false);
40
+ // }
41
+ // })
42
+ // } else {
43
+ //
44
+ // let checkCaptions = (instance.plyr as plyr).captions;
45
+ //
46
+ // if (checkCaptions.currentTrack >= 0) {
47
+ // instance.plyr.toggleCaptions(true);
48
+ // }
49
+ // }
57
50
  }
58
51
  removeDesktopPlyrEvents() {
59
52
  let plyrInstance = this.plyr as Plyr as Plyr & { eventListeners: Array<any> }
@@ -107,16 +100,18 @@ export class LTPlayerCommon {
107
100
  });
108
101
  }
109
102
  onReadyPlayer() {
110
-
111
103
  //set share button
112
- this.player.share.events.desktop.init(this.player);
104
+ if (this.player.playerConfig.getShareData()) {
105
+ if (this.player.playerConfig.getDevice() === 'mobile') {
106
+ this.player.share.events.mobile.init();
107
+ } else {
108
+ this.player.share.events.desktop.init();
109
+ }
110
+ }
113
111
 
114
- // this.player.windowService.init(this.player);
115
112
  //set poster
116
113
  this.player.posterManager.mobileEvents.onload(this.player);
117
114
 
118
-
119
-
120
115
  if (this.player.playerConfig.isAutoPlay()) {
121
116
  let playerContainer = this.player.plyr.elements.container;
122
117
 
@@ -151,9 +146,6 @@ export class LTPlayerCommon {
151
146
  if (this.player.playerControl.chaptersService) {
152
147
  this.player.playerControl.chaptersService.updateCurrentTimeAndTitle(this.player, event);
153
148
  }
154
-
155
- //set captions
156
- this.player.playerControl.desktopEvents.subtitles(this.player);
157
149
  }
158
150
 
159
151
 
@@ -147,6 +147,8 @@ export class LTPlayerDesktop extends LTPlayerCommon implements EventsInterfaces
147
147
  //fullscreen icon
148
148
  instance.playerControl.desktopEvents.fullscreenIcon(instance, 'enterfullscreen');
149
149
 
150
+ instance.videoService.removeObjectFit();
151
+
150
152
  });
151
153
 
152
154
  plyr.on('exitfullscreen', function LTPlayerDesktopExitFullScreen() {
@@ -155,6 +157,8 @@ export class LTPlayerDesktop extends LTPlayerCommon implements EventsInterfaces
155
157
 
156
158
  //fullscreen icon
157
159
  instance.playerControl.desktopEvents.fullscreenIcon(instance, 'exitfullscreen');
160
+
161
+ instance.videoService.appendObjectFit();
158
162
  })
159
163
  }
160
164
 
@@ -83,8 +83,8 @@ export class LTPlayerMobile extends LTPlayerCommon implements EventsInterfaces {
83
83
  instance.playerControl.mobileEvents.backwardForward(instance);
84
84
  instance.playerControl.mobileEvents.backwardForwardSeconds(instance);
85
85
 
86
- //set volume controller
87
- instance.playerControl.mobileEvents.volume(instance);
86
+ //remove volume controller
87
+ // instance.playerControl.mobileEvents.volume(instance);
88
88
 
89
89
  //set settings controller
90
90
  instance.playerControl.settingsControlsManager.init(instance);
@@ -132,11 +132,13 @@ export class LTPlayerMobile extends LTPlayerCommon implements EventsInterfaces {
132
132
  //fullscreen icon
133
133
  instance.playerControl.desktopEvents.fullscreenIcon(instance, 'enterfullscreen');
134
134
 
135
+ instance.videoService.removeObjectFit();
135
136
  });
136
137
 
137
138
  plyr.on('exitfullscreen', function LTPlayerDesktopExitFullScreen() {
138
139
  //fullscreen icon
139
140
  instance.playerControl.desktopEvents.fullscreenIcon(instance, 'exitfullscreen');
141
+ instance.videoService.appendObjectFit();
140
142
  })
141
143
  }
142
144
 
@@ -0,0 +1,131 @@
1
+ import {LTPlayerShareManager} from "./LTPlayerShareManager";
2
+
3
+ export class LTPlayerShareDesktop {
4
+ manager : LTPlayerShareManager
5
+ isPlaying : boolean
6
+ switchButtonSet: boolean
7
+ constructor(instance : LTPlayerShareManager) {
8
+ this.manager = instance;
9
+ this.setTemplate();
10
+ }
11
+ setTemplate() {
12
+ const playerContainer = this.manager.instance.plyr.elements.wrapper;
13
+ playerContainer.insertAdjacentHTML("afterend", this.manager.templateService.getShare(this.manager.playerConfig.getShareData()));
14
+ }
15
+
16
+ activeModal() {
17
+ const selectors = this.getSelector();
18
+ const instance = this.manager.instance;
19
+
20
+ selectors.shareContainer.classList.remove('share-inactive');
21
+ selectors.shareContainer.classList.add('share-active');
22
+ (window as any).a2a.init_all();
23
+ if (!instance.playerConfig.getShareData().canonicalUrl) {
24
+ if (!instance.playerConfig.getShareData().embedUrl) {
25
+ selectors.shareContainer.querySelector('.share-controller-top').classList.add('d-none')
26
+ } else {
27
+ this.setCopyContent(true);
28
+ }
29
+ } else {
30
+ this.setCopyContent(false);
31
+ }
32
+
33
+ this.setCopyButtonsEvents();
34
+
35
+ if (!this.switchButtonSet) {
36
+ this.setSwitchButton();
37
+ this.switchButtonSet = true;
38
+ }
39
+
40
+ if (instance.plyr.playing) {
41
+ this.isPlaying = true;
42
+ instance.plyr.pause();
43
+ } else {
44
+ this.isPlaying = false;
45
+ }
46
+ }
47
+
48
+
49
+ setSwitchButton() {
50
+ const selectors = this.getSelector();
51
+ const instance = this.manager.instance;
52
+
53
+ if (!instance.playerConfig.getShareData().embedUrl || !instance.playerConfig.getShareData().canonicalUrl) {
54
+ selectors.switchButton.classList.add('d-none');
55
+ return;
56
+ }
57
+
58
+ const switchEvent = () => {
59
+
60
+ if (selectors.urlInput.classList.contains('canonicalUrl')) {
61
+ selectors.urlInput.classList.remove('canonicalUrl');
62
+ selectors.urlInput.classList.add('embedUrl');
63
+ this.setCopyContent(true);
64
+ } else {
65
+ selectors.urlInput.classList.add('canonicalUrl');
66
+ selectors.urlInput.classList.remove('embedUrl');
67
+ this.setCopyContent(false);
68
+ }
69
+ }
70
+
71
+ selectors.switchButton.addEventListener('click', () => {
72
+ switchEvent();
73
+ })
74
+ }
75
+
76
+ setCopyContent(embed : boolean) {
77
+ const selectors = this.getSelector();
78
+ const instance = this.manager.instance;
79
+
80
+ if (!embed) {
81
+ selectors.urlInput.classList.add('canonicalUrl');
82
+ selectors.urlInput.innerHTML = `${instance.playerConfig.getShareData().canonicalUrl}`;
83
+ (selectors.urlInput as HTMLElement).dataset.copy = instance.playerConfig.getShareData().canonicalUrl;
84
+ selectors.urlInput.addEventListener('click', () => {
85
+ window.open(instance.playerConfig.getShareData().canonicalUrl)
86
+ })
87
+ return
88
+ }
89
+ selectors.urlInput.classList.add('embedUrl');
90
+ const iframe = `<iframe width="560" height="315" src="${instance.playerConfig.getShareData().embedUrl}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`;
91
+ (selectors.urlInput as HTMLElement).innerText = iframe;
92
+ (selectors.urlInput as HTMLElement).dataset.copy = iframe;
93
+ }
94
+
95
+ inactiveModal() {
96
+ const selectors = this.getSelector();
97
+ const instance = this.manager.instance;
98
+
99
+ selectors.shareContainer.classList.add('share-inactive');
100
+ selectors.shareContainer.classList.remove('share-active');
101
+ if (this.isPlaying) {
102
+ instance.plyr.play();
103
+ }
104
+ }
105
+
106
+ getSelector() {
107
+ return {
108
+ buttons : [
109
+ this.manager.instance.plyr.elements.container.querySelector('.poster-lt-player-share'),
110
+ this.manager.instance.plyr.elements.controls.querySelector('.lt-player-share'),
111
+ ],
112
+ urlInput : this.manager.instance.plyr.elements.container.querySelector('.share-controller-wrapper').querySelector('.share-controller-url'),
113
+ shareContainer : this.manager.instance.plyr.elements.container.querySelector('.share-controller-wrapper'),
114
+ copyButtons : this.manager.instance.plyr.elements.container.querySelectorAll('.share-controller-link'),
115
+ switchButton : this.manager.instance.plyr.elements.container.querySelector('.share-controller-wrapper').querySelector('.button_embed')
116
+ };
117
+ }
118
+
119
+ setCopyButtonsEvents() {
120
+ const selectors = this.getSelector();
121
+
122
+ if (selectors.copyButtons.length > 0) {
123
+ selectors.copyButtons.forEach((button: HTMLElement) => {
124
+ button.addEventListener('click', function LTPlayerShareCopy() {
125
+ navigator.clipboard.writeText((selectors.urlInput as HTMLElement).dataset.copy);
126
+ })
127
+
128
+ })
129
+ }
130
+ }
131
+ }