@latest-thinking/lt-player 1.2.0 → 2.0.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/.editorconfig +1 -1
- package/.node-version +1 -0
- package/.nvmrc +1 -0
- package/README.md +162 -0
- package/dist/main.js +24375 -0
- package/package.json +31 -67
- package/tsconfig.json +2 -1
- package/vite-dev.config.mts +35 -0
- package/vite.config.mts +40 -0
- package/ README.md +0 -270
- package/.babelrc +0 -11
- package/.eslintrc.js +0 -6
- package/dist/css/lt-player-main.css +0 -3
- package/dist/css/lt-player-main.css.map +0 -1
- package/dist/fonts/0574e80a2483be7b033e.otf +0 -0
- package/dist/fonts/34274fbfb2f270b8d53b.otf +0 -0
- package/dist/fonts/80acced0ba3630ee652b.otf +0 -0
- package/dist/fonts/8ccea4947561e7008d19.otf +0 -0
- package/dist/fonts/d355445ed7d61b887e58.otf +0 -0
- package/dist/js/lt-player-main.js +0 -3
- package/dist/js/lt-player-main.js.LICENSE.txt +0 -9
- package/dist/js/lt-player-main.js.map +0 -1
- package/examples/basic.html +0 -35
- package/examples/lt-page-with-player.html +0 -3529
- package/examples/lt-page-with-player_files/Weiskopf_Coverphoto.jpg +0 -0
- package/examples/lt-page-with-player_files/ajax-progress.module.css +0 -49
- package/examples/lt-page-with-player_files/align.module.css +0 -32
- package/examples/lt-page-with-player_files/announce.js +0 -49
- package/examples/lt-page-with-player_files/autocomplete-loading.module.css +0 -22
- package/examples/lt-page-with-player_files/autocomplete.css +0 -16
- package/examples/lt-page-with-player_files/bootstrap.css +0 -22691
- package/examples/lt-page-with-player_files/clearfix.module.css +0 -15
- package/examples/lt-page-with-player_files/container-inline.module.css +0 -16
- package/examples/lt-page-with-player_files/cookiesjsr.min.css +0 -10
- package/examples/lt-page-with-player_files/core.css +0 -97
- package/examples/lt-page-with-player_files/details.module.css +0 -10
- package/examples/lt-page-with-player_files/fieldgroup.module.css +0 -9
- package/examples/lt-page-with-player_files/hidden.module.css +0 -53
- 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 +0 -19
- package/examples/lt-page-with-player_files/js.module.css +0 -22
- package/examples/lt-page-with-player_files/latest_thinking.style.css +0 -6496
- package/examples/lt-page-with-player_files/logo-small.png +0 -0
- package/examples/lt-page-with-player_files/menu.css +0 -64
- package/examples/lt-page-with-player_files/nowrap.module.css +0 -8
- package/examples/lt-page-with-player_files/paragraphs.unpublished.css +0 -3
- package/examples/lt-page-with-player_files/position-container.module.css +0 -8
- package/examples/lt-page-with-player_files/progress.module.css +0 -51
- package/examples/lt-page-with-player_files/radix.style.css +0 -1
- package/examples/lt-page-with-player_files/reset-appearance.module.css +0 -15
- package/examples/lt-page-with-player_files/resize.module.css +0 -21
- package/examples/lt-page-with-player_files/search_api_autocomplete.css +0 -41
- package/examples/lt-page-with-player_files/sticky-header.module.css +0 -13
- package/examples/lt-page-with-player_files/system-status-counter.css +0 -30
- package/examples/lt-page-with-player_files/system-status-report-counters.css +0 -27
- package/examples/lt-page-with-player_files/system-status-report-general-info.css +0 -14
- package/examples/lt-page-with-player_files/tabledrag.module.css +0 -98
- package/examples/lt-page-with-player_files/tablesort.module.css +0 -19
- package/examples/lt-page-with-player_files/theme.css +0 -446
- 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 +0 -18
- package/examples/lt-page-with-player_files/widget-min.js +0 -10
- package/examples/lt-website.html +0 -76
- package/examples/portrait-with-subtitles.html +0 -81
- package/examples/samples/vtt/Pahl-Kerstin-Maria-MAIN-20230320.vtt +0 -765
- package/examples/samples/vtt/Sobolev-Anton-Subtitles-20230518_0.vtt +0 -352
- package/examples/samples/vtt/demo.vtt +0 -7
- package/src/assets/css/sample.css +0 -12
- package/src/assets/fonts/museo/MuseoSans-100.otf +0 -0
- package/src/assets/fonts/museo/MuseoSans-300.otf +0 -0
- package/src/assets/fonts/museo/MuseoSans-500.otf +0 -0
- package/src/assets/fonts/museo/MuseoSans-700.otf +0 -0
- package/src/assets/fonts/museo/MuseoSans-900.otf +0 -0
- package/src/assets/icons/arrow-down.svg +0 -8
- package/src/assets/icons/arrow-left.svg +0 -8
- package/src/assets/icons/chevron-down-full.svg +0 -7
- package/src/assets/icons/chevron-down.svg +0 -7
- package/src/assets/icons/chevron-up-full.svg +0 -7
- package/src/assets/icons/chevron-up.svg +0 -7
- package/src/assets/icons/close.svg +0 -8
- package/src/assets/icons/compass.svg +0 -8
- package/src/assets/icons/external-link.svg +0 -9
- package/src/assets/icons/facebook.svg +0 -7
- package/src/assets/icons/fast-backward.svg +0 -8
- package/src/assets/icons/fast-forward.svg +0 -8
- package/src/assets/icons/file-text.svg +0 -11
- package/src/assets/icons/home.svg +0 -8
- package/src/assets/icons/logo-big.png +0 -0
- package/src/assets/icons/logo.png +0 -0
- package/src/assets/icons/maximize.svg +0 -7
- package/src/assets/icons/mini-player.svg +0 -8
- package/src/assets/icons/minimize.svg +0 -7
- package/src/assets/icons/more-vertical.svg +0 -9
- package/src/assets/icons/mute.svg +0 -9
- package/src/assets/icons/pause.svg +0 -8
- package/src/assets/icons/play.svg +0 -8
- package/src/assets/icons/search.svg +0 -8
- package/src/assets/icons/settings.svg +0 -8
- package/src/assets/icons/share.svg +0 -11
- package/src/assets/icons/skip-backward.svg +0 -8
- package/src/assets/icons/skip-forward.svg +0 -8
- package/src/assets/icons/speed-1-5.svg +0 -7
- package/src/assets/icons/speed-1.svg +0 -7
- package/src/assets/icons/speed-2.svg +0 -7
- package/src/assets/icons/subtitles.svg +0 -7
- package/src/assets/icons/twitter.svg +0 -7
- package/src/assets/icons/university.svg +0 -9
- package/src/assets/icons/user.svg +0 -8
- package/src/assets/icons/volume-1.svg +0 -15
- package/src/assets/icons/volume-2.svg +0 -15
- package/src/assets/icons/volume-3.svg +0 -15
- package/src/assets/sass/abstracts/_mixins.scss +0 -145
- package/src/assets/sass/abstracts/_placeholders.scss +0 -112
- package/src/assets/sass/abstracts/_variables.scss +0 -68
- package/src/assets/sass/abstracts/all.scss +0 -4
- package/src/assets/sass/app.scss +0 -99
- package/src/assets/sass/components/_all.scss +0 -6
- package/src/assets/sass/components/_buttons.scss +0 -1
- package/src/assets/sass/components/_images.scss +0 -4
- package/src/assets/sass/components/_loader.scss +0 -187
- package/src/assets/sass/components/_modal.scss +0 -365
- package/src/assets/sass/components/_range.scss +0 -33
- package/src/assets/sass/core/_all.scss +0 -13
- package/src/assets/sass/core/_fonts.scss +0 -55
- package/src/assets/sass/core/_player.scss +0 -71
- package/src/assets/sass/core/_typography.scss +0 -13
- package/src/assets/sass/layout/_all.scss +0 -3
- package/src/assets/sass/layout/_grid.scss +0 -0
- package/src/assets/sass/sections/_additional-info.scss +0 -90
- package/src/assets/sass/sections/_all.scss +0 -6
- package/src/assets/sass/sections/_control.scss +0 -122
- package/src/assets/sass/sections/_poster.scss +0 -319
- package/src/assets/sass/sections/_settings.scss +0 -504
- package/src/assets/sass/sections/_share.scss +0 -250
- package/src/assets/sass/sections/_subtitles.scss +0 -85
- package/src/assets/sass/sections/controllers/_all.scss +0 -4
- package/src/assets/sass/sections/controllers/_botom.scss +0 -522
- package/src/assets/sass/sections/controllers/_mini-player.scss +0 -169
- package/src/assets/sass/sections/controllers/_notification-rewind-forward.scss +0 -260
- package/src/assets/sass/sections/controllers/_top.scss +0 -169
- package/src/components/LTPlayerDevMethode.ts +0 -192
- package/src/components/LTPlayerEventsManager.ts +0 -31
- package/src/components/LTPlayerHls.ts +0 -38
- package/src/components/LTPlayerManager.ts +0 -266
- package/src/components/LTPlayerSettingsManager.ts +0 -117
- package/src/components/LTPlayerSetup.ts +0 -286
- package/src/components/LTPlayerStatusFeedback.ts +0 -76
- package/src/components/LTPlayerStorage.ts +0 -58
- package/src/components/LTPlayerType.ts +0 -371
- package/src/components/LTPlayerUpdate.ts +0 -61
- package/src/components/addInfo/LTPLayerAddInfoResizeManager.ts +0 -15
- package/src/components/addInfo/LTPlayerAddInfoDesktop.ts +0 -127
- package/src/components/addInfo/LTPlayerAddInfoManager.ts +0 -230
- package/src/components/addInfo/LTPlayerAddInfoMobile.ts +0 -113
- package/src/components/captions/LTPlayerCaptions.ts +0 -80
- package/src/components/config/LTPlayerConfig.ts +0 -280
- package/src/components/config/LTPlayerConfigProcessor.ts +0 -604
- package/src/components/controls/LTPlayerChapters.ts +0 -285
- package/src/components/controls/LTPlayerControls.ts +0 -57
- package/src/components/controls/LTPlayerControlsEvents.ts +0 -946
- package/src/components/controls/LTPlayerMini.ts +0 -285
- package/src/components/controls/LTPlayerSettingsControlsManager.ts +0 -60
- package/src/components/controls/settings/LTPlayerCommonSettingsControllers.ts +0 -71
- package/src/components/controls/settings/LTPlayerDesktopSettingsControllers.ts +0 -135
- package/src/components/controls/settings/LTPlayerMobileSettingsControllers.ts +0 -211
- package/src/components/events/LTPlayer.ts +0 -194
- package/src/components/events/LTPlayerCommon.ts +0 -252
- package/src/components/events/LTPlayerDesktop.ts +0 -222
- package/src/components/events/LTPlayerMobile.ts +0 -243
- package/src/components/poster/LTPlayerPoster.ts +0 -78
- package/src/components/poster/LTPlayerPosterEvents.ts +0 -172
- package/src/components/poster/LTPlayerPosterManager.ts +0 -46
- package/src/components/poster/LTPlayerPosterPreload.ts +0 -51
- package/src/components/poster/LTPlayerPosterPreloadEvents.ts +0 -152
- package/src/components/share/LTPlayerShareDesktop.ts +0 -131
- package/src/components/share/LTPlayerShareEvents.ts +0 -64
- package/src/components/share/LTPlayerShareManager.ts +0 -58
- package/src/components/share/LTPlayerShareMobile.ts +0 -154
- package/src/components/video/LTPlayerVideo.ts +0 -49
- package/src/global/controllers/LTPlayerController.ts +0 -58
- package/src/global/interfaces/EventsInterfaces.ts +0 -11
- package/src/global/interfaces/SettingsControlsInterfaces.ts +0 -3
- package/src/global/interfaces/TypeInterface.ts +0 -9
- package/src/global/types/ModuleTypes.d.ts +0 -35
- package/src/global/types/ModuleViews.d.ts +0 -13
- package/src/global/types/ModuleWindow.d.ts +0 -12
- package/src/global/types/Modules.d.ts +0 -44
- package/src/index.ts +0 -10
- package/src/json-schema/player-config.json +0 -16
- package/src/services/Helper.ts +0 -147
- package/src/services/IconsService.ts +0 -124
- package/src/services/LTPlayerRotateDeviceService.ts +0 -15
- package/src/services/LoaderService.ts +0 -21
- package/src/services/ResizeService.ts +0 -352
- package/src/services/TemplateService.ts +0 -136
- package/src/services/ValidatorService.ts +0 -31
- package/src/views/additionalInfo.handlebars +0 -103
- package/src/views/background.handlebars +0 -5
- package/src/views/controls.handlebars +0 -390
- package/src/views/onloadPoster.handlebars +0 -1
- package/src/views/poster.handlebars +0 -69
- package/src/views/settings.handlebars +0 -31
- package/src/views/settings.mobile.handlebars +0 -22
- package/src/views/share.handlebars +0 -101
- package/src/views/template.handlebars +0 -15
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import {LTPlayer} from "../LTPlayerType";
|
|
2
|
-
import {LoaderService} from "../../services/LoaderService";
|
|
3
|
-
|
|
4
|
-
export namespace LTPlayerPosterEvents {
|
|
5
|
-
export class Common {
|
|
6
|
-
|
|
7
|
-
poster = {
|
|
8
|
-
getButtons(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType): undefined | NodeListOf<Element> {
|
|
9
|
-
const playerContainer = instance.plyr.elements.container;
|
|
10
|
-
const playButtons = playerContainer.querySelectorAll('.poster-button-play, .poster-button-watch-now');
|
|
11
|
-
|
|
12
|
-
if (playButtons.length === 0) {
|
|
13
|
-
if (process.env.DEBUG === "true") {
|
|
14
|
-
console.error('No button selector found');
|
|
15
|
-
}
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return playButtons;
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
reset(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
|
|
23
|
-
const playerContainer = instance.plyr.elements.container;
|
|
24
|
-
const disablePoster = () => {
|
|
25
|
-
playerContainer.querySelector(`.lt-player__poster`).classList.add('d-none');
|
|
26
|
-
playerContainer.querySelector('.plyr__controls').classList.remove('d-none');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const play = () => {
|
|
30
|
-
if (instance.plyr.isEmbed) {
|
|
31
|
-
disablePoster();
|
|
32
|
-
playerContainer.querySelector(`.lt-player__poster`).insertAdjacentHTML('afterend', LoaderService.getSpinner())
|
|
33
|
-
instance.plyr.embed.play().then(() => {
|
|
34
|
-
instance.plyr.volume = 1;
|
|
35
|
-
LoaderService.removeSpinner(playerContainer)
|
|
36
|
-
},
|
|
37
|
-
() => {
|
|
38
|
-
instance.plyr.volume = 1;
|
|
39
|
-
LoaderService.removeSpinner(playerContainer)
|
|
40
|
-
instance.plyr.play();
|
|
41
|
-
});
|
|
42
|
-
} else {
|
|
43
|
-
disablePoster();
|
|
44
|
-
instance.plyr.volume = 1;
|
|
45
|
-
instance.plyr.play();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (instance.playerConfig.getPreload()) {
|
|
49
|
-
LoaderService.removeSpinner(playerContainer);
|
|
50
|
-
|
|
51
|
-
if (instance.playerConfig.getDevice() === 'mobile') {
|
|
52
|
-
if (instance.plyr.isEmbed) {
|
|
53
|
-
instance.plyr.embed.getTextTracks().then( (response: string | any[]) => {
|
|
54
|
-
if (response.length !== 0) {
|
|
55
|
-
instance.plyr.toggleCaptions(true);
|
|
56
|
-
}
|
|
57
|
-
})
|
|
58
|
-
} else {
|
|
59
|
-
instance.plyr.toggleCaptions(true);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (instance.playerConfig.getPreload().isActive) {
|
|
67
|
-
instance.plyr.volume = 1;
|
|
68
|
-
instance.plyr.currentTime = 0;
|
|
69
|
-
instance.playerConfig.getPreload().isActive = false;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
play();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
export class Desktop {
|
|
80
|
-
/**
|
|
81
|
-
* Add play event on poster
|
|
82
|
-
*/
|
|
83
|
-
posterBody(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
|
|
84
|
-
|
|
85
|
-
const common: Common = new LTPlayerPosterEvents.Common();
|
|
86
|
-
|
|
87
|
-
const playerContainer: HTMLElement = instance.plyr.elements.container;
|
|
88
|
-
const posterBody: HTMLElement = playerContainer.querySelector('.lt-player__poster__body');
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (posterBody) {
|
|
92
|
-
posterBody.addEventListener('click', function LTPlayerPosterButtons(event) {
|
|
93
|
-
event.preventDefault();
|
|
94
|
-
|
|
95
|
-
if((event.target as HTMLInputElement).classList.contains('poster-lt-player-share') ||
|
|
96
|
-
(event.target as HTMLInputElement).classList.contains('filter')
|
|
97
|
-
) {
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
instance.playerControl.desktopEvents.titleLineBreak(instance);
|
|
102
|
-
instance.playerControl.desktopEvents.playPauseIcon(instance, 'timeupdate');
|
|
103
|
-
common.poster.reset(instance);
|
|
104
|
-
|
|
105
|
-
})
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export class Mobile {
|
|
111
|
-
/**
|
|
112
|
-
* Add play event on poster mobile
|
|
113
|
-
*/
|
|
114
|
-
posterBody(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
|
|
115
|
-
|
|
116
|
-
const playerContainer: HTMLElement = instance.plyr.elements.container;
|
|
117
|
-
const playerPoster: Element = playerContainer.querySelector('.plyr__poster');
|
|
118
|
-
const playerBody: Element = playerContainer.querySelector('.lt-player__poster__body');
|
|
119
|
-
const common: Common = new LTPlayerPosterEvents.Common();
|
|
120
|
-
|
|
121
|
-
let mobileEvent: HammerManager = instance.eventInstance.mobileEvents.setMobileEvent(playerBody);
|
|
122
|
-
|
|
123
|
-
if (mobileEvent) {
|
|
124
|
-
mobileEvent.on('singletap', function LTPlayerMobilePosterPlay() {
|
|
125
|
-
|
|
126
|
-
if (playerPoster.classList.contains('d-none')) {
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
instance.playerControl.desktopEvents.titleLineBreak(instance);
|
|
131
|
-
|
|
132
|
-
instance.playerControl.mobileEvents.playPauseIcon(instance, 'timeupdate');
|
|
133
|
-
common.poster.reset(instance);
|
|
134
|
-
|
|
135
|
-
playerContainer.classList.remove('plyr__poster-enabled');
|
|
136
|
-
|
|
137
|
-
instance.playerControl.mobileEvents.showControls(instance);
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Remove Onload Poster from player
|
|
144
|
-
*/
|
|
145
|
-
onload(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
|
|
146
|
-
// const playerElementContainer = instance.playerConfig.getPlayerElementContainer();
|
|
147
|
-
// const playerOnloadPosterSelector = playerElementContainer.parentElement.querySelector('.lt-player-onload-poster');
|
|
148
|
-
//
|
|
149
|
-
// if (playerOnloadPosterSelector) {
|
|
150
|
-
// // playerElementContainer.classList.remove('d-none');
|
|
151
|
-
// playerElementContainer.parentElement.querySelector('.lt-player-onload-poster').remove();
|
|
152
|
-
// }
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
showControls(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
|
|
156
|
-
const playerContainer: HTMLElement = instance.plyr.elements.container;
|
|
157
|
-
const playerControlsContainer: HTMLElement = instance.plyr.elements.controls;
|
|
158
|
-
const playerPoster: Element = playerContainer.querySelector('.plyr__poster');
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
let mobileEvent: HammerManager = instance.eventInstance.mobileEvents.setMobileEvent(playerPoster);
|
|
162
|
-
|
|
163
|
-
if (mobileEvent) {
|
|
164
|
-
mobileEvent.on('singletap', function LTPlayerMobilePosterShowControls() {
|
|
165
|
-
if (!playerControlsContainer.classList.contains('.plyr__controls-enable')) {
|
|
166
|
-
instance.playerControl.mobileEvents.showControls(instance);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import {LTPlayerPosterPreload} from "./LTPlayerPosterPreload";
|
|
2
|
-
import {LTPlayerPoster} from "./LTPlayerPoster";
|
|
3
|
-
import {LTPlayer} from "../LTPlayerType";
|
|
4
|
-
import {LTPlayerDevMethode} from "../LTPlayerDevMethode";
|
|
5
|
-
import {LTPlayerConfig} from "../config/LTPlayerConfig";
|
|
6
|
-
import {TemplateService} from "../../services/TemplateService";
|
|
7
|
-
import {IconsService} from "../../services/IconsService";
|
|
8
|
-
import {LTPlayerPosterEvents} from "./LTPlayerPosterEvents";
|
|
9
|
-
|
|
10
|
-
export class LTPlayerPosterManager {
|
|
11
|
-
|
|
12
|
-
instance: LTPlayer.LandscapeType | LTPlayer.PortraitType
|
|
13
|
-
preload: LTPlayerPosterPreload
|
|
14
|
-
poster: LTPlayerPoster
|
|
15
|
-
playerConfig: LTPlayerConfig
|
|
16
|
-
iconService: IconsService
|
|
17
|
-
templateService: TemplateService
|
|
18
|
-
desktopEvents: LTPlayerPosterEvents.Desktop;
|
|
19
|
-
mobileEvents: LTPlayerPosterEvents.Mobile;
|
|
20
|
-
constructor() {
|
|
21
|
-
this.desktopEvents = new LTPlayerPosterEvents.Desktop();
|
|
22
|
-
this.mobileEvents = new LTPlayerPosterEvents.Mobile();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
init(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
|
|
26
|
-
|
|
27
|
-
this.instance = instance;
|
|
28
|
-
this.playerConfig = instance.playerConfig;
|
|
29
|
-
this.templateService = instance.templateService;
|
|
30
|
-
this.iconService = instance.iconService;
|
|
31
|
-
|
|
32
|
-
this.poster = new LTPlayerPoster(this.instance.plyr, this.templateService, this.playerConfig, this.iconService);
|
|
33
|
-
|
|
34
|
-
this.poster.setTemplate();
|
|
35
|
-
this.poster.setImage();
|
|
36
|
-
if (this.playerConfig.getPreload()) {
|
|
37
|
-
this.initPreload();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
initPreload() {
|
|
42
|
-
this.preload = new LTPlayerPosterPreload();
|
|
43
|
-
this.preload.initPreload(this.instance.plyr, this.templateService, this.playerConfig, this.iconService);
|
|
44
|
-
this.instance.devMethodePreload = new LTPlayerDevMethode.Preload(this.instance, this.preload);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {LTPlayerPoster} from "./LTPlayerPoster";
|
|
2
|
-
import Plyr from "plyr";
|
|
3
|
-
import {TemplateService} from "../../services/TemplateService";
|
|
4
|
-
import {LTPlayerConfig} from "../config/LTPlayerConfig";
|
|
5
|
-
import {IconsService} from "../../services/IconsService";
|
|
6
|
-
import {LoaderService} from "../../services/LoaderService";
|
|
7
|
-
import {LTPlayer} from "../LTPlayerType";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Preload video
|
|
11
|
-
*/
|
|
12
|
-
export class LTPlayerPosterPreload {
|
|
13
|
-
config: LTPlayerConfig;
|
|
14
|
-
iconService: IconsService;
|
|
15
|
-
templateService: TemplateService;
|
|
16
|
-
plyr: Plyr
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Setup preload video with poster cover
|
|
20
|
-
* @param plyr
|
|
21
|
-
* @param templateService
|
|
22
|
-
* @param config
|
|
23
|
-
* @param iconService
|
|
24
|
-
*/
|
|
25
|
-
initPreload(plyr: Plyr, templateService: TemplateService, config: LTPlayerConfig, iconService: IconsService) {
|
|
26
|
-
|
|
27
|
-
this.plyr = plyr;
|
|
28
|
-
this.iconService = iconService;
|
|
29
|
-
this.templateService = templateService;
|
|
30
|
-
this.config = config;
|
|
31
|
-
|
|
32
|
-
const playerContainer = plyr.elements.container;
|
|
33
|
-
const imagePosterContainer = playerContainer.querySelector('.lt-player__poster__image-body');
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (imagePosterContainer) {
|
|
37
|
-
|
|
38
|
-
if (config.isAutoPreload()) {
|
|
39
|
-
this.plyr.on('play', () => {
|
|
40
|
-
imagePosterContainer.classList.add('lt-player__poster__image-body--preload');
|
|
41
|
-
})
|
|
42
|
-
} else {
|
|
43
|
-
setTimeout(() => {
|
|
44
|
-
imagePosterContainer.classList.add('lt-player__poster__image-body--preload');
|
|
45
|
-
}, 800)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import {LTPlayer} from "../LTPlayerType";
|
|
2
|
-
import {LoaderService} from "../../services/LoaderService";
|
|
3
|
-
|
|
4
|
-
export class LTPlayerPosterPreloadEvents {
|
|
5
|
-
static preloadEvents = {
|
|
6
|
-
removePosterImage(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
|
|
7
|
-
const playerElementContainer = instance.playerConfig.getPlayerElementContainer();
|
|
8
|
-
const playerOnloadPosterSelector = playerElementContainer.parentElement.querySelector('.plyr__poster');
|
|
9
|
-
if (playerOnloadPosterSelector) {
|
|
10
|
-
playerOnloadPosterSelector.classList.add('lt-player__preload-hide');
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
embedPlay(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string) {
|
|
15
|
-
let playerContainer = instance.plyr.elements.container;
|
|
16
|
-
playerContainer.querySelector(`.lt-player__poster`).insertAdjacentHTML('afterend', LoaderService.getSpinner());
|
|
17
|
-
const preloadData = instance.playerConfig.getPreload();
|
|
18
|
-
const playAutoPreload = () => {
|
|
19
|
-
console.log('preload play')
|
|
20
|
-
if (preloadData.start !== 0) {
|
|
21
|
-
instance.plyr.embed.setCurrentTime(preloadData.start).then(() => {
|
|
22
|
-
instance.plyr.embed.setMuted(true).then(function () {
|
|
23
|
-
instance.plyr.embed.play().then(function () {
|
|
24
|
-
instance.plyr.volume = 0;
|
|
25
|
-
LoaderService.removeSpinner(playerContainer)
|
|
26
|
-
});
|
|
27
|
-
}).catch(function () {
|
|
28
|
-
// an error occurred
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
LoaderService.removeSpinner(playerContainer)
|
|
32
|
-
} else {
|
|
33
|
-
instance.plyr.volume = 0;
|
|
34
|
-
if (instance.plyr.embed) {
|
|
35
|
-
instance.plyr.embed.play().then(function () {
|
|
36
|
-
LoaderService.removeSpinner(playerContainer)
|
|
37
|
-
});
|
|
38
|
-
} else {
|
|
39
|
-
instance.plyr.play()
|
|
40
|
-
LoaderService.removeSpinner(playerContainer)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const pausePreload = () => {
|
|
47
|
-
console.log('preload play')
|
|
48
|
-
if (preloadData.start !== 0) {
|
|
49
|
-
instance.plyr.embed.setCurrentTime(preloadData.start).then( () => {
|
|
50
|
-
instance.plyr.embed.pause().then(function() {
|
|
51
|
-
instance.plyr.volume = 0;
|
|
52
|
-
LoaderService.removeSpinner(playerContainer)
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
} else {
|
|
56
|
-
if (instance.plyr.embed) {
|
|
57
|
-
instance.plyr.embed.pause().then(function () {
|
|
58
|
-
LoaderService.removeSpinner(playerContainer)
|
|
59
|
-
});
|
|
60
|
-
} else {
|
|
61
|
-
instance.plyr.pause()
|
|
62
|
-
LoaderService.removeSpinner(playerContainer)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
LoaderService.removeSpinner(playerContainer)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const playEvent = () => {
|
|
69
|
-
if (instance.playerConfig.isAutoPreload()) {
|
|
70
|
-
playAutoPreload();
|
|
71
|
-
} else {
|
|
72
|
-
pausePreload();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
switch (type) {
|
|
77
|
-
case 'event':
|
|
78
|
-
this.removePosterImage(instance);
|
|
79
|
-
playEvent();
|
|
80
|
-
break
|
|
81
|
-
case 'action':
|
|
82
|
-
playAutoPreload();
|
|
83
|
-
break
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
html5Play(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string) {
|
|
88
|
-
|
|
89
|
-
const play = () => {
|
|
90
|
-
instance.plyr.volume = 0;
|
|
91
|
-
const preloadData = instance.playerConfig.getPreload();
|
|
92
|
-
|
|
93
|
-
if (preloadData.start !== 0) {
|
|
94
|
-
instance.plyr.currentTime = preloadData.start;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
switch (type) {
|
|
98
|
-
case 'event':
|
|
99
|
-
this.removePosterImage(instance);
|
|
100
|
-
if (instance.playerConfig.isAutoPreload()) {
|
|
101
|
-
instance.plyr.play();
|
|
102
|
-
} else {
|
|
103
|
-
instance.plyr.pause();
|
|
104
|
-
}
|
|
105
|
-
break
|
|
106
|
-
case 'action':
|
|
107
|
-
instance.plyr.play();
|
|
108
|
-
break
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
let checkPlayer = false;
|
|
114
|
-
|
|
115
|
-
instance.plyr.on('loadeddata', () => {
|
|
116
|
-
checkPlayer = true;
|
|
117
|
-
play();
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
if (!checkPlayer) {
|
|
121
|
-
play();
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
stop(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string) {
|
|
127
|
-
const playEvent = () => {
|
|
128
|
-
const preloadData = instance.playerConfig.getPreload();
|
|
129
|
-
if (instance.plyr.currentTime >= preloadData.stop) {
|
|
130
|
-
if (instance.plyr.isEmbed) {
|
|
131
|
-
this.embedPlay(instance, 'action');
|
|
132
|
-
} else {
|
|
133
|
-
this.html5Play(instance, 'action');
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const stop = () => {
|
|
140
|
-
instance.plyr.pause();
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
switch (type) {
|
|
144
|
-
case 'event':
|
|
145
|
-
playEvent();
|
|
146
|
-
break
|
|
147
|
-
case 'action' :
|
|
148
|
-
stop();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
@@ -1,131 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import {LTPlayerShareManager} from "./LTPlayerShareManager";
|
|
2
|
-
|
|
3
|
-
export namespace LTPlayerShareEvents {
|
|
4
|
-
|
|
5
|
-
export class mobile {
|
|
6
|
-
|
|
7
|
-
manager : LTPlayerShareManager
|
|
8
|
-
|
|
9
|
-
constructor(manager: LTPlayerShareManager) {
|
|
10
|
-
this.manager = manager;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
init() {
|
|
14
|
-
const buttons = [
|
|
15
|
-
this.manager.instance.plyr.elements.container.querySelector('.poster-lt-player-share'),
|
|
16
|
-
this.manager.instance.plyr.elements.controls.querySelector('.lt-player-share'),
|
|
17
|
-
];
|
|
18
|
-
|
|
19
|
-
const instance = this;
|
|
20
|
-
|
|
21
|
-
buttons.forEach(button => {
|
|
22
|
-
if (button) {
|
|
23
|
-
let mobileEvent: HammerManager = this.manager.instance.eventInstance.mobileEvents.setMobileEvent(button);
|
|
24
|
-
if (mobileEvent) {
|
|
25
|
-
mobileEvent.on('singletap', function LTPlayerMobileShareButtons(event) {
|
|
26
|
-
event.preventDefault();
|
|
27
|
-
instance.manager.mobile.activeModal();
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class desktop {
|
|
36
|
-
manager : LTPlayerShareManager
|
|
37
|
-
constructor(manager: LTPlayerShareManager) {
|
|
38
|
-
this.manager = manager;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
init() {
|
|
42
|
-
const manager = this.manager;
|
|
43
|
-
manager.desktop.getSelector().buttons.forEach(button => {
|
|
44
|
-
if (button) {
|
|
45
|
-
button.addEventListener('click', () => {
|
|
46
|
-
manager.desktop.activeModal();
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
if (manager.desktop.getSelector().shareContainer) {
|
|
52
|
-
manager.desktop.getSelector().shareContainer.addEventListener('click', function LTPlayerShareArea(event) {
|
|
53
|
-
event.preventDefault();
|
|
54
|
-
if ( manager.desktop.getSelector().shareContainer.classList.contains('share-active')) {
|
|
55
|
-
let target = event.target as HTMLElement;
|
|
56
|
-
if (target.classList.contains('share-active') || target.classList.contains('player-lt__close-button')) {
|
|
57
|
-
manager.desktop.inactiveModal();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
})
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import {LTPlayer} from "../LTPlayerType";
|
|
2
|
-
import {LTPlayerConfig} from "../config/LTPlayerConfig";
|
|
3
|
-
import {IconsService} from "../../services/IconsService";
|
|
4
|
-
import {TemplateService} from "../../services/TemplateService";
|
|
5
|
-
import {LTPlayerShareEvents} from "./LTPlayerShareEvents";
|
|
6
|
-
import {shareType} from "../../global/types/ModuleTypes";
|
|
7
|
-
import {LTPlayerShareDesktop} from "./LTPlayerShareDesktop";
|
|
8
|
-
import {LTPlayerShareMobile} from "./LTPlayerShareMobile";
|
|
9
|
-
|
|
10
|
-
export class LTPlayerShareManager {
|
|
11
|
-
instance: LTPlayer.LandscapeType | LTPlayer.PortraitType
|
|
12
|
-
playerConfig: LTPlayerConfig
|
|
13
|
-
iconService: IconsService
|
|
14
|
-
templateService: TemplateService
|
|
15
|
-
events: shareType = {
|
|
16
|
-
desktop : undefined,
|
|
17
|
-
mobile : undefined
|
|
18
|
-
}
|
|
19
|
-
desktop : LTPlayerShareDesktop
|
|
20
|
-
mobile: LTPlayerShareMobile
|
|
21
|
-
|
|
22
|
-
init(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
|
|
23
|
-
this.instance = instance;
|
|
24
|
-
this.playerConfig = instance.playerConfig;
|
|
25
|
-
this.templateService = instance.templateService;
|
|
26
|
-
this.iconService = instance.iconService;
|
|
27
|
-
this.appendScriptTag();
|
|
28
|
-
this.setByDevice();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
setByDevice() {
|
|
32
|
-
switch (this.playerConfig.getDevice()) {
|
|
33
|
-
case "desktop":
|
|
34
|
-
this.desktop = new LTPlayerShareDesktop(this);
|
|
35
|
-
this.events.desktop = new LTPlayerShareEvents.desktop(this);
|
|
36
|
-
break
|
|
37
|
-
case "mobile":
|
|
38
|
-
this.mobile = new LTPlayerShareMobile(this);
|
|
39
|
-
this.events.mobile = new LTPlayerShareEvents.mobile(this)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
appendScriptTag() {
|
|
44
|
-
const script = document.createElement("script");
|
|
45
|
-
script.classList.add('lt-player-add-to-any')
|
|
46
|
-
script.type = "text/javascript";
|
|
47
|
-
script.src = "https://static.addtoany.com/menu/page.js";
|
|
48
|
-
script.async;
|
|
49
|
-
document.body.appendChild(script);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
removeScriptTag() {
|
|
53
|
-
const script = document.querySelector('.lt-player-add-to-any');
|
|
54
|
-
if(script) {
|
|
55
|
-
script.remove();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|