/**
* <h1>Media Player for BLOBbox</h1>
*
* <h2>configurationObject</h2>
* <dl>
* <dt>uri:</dt><dd>String, the uri to playback inside the player</dd>
* <dt>top:</dt><dd>Integer, the top grid reference in which position the player when not in full screen mode</dd>
* <dt>left:</dt><dd>Integer, the left grid reference in which position the player when not in full screen mode</dd>
* <dt>fullscreen:</dt><dd>Boolean, if true the player automatically starts in fullscreen (default: false)</dd>
* <dt>switchKey:</dt><dd>String, the name of the button (according with the remote control model) that automatically enter and exit the full screen mode; it works only if disableRemote is false, or if switchKey is not null (default: 'OK')</dd>
* <dt>autoplay:</dt><dd>Boolean, if true the player automatically starts the playback as soon as it has been initialized (default: true)</dd>
* <dt>noLittleHole:</dt><dd>Boolean, if true disable the player from automatically add the mask hole in front of the video; a blue screen mask with #0000ff color must be manually added in order to see the movie in the background (default: false)</dd>
* <dt>disableRemote:</dt><dd>Boolean, if true prevent the player from listening to the remote control buttons and does not initialize the remote control with the event model (default: false)</dd>
* <dt>width:</dt><dd>Integer, the width in pixels of the video player when not in full screen (default: half the width of the screen)</dd>
* <dt>height:</dt><dd>Integer, the height in pixels of the video player when not in full screen (default: half the height of the screen)</dd>
* </dl>
*
* <h2>List of events</h2>
* <dl>
* <dt>TVB.player.events.player:</dt><dd></dd>
* <dt>TVB.player.events.play:</dt><dd></dd>
* <dt>TVB.player.events.stop:</dt><dd></dd>
* <dt>TVB.player.events.pause:</dt><dd></dd>
* <dt>TVB.player.events.buffering:</dt><dd></dd>
* <dt>TVB.player.events.rewinding:</dt><dd></dd>
* <dt>TVB.player.events.fast_forwarding:</dt><dd></dd>
* <dt>TVB.player.events.end_of_streaming:</dt><dd></dd>
* <dt>TVB.player.events.starting_playback:</dt><dd></dd>
* </dl>
*
* <h2>Available uri schema</h2>
* <p>Every schema supported by the BLOBbox is supported by the video player.</p>
* <p>The following have been tested:</p>
* <ul>
* <li>http://</li>
* <li>file:///mnt/storage/sm-core/media/RELATIVE_PATH (for content in the media archive)</li>
* <li>dvb://ONID.TSID.SID</li>
* <li>rtsp:// (only on hardware that supports rtsp)</li>
* </ul>
*
* @module player
* @namespace TVB
* @title Media Player
* @requires tvblob, system, event, remote
* @author Francesco Facconi francesco.facconi@tvblob.com
* @author Edoardo Esposito edoardo.esposito@tvblob.com
*/
/**
* Object for handling TVBLOB video player
* @class player
* @static
* @namespace TVB
*/
TVB.player = {};
/**
* Default configuration for
* TVBLOB's media player
* @method config
* @private
*/
TVB.player.config = {
isInit: false,
isPlaying: false,
isFullScreen: false,
wasFullScreen: false,
disableRemote: false,
isStartPlay: true,
autoplay: true,
currentUri: null,
littleHole: null,
events: {},
remote: null,
keyForFullScreen: 'OK',
scale: 'SIF',
deltaX: 0,
deltaY: 0,
leftCord: 0,
topCord: 0,
isBuffering: false,
autoFullScreen: false,
noLittleHole: false,
width: 0,
height: 0,
useSIF: true
};
/**
* This object handles the low level api for
* TVBLOB's media player
* @method p
* @private
*/
TVB.player.p = {};
/**
* Initialize the video player
* @method init
* @param {Object} config configurationObject
* @return {Boolean}
*/
TVB.player.init = function(config){
try {
TVB.log("Player: init(config)");
if (TVB.player.config.isInit === false) {
TVB.player.p = new BlobPlayer();
TVB.player.config.isInit = true;
TVB.player.config.isPlaying = false;
TVB.player.config.isFullScreen = false;
TVB.player.config.wasFullScreen = false;
TVB.player.config.isBuffering = false;
TVB.player.config.geometryAllowed = false;
try {
var temp_ver = TVB.system.getSMOJVersion();
temp_ver = temp_ver.split('.');
if (parseInt(temp_ver[0], 10) > 1) {
TVB.player.config.geometryAllowed = true;
} else if (parseInt(temp_ver[1], 10) > 49) {
TVB.player.config.geometryAllowed = true;
}
} catch (e) {}
TVB.log("Player: geometry allowed? " + TVB.player.config.geometryAllowed);
var currentSMOJ = TVB.system.getSMOJVersion();
var currentSMOJarr = currentSMOJ.split('.');
if (currentSMOJarr[0] < 2 && currentSMOJarr[1] < 47) {
TVB.player.config.deltaX = +25;
TVB.player.config.deltaY = -8;
} else {
TVB.player.config.deltaX = 0; /* +63 */
TVB.player.config.deltaY = 0;
}
TVB.player.p.setEventListener("TVB.player.events");
if (typeof config.noLittleHole != 'undefined' && config.noLittleHole === true) {
TVB.log("Player: little hole disabled");
TVB.player.config.noLittleHole = true;
} else {
TVB.player.config.noLittleHole = false;
}
// configure remote
if (typeof config.disableRemote != 'undefined' && config.disableRemote === true) {
TVB.player.config.disableRemote = true;
} else {
TVB.player.config.disableRemote = false;
TVB.remoteInit();
TVB.CustomEvent.subscribeEvent(TVB.remote.buttons.VCR, TVB.player.handleRemote);
TVB.CustomEvent.subscribeEvent(TVB.remote.button.BACK, TVB.player.handleRemote);
}
// configure auto switch full screen
if (typeof config.switchKey != 'undefined') {
TVB.player.config.keyForFullScreen = config.switchKey;
}
try {
if (TVB.player.config.keyForFullScreen !== null) {
TVB.CustomEvent.subscribeEvent(TVB.remote.button[TVB.player.config.keyForFullScreen], function(){
try {
TVB.player.switchFullScreen();
} catch (e) {
TVB.error("Player events: " + e.message);
}
});
}
} catch (e) {
TVB.player.config.keyForFullScreen = null;
}
// configure events
TVB.player.events.player = TVB.CustomEvent.createEvent('player');
TVB.player.events.play = TVB.CustomEvent.createEvent('play');
TVB.player.events.stop = TVB.CustomEvent.createEvent('stop');
TVB.player.events.pause = TVB.CustomEvent.createEvent('pause');
TVB.player.events.buffering = TVB.CustomEvent.createEvent('buffering');
TVB.player.events.rewinding = TVB.CustomEvent.createEvent('rewinding');
TVB.player.events.fast_forwarding = TVB.CustomEvent.createEvent('fast_forwarding');
TVB.player.events.end_of_streaming = TVB.CustomEvent.createEvent('end_of_streaming');
TVB.player.events.starting_playback = TVB.CustomEvent.createEvent('starting_playback');
// configure uri
if (typeof config.uri == 'string') {
TVB.player.config.currentUri = config.uri;
} else {
TVB.player.config.currentUri = null;
}
// configure coords
if (typeof config.top != 'undefined') {
TVB.player.config.topCord = parseInt(config.top, 10);
} else {
TVB.player.config.topCord = parseInt((window.innerHeight / 2) - (window.innerHeight / 4), 10);
}
if (typeof config.left != 'undefined') {
TVB.player.config.leftCord = parseInt(config.left, 10);
} else {
TVB.player.config.leftCord = parseInt((window.innerWidth / 2) - (window.innerWidth / 4), 10);
}
TVB.log("Player: init: new player in coords(" + TVB.player.config.leftCord + ", " + TVB.player.config.topCord + ")");
// configure size
TVB.player.config.useSIF = true;
if (typeof config.width != 'undefined') {
TVB.player.config.width = parseInt(config.width, 10);
TVB.player.config.useSIF = false;
} else {
TVB.player.config.width = parseInt(window.innerWidth / 2, 10);
}
if (typeof config.height != 'undefined') {
TVB.player.config.height = parseInt(config.height, 10);
TVB.player.config.useSIF = false;
} else {
TVB.player.config.height = parseInt(window.innerHeight / 2, 10) + 18;
}
TVB.log("Player: init: new player with size (" + TVB.player.config.width + ", " + TVB.player.config.height + ")");
// configure fullscreen
if (typeof config.fullscreen != 'undefined' && config.fullscreen === true) {
TVB.player.config.autoFullScreen = true;
} else {
TVB.player.config.autoFullScreen = false;
}
TVB.log("Player: full screen mode configured to " + TVB.player.config.autoFullScreen);
// configure autoplay
if (typeof config.autoplay != 'undefined' && config.autoplay === false) {
TVB.player.config.autoplay = false;
} else {
TVB.player.config.autoplay = true;
}
TVB.player.addHole(0,0);
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.visibility = 'hidden';
TVB.player.config.littleHole.style.display = 'none';
}
if (TVB.player.config.autoplay === true) {
TVB.player.play();
}
return true;
} else {
TVB.log("Player: already inited (warning)");
return false;
}
} catch (e) {
TVB.warning("Player: init: " + e.message);
throw e;
}
};
/**
* This function handles the remote control for player class
* @method handleRemote
* @private
* @param {String} type The area name of the remote control
* @param {Object} args Array containing the pushed key name
*/
TVB.player.handleRemote = function(type, args) {
try {
TVB.log("Player: handleRemote() " + args[0].keyName);
if (TVB.player.config.disableRemote === false) {
switch (args[0].keyName) {
case 'BACK':
TVB.player.stop();
TVB.CustomEvent.stopEvent(TVB.remote.button.BACK);
break;
case 'STOP':
TVB.player.stop();
TVB.CustomEvent.stopEvent(TVB.remote.button.STOP);
break;
case 'PLAY':
TVB.player.play();
break;
case 'PAUSE':
TVB.player.pause();
break;
case 'PLAY_PAUSE':
TVB.log("Player: PLAY_PAUSE button catched");
TVB.player.playpause();
break;
case 'REWIND':
TVB.player.rewind();
break;
case 'FAST_FORWARD':
TVB.player.fastforward();
break;
case 'SKIP_FORWARD':
//TVB.player.skipforward();
break;
case 'SKIP_BACKWARD':
//TVB.player.skipbackward();
break;
case 'RECORD':
//TVB.player.record();
break;
}
}
} catch (e) {
TVB.warning("Player: handleRemote: " + e.message);
}
};
/**
* Starts play of current content
* @method play
* @return {Boolean}
*/
TVB.player.play = function() {
try {
TVB.log("Player: play()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
if (TVB.player.config.currentUri === null) {
TVB.warning("Player: play: please config a player uri before trying to play");
return false;
}
try {
TVB.player.config.isPlaying = true;
if (TVB.player.p.getContent() != TVB.player.config.currentUri) {
TVB.log("Player: setContent start");
TVB.player.showStartingPlaybackMessage();
TVB.player.p.setContent(TVB.player.config.currentUri);
TVB.log("Player: setContent end");
} else if (TVB.player.p.getStatus() == 'STOPPED') {
TVB.log("Player: setContent start because STOPPED");
TVB.player.showStartingPlaybackMessage();
TVB.player.p.setContent(TVB.player.config.currentUri);
TVB.log("Player: setContent end");
}
} catch (e) {
TVB.error("Player: error setting content: " + e.message);
TVB.player.removeBufferingMessage();
TVB.player.showUnableToPlayMessage();
setTimeout(function() {
TVB.player.removeErrorMessage();
}, 5000);
TVB.player.stop();
var params = {
newState: 'STOP',
previousState: 'STOP',
source: 'ERROR',
uri: TVB.player.config.currentUri
};
TVB.CustomEvent.fireEvent(TVB.player.events.stop, params);
TVB.player.config.isPlaying = false;
return false;
}
if (TVB.player.config.isStartPlay === true) {
TVB.player.config.isStartPlay = false;
TVB.CustomEvent.fireEvent(TVB.player.events.starting_playback, {});
TVB.log("Player: Starting playback...");
}
if (TVB.player.config.wasFullScreen === true) {
TVB.log("Player: entering full screen because TVB.player.config.wasFullScreen == true");
TVB.player.enterFullScreen();
TVB.player.config.wasFullScreen = false;
} else {
if (TVB.player.config.autoFullScreen === true) {
TVB.log("Player: entering full screen because TVB.player.config.autoFullScreen == true");
TVB.player.enterFullScreen();
} else {
TVB.player.exitFullScreen();
}
}
try {
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.visibility = 'visible';
TVB.player.config.littleHole.style.display = 'block';
}
} catch (e) {
TVB.warning("Player: play: " + e.message);
}
/*
TVB.log("Player: play: TVB.player.config.isFullScreen == " + TVB.player.config.isFullScreen);
if (TVB.player.config.isFullScreen == true) {
TVB.player.enterFullScreen();
} else {
TVB.player.exitFullScreen();
}
*/
//setTimeout(function() {
try {
TVB.player.removeBufferingMessage();
TVB.player.p.play();
TVB.player.config.isPlaying = true;
} catch (e) {
TVB.warning("Player: play: " + e.message);
TVB.player.config.isPlaying = false;
throw e;
}
//}, 500);
return true;
} catch (e) {
TVB.player.config.isPlaying = false;
TVB.warning("Player: play: " + e.message);
throw e;
}
};
/**
* Pause of current playback
* @method pause
* @return {Boolean}
*/
TVB.player.pause = function() {
try {
TVB.log("Player: pause()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
if (TVB.player.config.isPlaying === true) {
TVB.player.p.pause();
}
return true;
} catch (e) {
TVB.warning("Player: pause: " + e.message);
throw e;
}
};
/**
* Play/Pause of current playback
* @method playpause
* @return {Boolean}
*/
TVB.player.playpause = function() {
try {
TVB.log("Player: playpause()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
TVB.log("Player: isPlaying is " + TVB.player.config.isPlaying);
if (TVB.player.config.isPlaying === true) {
try {
TVB.log("Player: calling SMOJ playPause()...");
TVB.player.p.playPause();
} catch (e) {
TVB.log(TVB.player.getStatus());
if (TVB.player.getStatus() == 'PAUSED') {
TVB.log("Player: playpause: playing...");
TVB.player.play();
} else {
TVB.log("Player: playpause: pausing...");
TVB.player.pause();
}
}
} else {
TVB.log("Player: playpause: playing...");
TVB.player.play();
}
// otherwise I can use p.playPause();
return true;
} catch (e) {
TVB.warning("Player: playpause: " + e.message);
throw e;
}
};
/**
* Rewind of current playback
* @method rewind
* @return {Boolean}
*/
TVB.player.rewind = function() {
try {
TVB.log("Player: rewind()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
if (TVB.player.config.isPlaying === true) {
TVB.player.p.rewind();
}
return true;
} catch (e) {
TVB.warning("Player: rewind: " + e.message);
return false;
}
};
/**
* Fast forward of current playback
* @method fastforward
* @return {Boolean}
*/
TVB.player.fastforward = function() {
try {
TVB.log("Player: fastforward()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
if (TVB.player.config.isPlaying === true) {
TVB.player.p.fastForward();
}
return true;
} catch (e) {
TVB.warning("Player: fastforward: " + e.message);
return false;
}
};
/**
* Stops current playback, and put the marker to the first frame
* @method stop
* @return {Boolean}
*/
TVB.player.stop = function() {
try {
TVB.log("Player: stop()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
if (TVB.player.config.isPlaying === true) {
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.visibility = 'hidden';
TVB.player.config.littleHole.style.display = 'none';
}
TVB.player.p.stop();
/*try {
TVB.player.p.setContent(null);
} catch (e) {}*/
if (TVB.player.config.isFullScreen === true) {
TVB.player.config.wasFullScreen = true;
if (TVB.player.exitFullScreen() === false) {
TVB.log("Player: error exiting full screen mode");
return false;
}
} else {
TVB.player.config.wasFullScreen = false;
}
TVB.player.config.isPlaying = false;
TVB.player.config.isStartPlay = true;
}
return true;
} catch (e) {
TVB.warning("Player: stop: " + e.message);
throw e;
}
};
/**
* Returns current content uri
* @method getContent
* @return {String}
*/
TVB.player.getContent = function() {
try {
TVB.log("Player: getContent()");
if (TVB.player.config.currentUri !== null) {
return TVB.player.config.currentUri;
} else {
return null;
}
} catch (e) {
TVB.warning("Player: getContent: " + e.message);
return null;
}
};
/**
* Set content uri for current player; if config.autoplay
* is set to true, starts the playback
* @method setContent
* @param {String} uri Uri of the content
*/
TVB.player.setContent = function(uri) {
try {
TVB.log("Player: setContent(" + uri + ")");
TVB.player.config.currentUri = uri;
if (TVB.player.config.autoplay === true) {
TVB.player.play();
}
} catch (e) {
TVB.warning("Player: setContent: " + e.message);
throw e;
}
};
/**
* Enter full screen mode
* @method enterFullScreen
* @return {Boolean}
*/
TVB.player.enterFullScreen = function() {
try {
TVB.log("Player: enterFullScreen()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
// create a hole
if (TVB.player.config.littleHole === null) {
TVB.log("Player: enterFullScreen: before adding a hole");
if (TVB.player.config.noLittleHole === false) {
TVB.player.addHole(parseInt(window.innerWidth, 10), parseInt(window.innerHeight, 10));
}
TVB.log("Player: enterFullScreen: after adding a hole");
}
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.top = '0px';
TVB.player.config.littleHole.style.left = '0px';
TVB.log("Player: system width: " + window.innerWidth + " - height: " + window.innerHeight);
TVB.player.config.littleHole.style.width = parseInt(window.innerWidth, 10) + "px"; /* 744px */
TVB.player.config.littleHole.style.height = parseInt(window.innerHeight, 10) + "px"; /* 596px */
TVB.player.config.littleHole.style.visibility = 'visible';
TVB.player.config.littleHole.style.display = 'block';
TVB.player.config.littleHole.style.position = 'fixed';
TVB.player.config.littleHole.style.zIndex = '10000';
}
if (TVB.player.config.currentUri !== null) {
TVB.log("Player: enterFullScreen: before setPosition");
TVB.player.p.setPosition(0, 0);
TVB.log("Player: enterFullScreen: before setScale");
TVB.player.p.setScale("D1");
TVB.log("Player: enterFullScreen: before setFullScreenModeEnabled");
TVB.player.p.setFullScreenModeEnabled(true);
TVB.log("Player: enterFullScreen: after all of this");
}
TVB.player.config.isFullScreen = true;
/*
try {
if (document.getElementById('TVB.widget.colorButtonsBarHandler') !== null) {
document.getElementById('TVB.widget.colorButtonsBarHandler').style.display = 'none';
}
} catch (e) {
TVB.log("Player: warning 591: " + e.message);
}
try {
if (document.getElementById('TVB.widget.titleHandler') !== null) {
document.getElementById('TVB.widget.titleHandler').style.display = 'none';
}
} catch (e) {
TVB.log("Player: warning 599: " + e.message);
}
*/
return true;
} catch (e) {
TVB.warning("Player: enterFullScreen: " + e.message);
return false;
}
};
/**
* Add a hole in the browser to view the video clip
* @method addHole
* @private
* @param {Integer} width The width of the hole
* @param {Integer} height The height of the hole
*/
TVB.player.addHole = function(width, height) {
try {
TVB.log("Player: addHole(" + width + ", " + height + ")");
if (TVB.player.config.littleHole === null && TVB.player.config.noLittleHole === false) {
document.body.style.padding = '0';
document.body.style.margin = '0';
document.body.style.overflow = 'hidden';
TVB.player.config.littleHole = document.createElement('div');
TVB.player.config.littleHole.style.backgroundColor = '#0000ff';
TVB.player.config.littleHole.style.zIndex = '10000';
TVB.player.config.littleHole.style.border = '0px';
TVB.player.config.littleHole.style.top = TVB.player.config.topCord + 'px';
TVB.player.config.littleHole.style.left = TVB.player.config.leftCord + 'px';
TVB.player.config.littleHole.style.position = 'fixed';
TVB.player.config.littleHole.style.visibility = 'hidden';
TVB.player.config.littleHole.style.display = 'none'; // block
TVB.player.config.littleHole.style.width = width + 'px';
TVB.player.config.littleHole.style.height = height + 'px';
TVB.player.config.littleHole.style.margin = '0';
TVB.player.config.littleHole.style.padding = '0';
document.body.appendChild(TVB.player.config.littleHole);
} else {
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.top = TVB.player.config.topCord + 'px';
TVB.player.config.littleHole.style.left = TVB.player.config.leftCord + 'px';
TVB.player.config.littleHole.style.width = width + 'px';
TVB.player.config.littleHole.style.height = height + 'px';
}
}
return;
} catch (e) {
TVB.warning("Player: addHole: " + e.message);
throw e;
}
};
/**
* Switches from full screen mode to quarter of screen, and viceversa
* @method switchFullScreen
* @return {Boolean}
*/
TVB.player.switchFullScreen = function() {
try {
TVB.log("Player: switchFullScreen()");
if (TVB.player.config.isFullScreen === true) {
return TVB.player.exitFullScreen();
} else {
return TVB.player.enterFullScreen();
}
} catch (e) {
TVB.warning("Player: switchFullScreen: " + e.message);
return false;
}
};
/**
* Exit from full screen mode
* @method exitFullScreen
* @return {Boolean}
*/
TVB.player.exitFullScreen = function() {
try {
TVB.log("Player: exitFullScreen()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
// create a hole
if (TVB.player.config.littleHole === null) {
if (TVB.player.config.noLittleHole === false) {
TVB.player.addHole(TVB.player.config.width, TVB.player.config.height);
}
}
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.width = TVB.player.config.width + "px";
TVB.player.config.littleHole.style.height = TVB.player.config.height + "px";
}
var newX = parseInt(TVB.player.config.leftCord, 10) + parseInt(TVB.player.config.deltaX, 10);
var newY = parseInt(TVB.player.config.topCord, 10) + parseInt(TVB.player.config.deltaY, 10);
if (newY < 0) {
newY = 0;
}
if (newX < 0) {
newX = 0;
}
TVB.log("Player: hole coords (" + TVB.player.config.leftCord + ", " + TVB.player.config.topCord + ")");
TVB.log("Player: coords (" + newX + ", " + newY + ")");
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.top = TVB.player.config.topCord + 'px';
TVB.player.config.littleHole.style.left = TVB.player.config.leftCord + 'px';
}
TVB.log("Player: current URI = " + TVB.player.config.currentUri);
if (TVB.player.config.currentUri !== null) {
if (TVB.player.config.geometryAllowed === true) {
TVB.log("Player: setGeometry(" + newX + ", " + newY + ", " + TVB.player.config.width + ", " + TVB.player.config.height + ");");
TVB.player.p.setGeometry(newX, newY, TVB.player.config.width, TVB.player.config.height);
} else {
if (TVB.player.config.useSIF === true) {
TVB.log("Player: set scale SIF");
TVB.player.p.setScale("SIF");
} else {
TVB.log("Player: set size (" + TVB.player.config.width + ", " + TVB.player.config.height + ")");
TVB.player.p.setSize(TVB.player.config.width, TVB.player.config.height);
}
TVB.log("Player: set position " + newX + ", " + newY);
TVB.player.p.setPosition(newX, newY);
}
TVB.log("Player: set full screen mode enabled false");
TVB.player.p.setFullScreenModeEnabled(false);
}
TVB.player.config.isFullScreen = false;
/*
try {
if (document.getElementById('TVB.widget.titleHandler') !== null) {
document.getElementById('TVB.widget.titleHandler').style.display = 'block';
}
} catch (e) {
TVB.error("Player: warning 719: " + e.message);
}
try {
if (document.getElementById('TVB.widget.colorButtonsBarHandler') !== null) {
document.getElementById('TVB.widget.colorButtonsBarHandler').style.display = 'block';
}
} catch (e) {
TVB.error("Player: warning 727: " + e.message);
}
*/
return true;
} catch (e) {
TVB.warning("Player: exitFullScreen: " + e.message);
return false;
}
};
/**
* Destroy the video player and releases resources
* @method destroy
* @return {Boolean}
*/
TVB.player.destroy = function() {
try {
TVB.log("Player: destroy()");
if (TVB.player.config.isInit === false) {
TVB.log("Player: still not inited");
return false;
}
TVB.player.stop();
TVB.player.p.setScale("D1");
TVB.player.p.setPosition(0,0);
TVB.log("Player: destroy: disposing");
TVB.player.p.dispose();
try {
TVB.CustomEvent.unsubscribeEvent(TVB.remote.buttons.VCR);
TVB.CustomEvent.unsubscribeEvent(TVB.remote.button.BACK);
} catch (e) {}
TVB.player.config.isInit = false;
return true;
} catch (e) {
TVB.warning("Player: destroy: " + e.message);
return false;
}
};
/**
* Handle players events
* @method events
* @private
* @param {Object} event The event thrown by the player
*/
TVB.player.events = function(event) {
try {
TVB.log("Player: events(" + event.newState + ")");
var params = {
newState: event.newState,
previousState: event.previousState,
source: event.source,
uri: TVB.player.config.currentUri
};
TVB.CustomEvent.fireEvent(TVB.player.events.player, params);
switch (event.newState) {
case 'PLAYING':
TVB.player.removeBufferingMessage();
TVB.player.removePausedMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.play, params);
break;
case 'STOPPED':
TVB.player.removeBufferingMessage();
TVB.player.removePausedMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.stop, params);
break;
case 'PAUSED':
TVB.player.removeBufferingMessage();
TVB.player.showPausedMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.pause, params);
break;
case 'BUFFERING':
TVB.player.config.isBuffering = true;
TVB.player.showBufferingMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.buffering, params);
break;
case 'REWINDING':
TVB.player.removeBufferingMessage();
TVB.player.removePausedMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.rewinding, params);
break;
case 'FAST_FORWARDING':
TVB.player.removeBufferingMessage();
TVB.player.removePausedMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.fast_forwarding, params);
break;
case 'END_OF_STREAMING':
case 'END_OF_STREAM':
TVB.player.removeBufferingMessage();
TVB.player.removePausedMessage();
TVB.CustomEvent.fireEvent(TVB.player.events.end_of_streaming, params);
break;
default:
TVB.log("Player: unhandled state: " + event.newState);
}
} catch (e) {
TVB.warning("Player: events: " + e.message);
throw e;
}
};
/**
* Add muting to system
* @method mute
*/
TVB.player.mute = function() {
try {
TVB.log("Player: mute()");
TVB.player.p.setMuted(true);
} catch (e) {
TVB.warning("Player: mute: " + e.message);
throw e;
}
};
/**
* Remove muting from system
* @method unmute
*/
TVB.player.unmute = function() {
try {
TVB.log("Player: unmute()");
TVB.player.p.setMuted(false);
} catch (e) {
TVB.warning("Player: unmute: " + e.message);
throw e;
}
};
/**
* Returns current state of the mute subsystem
* @method isMuted
* @return {Boolean}
*/
TVB.player.isMuted = function() {
try {
TVB.log("Player: isMuted() -> " + TVB.player.p.isMuted());
return TVB.player.p.isMuted();
} catch (e) {
TVB.warning("Player: isMuted: " + e.message);
return false;
}
};
/**
* Returns current state of the player
* @method isInited
* @return {Boolean}
*/
TVB.player.isInited = function() {
try {
TVB.log("Player: isInited() -> " + TVB.player.config.isInit);
return TVB.player.config.isInit;
} catch (e) {
TVB.warning("Player: isInited: " + e.message);
return false;
}
};
/**
* Returns current content, if any
* @method getContent
* @return {String} Current content, false if no content available
*/
TVB.player.getContent = function() {
try {
TVB.log("Player: getContent() -> " + TVB.player.p.getContent());
return TVB.player.p.getContent();
} catch (e) {
TVB.warning("Player: getContent: " + e.message);
return null;
}
};
/**
* Returns current status, if any
* @method getStatus
* @return {String} Status name, false if no status available
*/
TVB.player.getStatus = function() {
try {
TVB.log("Player: getStatus() -> " + TVB.player.p.getStatus());
return TVB.player.p.getStatus();
} catch (e) {
TVB.warning("Player: getStatus: " + e.message);
return null;
}
};
/**
* Returns true if TVBLOB's browser has full screen mode enabled
* (security bar non visible), false otherwise
* @method isFullScreenModeEnabled
* @return {Boolean}
*/
TVB.player.isFullScreenModeEnabled = function() {
try {
TVB.log("Player: isFullScreenModeEnabled() -> " + TVB.player.p.isFullScreenModeEnabled());
return TVB.player.p.isFullScreenModeEnabled();
} catch (e) {
TVB.warning("Player: isFullScreenModeEnabled:" + e.message);
return false;
}
};
TVB.player.showPausedMessage = function() {
try {
if(!document.getElementById('TVB.player.pausedmessage')) {
TVB.log("Player: showBufferingMessage()");
var div = document.createElement('div');
div.id = 'TVB.player.pausedmessage';
div.style.width = '48px';
div.style.height = '32px';
div.style.position = 'fixed';
div.style.top = parseInt(window.innerHeight - 55, 10) + "px";
div.style.left = '30px';
div.style.padding = 0;
div.style.margin = 0;
div.style.zIndex = '10004';
document.body.appendChild(div);
}
var ico = null;
if (TVB.system.getFirmwareVersion() == "NON_TVBLOB") {
ico = 'http://storage.tvblob.com/lib/resources/playback_paused.png';
} else {
ico = 'file://gui/resources/themes/' + TVB.system.getVideoSystem() + '/consumer_v1/player/icons/dashboard/playback_paused.png';
}
try {
document.getElementById('TVB.player.pausedmessage').style.background = "#000001 url('" + ico + "') top left no-repeat";
} catch (e) {
TVB.log("Player: warning in showBufferingMessage: " + e.message);
}
} catch (e) {
TVB.warning("Player: showPausedMessage: " + e.message);
throw e;
}
};
TVB.player.removePausedMessage = function() {
try {
TVB.log("Player: removePausedMessage()");
if(document.getElementById('TVB.player.pausedmessage')) {
TVB.system.deleteElementById('TVB.player.pausedmessage');
}
} catch (e) {
TVB.warning("Player: removePausedMessage: " + e.message);
throw e;
}
};
TVB.player.showBufferingMessage = function() {
try {
if(!document.getElementById('bufferingmessage')) {
TVB.log("Player: showBufferingMessage()");
var div = document.createElement('div');
div.id = 'bufferingmessage';
div.style.width = '48px';
div.style.height = '32px';
div.style.position = 'fixed';
div.style.top = parseInt(window.innerHeight - 85, 10) + "px"; // 55
div.style.left = '30px';
div.style.padding = 0;
div.style.margin = 0;
div.style.zIndex = '10001';
document.body.appendChild(div);
}
var ico = null;
if (TVB.system.getFirmwareVersion() == "NON_TVBLOB") {
ico = 'http://storage.tvblob.com/lib/resources/playback_buffering.png';
} else {
ico = 'file://gui/resources/themes/' + TVB.system.getVideoSystem() + '/consumer_v1/player/icons/dashboard/playback_buffering.png';
}
try {
document.getElementById('bufferingmessage').style.background = "#000001 url('" + ico + "') top left no-repeat";
} catch (e) {
TVB.log("Player: warning in showBufferingMessage: " + e.message);
}
//document.getElementById('bufferingmessage').innerHTML = tvblob.getI18NString("hint.buffering", "Adapting to network conditions...", "messagesMediaPlayer");
} catch (e) {
TVB.warning("Player: showBufferingMessage: " + e.message);
throw e;
}
};
TVB.player.showStartingPlaybackMessage = function() {
try {
TVB.log("Player: showStartingPlaybackMessage()");
if(!document.getElementById('bufferingmessage')) {
TVB.log("Player: showBufferingMessage()");
var div = document.createElement('div');
div.id = 'bufferingmessage';
div.style.width = '48px';
div.style.height = '32px';
div.style.position = 'fixed';
div.style.top = parseInt(window.innerHeight - 85, 10) + "px";
div.style.left = '30px';
div.style.padding = 0;
div.style.margin = 0;
div.style.zIndex = '10002';
document.body.appendChild(div);
}
var ico = null;
if (TVB.system.getFirmwareVersion() == "NON_TVBLOB") {
ico = 'http://storage.tvblob.com/lib/resources/playback_working.png';
} else {
ico = 'file://gui/resources/themes/' + TVB.system.getVideoSystem() + '/consumer_v1/player/icons/dashboard/playback_working.png';
}
try {
document.getElementById('bufferingmessage').style.background = "#000001 url('" + ico + "') top left no-repeat";
} catch (e) {
TVB.log("Player: warning in showStartingPlaybackMessage: " + e.message);
}
} catch (e) {
TVB.warning("Player: showStartingPlaybackMessage: " + e.message);
throw e;
}
};
TVB.player.showUnableToPlayMessage = function() {
try {
TVB.log("Player: showUnableToPlayMessage()");
if(!document.getElementById('tvbplayererrormessage')) {
var div = document.createElement('div');
div.id = 'tvbplayererrormessage';
div.style.background = '#000 url("") no-repeat';
div.style.color = 'red';
div.style.zIndex = '32010';
div.style.border = '0';
div.style.top = parseInt(window.innerHeight - 28, 10) + "px";
div.style.left = '0px';
div.style.position = 'fixed';
div.style.display = 'block';
div.style.width = parseInt(window.innerWidth - 40, 10) + "px";
div.style.margin = '0';
div.style.padding = '0';
div.style.paddingLeft = '20px';
div.style.paddingRight = '20px';
div.style.overflow = 'hidden';
div.style.height = '28px';
div.style.zIndex = '10004';
div.innerHTML = '';
document.body.appendChild(div);
}
//document.getElementById('tvbplayererrormessage').innerHTML = tvblob.getI18NStringWithArgs("hint.unableToPlay", "Unable to play", "messagesMediaPlayer", [TVB.player.config.currentUri]);
document.getElementById('tvbplayererrormessage').innerHTML = tvblob.getI18NString("error.title", "Unable to play", "messagesMediaPlayer");
} catch (e) {
TVB.warning("Player: showUnableToPlayMessage: " + e.message);
throw e;
}
};
TVB.player.removeBufferingMessage = function() {
try {
TVB.log("Player: removeBufferingMessage()");
setTimeout(function() {
if(document.getElementById('bufferingmessage')) {
//document.getElementById('bufferingmessage').style.background = "#0000ff url() top left no-repeat";
TVB.system.deleteElementById('bufferingmessage');
}
}, 1000);
} catch (e) {
TVB.warning("Player: removeBufferingMessage: " + e.message);
throw e;
}
};
TVB.player.removeErrorMessage = function() {
try {
TVB.log("Player: removeErrorMessage()");
setTimeout(function() {
if (document.getElementById('tvbplayererrormessage')) {
//document.getElementById('tvbplayererrormessage').innerHTML = '';
TVB.system.deleteElementById('tvbplayererrormessage');
}
}, 1000);
} catch (e) {
TVB.warning("Player: removeErrorMessage: " + e.message);
throw e;
}
};
/**
* Disables temporary the remote control
* @method disableRemote
* @return {Boolean}
*/
TVB.player.disableRemote = function() {
try {
TVB.log("Player: disableRemote()");
TVB.player.config.disableRemote = true;
return true;
} catch (e) {
TVB.warning("Player: disableRemote:" + e.message);
return false;
}
};
/**
* Enables the remote control
* @method enableRemote
* @return {Boolean}
*/
TVB.player.enableRemote = function() {
try {
TVB.log("Player: enableRemote()");
TVB.player.config.disableRemote = false;
return true;
} catch (e) {
TVB.warning("Player: enableRemote:" + e.message);
return false;
}
};
/**
* Change the size of the player
* @method setSize
* @param {Integer} w Width
* @param {Integer} h Height
* @exception TypeError
* @exception RangeError
*/
TVB.player.setSize = function(w, h) {
try {
TVB.log("Player: setSize(" + w + ", " + h + ")");
if (w < 0 || h < 0) {
throw RangeError;
}
if (typeof w != 'number' || typeof h != 'number') {
throw TypeError;
}
TVB.player.p.setSize(w, h);
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.width = w + 'px';
TVB.player.config.littleHole.style.height = h + 'px';
}
TVB.player.config.width = w;
TVB.player.config.height = h;
} catch (e) {
TVB.warning("Player: setSize: " + e.message);
throw e;
}
};
/**
* Reposition current player instance on the canvas
* @method setPosition
* @param {Integer} x Left coord
* @param {Integer} y Top coord
* @exception TypeError
*/
TVB.player.setPosition = function(x, y) {
try {
if (typeof x != 'number' || typeof y != 'number') {
throw TypeError;
}
TVB.log("Player: setPosition(" + x + ", " + y + ");");
TVB.player.p.setPosition(x, y);
TVB.player.config.topCord = y;
TVB.player.config.leftCord = x;
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.top = y + 'px';
TVB.player.config.littleHole.style.left = x + 'px';
}
} catch (e) {
TVB.error("Player: setPosition: " + e.message);
throw e;
}
};
/**
* Change the whole geometry for the player
* @method setGeometry
* @param {Integer} x Left coord
* @param {Integer} y Top coord
* @param {Integer} w Width
* @param {Integer} x Height
* @exception TypeError
* @exception RangeError
*/
TVB.player.setGeometry = function(x, y, w, h) {
try {
if (typeof x != 'number' || typeof y != 'number' || typeof w != 'number' || typeof h != 'number') {
throw TypeError;
}
if (w < 0 || h < 0) {
throw RangeError;
}
TVB.player.config.useSIF = false;
if (TVB.player.config.geometryAllowed === false) {
TVB.log("Player: setSize(" + w + ", " + h + ");");
TVB.player.p.setSize(w, h);
TVB.log("Player: setPosition(" + x + ", " + y + ");");
TVB.player.p.setPosition(x, y);
} else {
TVB.log("Player: setGeometry(" + x + ", " + y + ", " + w + ", " + h + ");");
TVB.player.p.setGeometry(x, y, w, h);
}
TVB.player.config.topCord = y;
TVB.player.config.leftCord = x;
if (TVB.player.config.noLittleHole === false) {
TVB.player.config.littleHole.style.top = y + 'px';
TVB.player.config.littleHole.style.left = x + 'px';
TVB.player.config.littleHole.style.width = w + 'px';
TVB.player.config.littleHole.style.height = h + 'px';
}
} catch (e) {
TVB.error("Player: setGeometry: " + e.message);
throw e;
}
};
/**
* Restart current video playback from the beginning
* @method restartCurrentVideo
*/
TVB.player.restartCurrentVideo = function() {
try {
if (TVB.player.config.isPlaying === true) {
TVB.player.stop();
}
TVB.player.play();
} catch (e) {
TVB.error("Player: restartCurrentVideo: " + e.message);
throw e;
}
};
/**
* Return current streaming position
* @method getCurrentPosition
* @return {Integer} position in milliseconds
*/
TVB.player.getCurrentPosition = function() {
try {
if (TVB.player.config.isPlaying === true) {
return TVB.player.p.getCurrentFilePositionMS();
} else {
return null;
}
} catch (e) {
TVB.error("Player: getCurrentPosition: " + e.message);
throw e;
}
};
/**
* Set a listener for playing position. The listener will call the {callback} function every {timestep}
* passing an object with position and duration of the file in play
* @method setFileProgressListner
* @param {Function} callback
* @param {Integer} timestep
* @exception TypeError
*/
TVB.player.setFileProgressListener = function(callback, timestep){
try {
if (typeof timestep != 'number') {
throw TypeError;
}
if (typeof uri != 'function') {
throw TypeError;
}
TVB.player.p.setFileProgressListener(callback,timestep);
} catch (e) {
TVB.error("Player: setFileProgressListener: " + e.message);
throw e;
}
};
/**
* Return current file duration
* @method getDuration
* @return {Integer} duration in milliseconds
*/
TVB.player.getDuration = function() {
try {
if (TVB.player.config.isPlaying === true) {
return TVB.player.p.getCurrentFileDurationMS();
}else{
return null;
}
} catch (e) {
TVB.error("Player: getDuration: " + e.message);
throw e;
}
};