PluginProbe
WpStream – Live Streaming, Video on Demand, Pay Per View / 4.5.11.6
WpStream – Live Streaming, Video on Demand, Pay Per View v4.5.11.6
4.14.1 4.14.0 4.13.2 4.13.1 4.13 4.12.5 4.12.4 4.12.3 4.12.2 4.12.1 4.12 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5 4.5.1 4.5.11 4.5.11.1 4.5.11.2 4.5.11.4 4.5.11.5 4.5.11.6 All 181 releases
wpstream / public / js / wpstream-player.js

wpstream-player.js in WpStream – Live Streaming, Video on Demand, Pay Per View 4.5.11.6, at public/js/wpstream-player.js

941 lines 28.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 * player,'.$live_event_uri_final.','.$live_conect_views.'
6 */
7
8 window.WebSocket = window.WebSocket || window.MozWebSocket;
9 if (!window.WebSocket) {
10 console.log("Sorry, but your browser does not support WebSockets");
11 }
12
13 function wpstream_player_initialize(settings){
14 const player = new WpstreamPlayer(settings);
15 }
16
17 class WpstreamPlayer {
18 // id;
19 // trailerUrl;
20 // contentUrl;
21 // statsUri;
22 // autoplay;
23 // ruler = 0; //0 - basic; 1 - ajax; 2 - ws
24 // state = -1;
25 //-1 - unknown
26 // 0 - stopped
27 // 1 - notstarted
28 // 2 - started
29 // 4 - init
30 // 5 - paused
31 // 6 - startup
32 // 7 - onair
33 // 9 - ended
34 // 10 - finished
35
36 // liveConnect;
37 // wrapper;
38 // counter;
39 // chat;
40
41 constructor(settings){
42 console.log("[]WpstreamPlayer: ", settings);
43 this.id = settings.videoElementId;
44 this.trailerUrl = settings.trailerUrl;
45 this.contentUrl = settings.contentUrl;
46 this.statsUri = settings.statsUri;
47 this.autoplay = settings.autoplay;
48 this.playTrailerButton = jQuery(`#${settings.playTrailerButtonElementId}`);
49 this.muteTrailerButton = jQuery(`#${settings.muteTrailerButtonElementId}`);
50 this.unmuteTrailerButton = jQuery(`#${settings.unmuteTrailerButtonElementId}`);
51 console.log("playTrailerButton: ", this.playTrailerButton);
52 this.liveConnect = new LiveConnect(this);
53 this.wrapper = jQuery('#wpstream_live_player_wrapper' + this.id);
54 console.log("wrapper: ", this.wrapper)
55 this.channelId = this.wrapper.attr('data-product-id');
56 console.log("channelId: ", this.channelId)
57 this.playback = new WpstreamPlayback(this, this.id, this.autoplay);
58 this.counter = new LiveCounter(this.wrapper, this.id);
59 this.liveMessage = new WpstreamLiveMessage(this.wrapper, this.id);
60 this.chat = new WpstreamChat();
61 this.setRuler(1);
62
63 if (settings.trailerUrl) {
64 const owner = this;
65 this.playTrailerButton.on('click',function(){
66 console.log("playTrailer()");
67 owner.playTrailerButton.hide();
68 owner.playback.playTrailer(owner.trailerUrl, true);
69 });
70 this.muteTrailerButton.on("click", function(){
71 owner.playback.player.muted(true);
72 });
73 this.unmuteTrailerButton.on("click", function(){
74 owner.playback.player.muted(false);
75 });
76 }
77 this.playTrailerButton.hide();
78 }
79
80 setRuler(ruler){
81 console.log("setRuler: " + ruler);
82 let oldRuler = this.ruler;
83 console.log("oldRuler: ", oldRuler);
84 this.ruler = ruler;
85 switch (ruler){
86 case 1:
87 if (oldRuler != 1){
88 this.getDynamicSettings();
89 }
90 clearTimeout(this.retrieveDynamicSettingsTimeout);
91 let self = this;
92 this.retrieveDynamicSettingsTimeout = setTimeout(() => self.getDynamicSettings(), 30 * 1000)
93 break;
94 case 2:
95 clearTimeout(this.retrieveDynamicSettingsTimeout);
96 break;
97 }
98 }
99
100 getDynamicSettings(){
101 console.log("getDynamicSettings()");
102 let ajaxurl = wpstream_player_vars.admin_url + 'admin-ajax.php';
103 let owner = this;
104 jQuery.ajax({
105 type: 'POST',
106 url: ajaxurl,
107 dataType: 'json',
108 data: {
109 'action' : 'wpstream_player_check_status',
110 'channel_id' : this.channelId
111 },
112 success: function (data) {
113
114 console.log("dynamicSettings: ", data);
115 if (data == 0){
116 owner.setState('stopped');
117 }
118 else if (data.started == "no"){
119 owner.setState('notstarted');
120 owner.chat.disconnect();
121
122 }
123 else if (data.started == "yes"){
124 let liveConnectUri = data.live_conect_views;
125 owner.liveConnect.setup(liveConnectUri);
126 let contentUrl = data.event_uri;
127 owner.setState('started');
128 owner.setContentSrc(contentUrl);
129 owner.chat.connect(data.chat_url);
130 }
131 },
132 error: function (error) {
133 console.log("dynamicSettingsError: ", error)
134 }
135 });
136 if (this.ruler <= 1){
137 this.setRuler(1);
138 }
139 }
140
141 setContentSrc(uri){
142 this.playback.setContentSrc(uri);
143 }
144
145 setState(state){
146 console.log("setState: ", state);
147 const oldState = this.state;
148 console.log("oldState: ", oldState);
149 this.state = state;
150
151 if (this.trailerUrl && state != 'onair' && state != 'started' && state != 'startup'){
152 this.playback.playTrailer(this.trailerUrl);
153 }
154
155 switch(state){
156 case 'stopped':
157 case 'notstarted':
158 case 'starting':
159 this.liveMessage.showStoppedMessage();
160 this.playback.pauseContent();
161 break;
162 case 'started':
163 this.liveMessage.hide();
164 break;
165 case 'init':
166 case 'paused':
167 this.liveMessage.showMessage(state);
168 this.playback.pauseContent();
169 break;
170 case 'ended':
171 this.liveMessage.showMessage(state);
172 this.playback.pauseContent(true);
173 break;
174 case 'startup':
175 this.liveMessage.showMessage(state);
176 if (oldState != 'onair'){
177 this.playback.pauseContent();
178 }
179 break;
180 case 'onair':
181 this.liveMessage.hide();
182 this.playback.playContent();
183 break;
184 }
185 }
186
187 showHideMuteTrailerButtons(){
188 console.log("showHideMuteTrailerButtons()");
189 console.log("playingTrailer: ", this.playback.playingTrailer);
190 console.log("muted: ", this.playback.player.muted());
191 if (this.playback.playingTrailer){
192 if (this.playback.player.muted()){
193
194 this.muteTrailerButton.hide();
195 this.unmuteTrailerButton.show();
196 }
197 else {
198 this.muteTrailerButton.show();
199 this.unmuteTrailerButton.hide();
200 }
201 }
202 else {
203 this.muteTrailerButton.hide();
204 this.unmuteTrailerButton.hide();
205 }
206 }
207
208 onLiveConnectActive(isActive){
209 console.log("onLiveConnectActive: ", isActive);
210 this.setRuler(isActive ? 2 : 1);
211 if (!isActive){
212 this.counter.hide();
213 }
214 }
215
216 updateViewerCount(count){
217 console.log("updateViewerCount: ", count)
218 this.counter.show();
219 this.counter.setCount(count);
220 }
221 }
222
223 class WpstreamPlayback {
224 // player;
225 // timeQueue = [];
226 // master;
227 // paused = false;
228 // played = false;
229
230
231 constructor(master, id, autoplay){
232 this.timeQueue = [];
233 this.paused = false;
234 this.played = false;
235 this.contentSrc = null;
236 this.trailerState = 'notstarted';
237 this.playingTrailer = false;
238 this.master = master;
239 this.setupBasePlayer(id, autoplay);
240 this.runWatchdog();
241 }
242
243 setupBasePlayer(id, autoplay){
244
245 console.log("setupBasePlayer: ", id, autoplay);
246 let contentUrl = this.master.contentUrl;
247 console.log("contentUrl: ", contentUrl);
248 let llhls = isLlHls(contentUrl);
249 console.log("llhls: ", llhls);
250 this.player = videojs('wpstream-video' + id, {
251 html5: {
252 vhs: {
253 useBandwidthFromLocalStorage: true,
254 limitRenditionByPlayerDimensions: false,
255 useDevicePixelRatio: true,
256 overrideNative: !videojs.browser.IS_SAFARI,
257 cacheEncryptionKeys: true,
258 llhls
259 }
260 },
261 errorDisplay: false,
262 autoplay:autoplay,
263 preload:"auto",
264 // muted : true
265 });
266 // this.player.controls(false);
267 this.player.bigPlayButton.hide();
268 // player.controlBar.progressControl.hide();
269 const owner = this;
270 this.player.on('play', function(event) {
271 console.log("Play");
272 owner.played = true;
273 console.log("src: ", owner.player.currentSrc());
274 console.log("playingTrailer: ", owner.playingTrailer);
275 if (owner.playingTrailer){
276 console.log("trailerState: ", owner.trailerState);
277 if (owner.trailerState == 'attempted'){
278 owner.trailerState = 'playing';
279 owner.master.liveMessage.showAtBottom(true);
280 }
281 }
282 owner.master.playTrailerButton.hide();
283 owner.mastur.showHideMuteTrailerButtons();
284 });
285 this.player.on('pause', function(event) {
286 console.log("Pause");
287 });
288 this.player.on('ended', () => {
289 console.log("Ended");
290 console.log("playingTrailer: ", this.playingTrailer);
291 if (this.playingTrailer){
292 owner.stopTrailer();
293 }
294 else {
295 console.log("content ended");
296 this.player.controls(false);
297 this.player.hasStarted(false);
298 }
299 this.master.showHideMuteTrailerButtons();
300 });
301 this.player.on("durationchange", () => {
302 const duration = this.player.duration();
303 console.log('durationchange: ', duration);
304 if (duration > 0 && duration < Infinity){
305 this.player.controls(false);
306 }
307 });
308 this.player.on("error", (error) => {
309 console.log('error: ', error);
310 });
311 this.player.on('volumechange', () => {
312 console.log('muted: ', this.player.muted());
313 this.master.showHideMuteTrailerButtons();
314 });
315 console.log("src: ", this.player.currentSrc());
316 // setTimeout(() => {
317 // this.player.bigPlayButton.show();
318 // }, 2000);
319 }
320
321 playTrailer(src, click){
322 console.log("### playTrailer: ", src, click);
323 console.log("trailerState: ", this.trailerState);
324 // if (this.trailerState == 'notstarted' || this.trailerState == 'attempted'){
325
326 if (this.trailerState == 'notstarted' && !click){
327 this.master.playTrailerButton.show();
328 }
329
330 if (this.trailerState == 'notstarted' || click){
331 this.playingTrailer = true;
332 const player = this.player;
333 player.controls(false);
334 player.src({src});
335 if (click){
336 player.play();
337 }
338 this.trailerState = 'attempted';
339 }
340 }
341
342 stopTrailer(){
343 console.log("stopTrailer()");
344 console.log("trailerState: ", this.trailerState);
345 if (this.trailerState == 'playing'){
346 console.log('trailer has ended');
347 this.trailerState = 'ended';
348 this.master.liveMessage.showAtBottom(false);
349 this.player.hasStarted(false);
350 }
351 this.playingTrailer = false;
352 }
353
354 setContentSrc(src, force){
355 console.log("### setContentSrc: ", src, force);
356 console.log("currentSrc: ", this.player.currentSrc());
357 console.log("paused: ", this.player.paused());
358 console.log("currentTime: ", this.player.currentTime());
359 this.playingTrailer = false;
360 this.contentSrc = src;
361
362 const owner = this;
363 clearTimeout(this.setSrcTimeout);
364 this.setSrcTimeout = setTimeout(() => {
365 console.log("setting src...");
366 // src = src != null ? src : owner.player.currentSrc()
367 // owner.player.src({
368 // src,
369 // type: "application/x-mpegURL",
370 // llhls: isLlHls(src)
371 // });
372 owner.playContent(force);
373 }, force ? 1 : 2000);
374
375 // this.player.controlBar.show();
376 // this.player.loadingSpinner.show();
377 this.player.controls(true);
378 // this.player.muted(true);
379 // this.player.play();
380 }
381
382 playContent(forced){
383 console.log("playContent() ", forced);
384 this.paused = false;
385 this.stopTrailer();
386 this.playingTrailer = false;
387 this.master.playTrailerButton.hide();
388 this.player.bigPlayButton.show();
389 clearTimeout(this.setSrcTimeout);
390 console.log("player.paused: ", this.player.paused());
391 console.log("currentTime: ", this.player.currentTime());
392 console.log("objectivelyPlayingContent: ", this.objectivelyPlayingContent);
393
394 // if (this.player.paused() || forced || this.player.currentTime() === 0){
395 if (!this.objectivelyPlayingContent || forced){
396 this.player.src({
397 src: this.contentSrc,
398 type: "application/x-mpegURL",
399 llhls: isLlHls(this.contentSrc)
400 });
401 console.log("autoplay: ", this.player.autoplay());
402 // this.player.currentTime(0);
403 console.log("played: ", this.played);
404 if (this.played){
405 var promise = this.player.play();
406 // console.log("promise: ", promise);
407 let player = this.player;
408 if (promise !== undefined) {
409 promise.then(function() {
410 console.log("Autoplay started ;)");
411 }).catch(function(error) {
412 console.log("Autoplay did not work ", error);
413 });
414 }
415 console.log("no promise")
416 }
417 }
418 this.player.controlBar.show();
419 this.player.loadingSpinner.show();
420 this.player.controls(true);
421 }
422
423 pauseContent(stop){
424 console.log("pauseContent()");
425 this.paused = true;
426 clearTimeout(this.setSrcTimeout);
427 console.log("playingTrailer: ", this.playingTrailer);
428 if (!this.playingTrailer){
429 console.log("paused: ", this.player.paused());
430 this.player.pause();
431 console.log("currentTime: ", this.player.currentTime());
432 this.player.controlBar.hide();
433 this.player.loadingSpinner.hide();
434 this.player.controls(false);
435 if (stop){
436 this.player.hasStarted(false);
437 }
438 }
439 }
440
441 runWatchdog(){
442 //console.log("runWatchdog()");
443 const currentTime = this.player.currentTime();
444 this.timeQueue.push(currentTime);
445
446 var objectivelyPlayingContent = false;
447 if (currentTime > 0 && !this.playingTrailer){
448 const queueLength = this.timeQueue.length;
449 if (queueLength > 1){
450 if (this.timeQueue[queueLength - 1] > this.timeQueue[queueLength - 2]){
451 objectivelyPlayingContent = true;
452 }
453 }
454 }
455 this.objectivelyPlayingContent = objectivelyPlayingContent;
456
457 if (this.timeQueue.length > 25){
458 this.timeQueue.shift();
459 if (this.timeQueue[0] === this.timeQueue[this.timeQueue.length -1]){
460 console.log("queue: ", this.timeQueue[0], this.timeQueue[this.timeQueue.length -1]);
461 console.log("paused: ", this.paused);
462 console.log("ruler: ", this.master.ruler);
463 console.log("state: ", this.master.state);
464 console.log("player paused: ", this.player.paused());
465 console.log("currentTime: ", this.player.currentTime());
466
467 if (this.master.ruler == 2){
468 if (!this.player.paused()){
469 this.playContent(true);
470 }
471 }
472 else if (this.master.state > 1) {
473 if (!this.player.paused() || this.player.currentTime() === 0){
474 this.playContent(true);
475 }
476 }
477 this.timeQueue = [];
478 }
479 }
480 let self = this;
481 setTimeout(() => self.runWatchdog(), 1 * 1000)
482 }
483 }
484
485 class WpstreamChat {
486 // connected = '';
487
488 constructor(){
489 this.connected = '';
490 }
491
492 connect(url){
493 this.connected = 'yes';
494 if(typeof(connect)==='function' ){
495 connect(url);
496 }
497 }
498
499 disconnect(){
500 if( typeof(showChat) === 'function' && this.connected === 'yes' ){
501 showChat('info', null, wpstream_player_vars.chat_not_connected);
502 this.connected='no';
503 }
504 }
505 }
506
507 class WpstreamLiveMessage {
508
509
510 // element;
511 // msg;
512 // originalMessage;
513 // customMessage;
514 // state = -1; // -1 - unknown; 0 - hidden; 1 - showing original msg; 3 - showing paused msg; 5 - showing custom msg
515
516 static customMessageStates = ['stopped', 'init', 'paused', 'startup', 'ended'];
517 bottom = false;
518
519 constructor(wrapper, id){
520 this.state = 'none';
521 this.element = wrapper.find('.wpstream_not_live_mess');
522 this.msg = wrapper.find('.wpstream_not_live_mess_mess');
523 this.originalMessage = this.msg.html();
524 console.log("originalMessage: ", this.originalMessage);
525 var playerElement = jQuery('#wpstream-video' + id);
526 this.element.appendTo(playerElement);
527 }
528
529 showMessage(state){
530 // console.log("showMessage: ", state);
531 var label;
532 if (this.customMessage && WpstreamLiveMessage.customMessageStates.includes(state)){
533 label = this.customMessage;
534 }
535 else {
536 label = wpstream_player_vars[`wpstream_player_state_${state}_msg`];
537 }
538 this.msg.text(label);
539 // don't show if label is empty or spaces
540 if (!/^\s*$/.test(label))
541 this.show();
542 else
543 this.hide();
544 this.state = state;
545 }
546
547 showOriginalMessage(){
548 this.msg.html(this.originalMessage)
549 this.show();
550 this.state = 'original';
551 }
552
553 showAtBottom(show){
554 console.log("showAtBottom: ", show);
555 this.bottom = show;
556 this.element[0].style.top = this.bottom ? '80%' : '31%';
557
558 if (this.state == 'stopped' || this.state == 'original'){
559 this.showStoppedMessage();
560 }
561 }
562
563 showStoppedMessage(){
564 console.log("element: ", this.element);
565 if (this.bottom){
566 this.showMessage('stopped');
567 }
568 else {
569 this.showOriginalMessage();
570 }
571 }
572
573 //public
574 hide(){
575 this.element.hide();
576 this.state = 0;
577 }
578
579 //private
580 show(){
581 this.element.show();
582 }
583
584
585 }
586
587 class LiveCounter {
588 // element;
589 constructor(wrapper, id){
590 console.log("[]LiveCounter: ", wrapper, id);
591 this.element = wrapper.find('.wpestream_live_counting');
592 this.element.css("background-color","rgb(174 69 69 / 90%)");
593 //var playerElement = wrapper.find('.wpstream-video' + id);
594 var playerElement = jQuery('#wpstream-video' + id);
595 console.log("playerElement: ", playerElement);
596 this.element.appendTo(playerElement);
597 this.hide();
598 }
599
600 show(){
601 this.element.show();
602 }
603
604 hide(){
605 this.element.hide();
606 }
607 setCount(count){
608 this.element.html( count + " Viewers");
609 }
610 }
611
612 class LiveConnect {
613 // master;
614 // wsUri;
615 // ws;
616 // connectCount = 0;
617 // connected = false;
618 // pendingConnect = false;
619
620 constructor(master){
621 this.connectCount = 0;
622 this.connected = false;
623 this.pendingConnect = false;
624 this.master = master;
625 }
626
627 setup(wsUri){
628 console.log("setup: ", wsUri);
629 this.close();
630 this.wsUri = wsUri;
631 this.connect();
632 }
633
634 close(){
635 if (this.ws != null){
636 this.ws.close();
637 }
638 this.ws = null;
639 }
640
641 connect(){
642 let connectAttempt = ++ this.connectCount;
643 console.log("connect() ", connectAttempt);
644 this.pendingConnect = true;
645 try {
646 this.ws = new WebSocket(this.wsUri);
647 let owner = this;
648 this.ws.onopen = function () {
649 console.log("connected. ", connectAttempt);
650 owner.pendingConnect = false;
651 owner.master.onLiveConnectActive(true);
652 //socket_connection.send(`{"type":"register","data":"${now}"}`);
653 };
654 this.ws.onclose = function(){
655 console.log("onclose.. ", connectAttempt);
656 owner.master.onLiveConnectActive(false);
657 }
658 this.ws.onerror = function (error) {
659 console.log("onerror: ", connectAttempt, error);
660 owner.master.onLiveConnectActive(false);
661 };
662 this.ws.onmessage = function (message) {
663 console.log("onmessage: ", connectAttempt, message.data);
664 owner.processMessage(message.data);
665 }
666 }
667 catch (error){
668 console.log(error);
669 this.master.onLiveConnectActive(false);
670 }
671 }
672
673 processMessage(msg){
674 console.log("processMessage: ", msg);
675 var json;
676 try {
677 json = JSON.parse(msg);
678 } catch (e) {
679 console.log("Invalid JSON: ", msg);
680 return;
681 }
682 if (json.type){
683 switch(json.type){
684 case "viewerCount":
685 this.master.updateViewerCount(json.data);
686 break;
687 case "onair":
688 if (json.info){
689 this.master.setState(json.info.broadcasting);
690 }
691 else {
692 this.master.setState(json.data ? 'onair' : 'paused');
693 }
694 break;
695 case "status":
696 this.master.liveMessage.setCustomMessage(json.data);
697 break;
698 default:
699 console.log("invalid type: ", json.type);
700 }
701 }
702 }
703 }
704
705 function wpstream_read_websocket_info(event_id,player, player_wrapper, socket_wss_live_conect_views_uri, event_uri){
706 console.log("wpstream_read_websocket_info: ", event_id, player, player_wrapper, socket_wss_live_conect_views_uri, event_uri);
707 console.log("sldpPlayer: ", sldpPlayer);
708 if (sldpPlayer != null){
709 var chat = new WpstreamChat();
710 chat.connect(socket_wss_live_conect_views_uri);
711 }
712 }
713
714 jQuery(document).ready(function ($) {
715 console.log("ready!")
716 var event_id;
717 var player_wrapper;
718 jQuery('.wpstream_live_player_wrapper').each(function(){
719 console.log("wrapper: ", this, $(this));
720 if($(this).hasClass('wpstream_low_latency')){
721 return;
722 }
723 event_id = jQuery(this).attr('data-product-id');
724 player_wrapper = jQuery(this);
725
726 //wpstream_check_player_status_ticker(player_wrapper,event_id);
727 });
728
729 });
730
731
732
733 var sldpPlayer;
734
735 function initPlayer(playerID,low_latency_uri,muted,autoplay){
736 console.log("initPlayer: ", low_latency_uri)
737 var is_muted = false;
738 var is_autoplay = true;
739 if(muted === 'muted'){
740 is_muted=true;
741 }
742
743 if(autoplay !== 'autoplay'){
744 is_autoplay=false;
745 }
746
747 console.log('is_muted '+is_muted + '/ '+is_autoplay);
748
749 let player = OvenPlayer.create(playerID, {
750 "autoStart": is_autoplay,
751 "autoFallback": false,
752 "mute": is_muted,
753 "sources": [{
754 "type": "webrtc",
755 "file": low_latency_uri
756 }],
757 "hlsConfig": {
758 "liveSyncDuration": 1.5,
759 "liveMaxLatencyDuration": 3,
760 "maxLiveSyncPlaybackRate": 1.5
761 },
762 "webrtcConfig": {
763 "timeoutMaxRetry": 100,
764 "connectionTimeout": 10000
765 }
766 });
767
768
769 };
770
771 function removePlayer(){
772 sldpPlayer.destroy();
773 }
774
775 // {
776 // videoElementId
777 // trailerUrl
778 // videoUrl
779 // autoplay
780 // muted
781 // playTrailerButtonElementId
782 // playVideoButtonElementId
783 // }
784 function wpstream_player_initialize_vod(settings){
785
786 console.log('wpstream_player_initialize_vod: ', settings);
787 var playing = settings.trailerUrl ? 'trailer' : 'content';
788
789 const playTrailerButton = jQuery(`#${settings.playTrailerButtonElementId}`)
790 const playVideoButton = jQuery(`#${settings.playVideoButtonElementId}`);
791 const muteTrailerButton = jQuery(`#${settings.muteTrailerButtonElementId}`);
792 const unmuteTrailerButton = jQuery(`#${settings.unmuteTrailerButtonElementId}`);
793
794 muteTrailerButton.hide();
795 unmuteTrailerButton.hide();
796
797 if (!settings.trailerUrl) {
798 playTrailerButton.hide();
799 }
800 if (!settings.videoUrl){
801 playVideoButton.hide();
802 }
803
804 const initialSrc = settings.trailerUrl ? getSrc(settings.trailerUrl) : getSrc(settings.videoUrl);
805 console.log("initialSrc: ", initialSrc);
806
807 const player = videojs(settings.videoElementId);
808 player.preload('auto');
809 player.playsinline(true);
810 player.controls(!settings.trailerUrl);
811 player.autoplay(settings.autoplay);
812 player.muted(settings.muted);
813
814 const originalPoster = player.poster();
815
816 player.src({...initialSrc, autoplay:true, muted: true});
817
818 player.on("play", () => {
819 console.log('play()');
820 playTrailerButton.hide();
821 console.log("playing: ", playing);
822 if (playing == 'trailer'){
823 player.poster(null);
824 player.controls(false);
825 }
826 else {
827 playVideoButton.hide();
828 player.controls(true);
829 }
830 showHideMuteButtons();
831 });
832
833 player.on('ended', () => {
834 console.log("ended")
835 if (playing == 'trailer'){
836 console.log('trailer has ended');
837 if (settings.videoUrl){
838 playing = 'content';
839 player.controls(true);
840 player.autoplay(false);
841 player.muted(false);
842 player.poster(originalPoster);
843 player.src(getSrc(settings.videoUrl));
844 }
845 else {
846 player.hasStarted(false);
847 }
848 playTrailerButton.show();
849 showHideMuteButtons();
850 }
851 else {
852 console.log('video has ended');
853 }
854 });
855
856 player.on('volumechange', () => {
857 console.log('muted: ', player.muted());
858 // console.log("paused: ", player.paused());
859 if (!player.paused()){
860 showHideMuteButtons();
861 }
862 });
863
864 function showHideMuteButtons(){
865 console.log("showHideMuteButtons()");
866 if (playing == 'trailer'){
867 if (player.muted()){
868 muteTrailerButton.hide();
869 unmuteTrailerButton.show();
870 }
871 else {
872 muteTrailerButton.show();
873 unmuteTrailerButton.hide();
874 }
875 }
876 else {
877 muteTrailerButton.hide();
878 unmuteTrailerButton.hide();
879 }
880 }
881
882 player.on("error", () => {
883 console.log('error()');
884 if (playing == 'trailer'){
885 console.log('trailer failed');
886 playTrailerButton.hide();
887 if (videoUrl){
888 playing = 'content';
889 player.controls(true);
890 player.src(getSrc(settings.videoUrl))
891 }
892 }
893 });
894
895 playTrailerButton.on('click',function(){
896 console.log("playTrailer()")
897 if (playing != 'trailer'){
898 playing = 'trailer';
899 player.src(settings.trailerUrl);
900 }
901 player.play();
902 });
903
904 muteTrailerButton.on('click',function(){
905 if (playing == 'trailer'){
906 console.log("muteTrailer()")
907 player.muted(true);
908 }
909 });
910
911 unmuteTrailerButton.on('click',function(){
912 if (playing == 'trailer'){
913 console.log("unmuteTrailer()")
914 player.muted(false);
915 }
916 });
917
918 playVideoButton.on('click',function(){
919 console.log("playVideo")
920 if (!settings.videoUrl)
921 return;
922 if (playing == 'trailer'){
923 playing = 'content';
924 player.controls(true);
925 player.muted(false);
926 player.src(getSrc(settings.videoUrl));
927 }
928 player.play();
929 });
930 }
931
932 function getSrc(url) {
933 return {
934 src: url,
935 type: url.endsWith('.m3u8') ? 'application/x-mpegURL' : null
936 }
937 }
938
939 function isLlHls(url){
940 return /ll[a-z]+\.m3u8/.test(url);
941 }