diff --git a/.jsbeautifyrc b/.jsbeautifyrc index 064bf950..9c99cf95 100644 --- a/.jsbeautifyrc +++ b/.jsbeautifyrc @@ -6,6 +6,27 @@ "allowed_file_extensions": [] }, "js": { - "allowed_file_extensions": [] + "allowed_file_extensions": ["js", "json", "jshintrc", "jsbeautifyrc"], + "brace_style": "collapse", + "break_chained_methods": false, + "e4x": false, + "end_with_newline": false, + "indent_char": " ", + "indent_level": 0, + "indent_size": 4, + "indent_with_tabs": false, + "jslint_happy": false, + "keep_array_indentation": true, + "keep_function_indentation": true, + "max_preserve_newlines": 2, + "preserve_newlines": true, + "space_after_anon_function": false, + "space_before_conditional": true, + "space_in_empty_paren": false, + "space_in_paren": false, + "unescape_strings": false, + "wrap_line_length": 0, + "wrap_attributes": "auto", + "wrap_attributes_indent_size": 4 } } diff --git a/dist/plyr.js b/dist/plyr.js index 615d62ef..67ae9df0 100644 --- a/dist/plyr.js +++ b/dist/plyr.js @@ -1,2 +1,2 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,document):"function"==typeof define&&define.amd?define([],function(){return t(e,document)}):e.plyr=t(e,document)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(){var e,n,a,r=navigator.userAgent,s=navigator.appName,o=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10),l=!1,u=!1,c=!1,p=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(l=!0,s="IE",o="11"):(n=r.indexOf("MSIE"))!==-1?(l=!0,s="IE",o=r.substring(n+5)):(n=r.indexOf("Chrome"))!==-1?(c=!0,s="Chrome",o=r.substring(n+7)):(n=r.indexOf("Safari"))!==-1?(p=!0,s="Safari",o=r.substring(n+7),(n=r.indexOf("Version"))!==-1&&(o=r.substring(n+8))):(n=r.indexOf("Firefox"))!==-1?(u=!0,s="Firefox",o=r.substring(n+8)):(e=r.lastIndexOf(" ")+1)<(n=r.lastIndexOf("/"))&&(s=r.substring(e,n),o=r.substring(n+1),s.toLowerCase()===s.toUpperCase()&&(s=navigator.appName)),(a=o.indexOf(";"))!==-1&&(o=o.substring(0,a)),(a=o.indexOf(" "))!==-1&&(o=o.substring(0,a)),i=parseInt(""+o,10),isNaN(i)&&(o=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10)),{name:s,version:i,isIE:l,isFirefox:u,isChrome:c,isSafari:p,isIos:/(iPad|iPhone|iPod)/g.test(navigator.platform),isTouch:"ontouchstart"in t.documentElement}}function a(e){if(!t.querySelectorAll('script[src="'+e+'"]').length){var n=t.createElement("script");n.src=e;var a=t.getElementsByTagName("script")[0];a.parentNode.insertBefore(n,a)}}function r(e,t){return Array.prototype.indexOf&&e.indexOf(t)!==-1}function s(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)}function o(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var a=n>0?t.cloneNode(!0):t,r=e[n],s=r.parentNode,o=r.nextSibling;return a.appendChild(r),o?s.insertBefore(a,o):s.appendChild(a),a}}function i(e){e&&e.parentNode.removeChild(e)}function l(e,t){e.insertBefore(t,e.firstChild)}function u(e,t){for(var n in t)e.setAttribute(n,N.boolean(t[n])&&t[n]?"":t[n])}function c(e,n,a){var r=t.createElement(e);u(r,a),l(n,r)}function p(e){return e.replace(".","")}function d(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var a=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=a+(n?" "+t:"")}}function m(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))}function f(e,n){var a=Element.prototype,r=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.msMatchesSelector||function(e){return[].indexOf.call(t.querySelectorAll(e),this)!==-1};return r.call(e,n)}function y(e,t,n,a,r){g(e,t,function(t){n&&n.apply(e,[t]),a.apply(e,[t])},r)}function b(e,t,n,a,r){var s=t.split(" ");if(N.boolean(r)||(r=!1),e instanceof NodeList)for(var o=0;o','',''+E.i18n.play+"",""),e.push('
'),r(E.controls,"restart")&&e.push('"),r(E.controls,"rewind")&&e.push('"),r(E.controls,"play")&&e.push('",'"),r(E.controls,"fast-forward")&&e.push('"),r(E.controls,"progress")&&(e.push('','','','','',"0% "+E.i18n.buffered,""),E.tooltips.seek&&e.push('00:00'),e.push("")),r(E.controls,"current-time")&&e.push('',''+E.i18n.currentTime+"",'00:00',""),r(E.controls,"duration")&&e.push('',''+E.i18n.duration+"",'00:00',""),r(E.controls,"mute")&&e.push('"),r(E.controls,"volume")&&e.push('','",'','',""),r(E.controls,"captions")&&e.push('"),r(E.controls,"settings")&&e.push('
','",'","
"),r(E.controls,"pip")&&q.pip&&e.push('"),r(E.controls,"airplay")&&q.airplay&&e.push('"),r(E.controls,"fullscreen")&&e.push('"),e.push("
"),e.join("")}function R(){if(Je.supported.full&&("audio"!==Je.type||E.fullscreen.allowAudio)&&E.fullscreen.enabled){var e=q.fullscreen;e||E.fullscreen.fallback&&!U()?(Qe((e?"Native":"Fallback")+" fullscreen enabled"),d(Je.container,E.classes.fullscreen.enabled,!0)):Qe("Fullscreen not supported and fallback disabled"),Je.buttons&&Je.buttons.fullscreen&&_(Je.buttons.fullscreen,!1),$()}}function V(e){N.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?H(e.activeCues[0].getCueAsHTML()):H()}function D(){if("video"===Je.type){X(E.selectors.captions)||Je.videoContainer.insertAdjacentHTML("afterbegin",'
'),Je.usingTextTracks=!1,Je.media.textTracks&&(Je.usingTextTracks=!0);var e=[],t="";if(Je.media.childNodes.forEach(function(t){"track"===t.nodeName.toLowerCase()&&("captions"!==t.kind&&"subtitles"!==t.kind||e.push(t.getAttribute("src")))}),Je.captionExists=!0,0===e.length?(Je.captionExists=!1,Qe("No caption track found")):E.captions.selectedIndex+1>e.length?(Je.captionExists=!1,Qe("Caption index out of bound")):(t=e[E.captions.selectedIndex],Qe("Caption track found; URI: "+t)),Je.captionExists){var n=Je.media.textTracks;if([].forEach.call(n,function(e){v(e,"cuechange",V),e.mode="hidden"}),Y(Je),(Je.browser.isIE&&Je.browser.version>=10||Je.browser.isFirefox&&Je.browser.version>=31)&&(Qe("Detected browser with known TextTrack issues - using manual fallback"),Je.usingTextTracks=!1),Je.usingTextTracks){Qe("TextTracks supported");var a=n[E.captions.selectedIndex];"captions"!==a.kind&&"subtitles"!==a.kind||(g(a,"cuechange",V),a.activeCues&&a.activeCues.length>0&&V(a))}else if(Qe("TextTracks not supported so rendering captions manually"),Je.currentCaption="",Je.captions=[],""!==t){var r=new XMLHttpRequest;r.onreadystatechange=function(){if(4===r.readyState)if(200===r.status){var e,t=[],n=r.responseText,a="\r\n";n.indexOf(a+a)===-1&&(a=n.indexOf("\r\r")!==-1?"\r":"\n"),t=n.split(a+a);for(var s=0;s ");for(var a=0;aJe.captions.length-1){Je.subcount=Je.captions.length-1;break}Je.media.currentTime.toFixed(1)>=n(Je.captions[Je.subcount][0])&&Je.media.currentTime.toFixed(1)<=a(Je.captions[Je.subcount][0])?(Je.currentCaption=Je.captions[Je.subcount][1],H(Je.currentCaption)):H()}}function Y(){if(Je.buttons.captions){d(Je.container,E.classes.captions.enabled,!0);var e=Je.storage.captionsEnabled;N.boolean(e)||(e=E.captions.defaultActive),e&&(d(Je.container,E.classes.captions.active,!0),_(Je.buttons.captions,!0))}}function B(e){return Je.container.querySelectorAll(e)}function X(e){return B(e)[0]}function U(){try{return e.self!==e.top}catch(e){return!0}}function $(){function e(e){9===e.which&&Je.isFullscreen&&(e.target!==a||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),a.focus()):(e.preventDefault(),n.focus()))}var t=B("input:not([disabled]), button:not([disabled])"),n=t[0],a=t[t.length-1];g(Je.container,"keydown",e)}function J(e,t){if(N.string(t))c(e,Je.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)c(e,Je.media,t[n])}function K(){if(E.loadSprite){var e=L();e.absolute?(Qe("AJAX loading absolute SVG sprite"+(Je.browser.isIE?" (due to IE)":"")),S(e.url,"sprite-plyr")):Qe("Sprite will be used as external resource directly")}var n=E.html;Qe("Injecting custom controls"),n||(n=j()),n=s(n,"{seektime}",E.seekTime),n=s(n,"{speed}",E.currentSpeed.toFixed(1).toString().replace(".0","")+"×"),n=s(n,"{lang}","English"),n=s(n,"{id}",Math.floor(1e4*Math.random()));var a;if(N.string(E.selectors.controls.container)&&(a=t.querySelector(E.selectors.controls.container)),N.htmlElement(a)||(a=Je.container),a.insertAdjacentHTML("beforeend",n),E.tooltips.controls)for(var r=B([E.selectors.controls.wrapper," ",E.selectors.labels," .",E.classes.hidden].join("")),o=r.length-1;o>=0;o--){var i=r[o];d(i,E.classes.hidden,!1),d(i,E.classes.tooltip,!0)}}function z(){try{return Je.controls=X(E.selectors.controls.wrapper),Je.buttons={seek:X(E.selectors.buttons.seek),play:B(E.selectors.buttons.play),pause:X(E.selectors.buttons.pause),restart:X(E.selectors.buttons.restart),rewind:X(E.selectors.buttons.rewind),forward:X(E.selectors.buttons.forward),fullscreen:X(E.selectors.buttons.fullscreen),settings:X(E.selectors.buttons.settings),pip:X(E.selectors.buttons.pip)},Je.buttons.mute=X(E.selectors.buttons.mute),Je.buttons.captions=X(E.selectors.buttons.captions),Je.progress={container:X(E.selectors.progress.container)},Je.progress.buffer=function(){var e=X(E.selectors.progress.buffer);return{bar:e,text:N.htmlElement(e)&&e.getElementsByTagName("span")[0]}}(),Je.progress.played=X(E.selectors.progress.played),Je.progress.tooltip=Je.progress.container&&Je.progress.container.querySelector("."+E.classes.tooltip),Je.volume={input:X(E.selectors.volume.input),display:X(E.selectors.volume.display)},Je.duration=X(E.selectors.duration),Je.currentTime=X(E.selectors.currentTime),Je.seekTime=B(E.selectors.seekTime),!0}catch(e){return Ge("It looks like there is a problem with your controls HTML",e),G(!0),!1}}function Q(){d(Je.container,E.selectors.container.replace(".",""),Je.supported.full)}function G(e){e&&r(E.types.html5,Je.type)?Je.media.setAttribute("controls",""):Je.media.removeAttribute("controls")}function Z(e){var t=E.i18n.play;if(N.string(E.title)&&E.title.length&&(t+=", "+E.title,Je.container.setAttribute("aria-label",E.title)),Je.supported.full&&Je.buttons.play)for(var n=Je.buttons.play.length-1;n>=0;n--)Je.buttons.play[n].setAttribute("aria-label",t);N.htmlElement(e)&&e.setAttribute("title",E.i18n.frameTitle.replace("{title}",E.title))}function ee(){var t=null;Je.storage={},q.storage&&E.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(E.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?te({volume:parseFloat(t)}):Je.storage=JSON.parse(t)))}function te(t){q.storage&&E.storage.enabled&&(x(Je.storage,t),e.localStorage.setItem(E.storage.key,JSON.stringify(Je.storage)))}function ne(){if(!Je.media)return void Ge("No media element found!");if(Je.supported.full&&(d(Je.container,E.classes.type.replace("{0}",Je.type),!0),r(E.types.embed,Je.type)&&d(Je.container,E.classes.type.replace("{0}","video"),!0),d(Je.container,E.classes.pip.enabled,q.pip),d(Je.container,E.classes.stopped,E.autoplay),d(Je.ontainer,E.classes.isIos,Je.browser.isIos),d(Je.container,E.classes.isTouch,Je.browser.isTouch),"video"===Je.type)){var e=t.createElement("div");e.setAttribute("class",E.classes.videoWrapper),o(Je.media,e),Je.videoContainer=e}r(E.types.embed,Je.type)&&ae()}function ae(){var n,r=t.createElement("div"),s=Je.type+"-"+Math.floor(1e4*Math.random());switch(Je.type){case"youtube":n=w(Je.embedId);break;case"vimeo":n=T(Je.embedId);break;default:n=Je.embedId}for(var o=B('[id^="'+Je.type+'-"]'),l=o.length-1;l>=0;l--)i(o[l]);if(d(Je.media,E.classes.videoWrapper,!0),d(Je.media,E.classes.embedWrapper,!0),"youtube"===Je.type)Je.media.appendChild(r),r.setAttribute("id",s),N.object(e.YT)?se(n,r):(a(E.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){se(n,r)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===Je.type)if(Je.supported.full?Je.media.appendChild(r):r=Je.media,r.setAttribute("id",s),N.object(e.Vimeo))oe(n,r);else{a(E.urls.vimeo.api);var c=e.setInterval(function(){N.object(e.Vimeo)&&(e.clearInterval(c),oe(n,r))},50)}else if("soundcloud"===Je.type){var p=t.createElement("iframe");p.loaded=!1,g(p,"load",function(){p.loaded=!0}),u(p,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+n,id:s}),r.appendChild(p),Je.media.appendChild(r),e.SC||a(E.urls.soundcloud.api);var m=e.setInterval(function(){e.SC&&p.loaded&&(e.clearInterval(m),ie.call(p))},50)}}function re(){Je.supported.full&&(Xe(),Ue()),Z(X("iframe"))}function se(t,n){Je.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:E.autoplay?1:0,controls:Je.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:E.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){A(Je.container,"error",!0,{code:e.data,embed:e.target})},onPlaybackQualityChange:function(e){var t=e.target,n=t.getPlaybackQuality();console.warn(n)},onReady:function(t){var n=t.target;Je.media.play=function(){n.playVideo(),Je.media.paused=!1},Je.media.pause=function(){n.pauseVideo(),Je.media.paused=!0},Je.media.stop=function(){n.stopVideo(),Je.media.paused=!0},Je.media.duration=n.getDuration(),Je.media.paused=!0,Je.media.currentTime=0,Je.media.muted=n.isMuted();var a=n.getPlaybackRate(),r=n.getAvailablePlaybackRates();console.warn(a,r),E.title=n.getVideoData().title,Je.supported.full&&Je.media.querySelector("iframe").setAttribute("tabindex","-1"),re(),A(Je.media,"timeupdate"),A(Je.media,"durationchange"),e.clearInterval(Ke.buffering),Ke.buffering=e.setInterval(function(){Je.media.buffered=n.getVideoLoadedFraction(),(null===Je.media.lastBuffered||Je.media.lastBuffered=E.speeds.length&&(n=0),e=E.speeds[n]}else e=E.defaultSpeed}E.currentSpeed=e,Je.media.playbackRate=e,te({speed:e})}function fe(e){var t=0,n=Je.media.paused,a=ye();N.number(e)?t=e:N.event(e)&&r(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),Ne(t);try{Je.media.currentTime=t.toFixed(4)}catch(e){}if(r(E.types.embed,Je.type)){switch(Je.type){case"youtube":Je.embed.seekTo(t);break;case"vimeo":Je.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":Je.embed.seekTo(1e3*t)}n&&ue(),A(Je.media,"timeupdate"),Je.media.seeking=!0,A(Je.media,"seeking")}Qe("Seeking to "+Je.media.currentTime+" seconds"),W(t)}function ye(){var e=parseInt(E.duration),t=0;return null===Je.media.duration||isNaN(Je.media.duration)||(t=Je.media.duration),isNaN(e)?t:e}function be(){d(Je.container,E.classes.playing,!Je.media.paused),d(Je.container,E.classes.stopped,Je.media.paused),Le(Je.media.paused)}function ge(){P={x:e.pageXOffset||0,y:e.pageYOffset||0}}function ve(){e.scrollTo(P.x,P.y)}function he(e){var n=q.fullscreen;if(n){if(!e||e.type!==I.eventType)return I.isFullScreen(Je.container)?I.cancelFullScreen():(ge(),I.requestFullScreen(Je.container)),void(Je.isFullscreen=I.isFullScreen(Je.container));Je.isFullscreen=I.isFullScreen(Je.container)}else Je.isFullscreen=!Je.isFullscreen,t.body.style.overflow=Je.isFullscreen?"hidden":"";d(Je.container,E.classes.fullscreen.active,Je.isFullscreen),$(Je.isFullscreen),Je.buttons&&Je.buttons.fullscreen&&_(Je.buttons.fullscreen,Je.isFullscreen),A(Je.container,Je.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!Je.isFullscreen&&n&&ve()}function _e(e){if(N.boolean(e)||(e=!Je.media.muted),_(Je.buttons.mute,e),Je.media.muted=e,0===Je.media.volume&&ke(E.volume),r(E.types.embed,Je.type)){switch(Je.type){case"youtube":Je.embed[Je.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":Je.embed.setVolume(Je.media.muted?0:parseFloat(E.volume/E.volumeMax))}A(Je.media,"volumechange")}}function ke(e){var t=E.volumeMax,n=E.volumeMin;if(N.undefined(e)&&(e=Je.storage.volume),(null===e||isNaN(e))&&(e=E.volume),e>t&&(e=t),e0&&_e()}function xe(e){var t=Je.media.muted?0:Je.media.volume*E.volumeMax;N.number(e)||(e=E.volumeStep),ke(t+e)}function we(e){var t=Je.media.muted?0:Je.media.volume*E.volumeMax;N.number(e)||(e=E.volumeStep),ke(t-e)}function Te(){var e=Je.media.muted?0:Je.media.volume*E.volumeMax;Je.supported.full&&(Je.volume.input&&(Je.volume.input.value=e),Je.volume.display&&(Je.volume.display.value=e)),te({volume:e}),d(Je.container,E.classes.muted,0===e),Je.supported.full&&Je.buttons.mute&&_(Je.buttons.mute,0===e)}function Ee(e){Je.supported.full&&Je.buttons.captions&&(N.boolean(e)||(e=Je.container.className.indexOf(E.classes.captions.active)===-1),Je.captionsEnabled=e,_(Je.buttons.captions,Je.captionsEnabled),d(Je.container,E.classes.captions.active,Je.captionsEnabled),A(Je.container,Je.captionsEnabled?"captionsenabled":"captionsdisabled",!0),te({captionsEnabled:Je.captionsEnabled}))}function Se(e){E.captions.selectedIndex=e,H(),D()}function Ce(e){var t="waiting"===e.type;clearTimeout(Ke.loading),Ke.loading=setTimeout(function(){d(Je.container,E.classes.loading,t),Le(t)},t?250:0)}function Ae(e){if(Je.supported.full){var t=Je.progress.played,n=0,a=ye();if(e)switch(e.type){case"timeupdate":case"seeking":if(Je.controls.pressed)return;n=k(Je.media.currentTime,a),"timeupdate"===e.type&&Je.buttons.seek&&(Je.buttons.seek.value=n);break;case"playing":case"progress":t=Je.progress.buffer,n=function(){var e=Je.media.buffered;return e&&e.length?k(e.end(0),a):N.number(e)?100*e:0}()}Fe(t,n)}}function Fe(e,t){if(Je.supported.full){if(N.undefined(t)&&(t=0),N.undefined(e)){if(!Je.progress||!Je.progress.buffer)return;e=Je.progress.buffer}N.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function Ie(e,t){if(t){isNaN(e)&&(e=0),Je.secs=parseInt(e%60),Je.mins=parseInt(e/60%60),Je.hours=parseInt(e/60/60%60);var n=parseInt(ye()/60/60%60)>0;Je.secs=("0"+Je.secs).slice(-2),Je.mins=("0"+Je.mins).slice(-2),t.innerHTML=(n?Je.hours+":":"")+Je.mins+":"+Je.secs}}function Pe(){if(Je.supported.full){var e=ye()||0;!Je.duration&&E.displayDuration&&Je.media.paused&&Ie(e,Je.currentTime),Je.duration&&Ie(e,Je.duration),qe()}}function Me(e){Ie(Je.media.currentTime,Je.currentTime),e&&"timeupdate"===e.type&&Je.media.seeking||Ae(e)}function Ne(e){N.number(e)||(e=0);var t=ye(),n=k(e,t);Je.progress&&Je.progress.played&&(Je.progress.played.value=n),Je.buttons&&Je.buttons.seek&&(Je.buttons.seek.value=n)}function qe(e){var t=ye();if(E.tooltips.seek&&Je.progress.container&&0!==t){var n=Je.progress.container.getBoundingClientRect(),a=0,s=E.classes.tooltip+"--visible";if(e)a=100/n.width*(e.pageX-n.left);else{if(!m(Je.progress.tooltip,s))return;a=Je.progress.tooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100),Ie(t/100*a,Je.progress.tooltip),Je.progress.tooltip.style.left=a+"%",e&&r(["mouseenter","mouseleave"],e.type)&&d(Je.progress.tooltip,s,"mouseenter"===e.type)}}function Oe(e){N.undefined(e)&&(e=Je.storage.speed||E.defaultSpeed),me(e)}function Le(t){if(E.hideControls&&"audio"!==Je.type){var n=0,a=!1,s=t,o=m(Je.container,E.classes.loading);if(N.boolean(t)||(t&&t.type?(a="enterfullscreen"===t.type,s=r(["mousemove","touchstart","mouseenter","focus"],t.type),r(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):s=m(Je.container,E.classes.hideControls)), -e.clearTimeout(Ke.hover),s||Je.media.paused||o){if(d(Je.container,E.classes.hideControls,!1),Je.media.paused||o)return;Je.browser.isTouch&&(n=3e3)}s&&Je.media.paused||(Ke.hover=e.setTimeout(function(){(!Je.controls.pressed&&!Je.controls.hover||a)&&d(Je.container,E.classes.hideControls,!0)},n))}}function je(e){if(!N.undefined(e))return void Re(e);var t;switch(Je.type){case"youtube":t=Je.embed.getVideoUrl();break;case"vimeo":Je.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":Je.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=Je.media.currentSrc}return t||""}function Re(e){function n(){if(Je.embed=null,i(Je.media),"video"===Je.type&&Je.videoContainer&&i(Je.videoContainer),Je.container&&Je.container.removeAttribute("class"),"type"in e&&(Je.type=e.type,"video"===Je.type)){var n=e.sources[0];"type"in n&&r(E.types.embed,n.type)&&(Je.type=n.type)}switch(Je.supported=C(Je.type),Je.type){case"video":Je.media=t.createElement("video");break;case"audio":Je.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":Je.media=t.createElement("div"),Je.embedId=e.sources[0].src}l(Je.container,Je.media),N.boolean(e.autoplay)&&(E.autoplay=e.autoplay),r(E.types.html5,Je.type)&&(E.crossorigin&&Je.media.setAttribute("crossorigin",""),E.autoplay&&Je.media.setAttribute("autoplay",""),"poster"in e&&Je.media.setAttribute("poster",e.poster),E.loop&&Je.media.setAttribute("loop","")),d(Je.container,E.classes.fullscreen.active,Je.isFullscreen),d(Je.container,E.classes.captions.active,Je.captionsEnabled),Q(),r(E.types.html5,Je.type)&&J("source",e.sources),ne(),r(E.types.html5,Je.type)&&("tracks"in e&&J("track",e.tracks),Je.media.load()),(r(E.types.html5,Je.type)||r(E.types.embed,Je.type)&&!Je.supported.full)&&(Xe(),Ue()),E.title=e.title,Z()}return N.object(e)&&"sources"in e&&e.sources.length?(d(Je.container,E.classes.ready,!1),ue(),Ne(),Fe(),We(),void Ye(n,!1)):void Ge("Invalid source format")}function Ve(e){"video"===Je.type&&Je.media.setAttribute("poster",e)}function De(){function n(){var e=ce(),t=Je.buttons[e?"play":"pause"],n=Je.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var a=m(t,E.classes.tabFocus);setTimeout(function(){n.focus(),a&&(d(t,E.classes.tabFocus,!1),d(n,E.classes.tabFocus,!0))},100)}}function a(){var e=t.activeElement;return e=e&&e!==t.body?t.querySelector(":focus"):null}function s(e){return e.keyCode?e.keyCode:e.which}function o(e){for(var t in Je.buttons){var n=Je.buttons[t];if(N.nodeList(n))for(var a=0;a0)&&(t?we(n):xe(n)),(e.deltaY>0||e.deltaX<0)&&(t?xe(n):we(n))})}function He(){if(g(Je.media,"timeupdate seeking",Me),g(Je.media,"timeupdate",W),g(Je.media,"durationchange loadedmetadata",Pe),g(Je.media,"ended",function(){"video"===Je.type&&E.showPosterOnEnd&&("video"===Je.type&&H(),fe(),Je.media.load())}),g(Je.media,"progress playing",Ae),g(Je.media,"volumechange",Te),g(Je.media,"play pause ended",be),g(Je.media,"waiting canplay seeked",Ce),E.clickToPlay&&"audio"!==Je.type){var e=X("."+E.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",g(e,"click",function(){E.hideControls&&Je.browser.isTouch&&!Je.media.paused||(Je.media.paused?le():Je.media.ended?(fe(),le()):ue())})}E.disableContextMenu&&g(Je.media,"contextmenu",function(e){e.preventDefault()}),g(Je.media,E.events.concat(["keyup","keydown"]).join(" "),function(e){A(Je.container,e.type,!0)})}function We(){if(r(E.types.html5,Je.type)){for(var e=Je.media.querySelectorAll("source"),t=0;t=0;n--){var a=n>0?t.cloneNode(!0):t,r=e[n],s=r.parentNode,o=r.nextSibling;return a.appendChild(r),o?s.insertBefore(a,o):s.appendChild(a),a}}function i(e){e&&e.parentNode.removeChild(e)}function l(e,t){e.insertBefore(t,e.firstChild)}function u(e,t){for(var n in t)e.setAttribute(n,N.boolean(t[n])&&t[n]?"":t[n])}function c(e,n,a){var r=t.createElement(e);u(r,a),l(n,r)}function p(e){return e.replace(".","")}function d(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var a=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=a+(n?" "+t:"")}}function m(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))}function f(e,n){var a=Element.prototype,r=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.msMatchesSelector||function(e){return[].indexOf.call(t.querySelectorAll(e),this)!==-1};return r.call(e,n)}function y(e,t,n,a,r){g(e,t,function(t){n&&n.apply(e,[t]),a.apply(e,[t])},r)}function b(e,t,n,a,r){var s=t.split(" ");if(N.boolean(r)||(r=!1),e instanceof NodeList)for(var o=0;o','',''+E.i18n.play+"",""),e.push('
'),r(E.controls,"restart")&&e.push('"),r(E.controls,"rewind")&&e.push('"),r(E.controls,"play")&&e.push('",'"),r(E.controls,"fast-forward")&&e.push('"),r(E.controls,"progress")&&(e.push('','','','','',"0% "+E.i18n.buffered,""),E.tooltips.seek&&e.push('00:00'),e.push("")),r(E.controls,"current-time")&&e.push('',''+E.i18n.currentTime+"",'00:00',""),r(E.controls,"duration")&&e.push('',''+E.i18n.duration+"",'00:00',""),r(E.controls,"mute")&&e.push('"),r(E.controls,"volume")&&e.push('','",'','',""),r(E.controls,"captions")&&e.push('"),r(E.controls,"settings")&&e.push('
','",'","
"),r(E.controls,"pip")&&q.pip&&e.push('"),r(E.controls,"airplay")&&q.airplay&&e.push('"),r(E.controls,"fullscreen")&&e.push('"),e.push("
"),e.join("")}function R(){if(Je.supported.full&&("audio"!==Je.type||E.fullscreen.allowAudio)&&E.fullscreen.enabled){var e=q.fullscreen;e||E.fullscreen.fallback&&!U()?(Qe((e?"Native":"Fallback")+" fullscreen enabled"),d(Je.container,E.classes.fullscreen.enabled,!0)):Qe("Fullscreen not supported and fallback disabled"),Je.buttons&&Je.buttons.fullscreen&&_(Je.buttons.fullscreen,!1),$()}}function V(e){N.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?H(e.activeCues[0].getCueAsHTML()):H()}function D(){if("video"===Je.type){X(E.selectors.captions)||Je.videoContainer.insertAdjacentHTML("afterbegin",'
'),Je.usingTextTracks=!1,Je.media.textTracks&&(Je.usingTextTracks=!0);var e=[],t="";if(Je.media.childNodes.forEach(function(t){"track"===t.nodeName.toLowerCase()&&("captions"!==t.kind&&"subtitles"!==t.kind||e.push(t.getAttribute("src")))}),Je.captionExists=!0,0===e.length?(Je.captionExists=!1,Qe("No caption track found")):E.captions.selectedIndex+1>e.length?(Je.captionExists=!1,Qe("Caption index out of bound")):(t=e[E.captions.selectedIndex],Qe("Caption track found; URI: "+t)),Je.captionExists){var n=Je.media.textTracks;if([].forEach.call(n,function(e){v(e,"cuechange",V),e.mode="hidden"}),Y(Je),(Je.browser.isIE&&Je.browser.version>=10||Je.browser.isFirefox&&Je.browser.version>=31)&&(Qe("Detected browser with known TextTrack issues - using manual fallback"),Je.usingTextTracks=!1),Je.usingTextTracks){Qe("TextTracks supported");var a=n[E.captions.selectedIndex];"captions"!==a.kind&&"subtitles"!==a.kind||(g(a,"cuechange",V),a.activeCues&&a.activeCues.length>0&&V(a))}else if(Qe("TextTracks not supported so rendering captions manually"),Je.currentCaption="",Je.captions=[],""!==t){var r=new XMLHttpRequest;r.onreadystatechange=function(){if(4===r.readyState)if(200===r.status){var e,t=[],n=r.responseText,a="\r\n";n.indexOf(a+a)===-1&&(a=n.indexOf("\r\r")!==-1?"\r":"\n"),t=n.split(a+a);for(var s=0,o=0;o ");for(var a=0;aJe.captions.length-1){Je.subcount=Je.captions.length-1;break}Je.media.currentTime.toFixed(1)>=n(Je.captions[Je.subcount][0])&&Je.media.currentTime.toFixed(1)<=a(Je.captions[Je.subcount][0])?(Je.currentCaption=Je.captions[Je.subcount][1],H(Je.currentCaption)):H()}}function Y(){if(Je.buttons.captions){d(Je.container,E.classes.captions.enabled,!0);var e=Je.storage.captionsEnabled;N.boolean(e)||(e=E.captions.defaultActive),e&&(d(Je.container,E.classes.captions.active,!0),_(Je.buttons.captions,!0))}}function B(e){return Je.container.querySelectorAll(e)}function X(e){return B(e)[0]}function U(){try{return e.self!==e.top}catch(e){return!0}}function $(){function e(e){9===e.which&&Je.isFullscreen&&(e.target!==a||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),a.focus()):(e.preventDefault(),n.focus()))}var t=B("input:not([disabled]), button:not([disabled])"),n=t[0],a=t[t.length-1];g(Je.container,"keydown",e)}function J(e,t){if(N.string(t))c(e,Je.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)c(e,Je.media,t[n])}function K(){if(E.loadSprite){var e=L();e.absolute?(Qe("AJAX loading absolute SVG sprite"+(Je.browser.isIE?" (due to IE)":"")),S(e.url,"sprite-plyr")):Qe("Sprite will be used as external resource directly")}var n=E.html;Qe("Injecting custom controls"),n||(n=j()),n=s(n,"{seektime}",E.seekTime),n=s(n,"{speed}",E.currentSpeed.toFixed(1).toString().replace(".0","")+"×"),n=s(n,"{lang}","English"),n=s(n,"{id}",Math.floor(1e4*Math.random()));var a;if(N.string(E.selectors.controls.container)&&(a=t.querySelector(E.selectors.controls.container)),N.htmlElement(a)||(a=Je.container),a.insertAdjacentHTML("beforeend",n),E.tooltips.controls)for(var r=B([E.selectors.controls.wrapper," ",E.selectors.labels," .",E.classes.hidden].join("")),o=r.length-1;o>=0;o--){var i=r[o];d(i,E.classes.hidden,!1),d(i,E.classes.tooltip,!0)}}function z(){try{return Je.controls=X(E.selectors.controls.wrapper),Je.buttons={seek:X(E.selectors.buttons.seek),play:B(E.selectors.buttons.play),pause:X(E.selectors.buttons.pause),restart:X(E.selectors.buttons.restart),rewind:X(E.selectors.buttons.rewind),forward:X(E.selectors.buttons.forward),fullscreen:X(E.selectors.buttons.fullscreen),settings:X(E.selectors.buttons.settings),pip:X(E.selectors.buttons.pip)},Je.buttons.mute=X(E.selectors.buttons.mute),Je.buttons.captions=X(E.selectors.buttons.captions),Je.progress={container:X(E.selectors.progress.container)},Je.progress.buffer=function(){var e=X(E.selectors.progress.buffer);return{bar:e,text:N.htmlElement(e)&&e.getElementsByTagName("span")[0]}}(),Je.progress.played=X(E.selectors.progress.played),Je.progress.tooltip=Je.progress.container&&Je.progress.container.querySelector("."+E.classes.tooltip),Je.volume={input:X(E.selectors.volume.input),display:X(E.selectors.volume.display)},Je.duration=X(E.selectors.duration),Je.currentTime=X(E.selectors.currentTime),Je.seekTime=B(E.selectors.seekTime),!0}catch(e){return Ge("It looks like there is a problem with your controls HTML",e),G(!0),!1}}function Q(){d(Je.container,E.selectors.container.replace(".",""),Je.supported.full)}function G(e){e&&r(E.types.html5,Je.type)?Je.media.setAttribute("controls",""):Je.media.removeAttribute("controls")}function Z(e){var t=E.i18n.play;if(N.string(E.title)&&E.title.length&&(t+=", "+E.title,Je.container.setAttribute("aria-label",E.title)),Je.supported.full&&Je.buttons.play)for(var n=Je.buttons.play.length-1;n>=0;n--)Je.buttons.play[n].setAttribute("aria-label",t);N.htmlElement(e)&&e.setAttribute("title",E.i18n.frameTitle.replace("{title}",E.title))}function ee(){var t=null;Je.storage={},q.storage&&E.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(E.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?te({volume:parseFloat(t)}):Je.storage=JSON.parse(t)))}function te(t){q.storage&&E.storage.enabled&&(x(Je.storage,t),e.localStorage.setItem(E.storage.key,JSON.stringify(Je.storage)))}function ne(){if(!Je.media)return void Ge("No media element found!");if(Je.supported.full&&(d(Je.container,E.classes.type.replace("{0}",Je.type),!0),r(E.types.embed,Je.type)&&d(Je.container,E.classes.type.replace("{0}","video"),!0),d(Je.container,E.classes.pip.enabled,q.pip),d(Je.container,E.classes.stopped,E.autoplay),d(Je.container,E.classes.isIos,Je.browser.isIos),d(Je.container,E.classes.isTouch,Je.browser.isTouch),"video"===Je.type)){var e=t.createElement("div");e.setAttribute("class",E.classes.videoWrapper),o(Je.media,e),Je.videoContainer=e}r(E.types.embed,Je.type)&&ae()}function ae(){var n,r=t.createElement("div"),s=Je.type+"-"+Math.floor(1e4*Math.random());switch(Je.type){case"youtube":n=w(Je.embedId);break;case"vimeo":n=T(Je.embedId);break;default:n=Je.embedId}for(var o=B('[id^="'+Je.type+'-"]'),l=o.length-1;l>=0;l--)i(o[l]);if(d(Je.media,E.classes.videoWrapper,!0),d(Je.media,E.classes.embedWrapper,!0),"youtube"===Je.type)Je.media.appendChild(r),r.setAttribute("id",s),N.object(e.YT)?se(n,r):(a(E.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){se(n,r)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===Je.type)if(Je.supported.full?Je.media.appendChild(r):r=Je.media,r.setAttribute("id",s),N.object(e.Vimeo))oe(n,r);else{a(E.urls.vimeo.api);var c=e.setInterval(function(){N.object(e.Vimeo)&&(e.clearInterval(c),oe(n,r))},50)}else if("soundcloud"===Je.type){var p=t.createElement("iframe");p.loaded=!1,g(p,"load",function(){p.loaded=!0}),u(p,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+n,id:s}),r.appendChild(p),Je.media.appendChild(r),e.SC||a(E.urls.soundcloud.api);var m=e.setInterval(function(){e.SC&&p.loaded&&(e.clearInterval(m),ie.call(p))},50)}}function re(){Je.supported.full&&(Xe(),Ue()),Z(X("iframe"))}function se(t,n){Je.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:E.autoplay?1:0,controls:Je.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:E.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){A(Je.container,"error",!0,{code:e.data,embed:e.target})},onPlaybackQualityChange:function(e){var t=e.target,n=t.getPlaybackQuality();console.warn(n)},onReady:function(t){var n=t.target;Je.media.play=function(){n.playVideo(),Je.media.paused=!1},Je.media.pause=function(){n.pauseVideo(),Je.media.paused=!0},Je.media.stop=function(){n.stopVideo(),Je.media.paused=!0},Je.media.duration=n.getDuration(),Je.media.paused=!0,Je.media.currentTime=0,Je.media.muted=n.isMuted();var a=n.getPlaybackRate(),r=n.getAvailablePlaybackRates();console.warn(a,r),E.title=n.getVideoData().title,Je.supported.full&&Je.media.querySelector("iframe").setAttribute("tabindex","-1"),re(),A(Je.media,"timeupdate"),A(Je.media,"durationchange"),e.clearInterval(Ke.buffering),Ke.buffering=e.setInterval(function(){Je.media.buffered=n.getVideoLoadedFraction(),(null===Je.media.lastBuffered||Je.media.lastBuffered=E.speeds.length&&(n=0),e=E.speeds[n]}else e=E.defaultSpeed}E.currentSpeed=e,Je.media.playbackRate=e,te({speed:e})}function fe(e){var t=0,n=Je.media.paused,a=ye();N.number(e)?t=e:N.event(e)&&r(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),Ne(t);try{Je.media.currentTime=t.toFixed(4)}catch(e){}if(r(E.types.embed,Je.type)){switch(Je.type){case"youtube":Je.embed.seekTo(t);break;case"vimeo":Je.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":Je.embed.seekTo(1e3*t)}n&&ue(),A(Je.media,"timeupdate"),Je.media.seeking=!0,A(Je.media,"seeking")}Qe("Seeking to "+Je.media.currentTime+" seconds"),W(t)}function ye(){var e=parseInt(E.duration),t=0;return null===Je.media.duration||isNaN(Je.media.duration)||(t=Je.media.duration),isNaN(e)?t:e}function be(){d(Je.container,E.classes.playing,!Je.media.paused),d(Je.container,E.classes.stopped,Je.media.paused),Le(Je.media.paused)}function ge(){P={x:e.pageXOffset||0,y:e.pageYOffset||0}}function ve(){e.scrollTo(P.x,P.y)}function he(e){var n=q.fullscreen;if(n){if(!e||e.type!==I.eventType)return I.isFullScreen(Je.container)?I.cancelFullScreen():(ge(),I.requestFullScreen(Je.container)),void(Je.isFullscreen=I.isFullScreen(Je.container));Je.isFullscreen=I.isFullScreen(Je.container)}else Je.isFullscreen=!Je.isFullscreen,t.body.style.overflow=Je.isFullscreen?"hidden":"";d(Je.container,E.classes.fullscreen.active,Je.isFullscreen),$(Je.isFullscreen),Je.buttons&&Je.buttons.fullscreen&&_(Je.buttons.fullscreen,Je.isFullscreen),A(Je.container,Je.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!Je.isFullscreen&&n&&ve()}function _e(e){if(N.boolean(e)||(e=!Je.media.muted),_(Je.buttons.mute,e),Je.media.muted=e,0===Je.media.volume&&ke(E.volume),r(E.types.embed,Je.type)){switch(Je.type){case"youtube":Je.embed[Je.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":Je.embed.setVolume(Je.media.muted?0:parseFloat(E.volume/E.volumeMax))}A(Je.media,"volumechange")}}function ke(e){var t=E.volumeMax,n=E.volumeMin;if(N.undefined(e)&&(e=Je.storage.volume),(null===e||isNaN(e))&&(e=E.volume),e>t&&(e=t),e0&&_e()}function xe(e){var t=Je.media.muted?0:Je.media.volume*E.volumeMax;N.number(e)||(e=E.volumeStep),ke(t+e)}function we(e){var t=Je.media.muted?0:Je.media.volume*E.volumeMax;N.number(e)||(e=E.volumeStep),ke(t-e)}function Te(){var e=Je.media.muted?0:Je.media.volume*E.volumeMax;Je.supported.full&&(Je.volume.input&&(Je.volume.input.value=e),Je.volume.display&&(Je.volume.display.value=e)),te({volume:e}),d(Je.container,E.classes.muted,0===e),Je.supported.full&&Je.buttons.mute&&_(Je.buttons.mute,0===e)}function Ee(e){Je.supported.full&&Je.buttons.captions&&(N.boolean(e)||(e=Je.container.className.indexOf(E.classes.captions.active)===-1),Je.captionsEnabled=e,_(Je.buttons.captions,Je.captionsEnabled),d(Je.container,E.classes.captions.active,Je.captionsEnabled),A(Je.container,Je.captionsEnabled?"captionsenabled":"captionsdisabled",!0),te({captionsEnabled:Je.captionsEnabled}))}function Se(e){E.captions.selectedIndex=e,H(),D()}function Ce(e){var t="waiting"===e.type;clearTimeout(Ke.loading),Ke.loading=setTimeout(function(){d(Je.container,E.classes.loading,t),Le(t)},t?250:0)}function Ae(e){if(Je.supported.full){var t=Je.progress.played,n=0,a=ye();if(e)switch(e.type){case"timeupdate":case"seeking":if(Je.controls.pressed)return;n=k(Je.media.currentTime,a),"timeupdate"===e.type&&Je.buttons.seek&&(Je.buttons.seek.value=n);break;case"playing":case"progress":t=Je.progress.buffer,n=function(){var e=Je.media.buffered;return e&&e.length?k(e.end(0),a):N.number(e)?100*e:0}()}Fe(t,n)}}function Fe(e,t){if(Je.supported.full){if(N.undefined(t)&&(t=0),N.undefined(e)){if(!Je.progress||!Je.progress.buffer)return;e=Je.progress.buffer}N.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function Ie(e,t){if(t){isNaN(e)&&(e=0),Je.secs=parseInt(e%60),Je.mins=parseInt(e/60%60),Je.hours=parseInt(e/60/60%60);var n=parseInt(ye()/60/60%60)>0;Je.secs=("0"+Je.secs).slice(-2),Je.mins=("0"+Je.mins).slice(-2),t.innerHTML=(n?Je.hours+":":"")+Je.mins+":"+Je.secs}}function Pe(){if(Je.supported.full){var e=ye()||0;!Je.duration&&E.displayDuration&&Je.media.paused&&Ie(e,Je.currentTime),Je.duration&&Ie(e,Je.duration),qe()}}function Me(e){Ie(Je.media.currentTime,Je.currentTime),e&&"timeupdate"===e.type&&Je.media.seeking||Ae(e)}function Ne(e){N.number(e)||(e=0);var t=ye(),n=k(e,t);Je.progress&&Je.progress.played&&(Je.progress.played.value=n),Je.buttons&&Je.buttons.seek&&(Je.buttons.seek.value=n)}function qe(e){var t=ye();if(E.tooltips.seek&&Je.progress.container&&0!==t){var n=Je.progress.container.getBoundingClientRect(),a=0,s=E.classes.tooltip+"--visible";if(e)a=100/n.width*(e.pageX-n.left);else{if(!m(Je.progress.tooltip,s))return;a=Je.progress.tooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100),Ie(t/100*a,Je.progress.tooltip),Je.progress.tooltip.style.left=a+"%",e&&r(["mouseenter","mouseleave"],e.type)&&d(Je.progress.tooltip,s,"mouseenter"===e.type)}}function Oe(e){N.undefined(e)&&(e=Je.storage.speed||E.defaultSpeed),me(e)}function Le(t){if(E.hideControls&&"audio"!==Je.type){var n=0,a=!1,s=t,o=m(Je.container,E.classes.loading);if(N.boolean(t)||(t&&t.type?(a="enterfullscreen"===t.type,s=r(["mousemove","touchstart","mouseenter","focus"],t.type),r(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):s=m(Je.container,E.classes.hideControls)),e.clearTimeout(Ke.hover), +s||Je.media.paused||o){if(d(Je.container,E.classes.hideControls,!1),Je.media.paused||o)return;Je.browser.isTouch&&(n=3e3)}s&&Je.media.paused||(Ke.hover=e.setTimeout(function(){(!Je.controls.pressed&&!Je.controls.hover||a)&&d(Je.container,E.classes.hideControls,!0)},n))}}function je(e){if(!N.undefined(e))return void Re(e);var t;switch(Je.type){case"youtube":t=Je.embed.getVideoUrl();break;case"vimeo":Je.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":Je.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=Je.media.currentSrc}return t||""}function Re(e){function n(){if(Je.embed=null,i(Je.media),"video"===Je.type&&Je.videoContainer&&i(Je.videoContainer),Je.container&&Je.container.removeAttribute("class"),"type"in e&&(Je.type=e.type,"video"===Je.type)){var n=e.sources[0];"type"in n&&r(E.types.embed,n.type)&&(Je.type=n.type)}switch(Je.supported=C(Je.type),Je.type){case"video":Je.media=t.createElement("video");break;case"audio":Je.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":Je.media=t.createElement("div"),Je.embedId=e.sources[0].src}l(Je.container,Je.media),N.boolean(e.autoplay)&&(E.autoplay=e.autoplay),r(E.types.html5,Je.type)&&(E.crossorigin&&Je.media.setAttribute("crossorigin",""),E.autoplay&&Je.media.setAttribute("autoplay",""),"poster"in e&&Je.media.setAttribute("poster",e.poster),E.loop&&Je.media.setAttribute("loop","")),d(Je.container,E.classes.fullscreen.active,Je.isFullscreen),d(Je.container,E.classes.captions.active,Je.captionsEnabled),Q(),r(E.types.html5,Je.type)&&J("source",e.sources),ne(),r(E.types.html5,Je.type)&&("tracks"in e&&J("track",e.tracks),Je.media.load()),(r(E.types.html5,Je.type)||r(E.types.embed,Je.type)&&!Je.supported.full)&&(Xe(),Ue()),E.title=e.title,Z()}return N.object(e)&&"sources"in e&&e.sources.length?(d(Je.container,E.classes.ready,!1),ue(),Ne(),Fe(),We(),void Ye(n,!1)):void Ge("Invalid source format")}function Ve(e){"video"===Je.type&&Je.media.setAttribute("poster",e)}function De(){function n(){var e=ce(),t=Je.buttons[e?"play":"pause"],n=Je.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var a=m(t,E.classes.tabFocus);setTimeout(function(){n.focus(),a&&(d(t,E.classes.tabFocus,!1),d(n,E.classes.tabFocus,!0))},100)}}function a(){var e=t.activeElement;return e=e&&e!==t.body?t.querySelector(":focus"):null}function s(e){return e.keyCode?e.keyCode:e.which}function o(e){for(var t in Je.buttons){var n=Je.buttons[t];if(N.nodeList(n))for(var a=0;a0)&&(t?we(n):xe(n)),(e.deltaY>0||e.deltaX<0)&&(t?xe(n):we(n))})}function He(){if(g(Je.media,"timeupdate seeking",Me),g(Je.media,"timeupdate",W),g(Je.media,"durationchange loadedmetadata",Pe),g(Je.media,"ended",function(){"video"===Je.type&&E.showPosterOnEnd&&("video"===Je.type&&H(),fe(),Je.media.load())}),g(Je.media,"progress playing",Ae),g(Je.media,"volumechange",Te),g(Je.media,"play pause ended",be),g(Je.media,"waiting canplay seeked",Ce),E.clickToPlay&&"audio"!==Je.type){var e=X("."+E.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",g(e,"click",function(){E.hideControls&&Je.browser.isTouch&&!Je.media.paused||(Je.media.paused?le():Je.media.ended?(fe(),le()):ue())})}E.disableContextMenu&&g(Je.media,"contextmenu",function(e){e.preventDefault()}),g(Je.media,E.events.concat(["keyup","keydown"]).join(" "),function(e){A(Je.container,e.type,!0)})}function We(){if(r(E.types.html5,Je.type)){for(var e=Je.media.querySelectorAll("source"),t=0;t= 0; i--) { - var child = (i > 0) ? wrapper.cloneNode(true) : wrapper; + var child = (i > 0) ? wrapper.cloneNode(true) : wrapper; var element = elements[i]; // Cache the current parent and sibling. - var parent = element.parentNode; + var parent = element.parentNode; var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current @@ -395,13 +402,17 @@ // Element matches selector function _matches(element, selector) { - var p = Element.prototype; + var prototype = Element.prototype; - var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function(s) { - return [].indexOf.call(document.querySelectorAll(s), this) !== -1; - }; + var matches = prototype.matches || + prototype.webkitMatchesSelector || + prototype.mozMatchesSelector || + prototype.msMatchesSelector || + function(s) { + return [].indexOf.call(document.querySelectorAll(s), this) !== -1; + }; - return f.call(element, selector); + return matches.call(element, selector); } // Bind along with custom handler @@ -467,9 +478,9 @@ } // Create and dispatch the event - var event = new CustomEvent(type, { - bubbles: bubbles, - detail: properties + var event = new CustomEvent(type, { + bubbles: bubbles, + detail: properties }); // Dispatch the event @@ -520,7 +531,7 @@ // First object is the destination var destination = Array.prototype.shift.call(objects), - length = objects.length; + length = objects.length; // Loop through all objects to merge for (var i = 0; i < length; i++) { @@ -542,7 +553,7 @@ // Check variable types var _is = { object: function(input) { - return input !== null && typeof(input) === 'object' && input.constructor === Object; + return input !== null && typeof(input) === 'object' && input.constructor === Object; }, array: function(input) { return input !== null && typeof(input) === 'object' && input.constructor === Array; @@ -592,7 +603,7 @@ var _fullscreen; (function() { // Determine the prefix - var prefix = (function() { + var prefix = (function() { var value = false; if (_is.function(document.cancelFullScreen)) { @@ -660,7 +671,7 @@ return null; } return (prefix === '') ? document.fullscreenElement : document[prefix + 'FullscreenElement']; - } + } }; })(); @@ -689,20 +700,19 @@ // Check if value matches return (result === 'OK'); - } - catch (e) { + } catch (e) { return false; } return false; })(), // Picture-in-picture support - // Safari only currently + // Safari only currently pip: (function() { return _is.function(document.createElement('video').webkitSetPresentationMode); })(), // Airplay support - // Safari only currently + // Safari only currently airplay: (function() { return _is.function(window.WebKitPlaybackTargetAvailabilityEvent); })(), @@ -713,7 +723,7 @@ var media = plyr.media; try { - // Bail if no checking function + // Bail if no checking function if (!_is.function(media.canPlayType)) { return false; } @@ -721,19 +731,24 @@ // Type specific checks if (plyr.type === 'video') { switch (type) { - case 'video/webm': return media.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, ''); - case 'video/mp4': return media.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ''); - case 'video/ogg': return media.canPlayType('video/ogg; codecs="theora"').replace(/no/, ''); + case 'video/webm': + return media.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, ''); + case 'video/mp4': + return media.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ''); + case 'video/ogg': + return media.canPlayType('video/ogg; codecs="theora"').replace(/no/, ''); } } else if (plyr.type === 'audio') { switch (type) { - case 'audio/mpeg': return media.canPlayType('audio/mpeg;').replace(/no/, ''); - case 'audio/ogg': return media.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ''); - case 'audio/wav': return media.canPlayType('audio/wav; codecs="1"').replace(/no/, ''); + case 'audio/mpeg': + return media.canPlayType('audio/mpeg;').replace(/no/, ''); + case 'audio/ogg': + return media.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ''); + case 'audio/wav': + return media.canPlayType('audio/wav; codecs="1"').replace(/no/, ''); } } - } - catch(e) { + } catch (e) { return false; } @@ -744,11 +759,11 @@ // Player instance function Plyr(media, config) { - var plyr = this, - timers = {}, - api; + var plyr = this; + var timers = {}; + var api; - // Set media + // Set media plyr.media = media; var original = media.cloneNode(true); @@ -767,12 +782,16 @@ if (_is.string(config.logPrefix) && config.logPrefix.length) { args.unshift(config.logPrefix); } - + console[type].apply(console, args); } } - var _log = function() { _console('log', arguments) }, - _warn = function() { _console('warn', arguments) }; + var _log = function() { + _console('log', arguments) + }; + var _warn = function() { + _console('warn', arguments) + }; // Log config options _log('Config', config); @@ -780,53 +799,60 @@ // Get icon URL function _getIconUrl() { return { - url: config.iconUrl, - absolute: (config.iconUrl.indexOf("http") === 0) || plyr.browser.isIE + url: config.iconUrl, + absolute: (config.iconUrl.indexOf("http") === 0) || plyr.browser.isIE }; } // Build the default HTML function _buildControls() { // Create html array - var html = [], - iconUrl = _getIconUrl(), - iconPath = (!iconUrl.absolute ? iconUrl.url : '') + '#' + config.iconPrefix; + var html = []; + var iconUrl = _getIconUrl(); + var iconPath = (!iconUrl.absolute ? iconUrl.url : '') + '#' + config.iconPrefix; // Larger overlaid play button if (_inArray(config.controls, 'play-large')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } html.push('
'); // Restart button if (_inArray(config.controls, 'restart')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Rewind button if (_inArray(config.controls, 'rewind')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Play Pause button // TODO: This should be a toggle button really? if (_inArray(config.controls, 'play')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Fast forward button if (_inArray(config.controls, 'fast-forward')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Progress if (_inArray(config.controls, 'progress')) { // Create progress - html.push('', - '', - '', - '', - '', + /* beautify ignore:start */ + html.push( + '', + '', + '', + '', + '', '0% ' + config.i18n.buffered, - ''); + '' + ); + /* beautify ignore:end */ // Seek tooltip if (config.tooltips.seek) { @@ -871,26 +904,31 @@ // Media current time display if (_inArray(config.controls, 'current-time')) { + /* beautify ignore:start */ html.push( '', '' + config.i18n.currentTime + '', '00:00', '' ); + /* beautify ignore:end */ } // Media duration display if (_inArray(config.controls, 'duration')) { + /* beautify ignore:start */ html.push( '', '' + config.i18n.duration + '', '00:00', '' ); + /* beautify ignore:end */ } // Toggle mute button if (_inArray(config.controls, 'mute')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Volume range control if (_inArray(config.controls, 'volume')) { + /* beautify ignore:start */ html.push( '', '', @@ -909,21 +949,25 @@ '', '' ); + /* beautify ignore:end */ } // Toggle captions button if (_inArray(config.controls, 'captions')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Settings button / menu if (_inArray(config.controls, 'settings')) { + /* beautify ignore:start */ html.push( '
', '', '', '
  • ', '', '
  • ', '
  • ', '', '
  • ', '', @@ -964,7 +1011,7 @@ '
  • ', '', '
  • ', - '', + '', '
    ', '', '', '
    ' ); + /* beautify ignore:end */ } // Picture in picture button if (_inArray(config.controls, 'pip') && _support.pip) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Airplay button if (_inArray(config.controls, 'airplay') && _support.airplay) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Toggle fullscreen button if (_inArray(config.controls, 'fullscreen')) { + /* beautify ignore:start */ html.push( '' ); + /* beautify ignore:end */ } // Close everything @@ -1238,7 +1292,7 @@ var captions = [], caption, req = xhr.responseText; - + // According to webvtt spec, line terminator consists of one of the following // CRLF (U+000D U+000A), LF (U+000A) or CR (U+000D) var lineSeparator = '\r\n'; @@ -1249,11 +1303,11 @@ lineSeparator = '\n'; } } - + captions = req.split(lineSeparator + lineSeparator); var numOfAvailableCaptions = 0; - + for (var r = 0; r < captions.length; r++) { caption = captions[r]; @@ -1264,7 +1318,7 @@ // Incase caption numbers are added if (parts[index].indexOf(":") !== -1) { plyr.captions[numOfAvailableCaptions] = [parts[index], parts[index + 1]]; - numOfAvailableCaptions ++; + numOfAvailableCaptions++; } } @@ -1318,19 +1372,22 @@ function _timecodeCommon(tc, pos) { var tcpair = []; tcpair = tc.split(' --> '); - for(var i = 0; i < tcpair.length; i++) { + for (var i = 0; i < tcpair.length; i++) { // WebVTT allows for extra meta data after the timestamp line // So get rid of this if it exists tcpair[i] = tcpair[i].replace(/(\d+:\d+:\d+\.\d+).*/, "$1"); } return _subTcSecs(tcpair[pos]); } + function _timecodeMin(tc) { return _timecodeCommon(tc, 0); } + function _timecodeMax(tc) { return _timecodeCommon(tc, 1); } + function _subTcSecs(tc) { if (tc === null || tc === undefined) { return 0; @@ -1342,9 +1399,9 @@ tc2 = tc1[0].split(':'); for (var i = 0, len = tc2.length; i < len; i++) { - seconds += Math.floor(tc2[i]*(Math.pow(60, len-(i+1)))); + seconds += Math.floor(tc2[i] * (Math.pow(60, len - (i + 1)))); } - + return seconds; } } @@ -1378,7 +1435,7 @@ // Check if the next caption is in the current time range if (plyr.media.currentTime.toFixed(1) >= _timecodeMin(plyr.captions[plyr.subcount][0]) && plyr.media.currentTime.toFixed(1) <= _timecodeMax(plyr.captions[plyr.subcount][0])) { - plyr.currentCaption = plyr.captions[plyr.subcount][1]; + plyr.currentCaption = plyr.captions[plyr.subcount][1]; // Render the caption _setCaption(plyr.currentCaption); @@ -1424,17 +1481,16 @@ function _inFrame() { try { return window.self !== window.top; - } - catch (e) { + } catch (e) { return true; } } // Trap focus inside container function _focusTrap() { - var tabbables = _getElements('input:not([disabled]), button:not([disabled])'), - first = tabbables[0], - last = tabbables[tabbables.length - 1]; + var tabbables = _getElements('input:not([disabled]), button:not([disabled])'), + first = tabbables[0], + last = tabbables[tabbables.length - 1]; function _checkFocus(event) { // If it is TAB @@ -1458,7 +1514,9 @@ // Add elements to HTML5 media (source, tracks, etc) function _insertChildElements(type, attributes) { if (_is.string(attributes)) { - _insertElement(type, plyr.media, { src: attributes }); + _insertElement(type, plyr.media, { + src: attributes + }); } else if (attributes.constructor === Array) { for (var i = attributes.length - 1; i >= 0; i--) { _insertElement(type, plyr.media, attributes[i]); @@ -1536,28 +1594,28 @@ // Find the UI controls and store references function _findElements() { try { - plyr.controls = _getElement(config.selectors.controls.wrapper); + plyr.controls = _getElement(config.selectors.controls.wrapper); // Buttons plyr.buttons = { - seek: _getElement(config.selectors.buttons.seek), - play: _getElements(config.selectors.buttons.play), - pause: _getElement(config.selectors.buttons.pause), - restart: _getElement(config.selectors.buttons.restart), - rewind: _getElement(config.selectors.buttons.rewind), - forward: _getElement(config.selectors.buttons.forward), - fullscreen: _getElement(config.selectors.buttons.fullscreen), - settings: _getElement(config.selectors.buttons.settings), - pip: _getElement(config.selectors.buttons.pip) + seek: _getElement(config.selectors.buttons.seek), + play: _getElements(config.selectors.buttons.play), + pause: _getElement(config.selectors.buttons.pause), + restart: _getElement(config.selectors.buttons.restart), + rewind: _getElement(config.selectors.buttons.rewind), + forward: _getElement(config.selectors.buttons.forward), + fullscreen: _getElement(config.selectors.buttons.fullscreen), + settings: _getElement(config.selectors.buttons.settings), + pip: _getElement(config.selectors.buttons.pip) }; // Inputs - plyr.buttons.mute = _getElement(config.selectors.buttons.mute); - plyr.buttons.captions = _getElement(config.selectors.buttons.captions); + plyr.buttons.mute = _getElement(config.selectors.buttons.mute); + plyr.buttons.captions = _getElement(config.selectors.buttons.captions); // Progress plyr.progress = { - container: _getElement(config.selectors.progress.container) + container: _getElement(config.selectors.progress.container) }; // Progress - Buffering @@ -1565,31 +1623,30 @@ var bar = _getElement(config.selectors.progress.buffer); return { - bar: bar, - text: _is.htmlElement(bar) && bar.getElementsByTagName('span')[0] + bar: bar, + text: _is.htmlElement(bar) && bar.getElementsByTagName('span')[0] }; })(); // Progress - Played - plyr.progress.played = _getElement(config.selectors.progress.played); + plyr.progress.played = _getElement(config.selectors.progress.played); // Seek tooltip - plyr.progress.tooltip = plyr.progress.container && plyr.progress.container.querySelector('.' + config.classes.tooltip); + plyr.progress.tooltip = plyr.progress.container && plyr.progress.container.querySelector('.' + config.classes.tooltip); // Volume plyr.volume = { - input: _getElement(config.selectors.volume.input), - display: _getElement(config.selectors.volume.display) + input: _getElement(config.selectors.volume.input), + display: _getElement(config.selectors.volume.display) }; // Timing - plyr.duration = _getElement(config.selectors.duration); - plyr.currentTime = _getElement(config.selectors.currentTime); - plyr.seekTime = _getElements(config.selectors.seekTime); + plyr.duration = _getElement(config.selectors.duration); + plyr.currentTime = _getElement(config.selectors.currentTime); + plyr.seekTime = _getElements(config.selectors.seekTime); return true; - } - catch(e) { + } catch (e) { _warn('It looks like there is a problem with your controls HTML', e); // Restore native video controls @@ -1664,7 +1721,9 @@ // If value is a number, it's probably volume from an older // version of plyr. See: https://github.com/Selz/plyr/pull/313 // Update the key to be JSON - _updateStorage({volume: parseFloat(value)}); + _updateStorage({ + volume: parseFloat(value) + }); } else { // Assume it's JSON from this or a later version of plyr plyr.storage = JSON.parse(value); @@ -1710,7 +1769,7 @@ _toggleClass(plyr.container, config.classes.stopped, config.autoplay); // Add iOS class - _toggleClass(plyr.ontainer, config.classes.isIos, plyr.browser.isIos); + _toggleClass(plyr.container, config.classes.isIos, plyr.browser.isIos); // Add touch class _toggleClass(plyr.container, config.classes.isTouch, plyr.browser.isTouch); @@ -1751,7 +1810,7 @@ mediaId = _parseVimeoId(plyr.embedId); break; - default: + default: mediaId = plyr.embedId; } @@ -1783,11 +1842,15 @@ window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue - window.onYouTubeReadyCallbacks.push(function() { _youTubeReady(mediaId, container); }); + window.onYouTubeReadyCallbacks.push(function() { + _youTubeReady(mediaId, container); + }); // Set callback to process queue - window.onYouTubeIframeAPIReady = function () { - window.onYouTubeReadyCallbacks.forEach(function(callback) { callback(); }); + window.onYouTubeIframeAPIReady = function() { + window.onYouTubeReadyCallbacks.forEach(function(callback) { + callback(); + }); }; } } else if (plyr.type === 'vimeo') { @@ -1822,11 +1885,13 @@ // Watch for iframe load soundCloud.loaded = false; - _on(soundCloud, 'load', function() { soundCloud.loaded = true; }); + _on(soundCloud, 'load', function() { + soundCloud.loaded = true; + }); _setAttributes(soundCloud, { - 'src': 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + mediaId, - 'id': id + 'src': 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + mediaId, + 'id': id }); container.appendChild(soundCloud); @@ -1866,23 +1931,23 @@ plyr.embed = new window.YT.Player(container.id, { videoId: videoId, playerVars: { - autoplay: (config.autoplay ? 1 : 0), - controls: (plyr.supported.full ? 0 : 1), - rel: 0, - showinfo: 0, + autoplay: (config.autoplay ? 1 : 0), + controls: (plyr.supported.full ? 0 : 1), + rel: 0, + showinfo: 0, iv_load_policy: 3, cc_load_policy: (config.captions.defaultActive ? 1 : 0), - cc_lang_pref: 'en', - wmode: 'transparent', + cc_lang_pref: 'en', + wmode: 'transparent', modestbranding: 1, - disablekb: 1, - origin: '*' // https://code.google.com/p/gdata-issues/issues/detail?id=5788#c45 + disablekb: 1, + origin: '*' // https://code.google.com/p/gdata-issues/issues/detail?id=5788#c45 }, events: { 'onError': function(event) { _triggerEvent(plyr.container, 'error', true, { - code: event.data, - embed: event.target + code: event.data, + embed: event.target }); }, 'onPlaybackQualityChange': function(event) { @@ -1890,7 +1955,7 @@ var instance = event.target; var quality = instance.getPlaybackQuality(); - + // var set = instance.setPlaybackQuality(); console.warn(quality); }, @@ -2038,12 +2103,12 @@ // Setup instance // https://github.com/vimeo/player.js plyr.embed = new window.Vimeo.Player(container, { - id: parseInt(mediaId), - loop: config.loop, - autoplay: config.autoplay, - byline: false, - portrait: false, - title: false + id: parseInt(mediaId), + loop: config.loop, + autoplay: config.autoplay, + byline: false, + portrait: false, + title: false }); // Create a faux HTML5 API using the Vimeo API @@ -2059,7 +2124,7 @@ plyr.embed.stop(); plyr.media.paused = true; }; - + plyr.media.paused = true; plyr.media.currentTime = 0; @@ -2075,7 +2140,7 @@ plyr.embed.getDuration().then(function(value) { plyr.media.duration = value; - + // Trigger timeupdate _triggerEvent(plyr.media, 'durationchange'); }); @@ -2138,7 +2203,7 @@ plyr.embed = window.SC.Widget(this); // Setup on ready - plyr.embed.bind(window.SC.Widget.Events.READY, function() { + plyr.embed.bind(window.SC.Widget.Events.READY, function() { // Create a faux HTML5 API using the Soundcloud API plyr.media.play = function() { plyr.embed.play(); @@ -2158,7 +2223,7 @@ plyr.media.currentTime = 0; plyr.embed.getDuration(function(value) { - plyr.media.duration = value/1000; + plyr.media.duration = value / 1000; // Update UI _embedReady(); @@ -2184,7 +2249,7 @@ plyr.embed.bind(window.SC.Widget.Events.PLAY_PROGRESS, function(data) { plyr.media.seeking = false; - plyr.media.currentTime = data.currentPosition/1000; + plyr.media.currentTime = data.currentPosition / 1000; _triggerEvent(plyr.media, 'timeupdate'); }); @@ -2280,15 +2345,17 @@ plyr.media.playbackRate = speed; // Save speed to localStorage - _updateStorage({speed: speed}); + _updateStorage({ + speed: speed + }); } // Seek to time // The input parameter can be an event or a number function _seek(input) { - var targetTime = 0, - paused = plyr.media.paused, - duration = _getDuration(); + var targetTime = 0, + paused = plyr.media.paused, + duration = _getDuration(); if (_is.number(input)) { targetTime = input; @@ -2305,19 +2372,18 @@ targetTime = duration; } - // Update seek range and progress + // Update seek range and progress _updateSeekDisplay(targetTime); // Set the current time // Try/catch incase the media isn't set and we're calling seek() from source() and IE moans try { plyr.media.currentTime = targetTime.toFixed(4); - } - catch(e) {} + } catch (e) {} // Embeds if (_inArray(config.types.embed, plyr.type)) { - switch(plyr.type) { + switch (plyr.type) { case 'youtube': plyr.embed.seekTo(targetTime); break; @@ -2358,8 +2424,8 @@ // It should be a number, but parse it just incase var duration = parseInt(config.duration), - // True duration - mediaDuration = 0; + // True duration + mediaDuration = 0; // Only if duration available if (plyr.media.duration !== null && !isNaN(plyr.media.duration)) { @@ -2396,7 +2462,7 @@ function _toggleFullscreen(event) { // Check for native support var nativeSupport = _support.fullscreen; - + if (nativeSupport) { // If it's a fullscreen change event, update the UI if (event && event.type === _fullscreen.eventType) { @@ -2468,7 +2534,7 @@ // Embeds if (_inArray(config.types.embed, plyr.type)) { // YouTube - switch(plyr.type) { + switch (plyr.type) { case 'youtube': plyr.embed[plyr.media.muted ? 'mute' : 'unMute'](); break; @@ -2518,7 +2584,7 @@ // Embeds if (_inArray(config.types.embed, plyr.type)) { - switch(plyr.type) { + switch (plyr.type) { case 'youtube': plyr.embed.setVolume(plyr.media.volume * 100); break; @@ -2579,7 +2645,9 @@ } // Update the volume in storage - _updateStorage({volume: volume}); + _updateStorage({ + volume: volume + }); // Toggle class if muted _toggleClass(plyr.container, config.classes.muted, (volume === 0)); @@ -2615,7 +2683,9 @@ _triggerEvent(plyr.container, plyr.captionsEnabled ? 'captionsenabled' : 'captionsdisabled', true); // Save captions state to localStorage - _updateStorage({captionsEnabled: plyr.captionsEnabled}); + _updateStorage({ + captionsEnabled: plyr.captionsEnabled + }); } // Select active caption @@ -2653,9 +2723,9 @@ return; } - var progress = plyr.progress.played, - value = 0, - duration = _getDuration(); + var progress = plyr.progress.played, + value = 0, + duration = _getDuration(); if (event) { switch (event.type) { @@ -2675,11 +2745,11 @@ break; - // Check buffer status + // Check buffer status case 'playing': case 'progress': - progress = plyr.progress.buffer; - value = (function() { + progress = plyr.progress.buffer; + value = (function() { var buffered = plyr.media.buffered; if (buffered && buffered.length) { @@ -2706,7 +2776,7 @@ if (!plyr.supported.full) { return; } - + // Default to 0 if (_is.undefined(value)) { value = 0; @@ -2798,17 +2868,17 @@ _updateProgress(event); } - // Update seek range and progress + // Update seek range and progress function _updateSeekDisplay(time) { // Default to 0 if (!_is.number(time)) { time = 0; } - var duration = _getDuration(), - value = _getPercentage(time, duration); + var duration = _getDuration(), + value = _getPercentage(time, duration); - // Update progress + // Update progress if (plyr.progress && plyr.progress.played) { plyr.progress.played.value = value; } @@ -2829,9 +2899,9 @@ } // Calculate percentage - var clientRect = plyr.progress.container.getBoundingClientRect(), - percent = 0, - visible = config.classes.tooltip + '--visible'; + var clientRect = plyr.progress.container.getBoundingClientRect(), + percent = 0, + visible = config.classes.tooltip + '--visible'; // Determine percentage, if already visible if (!event) { @@ -2927,15 +2997,15 @@ } } - // If toggle is false or if we're playing (regardless of toggle), - // then set the timer to hide the controls + // If toggle is false or if we're playing (regardless of toggle), + // then set the timer to hide the controls if (!show || !plyr.media.paused) { timers.hover = window.setTimeout(function() { // If the mouse is over the controls (and not entering fullscreen), bail if ((plyr.controls.pressed || plyr.controls.hover) && !isEnterFullscreen) { return; } - + _toggleClass(plyr.container, config.classes.hideControls, true); }, delay); } @@ -2951,13 +3021,13 @@ // Return the current source var url; - switch(plyr.type) { + switch (plyr.type) { case 'youtube': url = plyr.embed.getVideoUrl(); break; case 'vimeo': - plyr.embed.getVideoUrl.then(function (value) { + plyr.embed.getVideoUrl.then(function(value) { url = value; }); break; @@ -3012,7 +3082,7 @@ _remove(plyr.videoContainer); } - // Reset class name + // Reset class name if (plyr.container) { plyr.container.removeAttribute('class'); } @@ -3035,7 +3105,7 @@ plyr.supported = supported(plyr.type); // Create new markup - switch(plyr.type) { + switch (plyr.type) { case 'video': plyr.media = document.createElement('video'); break; @@ -3202,12 +3272,12 @@ if (config.keyboardShorcuts.global) { _on(window, 'keydown keyup', function(event) { var code = getKeyCode(event), - focused = getFocusElement(), - allowed = [48,49,50,51,52,53,54,56,57,75,77,70,67], - count = get().length; + focused = getFocusElement(), + allowed = [48, 49, 50, 51, 52, 53, 54, 56, 57, 75, 77, 70, 67], + count = get().length; // Only handle global key press if there's only one player - // and the key is in the allowed keys + // and the key is in the allowed keys // and if the focused element is not editable (e.g. text input) // and any that accept key input http://webaim.org/techniques/keyboard/ if (count === 1 && _inArray(allowed, code) && (!_is.htmlElement(focused) || !_matches(focused, config.selectors.editable))) { @@ -3241,7 +3311,7 @@ return; } - // Divide the max duration into 10th's and times by the number value + // Divide the max duration into 10th's and times by the number value _seek((duration / 10) * (code - 48)); } @@ -3249,8 +3319,8 @@ // Reset on keyup if (pressed) { // Which keycodes should we prevent default - var preventDefault = [48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67]; - var checkFocus = [38,40]; + var preventDefault = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67]; + var checkFocus = [38, 40]; if (_inArray(checkFocus, code)) { var focused = getFocusElement(); @@ -3266,38 +3336,64 @@ event.stopPropagation(); } - switch(code) { + switch (code) { // 0-9 - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: case 56: - case 57: if (!held) { seekByKey(); } break; - // Space and K key - case 32: - case 75: if (!held) { _togglePlay(); } break; - // Arrow up - case 38: _increaseVolume(); break; - // Arrow down - case 40: _decreaseVolume(); break; - // M key - case 77: if (!held) { _toggleMute() } break; - // Arrow forward - case 39: _forward(); break; - // Arrow back - case 37: _rewind(); break; - // F key - case 70: _toggleFullscreen(); break; - // C key - case 67: if (!held) { _toggleCaptions(); } break; + case 57: + if (!held) { + seekByKey(); + } + break; + // Space and K key + case 32: + case 75: + if (!held) { + _togglePlay(); + } + break; + // Arrow up + case 38: + _increaseVolume(); + break; + // Arrow down + case 40: + _decreaseVolume(); + break; + // M key + case 77: + if (!held) { + _toggleMute() + } + break; + // Arrow forward + case 39: + _forward(); + break; + // Arrow back + case 37: + _rewind(); + break; + // F key + case 70: + _toggleFullscreen(); + break; + // C key + case 67: + if (!held) { + _toggleCaptions(); + } + break; } - // Escape is handle natively when in full screen + // Escape is handle natively when in full screen // So we only need to worry about non native if (!_support.fullscreen && plyr.isFullscreen && code === 27) { _toggleFullscreen(); @@ -3371,7 +3467,7 @@ _on(plyr.buttons.captions, 'click', _toggleCaptions); // Settings - _on(plyr.buttons.settings, 'click', function(event) { + _on(plyr.buttons.settings, 'click', function(event) { var menu = this, toggle = event.target, target = document.getElementById(toggle.getAttribute('aria-controls')), @@ -3384,22 +3480,22 @@ // Are we targetting a tab? var isTab = target.getAttribute('role') === 'tabpanel', - targetWidth, + targetWidth, targetHeight, container; // Hide all other tabs if (isTab) { // Get other tabs - var current = menu.querySelector('[role="tabpanel"][aria-hidden="false"]'); + var current = menu.querySelector('[role="tabpanel"][aria-hidden="false"]'); container = current.parentNode; [].forEach.call(menu.querySelectorAll('[aria-controls="' + current.getAttribute('id') + '"]'), function(toggle) { toggle.setAttribute('aria-expanded', false); }); - container.style.width = current.scrollWidth + 'px'; - container.style.height = current.scrollHeight + 'px'; + container.style.width = current.scrollWidth + 'px'; + container.style.height = current.scrollHeight + 'px'; current.setAttribute('aria-hidden', true); current.setAttribute('tabindex', -1); @@ -3412,9 +3508,9 @@ container.appendChild(clone); targetWidth = clone.scrollWidth; targetHeight = clone.scrollHeight; - _remove(clone); + _remove(clone); } - + target.setAttribute('aria-hidden', !show); toggle.setAttribute('aria-expanded', show); target.setAttribute('tabindex', 0); @@ -3431,7 +3527,7 @@ }); // Picture in picture - _on(plyr.buttons.pip, 'click', function() { + _on(plyr.buttons.pip, 'click', function() { //if () plyr.media.webkitSetPresentationMode(plyr.media.webkitPresentationMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture'); @@ -3446,12 +3542,12 @@ _on(plyr.container, 'mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen', _toggleControls); // Watch for cursor over controls so they don't hide when trying to interact - _on(plyr.controls, 'mouseenter mouseleave', function(event) { + _on(plyr.controls, 'mouseenter mouseleave', function(event) { plyr.controls.hover = event.type === 'mouseenter'; }); - // Watch for cursor over controls so they don't hide when trying to interact - _on(plyr.controls, 'mousedown mouseup touchstart touchend touchcancel', function(event) { + // Watch for cursor over controls so they don't hide when trying to interact + _on(plyr.controls, 'mousedown mouseup touchstart touchend touchcancel', function(event) { plyr.controls.pressed = _inArray(['mousedown', 'touchstart'], event.type); }); @@ -3507,7 +3603,7 @@ if (plyr.type === 'video') { _setCaption(); } - + // Restart _seek(); @@ -3561,7 +3657,9 @@ // Disable right click if (config.disableContextMenu) { - _on(plyr.media, 'contextmenu', function(event) { event.preventDefault(); }); + _on(plyr.media, 'contextmenu', function(event) { + event.preventDefault(); + }); } // Proxy events to container @@ -3609,7 +3707,7 @@ // Type specific stuff switch (plyr.type) { - case 'youtube': + case 'youtube': // Clear timers window.clearInterval(timers.buffering); window.clearInterval(timers.playing); @@ -3619,11 +3717,11 @@ // Clean up cleanUp(); - + break; case 'vimeo': - // Destroy Vimeo API + // Destroy Vimeo API // then clean up (wait, to prevent postmessage errors) plyr.embed.unload().then(cleanUp); @@ -3695,17 +3793,17 @@ // Supported: video, audio, vimeo, youtube var tagName = media.tagName.toLowerCase(); if (tagName === 'div') { - plyr.type = media.getAttribute('data-type'); - plyr.embedId = media.getAttribute('data-video-id'); + plyr.type = media.getAttribute('data-type'); + plyr.embedId = media.getAttribute('data-video-id'); // Clean up media.removeAttribute('data-type'); media.removeAttribute('data-video-id'); } else { - plyr.type = tagName; - config.crossorigin = (media.getAttribute('crossorigin') !== null); - config.autoplay = (config.autoplay || (media.getAttribute('autoplay') !== null)); - config.loop = (config.loop || (media.getAttribute('loop') !== null)); + plyr.type = tagName; + config.crossorigin = (media.getAttribute('crossorigin') !== null); + config.autoplay = (config.autoplay || (media.getAttribute('autoplay') !== null)); + config.loop = (config.loop || (media.getAttribute('loop') !== null)); } // Check for support @@ -3811,45 +3909,77 @@ } api = { - getOriginal: function() { return original; }, - getContainer: function() { return plyr.container }, - getEmbed: function() { return plyr.embed; }, - getMedia: function() { return plyr.media; }, - getType: function() { return plyr.type; }, - getDuration: _getDuration, - getCurrentTime: function() { return plyr.media.currentTime; }, - getVolume: function() { return plyr.media.volume; }, - isMuted: function() { return plyr.media.muted; }, - isReady: function() { return _hasClass(plyr.container, config.classes.ready); }, - isLoading: function() { return _hasClass(plyr.container, config.classes.loading); }, - isPaused: function() { return plyr.media.paused; }, - on: function(event, callback) { _on(plyr.container, event, callback); return this; }, - play: _play, - pause: _pause, - stop: function() { _pause(); _seek(); }, - restart: _seek, - rewind: _rewind, - forward: _forward, - seek: _seek, - source: _source, - poster: _updatePoster, - setVolume: _setVolume, - setSpeed: _setSpeed, - togglePlay: _togglePlay, - toggleMute: _toggleMute, - toggleCaptions: _toggleCaptions, - toggleFullscreen: _toggleFullscreen, - toggleControls: _toggleControls, - setCaptionIndex: _setCaptionIndex, - isFullscreen: function() { return plyr.isFullscreen || false; }, - support: function(mimeType) { return _support.mime(plyr, mimeType); }, - destroy: _destroy + getOriginal: function() { + return original; + }, + getContainer: function() { + return plyr.container + }, + getEmbed: function() { + return plyr.embed; + }, + getMedia: function() { + return plyr.media; + }, + getType: function() { + return plyr.type; + }, + getDuration: _getDuration, + getCurrentTime: function() { + return plyr.media.currentTime; + }, + getVolume: function() { + return plyr.media.volume; + }, + isMuted: function() { + return plyr.media.muted; + }, + isReady: function() { + return _hasClass(plyr.container, config.classes.ready); + }, + isLoading: function() { + return _hasClass(plyr.container, config.classes.loading); + }, + isPaused: function() { + return plyr.media.paused; + }, + on: function(event, callback) { + _on(plyr.container, event, callback); + return this; + }, + play: _play, + pause: _pause, + stop: function() { + _pause(); + _seek(); + }, + restart: _seek, + rewind: _rewind, + forward: _forward, + seek: _seek, + source: _source, + poster: _updatePoster, + setVolume: _setVolume, + setSpeed: _setSpeed, + togglePlay: _togglePlay, + toggleMute: _toggleMute, + toggleCaptions: _toggleCaptions, + toggleFullscreen: _toggleFullscreen, + toggleControls: _toggleControls, + setCaptionIndex: _setCaptionIndex, + isFullscreen: function() { + return plyr.isFullscreen || false; + }, + support: function(mimeType) { + return _support.mime(plyr, mimeType); + }, + destroy: _destroy }; // Everything done function _ready() { // Ready event at end of execution stack - window.setTimeout(function() { + window.setTimeout(function() { _triggerEvent(plyr.media, 'ready'); }, 0); @@ -3913,58 +4043,58 @@ // Check for support function supported(type) { - var browser = _getBrowser(), - isOldIE = (browser.isIE && browser.version <= 9), - isIos = browser.isIos, - isIphone = /iPhone|iPod/i.test(navigator.userAgent), - audio = !!document.createElement('audio').canPlayType, - video = !!document.createElement('video').canPlayType, + var browser = _getBrowser(), + isOldIE = (browser.isIE && browser.version <= 9), + isIos = browser.isIos, + isIphone = /iPhone|iPod/i.test(navigator.userAgent), + audio = !!document.createElement('audio').canPlayType, + video = !!document.createElement('video').canPlayType, basic, full; switch (type) { case 'video': basic = video; - full = (basic && (!isOldIE && !isIphone)); + full = (basic && (!isOldIE && !isIphone)); break; case 'audio': basic = audio; - full = (basic && !isOldIE); + full = (basic && !isOldIE); break; case 'vimeo': case 'youtube': case 'soundcloud': basic = true; - full = (!isOldIE && !isIos); + full = (!isOldIE && !isIos); break; default: basic = (audio && video); - full = (basic && !isOldIE); + full = (basic && !isOldIE); } return { - basic: basic, - full: full + basic: basic, + full: full }; } // Setup function function setup(targets, options) { // Get the players - var players = [], - instances = [], - selector = [defaults.selectors.html5, defaults.selectors.embed].join(','); + var players = [], + instances = [], + selector = [defaults.selectors.html5, defaults.selectors.embed].join(','); // Select the elements if (_is.string(targets)) { // String selector passed targets = document.querySelectorAll(targets); - } else if (_is.htmlElement(targets)) { + } else if (_is.htmlElement(targets)) { // Single HTMLElement passed targets = [targets]; - } else if (!_is.nodeList(targets) && !_is.array(targets) && !_is.string(targets)) { + } else if (!_is.nodeList(targets) && !_is.array(targets) && !_is.string(targets)) { // No selector passed, possibly options as first argument // If options are the first argument if (_is.undefined(options) && _is.object(targets)) { @@ -3993,9 +4123,9 @@ // Always wrap in a
    for styling //container: _wrap(media, document.createElement('div')), // Could be a container or the media itself - target: target, + target: target, // This should be the