1 line
No EOL
7.2 KiB
JavaScript
1 line
No EOL
7.2 KiB
JavaScript
mistplayers.videojs={name:"VideoJS player",mimes:["html5/application/vnd.apple.mpegurl","html5/application/vnd.apple.mpegurl;version=7"],priority:MistUtil.object.keys(mistplayers).length+1,isMimeSupported:function(e){return MistUtil.array.indexOf(this.mimes,e)==-1?false:true},isBrowserSupported:function(e,t,r){if(location.protocol!=MistUtil.http.url.split(t.url).protocol){r.log("HTTP/HTTPS mismatch for this source");return false}if(location.protocol=="file:"&&e=="html5/application/vnd.apple"){r.log("This source ("+e+") won't load if the page is run via file://");return false}function i(e){if(!MediaSource.isTypeSupported){return true}var t={};var i=false;for(var o in r.info.meta.tracks){if(r.info.meta.tracks[o].type=="meta"){if(r.info.meta.tracks[o].codec=="subtitle"){i=true}continue}if(!(r.info.meta.tracks[o].type in t)){t[r.info.meta.tracks[o].type]={}}t[r.info.meta.tracks[o].type][MistUtil.tracks.translateCodec(r.info.meta.tracks[o])]=1}var s=[];for(var a in t){var n=false;for(var l in t[a]){if(MediaSource.isTypeSupported(e+';codecs="'+l+'"')){n=true;break}}if(n){s.push(a)}}if(i){for(var o in r.info.source){if(r.info.source[o].type=="html5/text/vtt"){s.push("subtitle");break}}}return s.length?s:false}if(document.createElement("video").canPlayType(e.replace("html5/",""))){if(!("MediaSource"in window)){return true}if(!MediaSource.isTypeSupported){return true}return i(e.replace("html5/",""))}if(!("MediaSource"in window)){return false}return i("video/mp4")},player:function(){},scriptsrc:function(e){return e+"/videojs.js"}};var p=mistplayers.videojs.player;p.prototype=new MistPlayer;p.prototype.build=function(e,t){var r=this;var i;function o(){if(e.destroyed){return}e.log("Building VideoJS player..");i=document.createElement("video");if(e.source.type!="html5/video/ogg"){i.crossOrigin="anonymous"}i.setAttribute("playsinline","");var o=e.source.type.split("/");if(o[0]=="html5"){o.shift()}var s=document.createElement("source");s.setAttribute("src",e.source.url);r.source=s;i.appendChild(s);s.type=o.join("/");e.log("Adding "+s.type+" source @ "+e.source.url);MistUtil.class.add(i,"video-js");var a={};if(e.options.autoplay){a.autoplay=true}if(e.options.loop&&e.info.type!="live"){i.setAttribute("loop","")}if(e.options.muted){i.setAttribute("muted","")}if(e.options.poster){a.poster=e.options.poster}if(e.options.controls=="stock"){i.setAttribute("controls","");if(!document.getElementById("videojs-css")){var n=document.createElement("link");n.rel="stylesheet";n.href=e.options.host+"/skins/videojs.css";n.id="videojs-css";document.head.appendChild(n)}}else{a.controls=false}var l=MistUtil.event.addListener(i,"error",function(t){t.stopImmediatePropagation();var r=t.message;if(!r&&i.error){if("code"in i.error&&i.error.code){r="Code "+i.error.code;for(var o in i.error){if(o=="code"){continue}if(i.error[o]==i.error.code){r=o;break}}}else{r=JSON.stringify(i.error)}}e.log("Error captured and stopped because videojs has not yet loaded: "+r)});function d(){var e=navigator.userAgent.toLowerCase().match(/android\s([\d\.]*)/i);return e?e[1]:false}var p=MistUtil.getAndroid();if(p&&parseFloat(p)<7){e.log("Detected android < 7: instructing videojs to override native playback");a.html5={hls:{overrideNative:true}};a.nativeAudioTracks=false;a.nativeVideoTracks=false}r.onready(function(){e.log("Building videojs");r.videojs=videojs(i,a,function(){MistUtil.event.removeListener(l);e.log("Videojs initialized");if(e.info.type=="live"){MistUtil.event.addListener(i,"progress",function(t){var r=e.player.videojs.seekable().length-1;e.info.meta.buffer_window=(Math.max(e.player.videojs.seekable().end(r),i.duration)-e.player.videojs.seekable().start(r))*1e3})}});MistUtil.event.addListener(i,"error",function(t){if(t&&t.target&&t.target.error&&t.target.error.message&&MistUtil.array.indexOf(t.target.error.message,"NS_ERROR_DOM_MEDIA_OVERFLOW_ERR")>=0){e.timers.start(function(){e.log("Reloading player because of NS_ERROR_DOM_MEDIA_OVERFLOW_ERR");e.reload()},1e3)}});r.api.unload=function(){if(r.videojs){r.videojs.autoplay(false);r.videojs.pause();r.videojs.dispose();r.videojs=false;e.log("Videojs instance disposed")}}});e.log("Built html");if("Proxy"in window&&"Reflect"in window){var u={get:{},set:{}};e.player.api=new Proxy(i,{get:function(e,t,r){if(t in u.get){return u.get[t].apply(e,arguments)}var i=e[t];if(typeof i==="function"){return function(){return i.apply(e,arguments)}}return i},set:function(e,t,r){if(t in u.set){return u.set[t].call(e,r)}return e[t]=r}});e.player.api.load=function(){};u.set.currentTime=function(t){e.player.videojs.currentTime(t)};var f=0;var c=Infinity;for(var v in e.info.meta.tracks){f=Math.max(f,e.info.meta.tracks[v].lastms);c=Math.min(c,e.info.meta.tracks[v].firstms)}var y=c*.001;u.get.duration=function(){if(e.info){var t=i.duration;return t+y}return 0};MistUtil.event.addListener(i,"progress",function(){e.player.api.lastProgress=new Date});u.set.currentTime=function(t){var r=e.player.api.currentTime-t;var i=t-e.player.api.duration;e.log("Seeking to "+MistUtil.format.time(t)+" ("+Math.round(i*-10)/10+"s from live)");e.player.videojs.currentTime(e.video.currentTime-r)};u.get.currentTime=function(){var t=e.player.videojs?e.player.videojs.currentTime():i.currentTime;if(isNaN(t)){return 0}return t+y};u.get.buffered=function(){var t=e.player.videojs?e.player.videojs.buffered():i.buffered;return{length:t.length,start:function(e){return t.start(e)+y},end:function(e){return t.end(e)+y}}};if(e.info.type=="live"){e.player.api.lastProgress=new Date;e.player.api.liveOffset=0}}else{r.api=i}e.player.setSize=function(t){if("videojs"in e.player){e.player.videojs.dimensions(t.width,t.height);i.parentNode.style.width=t.width+"px";i.parentNode.style.height=t.height+"px"}this.api.style.width=t.width+"px";this.api.style.height=t.height+"px"};e.player.api.setSource=function(t){if(!e.player.videojs){return}if(e.player.videojs.src()!=t){e.player.videojs.src({type:e.player.videojs.currentSource().type,src:t})}};e.player.api.setSubtitle=function(e){var t=i.getElementsByTagName("track");for(var r=t.length-1;r>=0;r--){i.removeChild(t[r])}if(e){var o=document.createElement("track");i.appendChild(o);o.kind="subtitles";o.label=e.label;o.srclang=e.lang;o.src=e.src;o.setAttribute("default","")}};if(e.info.type=="live"){var m=MistUtil.event.addListener(i,"loadstart",function(e){MistUtil.event.removeListener(m);MistUtil.event.send("canplay",false,this)});var g=MistUtil.event.addListener(i,"canplay",function(e){if(m){MistUtil.event.removeListener(m)}MistUtil.event.removeListener(g)})}t(i)}if("videojs"in window){o()}else{var s=false;function a(){try{e.video.pause()}catch(e){}e.showError("Error in videojs player");if(!window.mistplayer_videojs_failures){window.mistplayer_videojs_failures=1;e.reload()}else{if(!s){var t=.05*Math.pow(2,window.mistplayer_videojs_failures);e.log("Rate limiter activated: MistPlayer reload delayed by "+Math.round(t*10)/10+" seconds.","error");s=e.timers.start(function(){s=false;delete window.videojs;e.reload()},t*1e3);window.mistplayer_videojs_failures++}}}var n=e.urlappend(mistplayers.videojs.scriptsrc(e.options.host));var l;var d=function(e,t,r,i,o){if(!l){return}if(t==l.src){window.removeEventListener("error",d);a()}return false};window.addEventListener("error",d);l=MistUtil.scripts.insert(n,{onerror:function(t){var r="Failed to load videojs.js";if(t.message){r+=": "+t.message}e.showError(r)},onload:o},e)}}; |