diff --git a/changelog.md b/changelog.md index dbbf4d28..0be6dc90 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,9 @@ # Changelog +## v2.0.10 +- Added seek event fixes for Vimeo and YouTube (fixes #409) +- Added support for embed URLs rather than ID only (fixes #345) + ## v2.0.9 - Temporary patch for the YouTube API issues with `getDuration()` (relates to #374) diff --git a/dist/plyr.js b/dist/plyr.js index 47b3c6f2..24ac7da5 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,i=""+parseFloat(navigator.appVersion),o=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",i="11"):(n=r.indexOf("MSIE"))!==-1?(l=!0,s="IE",i=r.substring(n+5)):(n=r.indexOf("Chrome"))!==-1?(c=!0,s="Chrome",i=r.substring(n+7)):(n=r.indexOf("Safari"))!==-1?(p=!0,s="Safari",i=r.substring(n+7),(n=r.indexOf("Version"))!==-1&&(i=r.substring(n+8))):(n=r.indexOf("Firefox"))!==-1?(u=!0,s="Firefox",i=r.substring(n+8)):(e=r.lastIndexOf(" ")+1)<(n=r.lastIndexOf("/"))&&(s=r.substring(e,n),i=r.substring(n+1),s.toLowerCase()===s.toUpperCase()&&(s=navigator.appName)),(a=i.indexOf(";"))!==-1&&(i=i.substring(0,a)),(a=i.indexOf(" "))!==-1&&(i=i.substring(0,a)),o=parseInt(""+i,10),isNaN(o)&&(i=""+parseFloat(navigator.appVersion),o=parseInt(navigator.appVersion,10)),{name:s,version:o,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 i(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,i=r.nextSibling;return a.appendChild(r),i?s.insertBefore(a,i):s.appendChild(a),a}}function o(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,P.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(P.boolean(r)||(r=!1),e instanceof NodeList)for(var i=0;i','',''+w.i18n.play+"",""),e.push('
'),r(w.controls,"restart")&&e.push('"),r(w.controls,"rewind")&&e.push('"),r(w.controls,"play")&&e.push('",'"),r(w.controls,"fast-forward")&&e.push('"),r(w.controls,"progress")&&(e.push('','','','','',"0% "+w.i18n.buffered,""),w.tooltips.seek&&e.push('00:00'),e.push("")),r(w.controls,"current-time")&&e.push('',''+w.i18n.currentTime+"",'00:00',""),r(w.controls,"duration")&&e.push('',''+w.i18n.duration+"",'00:00',""),r(w.controls,"mute")&&e.push('"),r(w.controls,"volume")&&e.push('','",'','',""),r(w.controls,"captions")&&e.push('"),r(w.controls,"settings")&&e.push('
','",'","
"),r(w.controls,"pip")&&M.pip&&e.push('"),r(w.controls,"airplay")&&M.airplay&&e.push('"),r(w.controls,"fullscreen")&&e.push('"),e.push("
"),e.join("")}function q(){if(Ue.supported.full&&("audio"!==Ue.type||w.fullscreen.allowAudio)&&w.fullscreen.enabled){var e=M.fullscreen;e||w.fullscreen.fallback&&!B()?(Ke((e?"Native":"Fallback")+" fullscreen enabled"),d(Ue.container,w.classes.fullscreen.enabled,!0)):Ke("Fullscreen not supported and fallback disabled"),Ue.buttons&&Ue.buttons.fullscreen&&_(Ue.buttons.fullscreen,!1),X()}}function j(e){P.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?R(e.activeCues[0].getCueAsHTML()):R()}function V(){if("video"===Ue.type){Y(w.selectors.captions)||Ue.videoContainer.insertAdjacentHTML("afterbegin",'
'),Ue.usingTextTracks=!1,Ue.media.textTracks&&(Ue.usingTextTracks=!0);var e=[],t="";if(Ue.media.childNodes.forEach(function(t){"track"===t.nodeName.toLowerCase()&&("captions"!==t.kind&&"subtitles"!==t.kind||e.push(t.getAttribute("src")))}),Ue.captionExists=!0,0===e.length?(Ue.captionExists=!1,Ke("No caption track found")):w.captions.selectedIndex+1>e.length?(Ue.captionExists=!1,Ke("Caption index out of bound")):(t=e[w.captions.selectedIndex],Ke("Caption track found; URI: "+t)),Ue.captionExists){var n=Ue.media.textTracks;if([].forEach.call(n,function(e){v(e,"cuechange",j),e.mode="hidden"}),H(Ue),(Ue.browser.isIE&&Ue.browser.version>=10||Ue.browser.isFirefox&&Ue.browser.version>=31)&&(Ke("Detected browser with known TextTrack issues - using manual fallback"),Ue.usingTextTracks=!1),Ue.usingTextTracks){Ke("TextTracks supported");var a=n[w.captions.selectedIndex];"captions"!==a.kind&&"subtitles"!==a.kind||(g(a,"cuechange",j),a.activeCues&&a.activeCues.length>0&&j(a))}else if(Ke("TextTracks not supported so rendering captions manually"),Ue.currentCaption="",Ue.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;aUe.captions.length-1){Ue.subcount=Ue.captions.length-1;break}Ue.media.currentTime.toFixed(1)>=n(Ue.captions[Ue.subcount][0])&&Ue.media.currentTime.toFixed(1)<=a(Ue.captions[Ue.subcount][0])?(Ue.currentCaption=Ue.captions[Ue.subcount][1],R(Ue.currentCaption)):R()}}function H(){if(Ue.buttons.captions){d(Ue.container,w.classes.captions.enabled,!0);var e=Ue.storage.captionsEnabled;P.boolean(e)||(e=w.captions.defaultActive),e&&(d(Ue.container,w.classes.captions.active,!0),_(Ue.buttons.captions,!0))}}function W(e){return Ue.container.querySelectorAll(e)}function Y(e){return W(e)[0]}function B(){try{return e.self!==e.top}catch(e){return!0}}function X(){function e(e){9===e.which&&Ue.isFullscreen&&(e.target!==a||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),a.focus()):(e.preventDefault(),n.focus()))}var t=W("input:not([disabled]), button:not([disabled])"),n=t[0],a=t[t.length-1];g(Ue.container,"keydown",e)}function U(e,t){if(P.string(t))c(e,Ue.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)c(e,Ue.media,t[n])}function J(){if(w.loadSprite){var e=O();e.absolute?(Ke("AJAX loading absolute SVG sprite"+(Ue.browser.isIE?" (due to IE)":"")),T(e.url,"sprite-plyr")):Ke("Sprite will be used as external resource directly")}var n=w.html;Ke("Injecting custom controls"),n||(n=L()),n=s(n,"{seektime}",w.seekTime),n=s(n,"{speed}",w.currentSpeed.toFixed(1).toString().replace(".0","")+"×"),n=s(n,"{lang}","English"),n=s(n,"{id}",Math.floor(1e4*Math.random()));var a;if(P.string(w.selectors.controls.container)&&(a=t.querySelector(w.selectors.controls.container)),P.htmlElement(a)||(a=Ue.container),a.insertAdjacentHTML("beforeend",n),w.tooltips.controls)for(var r=W([w.selectors.controls.wrapper," ",w.selectors.labels," .",w.classes.hidden].join("")),i=r.length-1;i>=0;i--){var o=r[i];d(o,w.classes.hidden,!1),d(o,w.classes.tooltip,!0)}}function z(){try{return Ue.controls=Y(w.selectors.controls.wrapper),Ue.buttons={seek:Y(w.selectors.buttons.seek),play:W(w.selectors.buttons.play),pause:Y(w.selectors.buttons.pause),restart:Y(w.selectors.buttons.restart),rewind:Y(w.selectors.buttons.rewind),forward:Y(w.selectors.buttons.forward),fullscreen:Y(w.selectors.buttons.fullscreen),settings:Y(w.selectors.buttons.settings),pip:Y(w.selectors.buttons.pip)},Ue.buttons.mute=Y(w.selectors.buttons.mute),Ue.buttons.captions=Y(w.selectors.buttons.captions),Ue.progress={container:Y(w.selectors.progress.container)},Ue.progress.buffer=function(){var e=Y(w.selectors.progress.buffer);return{bar:e,text:P.htmlElement(e)&&e.getElementsByTagName("span")[0]}}(),Ue.progress.played=Y(w.selectors.progress.played),Ue.progress.tooltip=Ue.progress.container&&Ue.progress.container.querySelector("."+w.classes.tooltip),Ue.volume={input:Y(w.selectors.volume.input),display:Y(w.selectors.volume.display)},Ue.duration=Y(w.selectors.duration),Ue.currentTime=Y(w.selectors.currentTime),Ue.seekTime=W(w.selectors.seekTime),!0}catch(e){return $e("It looks like there is a problem with your controls HTML",e),$(!0),!1}}function K(){d(Ue.container,w.selectors.container.replace(".",""),Ue.supported.full)}function $(e){e&&r(w.types.html5,Ue.type)?Ue.media.setAttribute("controls",""):Ue.media.removeAttribute("controls")}function G(e){var t=w.i18n.play;if(P.string(w.title)&&w.title.length&&(t+=", "+w.title,Ue.container.setAttribute("aria-label",w.title)),Ue.supported.full&&Ue.buttons.play)for(var n=Ue.buttons.play.length-1;n>=0;n--)Ue.buttons.play[n].setAttribute("aria-label",t);P.htmlElement(e)&&e.setAttribute("title",w.i18n.frameTitle.replace("{title}",w.title))}function Q(){var t=null;Ue.storage={},M.storage&&w.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(w.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?Z({volume:parseFloat(t)}):Ue.storage=JSON.parse(t)))}function Z(t){M.storage&&w.storage.enabled&&(x(Ue.storage,t),e.localStorage.setItem(w.storage.key,JSON.stringify(Ue.storage)))}function ee(){if(!Ue.media)return void $e("No media element found!");if(Ue.supported.full&&(d(Ue.container,w.classes.type.replace("{0}",Ue.type),!0),r(w.types.embed,Ue.type)&&d(Ue.container,w.classes.type.replace("{0}","video"),!0),d(Ue.container,w.classes.pip.enabled,M.pip),d(Ue.container,w.classes.stopped,w.autoplay),d(Ue.ontainer,w.classes.isIos,Ue.browser.isIos),d(Ue.container,w.classes.isTouch,Ue.browser.isTouch),"video"===Ue.type)){var e=t.createElement("div");e.setAttribute("class",w.classes.videoWrapper),i(Ue.media,e),Ue.videoContainer=e}r(w.types.embed,Ue.type)&&te()}function te(){for(var n=t.createElement("div"),r=Ue.embedId,s=Ue.type+"-"+Math.floor(1e4*Math.random()),i=W('[id^="'+Ue.type+'-"]'),l=i.length-1;l>=0;l--)o(i[l]);if(d(Ue.media,w.classes.videoWrapper,!0),d(Ue.media,w.classes.embedWrapper,!0),"youtube"===Ue.type)Ue.media.appendChild(n),n.setAttribute("id",s),P.object(e.YT)?ae(r,n):(a(w.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){ae(r,n)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===Ue.type)if(Ue.supported.full?Ue.media.appendChild(n):n=Ue.media,n.setAttribute("id",s),P.object(e.Vimeo))re(r,n);else{a(w.urls.vimeo.api);var c=e.setInterval(function(){P.object(e.Vimeo)&&(e.clearInterval(c),re(r,n))},50)}else if("soundcloud"===Ue.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/"+r,id:s}),n.appendChild(p),Ue.media.appendChild(n),e.SC||a(w.urls.soundcloud.api);var m=e.setInterval(function(){e.SC&&p.loaded&&(e.clearInterval(m),se.call(p))},50)}}function ne(){Ue.supported.full&&(Ye(),Be()),G(Y("iframe"))}function ae(t,n){Ue.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:w.autoplay?1:0,controls:Ue.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:w.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){S(Ue.container,"error",!0,{code:e.data,embed:e.target})},onReady:function(t){var n=t.target;Ue.media.play=function(){n.playVideo(),Ue.media.paused=!1},Ue.media.pause=function(){n.pauseVideo(),Ue.media.paused=!0},Ue.media.stop=function(){n.stopVideo(),Ue.media.paused=!0},Ue.media.duration=n.getDuration(),Ue.media.paused=!0,Ue.media.currentTime=0,Ue.media.muted=n.isMuted(),w.title=n.getVideoData().title,Ue.supported.full&&Ue.media.querySelector("iframe").setAttribute("tabindex","-1"),ne(),S(Ue.media,"timeupdate"),S(Ue.media,"durationchange"),e.clearInterval(Je.buffering),Je.buffering=e.setInterval(function(){Ue.media.buffered=n.getVideoLoadedFraction(),(null===Ue.media.lastBuffered||Ue.media.lastBuffered=w.speeds.length&&(n=0),e=w.speeds[n]}else e=w.defaultSpeed}w.currentSpeed=e,Ue.media.playbackRate=e,Z({speed:e})}function de(e){var t=0,n=Ue.media.paused,a=me();P.number(e)?t=e:P.event(e)&&r(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),Pe(t);try{Ue.media.currentTime=t.toFixed(4)}catch(e){}if(r(w.types.embed,Ue.type)){switch(Ue.type){case"youtube":Ue.embed.seekTo(t);break;case"vimeo":Ue.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":Ue.embed.seekTo(1e3*t)}n&&oe(),S(Ue.media,"timeupdate"),Ue.media.seeking=!0}Ke("Seeking to "+Ue.media.currentTime+" seconds"),D(t)}function me(){var e=parseInt(w.duration),t=0;return null===Ue.media.duration||isNaN(Ue.media.duration)||(t=Ue.media.duration),isNaN(e)?t:e}function fe(){d(Ue.container,w.classes.playing,!Ue.media.paused),d(Ue.container,w.classes.stopped,Ue.media.paused),Oe(Ue.media.paused)}function ye(){F={x:e.pageXOffset||0,y:e.pageYOffset||0}}function be(){e.scrollTo(F.x,F.y)}function ge(e){var n=M.fullscreen;if(n){if(!e||e.type!==A.eventType)return A.isFullScreen(Ue.container)?A.cancelFullScreen():(ye(),A.requestFullScreen(Ue.container)),void(Ue.isFullscreen=A.isFullScreen(Ue.container));Ue.isFullscreen=A.isFullScreen(Ue.container)}else Ue.isFullscreen=!Ue.isFullscreen,t.body.style.overflow=Ue.isFullscreen?"hidden":"";d(Ue.container,w.classes.fullscreen.active,Ue.isFullscreen),X(Ue.isFullscreen),Ue.buttons&&Ue.buttons.fullscreen&&_(Ue.buttons.fullscreen,Ue.isFullscreen),S(Ue.container,Ue.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!Ue.isFullscreen&&n&&be()}function ve(e){if(P.boolean(e)||(e=!Ue.media.muted),_(Ue.buttons.mute,e),Ue.media.muted=e,0===Ue.media.volume&&he(w.volume),r(w.types.embed,Ue.type)){switch(Ue.type){case"youtube":Ue.embed[Ue.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":Ue.embed.setVolume(Ue.media.muted?0:parseFloat(w.volume/w.volumeMax))}S(Ue.media,"volumechange")}}function he(e){var t=w.volumeMax,n=w.volumeMin;if(P.undefined(e)&&(e=Ue.storage.volume),(null===e||isNaN(e))&&(e=w.volume),e>t&&(e=t),e0&&ve()}function _e(e){var t=Ue.media.muted?0:Ue.media.volume*w.volumeMax;P.number(e)||(e=w.volumeStep),he(t+e)}function ke(e){var t=Ue.media.muted?0:Ue.media.volume*w.volumeMax;P.number(e)||(e=w.volumeStep),he(t-e)}function xe(){var e=Ue.media.muted?0:Ue.media.volume*w.volumeMax;Ue.supported.full&&(Ue.volume.input&&(Ue.volume.input.value=e),Ue.volume.display&&(Ue.volume.display.value=e)),Z({volume:e}),d(Ue.container,w.classes.muted,0===e),Ue.supported.full&&Ue.buttons.mute&&_(Ue.buttons.mute,0===e)}function we(e){Ue.supported.full&&Ue.buttons.captions&&(P.boolean(e)||(e=Ue.container.className.indexOf(w.classes.captions.active)===-1),Ue.captionsEnabled=e,_(Ue.buttons.captions,Ue.captionsEnabled),d(Ue.container,w.classes.captions.active,Ue.captionsEnabled),S(Ue.container,Ue.captionsEnabled?"captionsenabled":"captionsdisabled",!0),Z({captionsEnabled:Ue.captionsEnabled}))}function Te(e){w.captions.selectedIndex=e,R(),V()}function Ee(e){var t="waiting"===e.type;clearTimeout(Je.loading),Je.loading=setTimeout(function(){d(Ue.container,w.classes.loading,t),Oe(t)},t?250:0)}function Se(e){if(Ue.supported.full){var t=Ue.progress.played,n=0,a=me();if(e)switch(e.type){case"timeupdate":case"seeking":if(Ue.controls.pressed)return;n=k(Ue.media.currentTime,a),"timeupdate"===e.type&&Ue.buttons.seek&&(Ue.buttons.seek.value=n);break;case"playing":case"progress":t=Ue.progress.buffer,n=function(){var e=Ue.media.buffered;return e&&e.length?k(e.end(0),a):P.number(e)?100*e:0}()}Ce(t,n)}}function Ce(e,t){if(Ue.supported.full){if(P.undefined(t)&&(t=0),P.undefined(e)){if(!Ue.progress||!Ue.progress.buffer)return;e=Ue.progress.buffer}P.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function Ae(e,t){if(t){isNaN(e)&&(e=0),Ue.secs=parseInt(e%60),Ue.mins=parseInt(e/60%60),Ue.hours=parseInt(e/60/60%60);var n=parseInt(me()/60/60%60)>0;Ue.secs=("0"+Ue.secs).slice(-2),Ue.mins=("0"+Ue.mins).slice(-2),t.innerHTML=(n?Ue.hours+":":"")+Ue.mins+":"+Ue.secs}}function Fe(){if(Ue.supported.full){var e=me()||0;!Ue.duration&&w.displayDuration&&Ue.media.paused&&Ae(e,Ue.currentTime),Ue.duration&&Ae(e,Ue.duration),Me()}}function Ie(e){Ae(Ue.media.currentTime,Ue.currentTime),e&&"timeupdate"===e.type&&Ue.media.seeking||Se(e)}function Pe(e){P.number(e)||(e=0);var t=me(),n=k(e,t);Ue.progress&&Ue.progress.played&&(Ue.progress.played.value=n),Ue.buttons&&Ue.buttons.seek&&(Ue.buttons.seek.value=n)}function Me(e){var t=me();if(w.tooltips.seek&&Ue.progress.container&&0!==t){var n=Ue.progress.container.getBoundingClientRect(),a=0,s=w.classes.tooltip+"--visible";if(e)a=100/n.width*(e.pageX-n.left);else{if(!m(Ue.progress.tooltip,s))return;a=Ue.progress.tooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100),Ae(t/100*a,Ue.progress.tooltip),Ue.progress.tooltip.style.left=a+"%",e&&r(["mouseenter","mouseleave"],e.type)&&d(Ue.progress.tooltip,s,"mouseenter"===e.type)}}function Ne(e){P.undefined(e)&&(e=Ue.storage.speed||w.defaultSpeed),pe(e)}function Oe(t){if(w.hideControls&&"audio"!==Ue.type){var n=0,a=!1,s=t,i=m(Ue.container,w.classes.loading);if(P.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(Ue.container,w.classes.hideControls)),e.clearTimeout(Je.hover),s||Ue.media.paused||i){if(d(Ue.container,w.classes.hideControls,!1),Ue.media.paused||i)return;Ue.browser.isTouch&&(n=3e3)}s&&Ue.media.paused||(Je.hover=e.setTimeout(function(){(!Ue.controls.pressed&&!Ue.controls.hover||a)&&d(Ue.container,w.classes.hideControls,!0)},n))}}function Le(e){if(!P.undefined(e))return void qe(e);var t;switch(Ue.type){case"youtube":t=Ue.embed.getVideoUrl();break;case"vimeo":Ue.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":Ue.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=Ue.media.currentSrc}return t||""}function qe(e){function n(){if(Ue.embed=null,o(Ue.media),"video"===Ue.type&&Ue.videoContainer&&o(Ue.videoContainer),Ue.container&&Ue.container.removeAttribute("class"),"type"in e&&(Ue.type=e.type,"video"===Ue.type)){var n=e.sources[0];"type"in n&&r(w.types.embed,n.type)&&(Ue.type=n.type)}switch(Ue.supported=E(Ue.type),Ue.type){case"video":Ue.media=t.createElement("video");break;case"audio":Ue.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":Ue.media=t.createElement("div"),Ue.embedId=e.sources[0].src}l(Ue.container,Ue.media),P.boolean(e.autoplay)&&(w.autoplay=e.autoplay),r(w.types.html5,Ue.type)&&(w.crossorigin&&Ue.media.setAttribute("crossorigin",""),w.autoplay&&Ue.media.setAttribute("autoplay",""),"poster"in e&&Ue.media.setAttribute("poster",e.poster),w.loop&&Ue.media.setAttribute("loop","")),d(Ue.container,w.classes.fullscreen.active,Ue.isFullscreen),d(Ue.container,w.classes.captions.active,Ue.captionsEnabled),K(),r(w.types.html5,Ue.type)&&U("source",e.sources),ee(),r(w.types.html5,Ue.type)&&("tracks"in e&&U("track",e.tracks), -Ue.media.load()),(r(w.types.html5,Ue.type)||r(w.types.embed,Ue.type)&&!Ue.supported.full)&&(Ye(),Be()),w.title=e.title,G()}return P.object(e)&&"sources"in e&&e.sources.length?(d(Ue.container,w.classes.ready,!1),oe(),Pe(),Ce(),De(),void He(n,!1)):void $e("Invalid source format")}function je(e){"video"===Ue.type&&Ue.media.setAttribute("poster",e)}function Ve(){function n(){var e=le(),t=Ue.buttons[e?"play":"pause"],n=Ue.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var a=m(t,w.classes.tabFocus);setTimeout(function(){n.focus(),a&&(d(t,w.classes.tabFocus,!1),d(n,w.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 i(e){for(var t in Ue.buttons){var n=Ue.buttons[t];if(P.nodeList(n))for(var a=0;a0)&&(t?ke(n):_e(n)),(e.deltaY>0||e.deltaX<0)&&(t?_e(n):ke(n))})}function Re(){if(g(Ue.media,"timeupdate seeking",Ie),g(Ue.media,"timeupdate",D),g(Ue.media,"durationchange loadedmetadata",Fe),g(Ue.media,"ended",function(){"video"===Ue.type&&w.showPosterOnEnd&&("video"===Ue.type&&R(),de(),Ue.media.load())}),g(Ue.media,"progress playing",Se),g(Ue.media,"volumechange",xe),g(Ue.media,"play pause ended",fe),g(Ue.media,"waiting canplay seeked",Ee),w.clickToPlay&&"audio"!==Ue.type){var e=Y("."+w.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",g(e,"click",function(){w.hideControls&&Ue.browser.isTouch&&!Ue.media.paused||(Ue.media.paused?ie():Ue.media.ended?(de(),ie()):oe())})}w.disableContextMenu&&g(Ue.media,"contextmenu",function(e){e.preventDefault()}),g(Ue.media,w.events.concat(["keyup","keydown"]).join(" "),function(e){S(Ue.container,e.type,!0)})}function De(){if(r(w.types.html5,Ue.type)){for(var e=Ue.media.querySelectorAll("source"),t=0;t=0;n--){var a=n>0?t.cloneNode(!0):t,r=e[n],s=r.parentNode,i=r.nextSibling;return a.appendChild(r),i?s.insertBefore(a,i):s.appendChild(a),a}}function o(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 d(e){return e.replace(".","")}function p(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 i=0;i','',''+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")&&O.pip&&e.push('"),r(E.controls,"airplay")&&O.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=O.fullscreen;e||E.fullscreen.fallback&&!U()?(Ge((e?"Native":"Fallback")+" fullscreen enabled"),p(Je.container,E.classes.fullscreen.enabled,!0)):Ge("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,Ge("No caption track found")):E.captions.selectedIndex+1>e.length?(Je.captionExists=!1,Ge("Caption index out of bound")):(t=e[E.captions.selectedIndex],Ge("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)&&(Ge("Detected browser with known TextTrack issues - using manual fallback"),Je.usingTextTracks=!1),Je.usingTextTracks){Ge("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(Ge("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){p(Je.container,E.classes.captions.enabled,!0);var e=Je.storage.captionsEnabled;N.boolean(e)||(e=E.captions.defaultActive),e&&(p(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 z(){if(E.loadSprite){var e=q();e.absolute?(Ge("AJAX loading absolute SVG sprite"+(Je.browser.isIE?" (due to IE)":"")),S(e.url,"sprite-plyr")):Ge("Sprite will be used as external resource directly")}var n=E.html;Ge("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("")),i=r.length-1;i>=0;i--){var o=r[i];p(o,E.classes.hidden,!1),p(o,E.classes.tooltip,!0)}}function K(){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 Qe("It looks like there is a problem with your controls HTML",e),Q(!0),!1}}function G(){p(Je.container,E.selectors.container.replace(".",""),Je.supported.full)}function Q(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={},O.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){O.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 Qe("No media element found!");if(Je.supported.full&&(p(Je.container,E.classes.type.replace("{0}",Je.type),!0),r(E.types.embed,Je.type)&&p(Je.container,E.classes.type.replace("{0}","video"),!0),p(Je.container,E.classes.pip.enabled,O.pip),p(Je.container,E.classes.stopped,E.autoplay),p(Je.ontainer,E.classes.isIos,Je.browser.isIos),p(Je.container,E.classes.isTouch,Je.browser.isTouch),"video"===Je.type)){var e=t.createElement("div");e.setAttribute("class",E.classes.videoWrapper),i(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 i=B('[id^="'+Je.type+'-"]'),l=i.length-1;l>=0;l--)o(i[l]);if(p(Je.media,E.classes.videoWrapper,!0),p(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))ie(n,r);else{a(E.urls.vimeo.api);var c=e.setInterval(function(){N.object(e.Vimeo)&&(e.clearInterval(c),ie(n,r))},50)}else if("soundcloud"===Je.type){var d=t.createElement("iframe");d.loaded=!1,g(d,"load",function(){d.loaded=!0}),u(d,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+n,id:s}),r.appendChild(d),Je.media.appendChild(r),e.SC||a(E.urls.soundcloud.api);var m=e.setInterval(function(){e.SC&&d.loaded&&(e.clearInterval(m),oe.call(d))},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})},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(),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(ze.buffering),ze.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")}Ge("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(){p(Je.container,E.classes.playing,!Je.media.paused),p(Je.container,E.classes.stopped,Je.media.paused),qe(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=O.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":"";p(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}),p(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),p(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(ze.loading),ze.loading=setTimeout(function(){p(Je.container,E.classes.loading,t),qe(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),Oe()}}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 Oe(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)&&p(Je.progress.tooltip,s,"mouseenter"===e.type)}}function Le(e){N.undefined(e)&&(e=Je.storage.speed||E.defaultSpeed),me(e)}function qe(t){if(E.hideControls&&"audio"!==Je.type){var n=0,a=!1,s=t,i=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(ze.hover),s||Je.media.paused||i){if(p(Je.container,E.classes.hideControls,!1),Je.media.paused||i)return;Je.browser.isTouch&&(n=3e3)}s&&Je.media.paused||(ze.hover=e.setTimeout(function(){(!Je.controls.pressed&&!Je.controls.hover||a)&&p(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,o(Je.media),"video"===Je.type&&Je.videoContainer&&o(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","")),p(Je.container,E.classes.fullscreen.active,Je.isFullscreen),p(Je.container,E.classes.captions.active,Je.captionsEnabled),G(),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?(p(Je.container,E.classes.ready,!1),ue(),Ne(),Fe(),We(),void Ye(n,!1)):void Qe("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&&(p(t,E.classes.tabFocus,!1),p(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 i(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 ``` +Note: `data-video-id` value can now be the ID or URL for the video. This attribute name will change in a future release to reflect this change. + #### Vimeo embed ```html
``` +Note: `data-video-id` value can now be the ID or URL for the video. This attribute name will change in a future release to reflect this change. ### JavaScript Include the `plyr.js` script before the closing `` tag and then call `plyr.setup()`. More info on `setup()` can be found under [initialising](#initialising). @@ -122,7 +135,7 @@ Include the `plyr.js` script before the closing `` tag and then call `ply If you want to use our CDN for the JavaScript, you can use the following: ```html - + ``` ### CSS @@ -135,11 +148,11 @@ Include the `plyr.css` stylsheet into your `` If you want to use our CDN for the default CSS, you can use the following: ```html - + ``` ### SVG Sprite -The SVG sprite is loaded automatically from our CDN. To change this, see the [options](#Options) below. For reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/2.0.9/plyr.svg`. +The SVG sprite is loaded automatically from our CDN. To change this, see the [options](#Options) below. For reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/2.0.10/plyr.svg`. ## Advanced @@ -687,6 +700,8 @@ player.source({ }); ``` +Note: `src` can be the video ID or URL + Vimeo example ```javascript @@ -700,7 +715,9 @@ player.source({ }); ``` -Some more details on the object parameters +Note: `src` can be the video ID or URL + +More details on the object parameters @@ -724,7 +741,7 @@ Some more details on the object parameters - + @@ -787,7 +804,7 @@ These events also bubble up the DOM. The event target will be the container elem - + @@ -831,12 +848,12 @@ These events also bubble up the DOM. The event target will be the container elem - + - + diff --git a/src/js/plyr.js b/src/js/plyr.js index 60385711..6cf4d5b9 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -1,6 +1,6 @@ // ========================================================================== // Plyr -// plyr.js v2.0.9 +// plyr.js v2.0.10 // https://github.com/selz/plyr // License: The MIT License (MIT) // ========================================================================== @@ -45,7 +45,7 @@ displayDuration: true, loadSprite: true, iconPrefix: 'plyr', - iconUrl: 'https://cdn.plyr.io/2.0.9/plyr.svg', + iconUrl: 'https://cdn.plyr.io/2.0.10/plyr.svg', clickToPlay: true, hideControls: true, showPosterOnEnd: false, @@ -190,7 +190,7 @@ speed: null }, // Events to watch on HTML5 media elements - events: ['ready', 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'emptied'], + events: ['ready', 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied'], // Logging logPrefix: '[Plyr]' }; @@ -576,6 +576,18 @@ } }; + // Parse YouTube ID from url + function _parseYouTubeId(url) { + var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; + return (url.match(regex)) ? RegExp.$2 : url; + } + + // Parse Vimeo ID from url + function _parseVimeoId(url) { + var regex = /^.*(vimeo.com\/|video\/)(\d+).*/; + return (url.match(regex)) ? RegExp.$2 : url; + } + // Fullscreen API var _fullscreen; (function() { @@ -1688,9 +1700,23 @@ // Setup YouTube/Vimeo function _setupEmbed() { var container = document.createElement('div'), - mediaId = plyr.embedId, + mediaId, id = plyr.type + '-' + Math.floor(Math.random() * (10000)); + // Parse IDs from URLs if supplied + switch (plyr.type) { + case 'youtube': + mediaId = _parseYouTubeId(plyr.embedId); + break; + + case 'vimeo': + mediaId = _parseVimeoId(plyr.embedId); + break; + + default: + mediaId = plyr.embedId; + } + // Remove old containers var containers = _getElements('[id^="' + plyr.type + '-"]'); for (var i = containers.length - 1; i >= 0; i--) { @@ -1907,6 +1933,12 @@ case 1: plyr.media.paused = false; + + // If we were seeking, fire seeked event + if (plyr.media.seeking) { + _triggerEvent(plyr.media, 'seeked'); + } + plyr.media.seeking = false; _triggerEvent(plyr.media, 'play'); _triggerEvent(plyr.media, 'playing'); @@ -2031,6 +2063,12 @@ } }); + plyr.embed.on('seeked', function() { + plyr.media.seeking = false; + _triggerEvent(plyr.media, 'seeked'); + _triggerEvent(plyr.media, 'play'); + }); + plyr.embed.on('ended', function() { plyr.media.paused = true; _triggerEvent(plyr.media, 'ended'); @@ -2222,7 +2260,6 @@ // Embeds if (_inArray(config.types.embed, plyr.type)) { - // YouTube switch(plyr.type) { case 'youtube': plyr.embed.seekTo(targetTime); @@ -2242,11 +2279,14 @@ _pause(); } - // Trigger timeupdate for embeds + // Trigger timeupdate _triggerEvent(plyr.media, 'timeupdate'); // Set seeking flag plyr.media.seeking = true; + + // Trigger seeking + _triggerEvent(plyr.media, 'seeking'); } // Logging
sources ArrayThis is an array of sources. type is optional for YouTube and Vimeo when specifying an array. For YouTube and Vimeo media, only the video ID must be passed as the source as shown above. The keys of this object are mapped directly to HTML attributes so more can be added to the object if required.This is an array of sources. type is optional for YouTube and Vimeo when specifying an array. For YouTube and Vimeo media, the video ID or URL must be passed as the source as shown above. The keys of this object are mapped directly to HTML attributes so more can be added to the object if required.
poster
ended Sent when playback completes.Sent when playback completes. Note: with Vimeo this does not occur if `loop` is enabled.
error
seeked Sent when a seek operation completes.
seeking Sent when a seek operation begins.