@latest-thinking/lt-player 1.0.4-n → 1.0.4-p

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.
@@ -1,5 +1,5 @@
1
1
  import {LTPlayer} from "../LTPlayerType";
2
- import {LTPlayerConfig} from "../LTPlayerConfig";
2
+ import {LTPlayerConfig} from "../config/LTPlayerConfig";
3
3
  import {IconsService} from "../../services/IconsService";
4
4
  import {TemplateService} from "../../services/TemplateService";
5
5
  import {LTPlayerShareEvents} from "./LTPlayerShareEvents";
@@ -1,4 +1,4 @@
1
- import {LTPlayerConfig} from "../../components/LTPlayerConfig";
1
+ import {LTPlayerConfig} from "../../components/config/LTPlayerConfig";
2
2
  import {LTPlayerControls} from "../../components/controls/LTPlayerControls";
3
3
  import Plyr from "plyr";
4
4
  import {TemplateService} from "../../services/TemplateService";
@@ -1,4 +1,4 @@
1
- import {urlDataType, urlVideoType} from "../global/types/ModuleTypes";
1
+ import {defaultType} from "../global/types/ModuleTypes";
2
2
 
3
3
  export class Helper {
4
4
  static getDevice() {
@@ -28,7 +28,7 @@ export class Helper {
28
28
  }
29
29
  }
30
30
 
31
- static processConfigData(videoUrl: string) {
31
+ static processConfigData(videoUrl: string | defaultType) {
32
32
 
33
33
  const regex = /^(http:\/\/|https:\/\/)(player\.vimeo\.com|vimeo\.com|youtu\.be|www\.youtube\.com)\/([\w\/]+)(\?.*)?$/;
34
34
 
@@ -36,7 +36,7 @@ export class Helper {
36
36
  let type = 'video';
37
37
  let origin = 'video';
38
38
 
39
- if ((groupMatch = regex.exec(videoUrl)) !== null) {
39
+ if ((groupMatch = regex.exec(<string>videoUrl)) !== null) {
40
40
  groupMatch.forEach((match: string) => {
41
41
  if (match !== undefined) {
42
42
  if (match.includes('vimeo')) {
@@ -57,7 +57,7 @@ export class Helper {
57
57
  };
58
58
  }
59
59
 
60
- static getEmbeddedID = (url: string) => {
60
+ static getEmbeddedID = (url: string | defaultType) => {
61
61
  const urlGroups = url.split('?')[0].split('/');
62
62
  if (urlGroups.length > 4) {
63
63
  return url.split('?')[0].split('/').slice(-2)[0];
@@ -66,11 +66,26 @@ export class Helper {
66
66
 
67
67
  }
68
68
 
69
- static getEmbeddedHash = (url: string) => {
69
+ static getEmbeddedHash = (url: string | defaultType) => {
70
70
  const urlGroups = url.split('?')[0].split('/');
71
71
  if (urlGroups.length > 4) {
72
72
  return url.split('?')[0].split('/').slice(-1)[0];
73
73
  }
74
74
  return null;
75
75
  }
76
+
77
+ static isValidHttpUrl(string: string | defaultType) {
78
+ let url;
79
+
80
+ if (typeof string === 'object') {
81
+ return false;
82
+ }
83
+
84
+ try {
85
+ url = new URL(string);
86
+ } catch (_) {
87
+ return false;
88
+ }
89
+ return url.protocol === "http:" || url.protocol === "https:";
90
+ }
76
91
  }
@@ -8,7 +8,7 @@ import share from '../views/share.handlebars';
8
8
  import background from '../views/background.handlebars';
9
9
  import miniPlayerControls from '../views/controls.handlebars';
10
10
  import onloadPoster from '../views/onloadPoster.handlebars';
11
- import {LTPlayerConfig} from "../components/LTPlayerConfig";
11
+ import {LTPlayerConfig} from "../components/config/LTPlayerConfig";
12
12
  import {IconsService} from "./IconsService";
13
13
  import {defaultType} from "../global/types/ModuleTypes";
14
14
 
@@ -166,7 +166,32 @@
166
166
  <div class="player-lt__modal__mobile d-none"></div>
167
167
  </div>
168
168
  {{#mobile}}
169
- <div class="plyr__controls__mobile-background d-none"></div>
169
+ <div class="plyr__controls__mobile-background d-none">
170
+ <div class="lt-player-notification">
171
+ <div class="lt-player-rewind-area">
172
+ </div>
173
+ <div class="lt-player-rewind lt-player-notify">
174
+ <div class="lt-player-rewind__icon lt-player-rewind__icon__portrait">
175
+ <span class="rewind">10 sec</span>
176
+ <div class="lt-player-rewind__icon-wrapper rotate">
177
+ <img class="filter" src="{{icons.play}}" alt="">
178
+ <img class="filter" src="{{icons.play}}" alt="">
179
+ </div>
180
+ </div>
181
+ </div>
182
+ <div class="lt-player-forward-area">
183
+ </div>
184
+ <div class="lt-player-forward lt-player-notify">
185
+ <div class="lt-player-forward__icon lt-player-forward__icon__portrait">
186
+ <div class="lt-player-rewind__icon-wrapper">
187
+ <img class="filter" src="{{icons.play}}" alt="">
188
+ <img class="filter" src="{{icons.play}}" alt="">
189
+ </div>
190
+ <span class="forward">10 sec</span>
191
+ </div>
192
+ </div>
193
+ </div>
194
+ </div>
170
195
  {{/mobile}}
171
196
  {{/landscape}}
172
197
  {{#portrait}}
@@ -206,9 +231,12 @@
206
231
  <div class="lt-player-video-content">
207
232
  <div class="content__body">
208
233
  <h4 class="poster-title">{{videoParagraph}}</h4>
209
- <p class="poster-paragraph">{{videoTitle}}</p>
234
+ <div class="poster-paragraph">
235
+ <p class="poster-paragraph__content">{{videoTitle}}</p>
236
+ </div>
210
237
  </div>
211
238
  </div>
239
+ <button class="poster-paragraph__button">Read more</button>
212
240
  <div class="lt-player-rewind-area">
213
241
  </div>
214
242
  <div class="lt-player-rewind lt-player-notify">
@@ -305,7 +333,32 @@
305
333
  <div class="player-lt__modal__mobile d-none"></div>
306
334
  </div>
307
335
  {{#mobile}}
308
- <div class="plyr__controls__mobile-background d-none"></div>
336
+ <div class="plyr__controls__mobile-background d-none">
337
+ <div class="lt-player-notification">
338
+ <div class="lt-player-rewind-area">
339
+ </div>
340
+ <div class="lt-player-rewind lt-player-notify">
341
+ <div class="lt-player-rewind__icon lt-player-rewind__icon__portrait">
342
+ <span class="rewind">10 sec</span>
343
+ <div class="lt-player-rewind__icon-wrapper rotate">
344
+ <img class="filter" src="{{icons.play}}" alt="">
345
+ <img class="filter" src="{{icons.play}}" alt="">
346
+ </div>
347
+ </div>
348
+ </div>
349
+ <div class="lt-player-forward-area">
350
+ </div>
351
+ <div class="lt-player-forward lt-player-notify">
352
+ <div class="lt-player-forward__icon lt-player-forward__icon__portrait">
353
+ <div class="lt-player-rewind__icon-wrapper">
354
+ <img class="filter" src="{{icons.play}}" alt="">
355
+ <img class="filter" src="{{icons.play}}" alt="">
356
+ </div>
357
+ <span class="forward">10 sec</span>
358
+ </div>
359
+ </div>
360
+ </div>
361
+ </div>
309
362
  {{/mobile}}
310
363
  {{/portrait}}
311
364
  {{/player}}
@@ -1,10 +1,10 @@
1
1
  {{#embedded }}
2
- <div class="plyr__video-embed embed_player" data-plyr-provider="{{origin}}" data-plyr-embed-id="{{embedId}}" data-plyr-embed-hash="{{embedHash}}">
2
+ <div class="plyr__video-embed embed_player" data-plyr-provider="{{videoUrl.origin}}" data-plyr-embed-id="{{videoUrl.embedId}}" data-plyr-embed-hash="{{videoUrl.embedHash}}">
3
3
  </div>
4
4
  {{/embedded}}
5
5
  {{#video}}
6
6
  <video class="embed_player lt-player-wrapper" playsinline controls>
7
- <source src="{{videoUrl}}"/>
7
+ <source src="{{videoUrl.videoUrl}}"/>
8
8
  {{#defaultConfig.captions}}
9
9
  <track kind="captions" label="{{label}} captions" src="{{url}}" srclang="{{srclang}}" {{default}} />
10
10
  {{/defaultConfig.captions}}
@@ -1,398 +0,0 @@
1
- import {defaultType, playerConfigType, urlDataType} from "../global/types/ModuleTypes";
2
- import {Helper} from "../services/Helper";
3
-
4
- export class LTPlayerConfig {
5
-
6
- private configData: playerConfigType = {
7
- preload: false,
8
- selector : '',
9
- autoPlay : false,
10
- videoTitle: '',
11
- posterImage: '',
12
- videoParagraph: '',
13
- videoUrl: '',
14
- videoType: '',
15
- embedId: '',
16
- embedHash: '',
17
- origin: '',
18
- playerId: '',
19
- playerContainer: '',
20
- vimeo: {
21
- 'controls': false,
22
- "active": false,
23
- 'gesture': 'media',
24
- 'transparent': false,
25
- 'speed': true,
26
- 'portrait': true,
27
- 'keyboard': false,
28
- 'title': false,
29
- 'byline': false,
30
- 'playsinline': true,
31
- 'background' : true
32
- },
33
- youtube: {
34
- 'controls': 0,
35
- 'noCookie': false,
36
- 'rel': 0,
37
- 'showinfo': 0,
38
- 'iv_load_policy': 3,
39
- 'modestbranding': 1,
40
- 'playsinline': true,
41
- },
42
- defaultConfig : {
43
- speed : {
44
- selected : 1,
45
- captions : false,
46
- update: true
47
- },
48
- captions : {
49
- active : false
50
- },
51
- clickToPlay : false,
52
- playsinline : true,
53
- pip : false
54
- },
55
- share: null,
56
- chapters : null,
57
- dimensions: null,
58
- playerType: null,
59
- device : 'desktop'
60
- }
61
-
62
-
63
- private defaultDimensions: defaultType = {
64
- max_width: '450px',
65
- min_width: '350px',
66
- max_height: '780px',
67
- min_height: '600px'
68
- }
69
-
70
- /**
71
- * @param config
72
- */
73
- constructor(config: playerConfigType) {
74
- this.setConfig(config);
75
- this.processConfigData();
76
- }
77
-
78
- setConfig(config: playerConfigType) {
79
- Object.keys(this.configData).forEach(item => {
80
-
81
- const setCustomConfig = (item: object, configItem: object) => {
82
-
83
- if (configItem && Object.keys(configItem).length > 0) {
84
-
85
- Object.keys(configItem).forEach( element => {
86
- if (item[element as keyof typeof item] === configItem[element as keyof typeof configItem]) {
87
- item[element as keyof typeof item] = configItem[element as keyof typeof configItem]
88
- } else {
89
- Object.assign(item, {[element]:configItem[element as keyof typeof configItem]})
90
- }
91
- })
92
- }
93
-
94
- return item;
95
-
96
- }
97
-
98
- const setDimensions = (data: defaultType) : any => {
99
-
100
- let response: defaultType = {
101
- width: '100%',
102
- min_width: this.defaultDimensions.min_width,
103
- max_width: this.defaultDimensions.max_width,
104
- height: '100%',
105
- min_height: this.defaultDimensions.min_height,
106
- max_height: this.defaultDimensions.max_height,
107
- }
108
-
109
-
110
- if (data) {
111
- if (data.width <= parseInt(this.defaultDimensions.max_width.replace('px', '')) && data.width >= parseInt(this.defaultDimensions.min_width.replace('px', ''))) {
112
- response.width = (Number.isInteger(data.width)) ? `${data.width}px` : '100%';
113
- }
114
-
115
- if (data.height <= parseInt(this.defaultDimensions.max_height.replace('px', '')) && data.height >= parseInt(this.defaultDimensions.min_height.replace('px', ''))) {
116
- response.height = (Number.isInteger(data.height)) ? `${data.height}px` : '100%';
117
- }
118
- }
119
-
120
- return response;
121
-
122
- }
123
-
124
- switch (item) {
125
- case 'vimeo':
126
- this.configData[item] = setCustomConfig(this.configData[item], config[item]);
127
- break;
128
- case 'youtube':
129
- this.configData[item] = setCustomConfig(this.configData[item], config[item]);
130
- break;
131
- case 'defaultConfig':
132
- this.configData[item] = setCustomConfig(this.configData[item], config[item]);
133
- break
134
- case 'dimensions':
135
- this.configData[item] = setDimensions(config[item]);
136
- break
137
- case 'additionalInfo':
138
- this.configData[item] = config[item];
139
- break
140
- case 'playerId' :
141
- if (typeof item === 'string') {
142
- this.configData[item] = parseInt(config[item]);
143
- } else {
144
- this.configData[item] = config[item];
145
- }
146
- break
147
- case 'preload':
148
- const setDefaultTimeRange = () => {
149
- this.configData[item] = {
150
- start : 0,
151
- stop : 10
152
- }
153
- }
154
-
155
- const setTimeRange = (config: defaultType) => {
156
-
157
- setDefaultTimeRange();
158
-
159
- if (config.start) {
160
-
161
- let start = config.start;
162
-
163
- if (typeof start === 'string') {
164
- start = parseFloat(start);
165
- }
166
-
167
- this.configData[item].start = start;
168
-
169
-
170
- if (!start) {
171
- this.configData[item].start = 0;
172
- }
173
- }
174
- if (config.stop) {
175
-
176
- let stop = config.stop;
177
-
178
- if (typeof stop === 'string') {
179
- stop = parseFloat(stop);
180
- }
181
-
182
- this.configData[item].stop = stop;
183
-
184
- if (!stop) {
185
- this.configData[item].stop = 10;
186
- }
187
-
188
- }
189
-
190
- if (!config.start || !config.stop) {
191
- setDefaultTimeRange();
192
- }
193
- }
194
-
195
-
196
- const setPreloadType = (type: defaultType) => {
197
-
198
- this.configData[item].autoType = true;
199
-
200
- if (type.onload !== undefined) {
201
- if (typeof type.onload === 'string' && type.onload === 'false') {
202
- this.configData[item].autoType = false;
203
- }
204
-
205
- if (typeof type.onload === 'boolean') {
206
- if (!type.onload) {
207
- this.configData[item].autoType = false;
208
- }
209
- }
210
- }
211
-
212
- }
213
-
214
- const setActive = () => {
215
- this.configData[item].isActive = true;
216
- }
217
-
218
- if (typeof config[item] === 'object') {
219
- if (Object.keys(config[item]).length !== 0) {
220
- setTimeRange(config[item]);
221
- setPreloadType(config[item]);
222
- setActive();
223
- }
224
-
225
- if (Object.keys(config[item]).length === 0) {
226
- setDefaultTimeRange();
227
- setPreloadType(config[item]);
228
- setActive();
229
- }
230
- }
231
-
232
-
233
- if (typeof config[item] === 'string' && config[item] !== 'false') {
234
- switch (config[item]) {
235
- case 'true':
236
- setDefaultTimeRange();
237
- setPreloadType(config[item]);
238
- setActive();
239
- break
240
- }
241
- }
242
-
243
- if (typeof config[item] === 'boolean') {
244
- if (config[item]) {
245
- setDefaultTimeRange();
246
- setPreloadType(config[item]);
247
- setActive();
248
- }
249
- }
250
-
251
- break
252
- default:
253
- if (config[item]) {
254
- this.configData[item] = config[item];
255
- }
256
- }
257
- })
258
- }
259
-
260
- processConfigData() {
261
-
262
- let videoUrl: string = this.configData.videoUrl;
263
-
264
- const urlVideoData: urlDataType = Helper.processConfigData(videoUrl);
265
-
266
- this.configData.origin = urlVideoData.origin;
267
-
268
- if (!this.configData.videoType.toLowerCase() || (urlVideoData.type !== this.configData.videoType.toLowerCase())) {
269
- Object.assign(this.configData, {videoType: urlVideoData.type})
270
- }
271
-
272
- if (this.configData.videoType === 'embedded') {
273
-
274
- this.configData.embedId = Helper.getEmbeddedID(this.configData.videoUrl);
275
-
276
- if (Helper.getEmbeddedHash(this.configData.videoUrl)) {
277
- this.configData.embedHash = Helper.getEmbeddedHash(this.configData.videoUrl);
278
- }
279
-
280
- }
281
- }
282
-
283
- getDimensions() {
284
- return this.configData.dimensions
285
- }
286
-
287
- getAdditionalInfo() {
288
- return this.configData.additionalInfo;
289
- }
290
-
291
- getVideoTitle() {
292
- return this.configData.videoTitle;
293
- }
294
-
295
- getPosterImage() {
296
- return this.configData.posterImage;
297
- }
298
-
299
- getParagraph() {
300
- return this.configData.videoParagraph;
301
- }
302
-
303
- getVideoType() {
304
- return this.configData.videoType;
305
- }
306
-
307
- getVideoUrl() {
308
- return this.configData.videoUrl;
309
- }
310
-
311
- getPlayerId() {
312
- return this.configData.playerId;
313
- }
314
-
315
- getConfigData() {
316
- return this.configData;
317
- }
318
-
319
- getPlayerElementContainer() {
320
- return this.configData.playerContainer;
321
- }
322
-
323
- getVideoOrigin() {
324
- return this.configData.origin;
325
- }
326
-
327
- /**
328
- *
329
- * @param origin
330
- */
331
- getConfigByOrigin(origin: string) {
332
- return (this.configData[origin] !== undefined) ? this.configData[origin] : null;
333
- }
334
-
335
- getDefaultConfigItems() {
336
- return this.configData.defaultConfig;
337
- }
338
-
339
- getDomSelector() {
340
- return this.configData.selector;
341
- }
342
-
343
- getChapters() {
344
- return this.configData.chapters
345
- }
346
-
347
- isShareData() {
348
- if (this.configData.share) {
349
- return Object.keys(this.configData.share).length > 0;
350
- }
351
-
352
- return false;
353
- }
354
-
355
- getShareData() {
356
- return this.configData.share
357
- }
358
-
359
- getCaptions () {
360
- return this.configData.defaultConfig.captions
361
- }
362
-
363
- getPlayerType() {
364
- return this.configData.playerType
365
- }
366
-
367
- setPlayerId(id: number) {
368
- this.configData.playerId = id;
369
- }
370
-
371
- isAutoPlay() {
372
- return this.configData.autoPlay;
373
- }
374
-
375
- getPreload() {
376
- return this.configData.preload;
377
- }
378
- isAutoPreload() {
379
- return this.configData.preload.autoType;
380
- }
381
-
382
- getDevice() {
383
- return this.configData.device;
384
- }
385
-
386
- getEmbedOrigin() {
387
- return {[this.getVideoOrigin()] : this.getConfigByOrigin(this.getVideoOrigin())};
388
- }
389
-
390
- getFullscreenMode() {
391
- if (this.getDevice() === 'mobile') {
392
- return {fullscreen: {enabled: false}}
393
- } else {
394
- return false
395
- }
396
- }
397
- }
398
-