new embed framework - WIP
This commit is contained in:
parent
5d702abdc5
commit
f82e75e891
2 changed files with 430 additions and 0 deletions
381
lsp/newembed.js
Normal file
381
lsp/newembed.js
Normal file
|
@ -0,0 +1,381 @@
|
|||
if (typeof mistplayers == 'undefined') {
|
||||
//no need to define this if it's already there
|
||||
|
||||
var mistplayers = {};
|
||||
|
||||
//create prototype with empty functions the player should have, so that any that have not been defined return false
|
||||
function MistPlayer() {
|
||||
|
||||
//return true if this player is to be used for this mimetype
|
||||
this.formimetype = function (fullmimetype){ return false; };
|
||||
|
||||
this.name = 'Generic player';
|
||||
|
||||
//mimetype: e.g. 'video/mp4'; that is withouth the html5, flash, or whatever first part.
|
||||
this.supported = function(mimetype){ return false; };
|
||||
|
||||
/*
|
||||
shape of build options:
|
||||
{
|
||||
container: html DOM element,
|
||||
width: (int) video width,
|
||||
height: (int) video height,
|
||||
name: (string) the stream name,
|
||||
src: (string) the video source string,
|
||||
mimetype: (string) the mimetype,
|
||||
islive: (boolean) whether or not this is a live video,
|
||||
autoplay: (boolean) whether or not to enable autoplay
|
||||
}
|
||||
*/
|
||||
this.build = function(options){ return false; };
|
||||
|
||||
//creates the player element, including custom functions
|
||||
this.element = function(tag){
|
||||
var ele = document.createElement(tag);
|
||||
ele.mistplay = function(){ return false; };
|
||||
ele.mistpause = function(){ return false; };
|
||||
|
||||
//(double) value: 0 for muted, 1 for max
|
||||
ele.mistsetvolume = function(value){ return false; };
|
||||
//return the current position, in seconds
|
||||
ele.mistposition = function(){ return false; };
|
||||
|
||||
return ele;
|
||||
};
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
//ADD AVAILABLE PLAYERS TO THE MISTPLAYERS OBJECT//
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
////HTML5////////////////////////////////////////////
|
||||
var html5 = new MistPlayer();
|
||||
mistplayers.html5 = html5;
|
||||
html5.name = 'HTML5 video element';
|
||||
html5.formimetype = function(fullmimetype){
|
||||
var t = fullmimetype.split('/');
|
||||
return ((t[0] == 'html5') && (t[1] == 'video'));
|
||||
};
|
||||
html5.supported = function(mimetype) {
|
||||
var support = false;
|
||||
try {
|
||||
var v = document.createElement('video');
|
||||
if ((v) && (v.canPlayType(mimetype) != "")) {
|
||||
support = v.canPlayType(mimetype);
|
||||
}
|
||||
} catch(e){}
|
||||
return support;
|
||||
}
|
||||
html5.build = function(options){
|
||||
var ele = this.element('video');
|
||||
|
||||
ele.setAttribute('width',options.width);
|
||||
ele.setAttribute('height',options.height);
|
||||
ele.setAttribute('src',encodeURI(options.src));
|
||||
ele.setAttribute('controls','controls');
|
||||
|
||||
if (options.autoplay) {
|
||||
ele.setAttribute('autoplay','controls');
|
||||
}
|
||||
|
||||
ele.mistplay = function(){
|
||||
this.play();
|
||||
};
|
||||
ele.mistpause = function(){
|
||||
this.pause();
|
||||
};
|
||||
ele.mistsetvolume = function(value){
|
||||
this.volume = value;
|
||||
};
|
||||
ele.mistposition = function(){
|
||||
return this.currentTime;
|
||||
}
|
||||
|
||||
options.container.appendChild(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
////FLASH////////////////////////////////////////////
|
||||
var flash = new MistPlayer();
|
||||
mistplayers.flash = flash;
|
||||
flash.name = 'Flash object';
|
||||
flash.formimetype = function(fullmimetype){
|
||||
var t = fullmimetype.split('/');
|
||||
return (t[0] == 'flash');
|
||||
};
|
||||
flash.supported = function(mimetype) {
|
||||
|
||||
var version = 0;
|
||||
try {
|
||||
// check in the mimeTypes
|
||||
version = navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin.description.replace(/([^0-9\.])/g, '').split('.')[0];
|
||||
} catch(e){}
|
||||
try {
|
||||
// for our special friend IE
|
||||
version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable("$version").replace(/([^0-9\,])/g, '').split(',')[0];
|
||||
} catch(e){}
|
||||
version = parseInt(version);
|
||||
|
||||
return version >= parseInt(mimetype);
|
||||
}
|
||||
flash.build = function(options){
|
||||
var ele = this.element('object');
|
||||
ele.setAttribute('id',options.name);
|
||||
ele.setAttribute('width',options.width);
|
||||
ele.setAttribute('height',options.height);
|
||||
|
||||
//set flashvars
|
||||
var flashvars = {
|
||||
src: encodeURIComponent(options.src),
|
||||
controlBarMode: 'floating',
|
||||
initialBufferTime: 5,
|
||||
expandedBufferTime: 5,
|
||||
minContinuousPlaybackTime: 3
|
||||
};
|
||||
//set param elements
|
||||
var params = {
|
||||
movie: 'http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf',
|
||||
flashvars: [],
|
||||
allowFullScreen: 'true',
|
||||
allowscriptaccess: 'always',
|
||||
wmode: 'direct'
|
||||
};
|
||||
if (options.autoplay) {
|
||||
params.autoPlay = 'true';
|
||||
flashvars.autoPlay = 'true';
|
||||
}
|
||||
if (options.islive) {
|
||||
flashvars.streamType = 'live';
|
||||
}
|
||||
if (parseInt(options.mimetype) >= 10) {
|
||||
params.movie = 'http://fpdownload.adobe.com/strobe/FlashMediaPlayback_101.swf';
|
||||
}
|
||||
for (var i in flashvars) {
|
||||
params.flashvars.push(i+'='+flashvars[i]);
|
||||
}
|
||||
params.flashvars = params.flashvars.join('&');
|
||||
for (var i in params) {
|
||||
var param = document.createElement('param');
|
||||
ele.appendChild(param);
|
||||
param.setAttribute('name',i);
|
||||
param.setAttribute('value',params[i]);
|
||||
}
|
||||
|
||||
var embed = document.createElement('embed');
|
||||
embed.setAttribute('name',options.name);
|
||||
embed.setAttribute('src',params.movie);
|
||||
embed.setAttribute('type','application/x-shockwave-flash');
|
||||
embed.setAttribute('allowscriptaccess','always');
|
||||
embed.setAttribute('allowfullscreen','true');
|
||||
embed.setAttribute('width',options.width);
|
||||
embed.setAttribute('height',options.height);
|
||||
embed.setAttribute('flashvars',params.flashvars);
|
||||
ele.appendChild(embed);
|
||||
|
||||
options.container.appendChild(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
////SILVERLIGHT//////////////////////////////////////
|
||||
var silverlight = new MistPlayer();
|
||||
mistplayers.silverlight = silverlight;
|
||||
silverlight.name = 'Silverlight';
|
||||
silverlight.formimetype = function(fullmimetype){
|
||||
return (fullmimetype == 'silverlight');
|
||||
};
|
||||
silverlight.supported = function(mimetype) {
|
||||
var plugin;
|
||||
|
||||
try {
|
||||
// check in the mimeTypes
|
||||
plugin = navigator.plugins["Silverlight Plug-In"];
|
||||
return !!plugin;
|
||||
} catch(e){}
|
||||
try {
|
||||
// for our special friend IE
|
||||
plugin = new ActiveXObject('AgControl.AgControl');
|
||||
return true;
|
||||
} catch(e){}
|
||||
|
||||
return false;
|
||||
}
|
||||
silverlight.build = function(options){
|
||||
var ele = this.element('object');
|
||||
|
||||
ele.setAttribute('data','data:application/x-silverlight,'); //yes that comma needs to be there
|
||||
ele.setAttribute('type','application/x-silverlight');
|
||||
ele.setAttribute('width',options.width);
|
||||
ele.setAttribute('height',options.height);
|
||||
|
||||
var params = {
|
||||
source: encodeURI(options.src),
|
||||
onerror: 'onSilverlightError',
|
||||
autoUpgrade: 'true',
|
||||
background: 'black',
|
||||
enableHtmlAccess: 'true',
|
||||
minRuntimeVersion: '3.0.40624.0',
|
||||
initparams: []
|
||||
};
|
||||
var initparams = {
|
||||
autoload: 'false',
|
||||
enablecaptions: 'true',
|
||||
joinLive: 'true',
|
||||
muted: 'false',
|
||||
playlist: document.createElement('playList')
|
||||
};
|
||||
if (options.autoplay) {
|
||||
initparams.autoplay = 'true';
|
||||
}
|
||||
var playitems = document.createElement('playListItems');
|
||||
initparams.playlist.appendChild(playitems);
|
||||
var playitem = document.createElement('playListItem');
|
||||
playitems.appendChild(playitem);
|
||||
playitems.setAttribute('mediaSource',encodeURI(options.src));
|
||||
playitems.setAttribute('adaptiveStreaming','true');
|
||||
initparams.playlist = initparams.playlist.outerHTML;
|
||||
|
||||
for (var i in initparams) {
|
||||
params.initparams.push(i+'='+initparams[i]);
|
||||
}
|
||||
params.initparams = params.initparams.join(',');
|
||||
for (var i in params) {
|
||||
var param = document.createElement('param');
|
||||
ele.appendChild(param);
|
||||
param.setAttribute('name',i);
|
||||
param.setAttribute('value',params[i]);
|
||||
}
|
||||
|
||||
ele.innerHTML += '<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"><img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /></a>';
|
||||
|
||||
options.container.appendChild(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
} //end of player definitions
|
||||
|
||||
function mistembed(streamname) {
|
||||
|
||||
function findPlayer(fullmimetype) {
|
||||
for (var i in mistplayers) {
|
||||
if (mistplayers[i].formimetype(fullmimetype)) {
|
||||
return mistplayers[i];
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
var video = mistvideo[streamname];
|
||||
container = document.createElement('div'),
|
||||
scripts = document.getElementsByTagName('script'),
|
||||
me = scripts[scripts.length - 1];
|
||||
|
||||
if (me.parentNode.hasAttribute('data-forcetype')) {
|
||||
var forceType = me.parentNode.getAttribute('data-forcetype');
|
||||
}
|
||||
if (me.parentNode.hasAttribute('data-forcesupportcheck')) {
|
||||
var forceSupportCheck = true;
|
||||
}
|
||||
if (me.parentNode.hasAttribute('data-autoplay')) {
|
||||
var autoplay = true;
|
||||
}
|
||||
|
||||
// create the container
|
||||
me.parentNode.insertBefore(container, me);
|
||||
// set the class to 'mistvideo'
|
||||
container.setAttribute('class', 'mistvideo');
|
||||
// remove script tag
|
||||
me.parentNode.removeChild(me);
|
||||
|
||||
if(video.error) {
|
||||
// there was an error; display it
|
||||
container.innerHTML = '<strong>Error: '+video.error+'</strong>';
|
||||
}
|
||||
else if ((typeof video.source == 'undefined') || (video.source.length < 1)) {
|
||||
// no stream sources
|
||||
container.innerHTML = '<strong>Error: no protocols found</strong>';
|
||||
}
|
||||
else {
|
||||
// no error, and sources found. Check the video types and output the best
|
||||
// available video player.
|
||||
|
||||
var foundPlayer = false;
|
||||
|
||||
for (var i in video.source) {
|
||||
if ((forceType) && (video.source[i].type.indexOf(forceType) < 0)) {
|
||||
video.source[i].rejected = 'This source type is not the one being forced.';
|
||||
continue;
|
||||
}
|
||||
|
||||
var player = findPlayer(video.source[i].type);
|
||||
var shortmime = video.source[i].type.split('/');
|
||||
shortmime.shift();
|
||||
shortmime = shortmime.join('/');
|
||||
video.source[i].browser_support = false;
|
||||
|
||||
if (player) {
|
||||
var support = player.supported(shortmime);
|
||||
if ((support) || (forceType)) {
|
||||
//either the player is supported by the browser, or this source type is being enforced
|
||||
|
||||
video.source[i].browser_support = Boolean(support);
|
||||
if (foundPlayer === false) {
|
||||
foundPlayer = {
|
||||
protocol: video.source[i],
|
||||
player: player,
|
||||
shortmime: shortmime
|
||||
};
|
||||
}
|
||||
if (!forceSupportCheck) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
video.source[i].rejected = 'The player for this source type ('+player.name+') is not supported by your browser.';
|
||||
}
|
||||
}
|
||||
else {
|
||||
video.source[i].rejected = 'No compatible player found for this source type.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (foundPlayer) {
|
||||
// we support this kind of video, so build it.
|
||||
|
||||
//calculations for the size
|
||||
videowidth = video.width || 250;
|
||||
videoheight = video.height || 250;
|
||||
var ratio;
|
||||
var containerwidth = parseInt(container.scrollWidth);
|
||||
var containerheight = parseInt(container.scrollHeight);
|
||||
if(videowidth > containerwidth && containerwidth > 0) {
|
||||
ratio = videowidth / containerwidth;
|
||||
videowidth /= ratio;
|
||||
videoheight /= ratio;
|
||||
}
|
||||
if(videoheight > containerheight && containerheight > 0) {
|
||||
ratio = videoheight / containerheight;
|
||||
videowidth /= ratio;
|
||||
videoheight /= ratio;
|
||||
}
|
||||
|
||||
video.embedded = foundPlayer.player.build({
|
||||
container: container,
|
||||
width: videowidth,
|
||||
height: videoheight,
|
||||
src: foundPlayer.protocol.url,
|
||||
name: streamname,
|
||||
mimetype: foundPlayer.shortmime,
|
||||
islive: (video.type == 'live'),
|
||||
autoplay: autoplay
|
||||
});
|
||||
|
||||
return foundPlayer.protocol.type;
|
||||
}
|
||||
else {
|
||||
// of all the source types given, none was supported (eg. no flash and HTML5 video). Display error
|
||||
container.innerHTML = '<strong>No support for any player found</strong>';
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
49
lsp/test_newembed.html
Normal file
49
lsp/test_newembed.html
Normal file
|
@ -0,0 +1,49 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Test the stream embedding</title>
|
||||
<style></style>
|
||||
<script src=plugins/jquery.js></script>
|
||||
<!--<script src='../src/embed.js'></script>-->
|
||||
<script src='newembed.js'></script>
|
||||
<script>
|
||||
var embed_settings = {};
|
||||
$(function(){
|
||||
$('button#embed').click(function(){
|
||||
$('#embedcontainer, #button_container').html('');
|
||||
|
||||
var streamName = $('input[name=streamName]').val();
|
||||
var embedtype = $('input[name=force]').val();
|
||||
|
||||
var info = document.createElement('script');
|
||||
info.src = 'http://localhost:8080/info_'+streamName+'.js';
|
||||
document.getElementById('embedcontainer').appendChild(info);
|
||||
info.onload = function(){
|
||||
if (embedtype == '') {
|
||||
$('#embedcontainer').removeAttr('data-forcetype');
|
||||
}
|
||||
else {
|
||||
$('#embedcontainer').attr('data-forcetype',embedtype);
|
||||
}
|
||||
$('#embedcontainer').append(
|
||||
$('<div>').text('Embedded: '+mistembed(streamName))
|
||||
);
|
||||
console.log(mistvideo[streamName]);
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<label>
|
||||
Enter the streamname: <input type=text value=bunny name=streamName>
|
||||
</label><br>
|
||||
<label>
|
||||
Force embed type: <input type=text name=force> (blank for auto)
|
||||
</label><br>
|
||||
<button id=embed>Embed</button>
|
||||
<div id=button_container></div>
|
||||
<div id=embedcontainer style="width: 100%; height: 35em;" data-forcesupportcheck data-autoplay>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Reference in a new issue