API Docs for:
Show:

File: generic-vlc.js

/*******************************************************************************
 * Copyright (c) 2017 Genialist Software Ltd.
 * All rights reserved.
 ******************************************************************************/

function pYouTubeMediaPlayer(p_element) {
	var that = this, eh = new pEventHandler(), m_enabled = true, m_source, m_element = pElement.x(p_element), m_player, play_requested, iframe_timeout;
	this.tracePrefix = 'YouTubeMediaPlayer';

	// "id" property
	Object.defineProperty(this, "id", { get: function() { return m_element.id; }});

	//*** EXPOSE EVENT HANDLER
	this.addEventListener = function(eid, f) {
		return eh.addEventListener(eid, f);
	};
	
	this.removeEventListener = function(eid, f) {
		return eh.removeEventListener(eid, f);
	};

	// "currentTime" property
	Object.defineProperty(this, "currentTime", { get: function() {
		if (m_player && m_player.getCurrentTime)
			return m_player.getCurrentTime() * 1000;
		return 0;
	}, set: function(p_time) { m_player.seekTo(p_time / 1000, false); }});

	this.play = function() {
		if (m_player && m_player.playVideo)
			m_player.playVideo();
		else
			play_requested = true;
	};
	this.pause = function() {
		if (m_player && m_player.pauseVideo) m_player.pauseVideo();
	};
	this.load = function() {
	};

	this.controls = function() {
		return null;//this.m_element.content.findName("mediaPlayer");
	};

	// "source" property
	Object.defineProperty(this, "source", { get: function() { m_source; }, set:
		function(p_src) {
			if (null==p_src || null==p_src.url) {
				m_element.onerror = null;
				m_element.onload = null;
				clearTimeout(iframe_timeout);

				if (m_player && m_player.stopVideo) m_player.stopVideo();
				return;
			}

			m_element.onerror = function(p_event) {
				pConsole.error(that, "error");
			};
			
			m_element.onload = function(p_event) {
				clearTimeout(iframe_timeout);
				pConsole.info(that, "load");
			};
			
			iframe_timeout = setTimeout(function() { pConsole.error(that, "Video did not load after 10s..."); }, 10000);

			resizeYouTubePlayer();

			var i_v = pLocation.param(p_src.url, 'v'), u;
			if (i_v) {
				u = 'https://www.youtube.com/embed/'+i_v + /*((pDevice.isIOS())?*/ '?autoplay=1&playsinline=1&showinfo=0&enablejsapi=1&origin='+location.protocol+'//'+location.host+'&html5=1';
				u += '&rel=' + (pPlaylistUtil.OPTION_YOUTUBE_SHOW_RELATED===true? '1':'0');
			}
			else
				u = p_src.url + '?showinfo=0&enablejsapi=1&origin=http://localhost:8089&html5=1';
			u += '&modestbranding=1&showinfo=0';
			
			pConsole.info(that, "URL: " + u);
			if (!m_player || !m_player.loadVideoByUrl) {
				pApplicationUI.errorDialog({ text: 'Failed to load YouTube video...'/*, icon: { src: '/resources/html/images/32x32/picture_error.png' }*/ });
			}
			else {
				m_player.loadVideoByUrl({ mediaContentUrl: u });
				eh.fireEvent('source', that);
			}
		} });

	this.canTranscode = function() { return false; }

	this.canPlayLocalFiles = function() { return false; };

	// "enabled" property
	Object.defineProperty(this, "enabled", { get: function() { return m_enabled; }, set: function(v) { if (typeof v == "boolean") m_enabled = v; }});

	// "type" property
	Object.defineProperty(this, "type", { get: function() { return "video" }});

	// "fullscreen" property
	//Object.defineProperty(this, "fullscreen", { get: function() { return this.m_element.fullscreen; }, set: function(value) { if (typeof value == "boolean" && value === true) this.m_element.requestFullscreen(); }});
	Object.defineProperty(this, "fullscreen", { get: pDocument.isFullScreen, set: function(s) {
		if (typeof s == "boolean") {
			if (s === false)
				pDocument.exitFullScreen();//this.m_element);
			else
				pDocument.fullScreen(m_element);
		}
	}});
	
	// "providers" property
	Object.defineProperty(this, "providers", { get: function() { return [ "youtube" ]} });

	//*** LOAD YOUTUBE iframe API
	window.onYouTubeIframeAPIReady = function() {
		m_player = new YT.Player(m_element.id, {
			playerVars: { showinfo: 0, playsinline: 1 },
			events: {
			  'onReady': onYTPlayerReady,
			  'onStateChange': onYTPlayerStateChange,
			  'onError': onYTPlayerError
			}
		});
	};

	var tag = document.createElement('script');
	tag.id = 'script-youtube';
	tag.src = 'https://www.youtube.com/iframe_api';
	var firstScriptTag = document.getElementsByTagName('script')[0];
	firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
	setTimeout(function() {
		if (!m_player) {
			pConsole.error(that, "Youtube iFrame API did not load after 10s...");
			eh.fireEvent("error", that);
		}
	}, 10000);

	function onYTPlayerStateChange(event) {
		if (event.data == 0 && !pPlaylistUtil.OPTION_YOUTUBE_SHOW_RELATED)
			eh.fireEvent("ended", that);
		else if (event.data == 1)
			eh.fireEvent("play", that);
		else if (event.data == 2)
			eh.fireEvent("pause", that);
	}

	function onYTPlayerError(event) {
		eh.fireEvent("error", that);
	}

	function onYTPlayerReady(event) {
		// find iframe that API replaced
		m_element = pElement.x(m_element.id);
		
		resizeYouTubePlayer();
		
		if (play_requested === true) {
			play_requested = null;
			m_player.playVideo();
		}
	}
	
	this.show = function() {
		pDocument.hide('video-controls');
		pDocument.show(m_element);
	};
	
	this.hide = function() {
		pDocument.hide(m_element);
		pDocument.show('video-controls');
	};

	function resizeYouTubePlayer() { 
		window.resizeVideoImpl(m_element); 
	}

	pDocument.addOnResize(resizeYouTubePlayer);
};

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

