diff --git a/embed/core.js b/embed/core.js index f879d9af..1660a5e9 100644 --- a/embed/core.js +++ b/embed/core.js @@ -572,6 +572,11 @@ function mistPlay(streamName,options) { //embedLog('Stream info contents: '+JSON.stringify(streaminfo)); streaminfo.initTime = new Date(); + //sort the sources by priority and mime, but prefer HTTPS + streaminfo.source.sort(function(a,b){ + return (b.priority - a.priority) || a.type.localeCompare(b.type) || b.url.localeCompare(a.url); + }); + var mistPlayer = false; var source; var forceType = false; @@ -579,6 +584,12 @@ function mistPlay(streamName,options) { embedLog('Forcing '+options.forceType); forceType = options.forceType; } + var forceSource = false; + if (('forceSource' in options) && (options.forceSource)) { + forceSource = options.forceSource; + forceType = streaminfo.source[forceSource].type; + embedLog('Forcing source '+options.forceSource+': '+forceType+' @ '+streaminfo.source[forceSource].url); + } var forceSupportCheck = false; if (('forceSupportCheck' in options) && (options.forceSupportCheck)) { embedLog('Forcing a full support check'); @@ -615,16 +626,21 @@ function mistPlay(streamName,options) { return false; } function checkMime(p_shortname,mime) { - embedLog('Checking if Mist broadcasts '+mime+'..'); - for (var s in streaminfo.source) { - if (streaminfo.source[s].type == mime) { - embedLog('Yup! Checking browser support..'); - if (mistplayers[p_shortname].isBrowserSupported(mime)) { - embedLog('Yup! This is a working player/source combo.'); + var loop; + if (forceSource) { + loop = [streaminfo.source[forceSource]]; + } + else { + loop = streaminfo.source; + } + for (var s in loop) { + if (loop[s].type == mime) { + if (mistplayers[p_shortname].isBrowserSupported(mime,loop[s],options)) { + embedLog('Found a working combo: '+mistplayers[p_shortname].name+' with '+mime+' @ '+loop[s].url); streaminfo.working[p_shortname].push(mime); if (!source) { mistPlayer = p_shortname; - source = streaminfo.source[s]; + source = loop[s]; } if (!forceSupportCheck) { return source; @@ -632,6 +648,8 @@ function mistPlay(streamName,options) { } } } + embedLog('Mist doesn\'t broadcast '+mime+' or there is no browser support.'); + return false; } @@ -651,16 +669,16 @@ function mistPlay(streamName,options) { } } + options.target.innerHTML = ''; if (mistPlayer) { - embedLog('Preparing to build '+mistplayers[mistPlayer].name); - //create the options to send to the player var playerOpts = { src: source.url+(('urlappend' in options) && (options.urlappend) ? options.urlappend : '' ), live: (streaminfo.type == 'live' ? true : false), initTime: streaminfo.initTime, meta: streaminfo.meta, - source: source + source: source, + host: options.host }; //pass player options and handle defaults playerOpts.autoplay = options.autoplay; @@ -733,6 +751,7 @@ function mistPlay(streamName,options) { }; for (var i in streaminfo.meta.tracks) { var t = streaminfo.meta.tracks[i]; + var skip = false; switch (t.type) { case 'video': t.desc = ['['+t.codec+']',t.width+'x'+t.height,Math.round(t.bps/1024)+'kbps',t.fpks/1e3+'fps',t.lang]; @@ -743,7 +762,11 @@ function mistPlay(streamName,options) { case 'subtitle': t.desc = ['['+t.codec+']',t.lang]; break; + default: + skip = true; + break; } + if (skip) { continue; } t.desc = t.desc.join(', '); tracks[t.type].push(t); } diff --git a/embed/test.html b/embed/test.html index b3b25e47..78d8d869 100644 --- a/embed/test.html +++ b/embed/test.html @@ -15,13 +15,14 @@ - - + + @@ -65,27 +66,32 @@ //tryplayers = Object.keys(mistplayers); tryplayers = []; - tryplayers.push('html5'); - //tryplayers.push('dashjs'); + //tryplayers.push('html5'); + tryplayers.push('dashjs'); //tryplayers.push('flash_strobe'); //tryplayers.push('silverlight'); + streams = []; + //streams.push('live'); + //streams.push('vids+mist.mp4'); + //streams.push('lama'); + streams.push('bunny'); - for (var i in tryplayers) { - var c = document.createElement('div'); - c.className = 'mistvideo'; - c.title = tryplayers[i]; - document.body.appendChild(c); - //mistPlay('live',{ - //mistPlay('vids+mist.mp4',{ - //mistPlay('lama',{ - mistPlay('bunny',{ - target: c, - forcePlayer: tryplayers[i], - loop: true - }); + for (var j in streams) { + for (var i in tryplayers) { + var c = document.createElement('div'); + c.className = 'mistvideo'; + c.title = tryplayers[i]; + document.body.appendChild(c); + mistPlay(streams[j],{ + target: c, + forcePlayer: tryplayers[i], + //forceType: 'flash/7', + //forceSource: 5, + loop: true + }); + } } - }; /* diff --git a/embed/wrappers/dashjs.js b/embed/wrappers/dashjs.js index 5b92e814..a6eeaec3 100644 --- a/embed/wrappers/dashjs.js +++ b/embed/wrappers/dashjs.js @@ -5,7 +5,8 @@ mistplayers.dashjs = { isMimeSupported: function (mimetype) { return (this.mimes.indexOf(mimetype) == -1 ? false : true); }, - isBrowserSupported: function (mimetype) { + isBrowserSupported: function (mimetype,source,options) { + if ((options.host.substr(0,7) == 'http://') && (source.url.substr(0,8) == 'https://')) { return false; } return (('dashjs' in window) && ('MediaSource' in window) && (location.protocol != 'file:')); }, player: function(){} diff --git a/embed/wrappers/flash_strobe.js b/embed/wrappers/flash_strobe.js index 9566d79e..c1d0e679 100644 --- a/embed/wrappers/flash_strobe.js +++ b/embed/wrappers/flash_strobe.js @@ -5,7 +5,10 @@ mistplayers.flash_strobe = { isMimeSupported: function (mimetype) { return (this.mimes.indexOf(mimetype) == -1 ? false : true); }, - isBrowserSupported: function (mimetype) { + isBrowserSupported: function (mimetype,source,options) { + //check for http / https crossovers + if ((options.host.substr(0,7) == 'http://') && (source.url.substr(0,8) == 'https://')) { return false; } + var version = 0; try { // check in the mimeTypes @@ -38,7 +41,7 @@ p.prototype.build = function (options) { ele.setAttribute('width',options.width); ele.setAttribute('height',options.height); - ele.appendChild(createParam('movie',options.source.player_url)); + ele.appendChild(createParam('movie',options.host+options.source.player_url)); var flashvars = 'src='+encodeURIComponent(options.src)+'&controlBarMode='+(options.controls ? 'floating' : 'none')+'&initialBufferTime=0.5&expandedBufferTime=5&minContinuousPlaybackTime=3'+(options.live ? '&streamType=live' : '')+(options.autoplay ? '&autoPlay=true' : '' ); ele.appendChild(createParam('flashvars',flashvars)); ele.appendChild(createParam('allowFullScreen','true')); diff --git a/embed/wrappers/html5.js b/embed/wrappers/html5.js index 4d8a93d2..00669f85 100644 --- a/embed/wrappers/html5.js +++ b/embed/wrappers/html5.js @@ -135,15 +135,55 @@ p.prototype.build = function (options,callback) { ele.addEventListener('progress',nolongerdced); } - //ele.addEventListener('stalled',dced,true); + ele.addEventListener('stalled',dced,true); ele.addEventListener('ended',dced,true); + ele.addEventListener('pause',dced,true); } this.addlog('Built html'); //forward events ele.addEventListener('error',function(e){ - me.adderror(e.message); + var msg; + if ('message' in e) { + msg = e.message; + } + else { + msg = 'readyState: '; + switch (me.element.readyState) { + case 0: + msg += 'HAVE_NOTHING'; + break; + case 1: + msg += 'HAVE_METADATA'; + break; + case 2: + msg += 'HAVE_CURRENT_DATA'; + break; + case 3: + msg += 'HAVE_FUTURE_DATA'; + break; + case 4: + msg += 'HAVE_ENOUGH_DATA'; + break; + } + msg += ' networkState: '; + switch (me.element.networkState) { + case 0: + msg += 'NETWORK_EMPTY'; + break; + case 1: + msg += 'NETWORK_IDLE'; + break; + case 2: + msg += 'NETWORK_LOADING'; + break; + case 3: + msg += 'NETWORK_NO_SOURCE'; + break; + } + } + me.adderror(msg); },true); var events = ['abort','canplay','canplaythrough','durationchange','emptied','ended','interruptbegin','interruptend','loadeddata','loadedmetadata','loadstart','pause','play','playing','ratechange','seeked','seeking','stalled','volumechange','waiting']; for (var i in events) { diff --git a/lsp/main.css b/lsp/main.css index 45f4f0c7..03317178 100644 --- a/lsp/main.css +++ b/lsp/main.css @@ -848,6 +848,19 @@ button.return:before { color: rgba(0,0,0,0.8); margin-bottom: 1em; } +.logs { + text-indent: 0; +} +.logs > div { + display: flex; + flex-flow: row nowrap; +} +.logs > div > * { + margin-right: 1em; +} +.logs .content > * { + margin-right: 0.5em; +} @font-face { font-family: FuturaICGLight; diff --git a/lsp/minified.js b/lsp/minified.js index 5e3a029c..cd4d6fb3 100644 --- a/lsp/minified.js +++ b/lsp/minified.js @@ -1,14 +1,14 @@ -var MD5=function(a){function b(a,b){var c,d,g,f,i;g=a&2147483648;f=b&2147483648;c=a&1073741824;d=b&1073741824;i=(a&1073741823)+(b&1073741823);return c&d?i^2147483648^g^f:c|d?i&1073741824?i^3221225472^g^f:i^1073741824^g^f:i^g^f}function c(a,c,d,g,f,i,j){a=b(a,b(b(c&d|~c&g,f),j));return b(a<>>32-i,c)}function d(a,c,d,g,f,i,j){a=b(a,b(b(c&g|d&~g,f),j));return b(a<>>32-i,c)}function e(a,c,d,g,f,i,j){a=b(a,b(b(c^d^g,f),j));return b(a<>>32-i,c)}function l(a,c,d,g,f,i,j){a=b(a,b(b(d^(c|~g), -f),j));return b(a<>>32-i,c)}function n(a){var b="",c="",d;for(d=0;3>=d;d++)c=a>>>8*d&255,c="0"+c.toString(16),b+=c.substr(c.length-2,2);return b}var h=[],q,p,f,v,g,i,j,k,h=a.replace(/\r\n/g,"\n"),a="";for(q=0;qp?a+=String.fromCharCode(p):(127p?a+=String.fromCharCode(p>>6|192):(a+=String.fromCharCode(p>>12|224),a+=String.fromCharCode(p>>6&63|128)),a+=String.fromCharCode(p&63|128));h=a;a=h.length;q=a+8;p=16*((q-q%64)/64+1);f=Array(p-1);for(g=v=0;g>>29;h=f;g=1732584193;i=4023233417;j=2562383102;k=271733878;for(a=0;ac?1*d:a .menu"),main:$("main"),header:$("header"),connection:{status:$("#connection"),user_and_host:$("#user_and_host"),msg:$("#message")}};UI.buildMenu();UI.stored.getOpts();try{if("mistLogin"in sessionStorage){var a=JSON.parse(sessionStorage.mistLogin);mist.user.name=a.name;mist.user.password=a.password;mist.user.host=a.host}}catch(b){}location.hash&&(a=decodeURIComponent(location.hash).substring(1).split("@")[0].split("&"),mist.user.name=a[0],a[1]&&(mist.user.host= +var MD5=function(a){function b(a,b){var g,c,d,h,i;d=a&2147483648;h=b&2147483648;g=a&1073741824;c=b&1073741824;i=(a&1073741823)+(b&1073741823);return g&c?i^2147483648^d^h:g|c?i&1073741824?i^3221225472^d^h:i^1073741824^d^h:i^d^h}function c(a,g,d,c,h,i,f){a=b(a,b(b(g&d|~g&c,h),f));return b(a<>>32-i,g)}function d(a,g,d,c,h,i,f){a=b(a,b(b(g&c|d&~c,h),f));return b(a<>>32-i,g)}function e(a,g,c,d,h,i,f){a=b(a,b(b(g^c^d,h),f));return b(a<>>32-i,g)}function k(a,g,c,d,h,i,f){a=b(a,b(b(c^(g|~d), +h),f));return b(a<>>32-i,g)}function m(a){var b="",g="",c;for(c=0;3>=c;c++)g=a>>>8*c&255,g="0"+g.toString(16),b+=g.substr(g.length-2,2);return b}var f=[],q,p,l,v,h,g,i,j,f=a.replace(/\r\n/g,"\n"),a="";for(q=0;qp?a+=String.fromCharCode(p):(127p?a+=String.fromCharCode(p>>6|192):(a+=String.fromCharCode(p>>12|224),a+=String.fromCharCode(p>>6&63|128)),a+=String.fromCharCode(p&63|128));f=a;a=f.length;q=a+8;p=16*((q-q%64)/64+1);l=Array(p-1);for(h=v=0;h>>29;f=l;h=1732584193;g=4023233417;i=2562383102;j=271733878;for(a=0;ac?1*d:a .menu"),main:$("main"),header:$("header"),connection:{status:$("#connection"),user_and_host:$("#user_and_host"),msg:$("#message")}};UI.buildMenu();UI.stored.getOpts();try{if("mistLogin"in sessionStorage){var a=JSON.parse(sessionStorage.mistLogin);mist.user.name=a.name;mist.user.password=a.password;mist.user.host=a.host}}catch(b){}location.hash&&(a=decodeURIComponent(location.hash).substring(1).split("@")[0].split("&"),mist.user.name=a[0],a[1]&&(mist.user.host= a[1]));mist.send(function(){$(window).trigger("hashchange")},{},{timeout:5,hide:!0});var c=0;$("body > div.filler").on("scroll",function(){var a=$(this).scrollLeft();a!=c&&UI.elements.header.css("margin-right",-1*a+"px");c=a})});$(window).on("hashchange",function(){var a=decodeURIComponent(location.hash).substring(1).split("@");a[1]||(a[1]="");a=a[1].split("&");""==a[0]&&(a[0]="Overview");UI.showTab(a[0],a[1])}); -var otherhost=!1,UI={debug:!1,elements:{},stored:{getOpts:function(){var a=localStorage.stored;a&&(a=JSON.parse(a));$.extend(!0,this.vars,a);return this.vars},saveOpt:function(a,b){this.vars[a]=b;localStorage.stored=JSON.stringify(this.vars);return this.vars},vars:{helpme:!0}},interval:{clear:function(){"undefined"!=typeof this.opts&&(clearInterval(this.opts.id),delete this.opts)},set:function(a,b){this.opts&&log("[interval]","Set called on interval, but an interval is already active.");this.opts= -{delay:b,callback:a};this.opts.id=setInterval(a,b)}},returnTab:["Overview"],countrylist:{AF:"Afghanistan",AX:"Åland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua and Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia, Plurinational State of", +var otherhost={host:!1,https:!1},UI={debug:!1,elements:{},stored:{getOpts:function(){var a=localStorage.stored;a&&(a=JSON.parse(a));$.extend(!0,this.vars,a);return this.vars},saveOpt:function(a,b){this.vars[a]=b;localStorage.stored=JSON.stringify(this.vars);return this.vars},vars:{helpme:!0}},interval:{clear:function(){"undefined"!=typeof this.opts&&(clearInterval(this.opts.id),delete this.opts)},set:function(a,b){this.opts&&log("[interval]","Set called on interval, but an interval is already active."); +this.opts={delay:b,callback:a};this.opts.id=setInterval(a,b)}},returnTab:["Overview"],countrylist:{AF:"Afghanistan",AX:"Åland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua and Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia, Plurinational State of", BQ:"Bonaire, Sint Eustatius and Saba",BA:"Bosnia and Herzegovina",BW:"Botswana",BV:"Bouvet Island",BR:"Brazil",IO:"British Indian Ocean Territory",BN:"Brunei Darussalam",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",KH:"Cambodia",CM:"Cameroon",CA:"Canada",CV:"Cape Verde",KY:"Cayman Islands",CF:"Central African Republic",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo",CD:"Congo, the Democratic Republic of the",CK:"Cook Islands", CR:"Costa Rica",CI:"Côte d'Ivoire",HR:"Croatia",CU:"Cuba",CW:"Curaçao",CY:"Cyprus",CZ:"Czech Republic",DK:"Denmark",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",ET:"Ethiopia",FK:"Falkland Islands (Malvinas)",FO:"Faroe Islands",FJ:"Fiji",FI:"Finland",FR:"France",GF:"French Guiana",PF:"French Polynesia",TF:"French Southern Territories",GA:"Gabon",GM:"Gambia",GE:"Georgia",DE:"Germany",GH:"Ghana", GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GG:"Guernsey",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HM:"Heard Island and McDonald Islands",VA:"Holy See (Vatican City State)",HN:"Honduras",HK:"Hong Kong",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran, Islamic Republic of",IQ:"Iraq",IE:"Ireland",IM:"Isle of Man",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JE:"Jersey",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati", @@ -21,172 +21,182 @@ clearTimeout(this.hiding);delete this.hiding;var c=$(document).height()-$tooltip "HLS";break;case "html5/video/mp4":b="MP4";break;case "dash/video/mp4":b="DASH";break;case "flash/11":b="HDS";break;case "flash/10":b="RTMP";break;case "flash/7":b="Progressive";break;case "html5/audio/mp3":b="MP3";break;case "html5/video/mp2t":b="TS";break;case "html5/application/vnd.ms-ss":b="Smooth";break;case "html5/text/vtt":b="VTT Subtitles";break;case "html5/text/plain":b="SRT Subtitles";break;case "html5/text/javascript":b="JSON Subtitles"}return b},popup:{element:null,show:function(a){this.element= $("
").attr("id","popup").append($("