@latest-thinking/lt-player 1.1.0 → 1.2.0-a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ README.md +126 -0
- package/dist/css/lt-player-main.css +1 -1
- package/dist/css/lt-player-main.css.map +1 -1
- package/dist/js/lt-player-main.js +1 -1
- package/dist/js/lt-player-main.js.map +1 -1
- package/examples/basic.html +35 -0
- package/examples/lt-page-with-player.html +3529 -0
- package/examples/lt-page-with-player_files/Weiskopf_Coverphoto.jpg +0 -0
- package/examples/lt-page-with-player_files/ajax-progress.module.css +49 -0
- package/examples/lt-page-with-player_files/align.module.css +32 -0
- package/examples/lt-page-with-player_files/announce.js +49 -0
- package/examples/lt-page-with-player_files/autocomplete-loading.module.css +22 -0
- package/examples/lt-page-with-player_files/autocomplete.css +16 -0
- package/examples/lt-page-with-player_files/bootstrap.css +22691 -0
- package/examples/lt-page-with-player_files/clearfix.module.css +15 -0
- package/examples/lt-page-with-player_files/container-inline.module.css +16 -0
- package/examples/lt-page-with-player_files/cookiesjsr.min.css +10 -0
- package/examples/lt-page-with-player_files/core.css +97 -0
- package/examples/lt-page-with-player_files/details.module.css +10 -0
- package/examples/lt-page-with-player_files/fieldgroup.module.css +9 -0
- package/examples/lt-page-with-player_files/hidden.module.css +53 -0
- package/examples/lt-page-with-player_files/himme-alexander-beyond_0.jpg +0 -0
- package/examples/lt-page-with-player_files/item-list.module.css +19 -0
- package/examples/lt-page-with-player_files/js.module.css +22 -0
- package/examples/lt-page-with-player_files/latest_thinking.style.css +6496 -0
- package/examples/lt-page-with-player_files/logo-small.png +0 -0
- package/examples/lt-page-with-player_files/menu.css +64 -0
- package/examples/lt-page-with-player_files/nowrap.module.css +8 -0
- package/examples/lt-page-with-player_files/paragraphs.unpublished.css +3 -0
- package/examples/lt-page-with-player_files/position-container.module.css +8 -0
- package/examples/lt-page-with-player_files/progress.module.css +51 -0
- package/examples/lt-page-with-player_files/radix.style.css +1 -0
- package/examples/lt-page-with-player_files/reset-appearance.module.css +15 -0
- package/examples/lt-page-with-player_files/resize.module.css +21 -0
- package/examples/lt-page-with-player_files/search_api_autocomplete.css +41 -0
- package/examples/lt-page-with-player_files/sticky-header.module.css +13 -0
- package/examples/lt-page-with-player_files/system-status-counter.css +30 -0
- package/examples/lt-page-with-player_files/system-status-report-counters.css +27 -0
- package/examples/lt-page-with-player_files/system-status-report-general-info.css +14 -0
- package/examples/lt-page-with-player_files/tabledrag.module.css +98 -0
- package/examples/lt-page-with-player_files/tablesort.module.css +19 -0
- package/examples/lt-page-with-player_files/theme.css +446 -0
- package/examples/lt-page-with-player_files/thumbnail_MPI_CBS_Eingangsbereich.jpg +0 -0
- package/examples/lt-page-with-player_files/tree-child.module.css +18 -0
- package/examples/lt-page-with-player_files/widget-min.js +10 -0
- package/examples/lt-website.html +76 -0
- package/examples/portrait-with-subtitles.html +81 -0
- package/examples/samples/vtt/Pahl-Kerstin-Maria-MAIN-20230320.vtt +765 -0
- package/examples/samples/vtt/Sobolev-Anton-Subtitles-20230518_0.vtt +352 -0
- package/examples/samples/vtt/demo.vtt +7 -0
- package/package.json +1 -1
- package/src/assets/sass/abstracts/_mixins.scss +1 -1
- package/src/assets/sass/abstracts/_variables.scss +1 -1
- package/src/assets/sass/app.scss +19 -0
- package/src/assets/sass/components/_all.scss +1 -1
- package/src/assets/sass/components/_loader.scss +187 -0
- package/src/assets/sass/components/_modal.scss +6 -0
- package/src/assets/sass/core/_player.scss +23 -5
- package/src/assets/sass/sections/_additional-info.scss +1 -1
- package/src/assets/sass/sections/_control.scss +0 -1
- package/src/assets/sass/sections/_poster.scss +1 -0
- package/src/assets/sass/sections/_settings.scss +36 -53
- package/src/assets/sass/sections/_subtitles.scss +78 -23
- package/src/assets/sass/sections/controllers/_botom.scss +59 -36
- package/src/assets/sass/sections/controllers/_notification-rewind-forward.scss +29 -14
- package/src/assets/sass/sections/controllers/_top.scss +1 -1
- package/src/components/LTPlayerDevMethode.ts +106 -84
- package/src/components/LTPlayerManager.ts +16 -0
- package/src/components/LTPlayerSettingsManager.ts +117 -0
- package/src/components/LTPlayerSetup.ts +3 -10
- package/src/components/LTPlayerStatusFeedback.ts +76 -0
- package/src/components/LTPlayerStorage.ts +58 -0
- package/src/components/LTPlayerType.ts +10 -2
- package/src/components/LTPlayerUpdate.ts +61 -0
- package/src/components/captions/LTPlayerCaptions.ts +80 -0
- package/src/components/config/LTPlayerConfig.ts +43 -0
- package/src/components/config/LTPlayerConfigProcessor.ts +110 -56
- package/src/components/controls/LTPlayerChapters.ts +8 -4
- package/src/components/controls/LTPlayerControls.ts +2 -0
- package/src/components/controls/LTPlayerControlsEvents.ts +200 -49
- package/src/components/controls/settings/LTPlayerCommonSettingsControllers.ts +9 -1
- package/src/components/controls/settings/LTPlayerDesktopSettingsControllers.ts +17 -14
- package/src/components/controls/settings/LTPlayerMobileSettingsControllers.ts +50 -44
- package/src/components/events/LTPlayer.ts +24 -21
- package/src/components/events/LTPlayerCommon.ts +94 -20
- package/src/components/events/LTPlayerDesktop.ts +21 -7
- package/src/components/events/LTPlayerMobile.ts +22 -10
- package/src/global/controllers/LTPlayerController.ts +7 -0
- package/src/services/Helper.ts +6 -1
- package/src/services/ResizeService.ts +35 -30
- package/src/services/TemplateService.ts +7 -0
- package/src/views/additionalInfo.handlebars +18 -18
- package/src/views/controls.handlebars +14 -3
- package/src/views/poster.handlebars +2 -2
- package/src/views/settings.handlebars +1 -1
- package/src/views/settings.mobile.handlebars +22 -0
- package/src/views/template.handlebars +4 -1
- 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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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
|
-
|
|
35
|
+
playerContainer.addEventListener('volumechange', () => {
|
|
36
|
+
this.settingsManager.setGlobalSettings();
|
|
37
|
+
});
|
|
28
38
|
|
|
29
|
-
|
|
30
|
-
controls.classList.remove('d-none');
|
|
31
|
-
}
|
|
32
|
-
}
|
|
39
|
+
this.settingsManager.applyGlobalSettings();
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
41
|
+
const disablePoster = () => {
|
|
42
|
+
let poster = playerContainer.querySelector(`.lt-player__poster`);
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
if (poster) {
|
|
45
|
+
poster.classList.add('d-none');
|
|
46
|
+
}
|
|
40
47
|
|
|
41
|
-
|
|
42
|
-
this.player.pause();
|
|
43
|
-
}
|
|
48
|
+
let controls = playerContainer.querySelector('.player__controls');
|
|
44
49
|
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
if (controls) {
|
|
51
|
+
controls.classList.remove('d-none');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
47
54
|
|
|
48
|
-
|
|
55
|
+
if (!this.player.playing) {
|
|
56
|
+
this.player.play();
|
|
57
|
+
}
|
|
49
58
|
|
|
50
|
-
|
|
51
|
-
|
|
59
|
+
disablePoster();
|
|
60
|
+
}
|
|
52
61
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
62
|
+
pause() {
|
|
63
|
+
this.player.pause();
|
|
64
|
+
}
|
|
57
65
|
|
|
58
|
-
|
|
66
|
+
stop() {
|
|
67
|
+
const playerContainer = this.player.elements.container;
|
|
59
68
|
|
|
60
|
-
|
|
69
|
+
this.settingsManager.setGlobalSettings();
|
|
61
70
|
|
|
62
|
-
|
|
71
|
+
const enablePoster = () => {
|
|
63
72
|
|
|
64
|
-
|
|
65
|
-
|
|
73
|
+
const customPoster = playerContainer.querySelector('.lt-player__poster');
|
|
74
|
+
const controls = playerContainer.querySelector('.plyr__controls');
|
|
66
75
|
|
|
67
|
-
|
|
76
|
+
playerContainer.classList.add('plyr--stopped')
|
|
77
|
+
customPoster.classList.remove('d-none');
|
|
78
|
+
controls.classList.add('d-none');
|
|
79
|
+
}
|
|
68
80
|
|
|
69
|
-
|
|
81
|
+
const disableSettings = () => {
|
|
70
82
|
|
|
71
|
-
|
|
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
|
-
|
|
79
|
-
|
|
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
|
-
|
|
88
|
-
miniPlayer.controls.remove();
|
|
89
|
-
}
|
|
90
|
+
settingsBody.classList.remove('settings-controllers-enable');
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
miniPlayer.background.remove();
|
|
93
|
-
}
|
|
92
|
+
const background = document.querySelector('.settings-controllers-enable__background');
|
|
94
93
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
if (!background.classList.contains('d-none')) {
|
|
95
|
+
background.classList.add('d-none');
|
|
96
|
+
}
|
|
98
97
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
102
100
|
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
131
|
+
const exitFullScreen = () => {
|
|
132
|
+
if (this.player.fullscreen.active) {
|
|
133
|
+
this.player.fullscreen.exit();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
113
136
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
127
|
-
|
|
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
|
|
18
|
-
|
|
17
|
+
let response = false;
|
|
19
18
|
if (playerConfig.body.playerContainer instanceof HTMLElement) {
|
|
20
|
-
response =
|
|
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
|
+
}
|