function pVLCPlaylist(p_id) {
	var that = this, m_id = p_id;
	
	// "id" property
	Object.defineProperty(this, "id", { get: function() { return m_id; }});

	// "autoClose" property
	this.autoClose = true;

	this.m_func_open_before = function() {
		pElement.setInnerHTML('vlc-title', ' ');
		pElement.setInnerHTML('vlc-fullscreen-title', ' ');

		pDocument.showComponent('window-play', 'player-hide');
		pDocument.showComponent('div-vlc-header');
		pDocument.showComponent('div-vlc-main');
		//pDocument.showComponent('div-vlc-footer');
		
		pDocumenti.addOnKeyDown(that.m_playlist.close, pKeys.escape, false, 'vlc.close');

		pDocument.stopwait();
		
		if (window.f_resize_play) 
			window.f_resize_play();

	};
	
	this.m_func_ended = function() {
		//*** EXIT FULLSCREEN
		if (that.m_playlist) {
			that.m_playlist.pause();
			that.m_playlist.fullscreen = false;
		}
		//i_vlc_playlist.m_player.m_element.video.fullscreen = false;

		if (that.autoClose===true)
			that.m_func_hide_video();
		
		//*** RESTORE TITLE
		if (pString.v(that.m_playlist.doc_title_old))
			document.title = that.m_playlist.doc_title_old;

	};
	
	this.m_func_hide_video = function() {
		//pDocument.hideComponent('div-vlc-footer');
		pDocument.hideComponent('window-play');
		//pDocument.hideComponent('div-vlc-main');
		//pDocument.hideComponent('div-vlc-header');
		
		pDocumenti.removeOnKeyDown(that.m_playlist.close, pKeys.escape, 'vlc.close');
	};

	//*** CREATE PLAYLIST
	var x_audio = pElement.x('audio_0');
	//var x_vlc = pElement.x('video0-vlc');
	var x_video = pElement.x('video0-video');
	//var x_wmp = pElement.x('video0-wmp');
	var x_youtube = pElement.x('video0-youtube');
	var i_players = this.m_players = [
		(null!=x_audio)? new pMediaPlayer_Audio(x_audio) : null,
		//(null!=x_vlc)? new pVLCMediaPlayer(x_vlc) : null,
		(null!=x_video)? new pMediaPlayer(x_video) : null,
		//(null!=x_wmp)? new pWindowsMediaPlayer(x_wmp) : null,
		(null!=x_youtube)? new pYouTubeMediaPlayer(x_youtube) : null
	];
	//if (i_players[0]) i_players[0].enabled = /*false;*/(this.usevlc === true)? true : false;
	//if (i_players[1]) i_players[1].enabled = /*false;*/(this.usevlc === false)? true : false;
	//if (i_players[2]) i_players[2].enabled = this.usewmp;

	var i_playlist = this.m_playlist = pPlaylistManager.create(p_id, this.m_players, {
		previous: new pToggleElement([ 'music-player-previous', 'music-player-previous2', 'music-player-previous3' ]),//{ enabled:"video_0.previous.enabled", disabled:"video_0.previous.disabled" },
		next: new pToggleElement([ 'music-player-next', 'music-player-next2', 'music-player-next3' ]),//{ enabled:"video_0.next.enabled", disabled:"video_0.next.disabled" },
		play: new pToggleElement([ 'music-player-play', 'music-player-play2' ]),//"video_0.play",
		pause: new pToggleElement([ 'music-player-pause', 'music-player-pause2' ])//"video_0.pause"
	});
	//this.playlist.setVideoPlayer(this);
	i_playlist.addEventListener("open-before", this.m_func_open_before);
	i_playlist.addEventListener("show-video", this.m_func_open_before);
	i_playlist.addEventListener("hide-video", this.m_func_hide_video);

	i_playlist.addEventListener("ended", this.m_func_ended);
	i_playlist.addEventListener("close-after", this.m_func_ended);
	//i_playlist.addEventListener("transcode", function() {});
	i_playlist.addEventListener("title", function() {
		pElement.setTextContent('vlc-title', that.m_playlist.title);
		pElement.setTextContent('vlc-fullscreen-title', that.m_playlist.title);
	});

	this.m_playlist.scale = function(p_vlc_elem_id) {
		//this is the playlist

		var i_media = this.medias.getCurrentMedia();
		if (null==i_media)
			return;
		var i_player = this.getPlayer();
		if (null==i_player)
			return;

		if (i_media.width != undefined && i_media.height != undefined) {
			var i_rect = i_player.m_element.getBoundingClientRect();
			if ((i_media.width > i_rect.right - i_rect.left) || (i_media.height > i_rect.bottom - i_rect.top)) {
				i_player.m_element.width = "100%";
				i_player.m_element.height = "100%";
			}
			else {
				i_player.m_element.width = i_media.width;
				i_player.m_element.height = i_media.height;
			}

			pDocument.show(this.id+ ".scale.selected", 'inline');
			pDocument.hide(this.id+ ".scale");

			pDocument.hide(this.id+ ".scaleMax.selected");
			pDocument.show(this.id+ ".scaleMax", 'inline');
		}
		return;
	};
	this.m_playlist.scaleMax = function(p_vlc_elem_id) {
		//this is the playlist

		var i_player = this.getPlayer();
		if (null==i_player)
			return;

		i_player.m_element.width = "100%";
		i_player.m_element.height = "100%";

		pDocument.hide(this.id+ ".scale.selected");
		pDocument.show(this.id+ ".scale", 'inline');

		pDocument.show(this.id+ ".scaleMax.selected", 'inline');
		pDocument.hide(this.id+ ".scaleMax");
	};
}

/******************************************************************************/
/***  PAGE INIT  **************************************************************/
/******************************************************************************/

var m_vlc = null;
var m_vlc_langs = null;

/******************************************************************************/
/***  END OF PAGE  ************************************************************/
/******************************************************************************/