aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Potts <me@sampotts.me>2017-03-26 21:32:41 +1100
committerSam Potts <me@sampotts.me>2017-03-26 21:32:41 +1100
commit684107da5cdda920b57fd03bcc29349d11f625e2 (patch)
treea9417a71af494468971e01867fcedb0f5d3e4c32
parentca12343b164d3cb8d80dc5a4347f81d70c14095a (diff)
downloadplyr-684107da5cdda920b57fd03bcc29349d11f625e2.tar.lz
plyr-684107da5cdda920b57fd03bcc29349d11f625e2.tar.xz
plyr-684107da5cdda920b57fd03bcc29349d11f625e2.zip
WIP on new controls creation
-rw-r--r--dist/plyr.js4
-rw-r--r--notes.md10
-rw-r--r--readme.md38
-rw-r--r--src/js/plyr.js1102
4 files changed, 661 insertions, 493 deletions
diff --git a/dist/plyr.js b/dist/plyr.js
index 89e52a6b..99e5bf68 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,o=navigator.appName,s=""+parseFloat(navigator.appVersion),l=parseInt(navigator.appVersion,10),i=!1,u=!1,c=!1,p=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(i=!0,o="IE",s="11"):(n=r.indexOf("MSIE"))!==-1?(i=!0,o="IE",s=r.substring(n+5)):(n=r.indexOf("Chrome"))!==-1?(c=!0,o="Chrome",s=r.substring(n+7)):(n=r.indexOf("Safari"))!==-1?(p=!0,o="Safari",s=r.substring(n+7),(n=r.indexOf("Version"))!==-1&&(s=r.substring(n+8))):(n=r.indexOf("Firefox"))!==-1?(u=!0,o="Firefox",s=r.substring(n+8)):(e=r.lastIndexOf(" ")+1)<(n=r.lastIndexOf("/"))&&(o=r.substring(e,n),s=r.substring(n+1),o.toLowerCase()===o.toUpperCase()&&(o=navigator.appName)),(a=s.indexOf(";"))!==-1&&(s=s.substring(0,a)),(a=s.indexOf(" "))!==-1&&(s=s.substring(0,a)),l=parseInt(""+s,10),isNaN(l)&&(s=""+parseFloat(navigator.appVersion),l=parseInt(navigator.appVersion,10)),{name:o,version:l,isIE:i,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 o(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)}function s(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],o=r.parentNode,s=r.nextSibling;return a.appendChild(r),s?o.insertBefore(a,s):o.appendChild(a),a}}function l(e){e&&e.parentNode.removeChild(e)}function i(e,t){e.insertBefore(t,e.firstChild)}function u(e,t){for(var n in t)e.setAttribute(n,M.boolean(t[n])&&t[n]?"":t[n])}function c(e,n,a){var r=t.createElement(e);u(r,a),i(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 y(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 f(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 o=t.split(" ");if(M.boolean(r)||(r=!1),e instanceof NodeList)for(var s=0;s<e.length;s++)e[s]instanceof Node&&b(e[s],arguments[1],arguments[2],arguments[3]);else for(var l=0;l<o.length;l++)e[a?"addEventListener":"removeEventListener"](o[l],n,r)}function g(e,t,n,a){M.undefined(e)||b(e,t,n,!0,a)}function v(e,t,n,a){M.undefined(e)||b(e,t,n,!1,a)}function h(e,t,n,a){if(e&&t){M.boolean(n)||(n=!1);var r=new CustomEvent(t,{bubbles:n,detail:a});e.dispatchEvent(r)}}function _(e,t){if(e)return t=M.boolean(t)?t:!e.getAttribute("aria-pressed"),e.setAttribute("aria-pressed",t),t}function k(e,t){return 0===e||0===t||isNaN(e)||isNaN(t)?0:(e/t*100).toFixed(2)}function x(){var e=arguments;if(e.length){if(1===e.length)return e[0];for(var t=Array.prototype.shift.call(e),n=e.length,a=0;a<n;a++){var r=e[a];for(var o in r)r[o]&&r[o].constructor&&r[o].constructor===Object?(t[o]=t[o]||{},x(t[o],r[o])):t[o]=r[o]}return t}}function w(e){var t=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;return e.match(t)?RegExp.$2:e}function T(e){var t=/^.*(vimeo.com\/|video\/)(\d+).*/;return e.match(t)?RegExp.$2:e}function E(b,E){function C(e,t,n,a){h(e,t,n,x({},a,{plyr:$e}))}function L(t,n){E.debug&&e.console&&(n=Array.prototype.slice.call(n),M.string(E.logPrefix)&&E.logPrefix.length&&n.unshift(E.logPrefix),console[t].apply(console,n))}function O(){return{url:E.iconUrl,absolute:0===E.iconUrl.indexOf("http")||Je.browser.isIE}}function j(){var e=[],t=O(),n=(t.absolute?"":t.url)+"#"+E.iconPrefix;return r(E.controls,"play-large")&&e.push('<button type="button" data-plyr="play" class="plyr__play-large">','<svg><use xlink:href="'+n+'-play" /></svg>','<span class="plyr__sr-only">'+E.i18n.play+"</span>","</button>"),e.push('<div class="plyr__controls">'),r(E.controls,"restart")&&e.push('<button type="button" class="plyr__control" data-plyr="restart">','<svg><use xlink:href="'+n+'-restart" /></svg>','<span class="plyr__sr-only">'+E.i18n.restart+"</span>","</button>"),r(E.controls,"rewind")&&e.push('<button type="button" class="plyr__control" data-plyr="rewind">','<svg><use xlink:href="'+n+'-rewind" /></svg>','<span class="plyr__sr-only">'+E.i18n.rewind+"</span>","</button>"),r(E.controls,"play")&&e.push('<button type="button" class="plyr__control" data-plyr="play">','<svg><use xlink:href="'+n+'-play" /></svg>','<span class="plyr__sr-only">'+E.i18n.play+"</span>","</button>",'<button type="button" class="plyr__control" data-plyr="pause">','<svg><use xlink:href="'+n+'-pause" /></svg>','<span class="plyr__sr-only">'+E.i18n.pause+"</span>","</button>"),r(E.controls,"fast-forward")&&e.push('<button type="button" class="plyr__control" data-plyr="fast-forward">','<svg><use xlink:href="'+n+'-fast-forward" /></svg>','<span class="plyr__sr-only">'+E.i18n.forward+"</span>","</button>"),r(E.controls,"progress")&&(e.push('<span class="plyr__progress">','<div class="plyr__progress-loop"></div>','<label for="seek-{id}" class="plyr__sr-only">Seek</label>','<input id="seek-{id}" class="plyr__progress--seek" type="range" min="0" max="100" step="0.1" value="0" data-plyr="seek">','<progress class="plyr__progress--played" max="100" value="0" role="presentation"></progress>','<progress class="plyr__progress--buffer" max="100" value="0">',"<span>0</span>% "+E.i18n.buffered,"</progress>"),E.tooltips.seek&&e.push('<span class="plyr__tooltip">00:00</span>'),e.push("</span>")),r(E.controls,"current-time")&&e.push('<span class="plyr__time">','<span class="plyr__sr-only">'+E.i18n.currentTime+"</span>",'<span class="plyr__time--current">00:00</span>',"</span>"),r(E.controls,"duration")&&e.push('<span class="plyr__time">','<span class="plyr__sr-only">'+E.i18n.duration+"</span>",'<span class="plyr__time--duration">00:00</span>',"</span>"),r(E.controls,"mute")&&e.push('<button type="button" class="plyr__control" data-plyr="mute">','<svg class="icon--muted"><use xlink:href="'+n+'-muted" /></svg>','<svg><use xlink:href="'+n+'-volume" /></svg>','<span class="plyr__sr-only">'+E.i18n.toggleMute+"</span>","</button>"),r(E.controls,"volume")&&e.push('<span class="plyr__volume">','<label for="volume-{id}" class="plyr__sr-only">'+E.i18n.volume+"</label>",'<input id="volume-{id}" class="plyr__volume--input" type="range" min="'+E.volumeMin+'" max="'+E.volumeMax+'" value="'+E.volume+'" data-plyr="volume">','<progress class="plyr__volume--display" max="'+E.volumeMax+'" value="'+E.volumeMin+'" role="presentation"></progress>',"</span>"),r(E.controls,"captions")&&e.push('<button type="button" class="plyr__control" data-plyr="captions">','<svg class="icon--captions-on"><use xlink:href="'+n+'-captions-on" /></svg>','<svg><use xlink:href="'+n+'-captions-off" /></svg>','<span class="plyr__sr-only">'+E.i18n.toggleCaptions+"</span>","</button>"),r(E.controls,"settings")&&e.push('<div class="plyr__menu" data-plyr="settings">','<button type="button" id="plyr-settings-toggle-{id}" class="plyr__control" aria-haspopup="true" aria-controls="plyr-settings-{id}" aria-expanded="false">','<svg><use xlink:href="'+n+'-settings" /></svg>','<span class="plyr__sr-only">'+E.i18n.settings+"</span>","</button>",'<form class="plyr__menu__container" id="plyr-settings-{id}" aria-hidden="true" aria-labelled-by="plyr-settings-toggle-{id}" role="tablist" tabindex="-1">',"<div>",'<div id="plyr-settings-{id}-primary" aria-hidden="false" aria-labelled-by="plyr-settings-toggle-{id}" role="tabpanel" tabindex="-1">',"<ul>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--forward" id="plyr-settings-{id}-captions-toggle" aria-haspopup="true" aria-controls="plyr-settings-{id}-captions" aria-expanded="false">',E.i18n.captions+'<span class="plyr__menu__value">{lang}</span>',"</button>","</li>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--forward" id="plyr-settings-{id}-speed-toggle" aria-haspopup="true" aria-controls="plyr-settings-{id}-speed" aria-expanded="false">',E.i18n.speed+'<span class="plyr__menu__value" data-menu="speed">{speed}</span>',"</button>","</li>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--forward" id="plyr-settings-{id}-quality-toggle" aria-haspopup="true" aria-controls="plyr-settings-{id}-quality" aria-expanded="false">',E.i18n.quality+'<span class="plyr__menu__value">{quality}</span>',"</button>","</li>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--forward" id="plyr-settings-{id}-loop-toggle" aria-haspopup="true" aria-controls="plyr-settings-{id}-loop" aria-expanded="false">',E.i18n.loop+'<span class="plyr__menu__value" data-menu="loop">{loop}</span>',"</button>","</li>","</ul>","</div>",'<div id="plyr-settings-{id}-captions" aria-hidden="true" aria-labelled-by="plyr-settings-{id}-captions-toggle" role="tabpanel" tabindex="-1">',"<ul>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--back" aria-haspopup="true" aria-controls="plyr-settings-{id}-primary" aria-expanded="false">',E.i18n.captions,"</button>","</li>","<li>",'<button type="button" class="plyr__control">English</button>',"</li>","<li>",'<button type="button" class="plyr__control">Off</button>',"</li>","</ul>","</div>",'<div id="plyr-settings-{id}-speed" aria-hidden="true" aria-labelled-by="plyr-settings-{id}-speed-toggle" role="tabpanel" tabindex="-1">',"<ul>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--back" aria-haspopup="true" aria-controls="plyr-settings-{id}-primary" aria-expanded="false">',E.i18n.speed,"</button>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="speed" data-plyr="speed" value="2.0" '+(2===E.currentSpeed?"checked":"")+">","2.0&times;","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="speed" data-plyr="speed" value="1.5" '+(1.5===E.currentSpeed?"checked":"")+">","1.5&times;","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="speed" data-plyr="speed" value="1.0" '+(1===E.currentSpeed?"checked":"")+">","1.0&times;","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="speed" data-plyr="speed" value="0.5" '+(.5===E.currentSpeed?"checked":"")+">","0.5&times;","</label>","</li>","</ul>","</div>",'<div id="plyr-settings-{id}-quality" aria-hidden="true" aria-labelled-by="plyr-settings-{id}-quality-toggle" role="tabpanel" tabindex="-1">',"<ul>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--back" aria-haspopup="true" aria-controls="plyr-settings-{id}-primary" aria-expanded="false">',E.i18n.quality,"</button>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="quality">',"2160P",'<span class="plyr__menu__value">','<span class="plyr__badge">4K</span>',"</span>","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="quality">',"1440P",'<span class="plyr__menu__value">','<span class="plyr__badge">WQHD</span>',"</span>","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="quality">',"1080P",'<span class="plyr__menu__value">','<span class="plyr__badge">HD</span>',"</span>","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="quality">',"720P",'<span class="plyr__menu__value">','<span class="plyr__badge">HD</span>',"</span>","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="quality">',"480P","</label>","</li>","<li>",'<label class="plyr__control">','<input type="radio" name="quality">',"360P","</label>","</li>","</ul>","</div>",'<div id="plyr-settings-{id}-loop" aria-hidden="true" aria-labelled-by="plyr-settings-{id}-loop-toggle" role="tabpanel" tabindex="-1">',"<ul>",'<li role="tab">','<button type="button" class="plyr__control plyr__control--back" aria-haspopup="true" aria-controls="plyr-settings-{id}-primary" aria-expanded="false">',E.i18n.loop,"</button>","</li>","<li>",'<button type="button" class="plyr__control" data-plyr="loop" data-plyr-loop="all">',E.i18n.loopAll,"<span></span>","</button>","</li>","<li>",'<button type="button" class="plyr__control" data-plyr="loop" data-plyr-loop="start">',E.i18n.loopStart,"<span></span>","</button>","</li>","<li>",'<button type="button" class="plyr__control" data-plyr="loop" data-plyr-loop="end">',E.i18n.loopEnd,"<span></span>","</button>","</li>","<li>",'<button type="button" class="plyr__control" data-plyr="loop" data-plyr-loop="none">',E.i18n.loopNone,"</button>","</li>","</ul>","</div>","</div>","</form>","</div>"),r(E.controls,"pip")&&q.pip&&e.push('<button type="button" class="plyr__control" data-plyr="pip">','<svg><use xlink:href="'+n+'-pip" /></svg>','<span class="plyr__sr-only">PIP</span>',"</button>"),r(E.controls,"airplay")&&q.airplay&&e.push('<button type="button" class="plyr__control" data-plyr="airplay">','<svg><use xlink:href="'+n+'-airplay" /></svg>','<span class="plyr__sr-only">AirPlay</span>',"</button>"),r(E.controls,"fullscreen")&&e.push('<button type="button" class="plyr__control" data-plyr="fullscreen">','<svg class="icon--exit-fullscreen"><use xlink:href="'+n+'-exit-fullscreen" /></svg>','<svg><use xlink:href="'+n+'-enter-fullscreen" /></svg>','<span class="plyr__sr-only">'+E.i18n.toggleFullscreen+"</span>","</button>"),e.push("</div>"),e.join("")}function R(e,t){function n(e){var t="";switch(e){case"hd2160":t="4K";break;case"hd1440":t="WQHD";break;case"hd1080":t="HD";break;case"hd720":t="HD"}return t.length?['<span class="plyr__menu__value">','<span class="plyr__badge">'+t+"</span>","</span>"].join(""):""}function a(e){switch(e){case"hd2160":return"2160P";case"hd1440":return"1440P";case"hd1080":return"1080P";case"hd720":return"720P";case"large":return"480P";case"medium":return"360P";case"small":return"240P";default:return"Auto"}}if(!M.object(Je.quality)&&(Je.quality={available:e,current:t},M.array(e)&&e.length)){var r=e.filter(function(e){return["tiny","small"].indexOf(e)===-1}),o=r.map(function(e){return["<li>",'<label class="plyr__control">','<input type="radio" name="quality" value="'+e+'"'+(e===Je.quality.current?" checked":"")+">",a(e),n(e),"</label>","</li>"].join("")});o.unshift(['<li role="tab">','<button type="button" class="plyr__control plyr__control--back" aria-haspopup="true" aria-controls="plyr-settings-'+Je.id+'-primary" aria-expanded="false">',E.i18n.quality,"</button>","</li>"].join("")),U(E.selectors.menu.quality).innerHTML=o.join("")}}function D(){if(Je.supported.full&&("audio"!==Je.type||E.fullscreen.allowAudio)&&E.fullscreen.enabled){var e=q.fullscreen;e||E.fullscreen.fallback&&!K()?(Ze((e?"Native":"Fallback")+" fullscreen enabled"),d(Je.container,E.classes.fullscreen.enabled,!0)):Ze("Fullscreen not supported and fallback disabled"),Je.buttons&&Je.buttons.fullscreen&&_(Je.buttons.fullscreen,!1),Q()}}function V(e){M.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?W(e.activeCues[0].getCueAsHTML()):W()}function H(){if("video"===Je.type){U(E.selectors.captions)||Je.videoContainer.insertAdjacentHTML("afterbegin",'<div class="'+p(E.selectors.captions)+'"></div>'),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,Ze("No caption track found")):E.captions.selectedIndex+1>e.length?(Je.captionExists=!1,Ze("Caption index out of bound")):(t=e[E.captions.selectedIndex],Ze("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"}),B(Je),(Je.browser.isIE&&Je.browser.version>=10||Je.browser.isFirefox&&Je.browser.version>=31)&&(Ze("Detected browser with known TextTrack issues - using manual fallback"),Je.usingTextTracks=!1),Je.usingTextTracks){Ze("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(Ze("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=r.responseText,t="\r\n";e.indexOf(t+t)===-1&&(t=e.indexOf("\r\r")!==-1?"\r":"\n");var n=e.split(t+t);Je.captions=n.map(function(e){var n=e.split(t),a=0;return n[a].indexOf(":")!==-1&&(a=1),[n[a],n[a+1]]}),Je.captions.shift(),Ze("Successfully loaded the caption file via AJAX")}else et(E.logPrefix+"There was a problem loading the caption file via AJAX")},r.open("get",t,!0),r.send()}}else d(Je.container,E.classes.captions.enabled)}}function W(e){var n=U(E.selectors.captions),a=t.createElement("span");n.innerHTML="",M.undefined(e)&&(e=""),M.string(e)?a.innerHTML=e.trim():a.appendChild(e),n.appendChild(a);n.offsetHeight}function Y(e){function t(e,t){var n=[];n=e.split(" --> ");for(var a=0;a<n.length;a++)n[a]=n[a].replace(/(\d+:\d+:\d+\.\d+).*/,"$1");return r(n[t])}function n(e){return t(e,0)}function a(e){return t(e,1)}function r(e){if(null===e||void 0===e)return 0;var t=[],n=[],a=0;t=e.split(","),n=t[0].split(":");for(var r=0,o=n.length;r<o;r++)a+=Math.floor(n[r]*Math.pow(60,o-(r+1)));return a}if(!Je.usingTextTracks&&"video"===Je.type&&Je.supported.full&&(Je.subcount=0,e=M.number(e)?e:Je.media.currentTime,Je.captions[Je.subcount])){for(;a(Je.captions[Je.subcount][0])<e.toFixed(1);)if(Je.subcount++,Je.subcount>Je.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],W(Je.currentCaption)):W()}}function B(){if(Je.buttons.captions){d(Je.container,E.classes.captions.enabled,!0);var e=Je.storage.captionsEnabled;M.boolean(e)||(e=E.captions.defaultActive),e&&(d(Je.container,E.classes.captions.active,!0),_(Je.buttons.captions,!0))}}function X(e){return Je.container.querySelectorAll(e)}function U(e){return X(e)[0]}function K(){try{return e.self!==e.top}catch(e){return!0}}function Q(){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=X("input:not([disabled]), button:not([disabled])"),n=t[0],a=t[t.length-1];g(Je.container,"keydown",e)}function $(e,t){if(M.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 J(){if(E.loadSprite){var e=O();e.absolute?(Ze("AJAX loading absolute SVG sprite"+(Je.browser.isIE?" (due to IE)":"")),S(e.url,"sprite-plyr")):Ze("Sprite will be used as external resource directly")}var n=E.html;Ze("Injecting custom controls"),n||(n=j()),n=o(n,"{seektime}",E.seekTime),n=o(n,"{speed}",z()),n=o(n,"{lang}","English"),Je.id=Math.floor(1e4*Math.random()),n=o(n,"{id}",Je.id);var a;if(M.string(E.selectors.controls.container)&&(a=t.querySelector(E.selectors.controls.container)),M.htmlElement(a)||(a=Je.container),a.insertAdjacentHTML("beforeend",n),E.tooltips.controls)for(var r=X([E.selectors.controls.wrapper," ",E.selectors.labels," .",E.classes.hidden].join("")),s=r.length-1;s>=0;s--){var l=r[s];d(l,E.classes.hidden,!1),d(l,E.classes.tooltip,!0)}}function z(){return E.currentSpeed.toFixed(1).toString().replace(".0","")+"&times;"}function G(){try{return Je.controls=U(E.selectors.controls.wrapper),Je.buttons={seek:U(E.selectors.buttons.seek),play:X(E.selectors.buttons.play),pause:U(E.selectors.buttons.pause),restart:U(E.selectors.buttons.restart),rewind:U(E.selectors.buttons.rewind),forward:U(E.selectors.buttons.forward),fullscreen:U(E.selectors.buttons.fullscreen),settings:U(E.selectors.buttons.settings),pip:U(E.selectors.buttons.pip),speed:U(E.selectors.buttons.speed),loop:U(E.selectors.buttons.loop)},Je.buttons.mute=U(E.selectors.buttons.mute),Je.buttons.captions=U(E.selectors.buttons.captions),Je.progress={container:U(E.selectors.progress.container)},Je.progress.buffer=function(){var e=U(E.selectors.progress.buffer);return{bar:e,text:M.htmlElement(e)&&e.getElementsByTagName("span")[0]}}(),Je.progress.played=U(E.selectors.progress.played),Je.progress.tooltip=Je.progress.container&&Je.progress.container.querySelector("."+E.classes.tooltip),Je.volume={input:U(E.selectors.volume.input),display:U(E.selectors.volume.display)},Je.duration=U(E.selectors.duration),Je.currentTime=U(E.selectors.currentTime),Je.seekTime=X(E.selectors.seekTime),!0}catch(e){return et("It looks like there is a problem with your controls HTML",e),ee(!0),!1}}function Z(){d(Je.container,E.selectors.container.replace(".",""),Je.supported.full)}function ee(e){e&&r(E.types.html5,Je.type)?Je.media.setAttribute("controls",""):Je.media.removeAttribute("controls")}function te(e){var t=E.i18n.play;if(M.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);M.htmlElement(e)&&e.setAttribute("title",E.i18n.frameTitle.replace("{title}",E.title))}function ne(){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)?ae({volume:parseFloat(t)}):Je.storage=JSON.parse(t)))}function ae(t){q.storage&&E.storage.enabled&&(x(Je.storage,t),e.localStorage.setItem(E.storage.key,JSON.stringify(Je.storage)))}function re(){if(!Je.media)return void et("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),s(Je.media,e),Je.videoContainer=e}r(E.types.embed,Je.type)&&oe()}function oe(){var n,r=t.createElement("div"),o=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 s=X('[id^="'+Je.type+'-"]'),i=s.length-1;i>=0;i--)l(s[i]);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",o),M.object(e.YT)?le(n,r):(a(E.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){le(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",o),M.object(e.Vimeo))ie(n,r);else{a(E.urls.vimeo.api);var c=e.setInterval(function(){M.object(e.Vimeo)&&(e.clearInterval(c),ie(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:o}),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),ue.call(p))},50)}}function se(){Je.supported.full&&(Ke(),Qe()),te(U("iframe"))}function le(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){C(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"),se(),C(Je.media,"timeupdate"),C(Je.media,"durationchange"),e.clearInterval(ze.buffering),ze.buffering=e.setInterval(function(){Je.media.buffered=n.getVideoLoadedFraction(),(null===Je.media.lastBuffered||Je.media.lastBuffered<Je.media.buffered)&&C(Je.media,"progress"),Je.media.lastBuffered=Je.media.buffered,1===Je.media.buffered&&(e.clearInterval(ze.buffering),C(Je.media,"canplaythrough"))},200)},onStateChange:function(t){var n=t.target;switch(e.clearInterval(ze.playing),t.data){case 0:Je.media.paused=!0,C(Je.media,"ended");break;case 1:Je.media.paused=!1,Je.media.seeking&&C(Je.media,"seeked"),Je.media.seeking=!1,C(Je.media,"play"),C(Je.media,"playing"),ze.playing=e.setInterval(function(){Je.media.currentTime=n.getCurrentTime(),C(Je.media,"timeupdate")},100),Je.media.duration!==n.getDuration()&&(Je.media.duration=n.getDuration(),C(Je.media,"durationchange"));var a=n.getAvailableQualityLevels(),r=n.getPlaybackQuality();R(a,r);break;case 2:Je.media.paused=!0,C(Je.media,"pause")}C(Je.container,"statechange",!1,{code:t.data})}}})}function ie(t,n){Je.embed=new e.Vimeo.Player(n,{id:parseInt(t),loop:E.loop.active,autoplay:E.autoplay,byline:!1,portrait:!1,title:!1}),Je.media.play=function(){Je.embed.play(),Je.media.paused=!1},Je.media.pause=function(){Je.embed.pause(),Je.media.paused=!0},Je.media.stop=function(){Je.embed.stop(),Je.media.paused=!0},Je.media.paused=!0,Je.media.currentTime=0,se(),Je.embed.getCurrentTime().then(function(e){Je.media.currentTime=e,C(Je.media,"timeupdate")}),Je.embed.getDuration().then(function(e){Je.media.duration=e,C(Je.media,"durationchange")}),Je.embed.on("loaded",function(){M.htmlElement(Je.embed.element)&&Je.supported.full&&Je.embed.element.setAttribute("tabindex","-1")}),Je.embed.on("play",function(){Je.media.paused=!1,C(Je.media,"play"),C(Je.media,"playing")}),Je.embed.on("pause",function(){Je.media.paused=!0,C(Je.media,"pause")}),Je.embed.on("timeupdate",function(e){Je.media.seeking=!1,Je.media.currentTime=e.seconds,C(Je.media,"timeupdate")}),Je.embed.on("progress",function(e){Je.media.buffered=e.percent,C(Je.media,"progress"),1===parseInt(e.percent)&&C(Je.media,"canplaythrough")}),Je.embed.on("seeked",function(){Je.media.seeking=!1,C(Je.media,"seeked"),C(Je.media,"play")}),Je.embed.on("ended",function(){Je.media.paused=!0,C(Je.media,"ended")})}function ue(){Je.embed=e.SC.Widget(this),Je.embed.bind(e.SC.Widget.Events.READY,function(){Je.media.play=function(){Je.embed.play(),Je.media.paused=!1},Je.media.pause=function(){Je.embed.pause(),Je.media.paused=!0},Je.media.stop=function(){Je.embed.seekTo(0),Je.embed.pause(),Je.media.paused=!0},Je.media.paused=!0,Je.media.currentTime=0,Je.embed.getDuration(function(e){Je.media.duration=e/1e3,se()}),Je.embed.getPosition(function(e){Je.media.currentTime=e,C(Je.media,"timeupdate")}),Je.embed.bind(e.SC.Widget.Events.PLAY,function(){Je.media.paused=!1,C(Je.media,"play"),C(Je.media,"playing")}),Je.embed.bind(e.SC.Widget.Events.PAUSE,function(){Je.media.paused=!0,C(Je.media,"pause")}),Je.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS,function(e){Je.media.seeking=!1,Je.media.currentTime=e.currentPosition/1e3,C(Je.media,"timeupdate")}),Je.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS,function(e){Je.media.buffered=e.loadProgress,C(Je.media,"progress"),1===parseInt(e.loadProgress)&&C(Je.media,"canplaythrough")}),Je.embed.bind(e.SC.Widget.Events.FINISH,function(){Je.media.paused=!0,C(Je.media,"ended")})})}function ce(){"play"in Je.media&&Je.media.play()}function pe(){"pause"in Je.media&&Je.media.pause()}function de(e){return M.boolean(e)||(e=Je.media.paused),e?ce():pe(),e}function me(e){r(["start","end","all","none","toggle"],e)||(e="toggle");var n=Number(Je.media.currentTime);switch(e){case"start":E.loop.end&&E.loop.end<=n&&(E.loop.end=null),E.loop.start=n,E.loop.indicator.start=Je.progress.played.value;break;case"end":if(E.loop.start>=n)return;E.loop.end=n,E.loop.indicator.end=Je.progress.played.value;break;case"all":E.loop.start=0,E.loop.end=Je.media.duration-2,E.loop.indicator.start=0,E.loop.indicator.end=100;break;case"toggle":E.loop.active?(E.loop.start=0,E.loop.end=null):(E.loop.start=0,E.loop.end=Je.media.duration-2);break;default:E.loop.start=0,E.loop.end=null}E.loop.active=M.number(E.loop.start)&&M.number(E.loop.end);var a=(Me(E.loop.start,U('[data-plyr-loop="start"]')),null);M.number(E.loop.end)&&(a=Me(E.loop.end,t.querySelector('[data-loop__value="loopout"]'))),E.loop.active}function ye(e){if(M.undefined(e)&&(e=Je.storage.speed||E.defaultSpeed),!M.array(E.speeds))return void et("Invalid speeds format");if(!M.number(e)){var n=E.speeds.indexOf(E.currentSpeed);if(n!==-1){var a=n+1;a>=E.speeds.length&&(a=0),e=E.speeds[a]}else e=E.defaultSpeed}E.currentSpeed=e,Je.media.playbackRate=e,ae({speed:e}),t.querySelector('[data-menu="speed"]').innerHTML=z()}function fe(e){M.number(e)||(e=E.seekTime),ge(Je.media.currentTime-e)}function be(e){M.number(e)||(e=E.seekTime),ge(Je.media.currentTime+e)}function ge(e){var t=0,n=Je.media.paused,a=ve();M.number(e)?t=e:M.event(e)&&r(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),Oe(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&&pe(),C(Je.media,"timeupdate"),Je.media.seeking=!0,C(Je.media,"seeking")}Ze("Seeking to "+Je.media.currentTime+" seconds"),Y(t)}function ve(){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 he(){d(Je.container,E.classes.playing,!Je.media.paused),d(Je.container,E.classes.stopped,Je.media.paused),Re(Je.media.paused)}function _e(){P={x:e.pageXOffset||0,y:e.pageYOffset||0}}function ke(){e.scrollTo(P.x,P.y)}function xe(e){var n=q.fullscreen;if(n){if(!e||e.type!==I.eventType)return I.isFullScreen(Je.container)?I.cancelFullScreen():(_e(),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),Q(Je.isFullscreen),Je.buttons&&Je.buttons.fullscreen&&_(Je.buttons.fullscreen,Je.isFullscreen),C(Je.container,Je.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!Je.isFullscreen&&n&&ke()}function we(e){if(M.boolean(e)||(e=!Je.media.muted),_(Je.buttons.mute,e),Je.media.muted=e,0===Je.media.volume&&Te(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))}C(Je.media,"volumechange")}}function Te(e){var t=E.volumeMax,n=E.volumeMin;
-if(M.undefined(e)&&(e=Je.storage.volume),(null===e||isNaN(e))&&(e=E.volume),e>t&&(e=t),e<n&&(e=n),Je.media.volume=parseFloat(e/t),Je.volume.display&&(Je.volume.display.value=e),r(E.types.embed,Je.type)){switch(Je.type){case"youtube":Je.embed.setVolume(100*Je.media.volume);break;case"vimeo":case"soundcloud":Je.embed.setVolume(Je.media.volume)}C(Je.media,"volumechange")}0===e?Je.media.muted=!0:Je.media.muted&&e>0&&we()}function Ee(e){var t=Je.media.muted?0:Je.media.volume*E.volumeMax;M.number(e)||(e=E.volumeStep),Te(t+e)}function Se(e){var t=Je.media.muted?0:Je.media.volume*E.volumeMax;M.number(e)||(e=E.volumeStep),Te(t-e)}function Ae(){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)),ae({volume:e}),d(Je.container,E.classes.muted,0===e),Je.supported.full&&Je.buttons.mute&&_(Je.buttons.mute,0===e)}function Ce(e){Je.supported.full&&Je.buttons.captions&&(M.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),C(Je.container,Je.captionsEnabled?"captionsenabled":"captionsdisabled",!0),ae({captionsEnabled:Je.captionsEnabled}))}function Fe(e){E.captions.selectedIndex=e,W(),H()}function Ie(e){var t="waiting"===e.type;clearTimeout(ze.loading),ze.loading=setTimeout(function(){d(Je.container,E.classes.loading,t),Re(t)},t?250:0)}function Pe(e){if(Je.supported.full){var t=Je.progress.played,n=0,a=ve();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):M.number(e)?100*e:0}()}M.number(E.loop.start)&&M.number(E.loop.end)&&Je.media.currentTime>=E.loop.end&&ge(E.loop.start),Ne(t,n)}}function Ne(e,t){if(Je.supported.full){if(M.undefined(t)&&(t=0),M.undefined(e)){if(!Je.progress||!Je.progress.buffer)return;e=Je.progress.buffer}M.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function Me(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(ve()/60/60%60)>0;Je.secs=("0"+Je.secs).slice(-2),Je.mins=("0"+Je.mins).slice(-2);var a=(n?Je.hours+":":"")+Je.mins+":"+Je.secs;return t.innerHTML=a,a}}function qe(){if(Je.supported.full){var e=ve()||0;!Je.duration&&E.displayDuration&&Je.media.paused&&Me(e,Je.currentTime),Je.duration&&Me(e,Je.duration),je()}}function Le(e){Me(Je.media.currentTime,Je.currentTime),e&&"timeupdate"===e.type&&Je.media.seeking||Pe(e)}function Oe(e){M.number(e)||(e=0);var t=ve(),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 je(e){var t=ve();if(E.tooltips.seek&&Je.progress.container&&0!==t){var n=Je.progress.container.getBoundingClientRect(),a=0,o=E.classes.tooltip+"--visible";if(e)a=100/n.width*(e.pageX-n.left);else{if(!m(Je.progress.tooltip,o))return;a=Je.progress.tooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100),Me(t/100*a,Je.progress.tooltip),Je.progress.tooltip.style.left=a+"%",e&&r(["mouseenter","mouseleave"],e.type)&&d(Je.progress.tooltip,o,"mouseenter"===e.type)}}function Re(t){if(E.hideControls&&"audio"!==Je.type){var n=0,a=!1,o=t,s=m(Je.container,E.classes.loading);if(M.boolean(t)||(t&&t.type?(a="enterfullscreen"===t.type,o=r(["mousemove","touchstart","mouseenter","focus"],t.type),r(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):o=m(Je.container,E.classes.hideControls)),e.clearTimeout(ze.hover),o||Je.media.paused||s){if(d(Je.container,E.classes.hideControls,!1),Je.media.paused||s)return;Je.browser.isTouch&&(n=3e3)}o&&Je.media.paused||(ze.hover=e.setTimeout(function(){(!Je.controls.pressed&&!Je.controls.hover||a)&&d(Je.container,E.classes.hideControls,!0)},n))}}function De(e){if(!M.undefined(e))return void Ve(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 Ve(e){function n(){if(Je.embed=null,l(Je.media),"video"===Je.type&&Je.videoContainer&&l(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=A(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}i(Je.container,Je.media),M.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.active&&Je.media.setAttribute("loop","")),d(Je.container,E.classes.fullscreen.active,Je.isFullscreen),d(Je.container,E.classes.captions.active,Je.captionsEnabled),Z(),r(E.types.html5,Je.type)&&$("source",e.sources),re(),r(E.types.html5,Je.type)&&("tracks"in e&&$("track",e.tracks),Je.media.load()),(r(E.types.html5,Je.type)||r(E.types.embed,Je.type)&&!Je.supported.full)&&(Ke(),Qe()),E.title=e.title,te()}return M.object(e)&&"sources"in e&&e.sources.length?(d(Je.container,E.classes.ready,!1),pe(),Oe(),Ne(),Be(),void Xe(n,!1)):void et("Invalid source format")}function He(e){"video"===Je.type&&Je.media.setAttribute("poster",e)}function We(){function n(){var e=de(),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 o(e){return e.keyCode?e.keyCode:e.which}function s(e){for(var t in Je.buttons){var n=Je.buttons[t];if(M.nodeList(n))for(var a=0;a<n.length;a++)d(n[a],E.classes.tabFocus,n[a]===e);else d(n,E.classes.tabFocus,n===e)}}function i(e){function t(){var e=Je.media.duration;M.number(e)&&ge(e/10*(s-48))}var s=o(e),l="keydown"===e.type,i=l&&s===c;if(M.number(s))if(l){var u=[48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79],p=[38,40];if(r(p,s)){var d=a();if(M.htmlElement(d)&&"radio"===a().type)return}switch(r(u,s)&&(e.preventDefault(),e.stopPropagation()),s){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:i||t();break;case 32:case 75:i||n();break;case 38:Ee();break;case 40:Se();break;case 77:i||we();break;case 39:be();break;case 37:fe();break;case 70:xe();break;case 67:i||Ce();break;case 73:me("start");break;case 76:me();break;case 79:me("end")}!q.fullscreen&&Je.isFullscreen&&27===s&&xe(),c=s}else c=null}var u=Je.browser.isIE?"change":"input";if(E.keyboardShortcuts.focused){var c=null;E.keyboardShortcuts.global&&g(e,"keydown keyup",function(e){var t=o(e),n=a(),s=[48,49,50,51,52,53,54,56,57,75,77,70,67,73,76,79],l=F().length;1!==l||!r(s,t)||M.htmlElement(n)&&y(n,E.selectors.editable)||i(e)}),g(Je.container,"keydown keyup",i)}g(e,"keyup",function(e){var t=o(e),n=a();9===t&&s(n)}),g(t.body,"click",function(){d(U("."+E.classes.tabFocus),E.classes.tabFocus,!1)});for(var p in Je.buttons){var b=Je.buttons[p];g(b,"blur",function(){d(b,"tab-focus",!1)})}f(Je.buttons.play,"click",E.listeners.play,n),f(Je.buttons.pause,"click",E.listeners.pause,n),f(Je.buttons.restart,"click",E.listeners.restart,ge),f(Je.buttons.rewind,"click",E.listeners.rewind,fe),f(Je.buttons.forward,"click",E.listeners.forward,be),f(Je.buttons.speed,"click",E.listeners.speed,function(){var e=t.querySelector('[data-plyr="speed"]:checked').value;ye(Number(e))}),f(Je.buttons.seek,u,E.listeners.seek,ge),f(Je.volume.input,u,E.listeners.volume,function(){Te(Je.volume.input.value)}),f(Je.buttons.mute,"click",E.listeners.mute,we),f(Je.buttons.fullscreen,"click",E.listeners.fullscreen,xe),f(Je.buttons.loop,"click",E.listeners.loop,function(e){var t=e.target.getAttribute("data-loop__value")||e.target.getAttribute("data-loop__type");r(["start","end","all","none"],t)&&me(t)}),q.fullscreen&&g(t,I.eventType,xe),f(Je.buttons.captions,"click",E.listeners.captions,Ce),g(Je.buttons.settings,"click",function(n){var a=this,r=n.target,o=t.getElementById(r.getAttribute("aria-controls")),s="false"===r.getAttribute("aria-expanded");if(M.htmlElement(o)){var i,u,c,p="tabpanel"===o.getAttribute("role");if(p){var d=a.querySelector('[role="tabpanel"][aria-hidden="false"]');c=d.parentNode,[].forEach.call(a.querySelectorAll('[aria-controls="'+d.getAttribute("id")+'"]'),function(e){e.setAttribute("aria-expanded",!1)}),c.style.width=d.scrollWidth+"px",c.style.height=d.scrollHeight+"px",d.setAttribute("aria-hidden",!0),d.setAttribute("tabindex",-1);var m=o.cloneNode(!0);m.style.position="absolute",m.style.opacity=0,m.setAttribute("aria-hidden",!1),c.appendChild(m),i=m.scrollWidth,u=m.scrollHeight,l(m)}o.setAttribute("aria-hidden",!s),r.setAttribute("aria-expanded",s),o.setAttribute("tabindex",0),p&&(c.style.width=i+"px",c.style.height=u+"px",e.setTimeout(function(){c.style.width="",c.style.height=""},300))}}),g(Je.buttons.pip,"click",function(){Je.media.webkitSetPresentationMode("picture-in-picture"===Je.media.webkitPresentationMode?"inline":"picture-in-picture")}),g(Je.progress.container,"mouseenter mouseleave mousemove",je),E.hideControls&&(g(Je.container,"mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen",Re),g(Je.controls,"mouseenter mouseleave",function(e){Je.controls.hover="mouseenter"===e.type}),g(Je.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){Je.controls.pressed=r(["mousedown","touchstart"],e.type)}),g(Je.controls,"focus blur",Re,!0)),g(Je.volume.input,"wheel",function(e){e.preventDefault();var t=e.webkitDirectionInvertedFromDevice,n=E.volumeStep/5;(e.deltaY<0||e.deltaX>0)&&(t?Se(n):Ee(n)),(e.deltaY>0||e.deltaX<0)&&(t?Ee(n):Se(n))})}function Ye(){if(g(Je.media,"timeupdate seeking",Le),g(Je.media,"timeupdate",Y),g(Je.media,"durationchange loadedmetadata",qe),g(Je.media,"ended",function(){"video"===Je.type&&E.showPosterOnEnd&&("video"===Je.type&&W(),ge(),Je.media.load())}),g(Je.media,"progress playing",Pe),g(Je.media,"volumechange",Ae),g(Je.media,"play pause ended",he),g(Je.media,"waiting canplay seeked",Ie),E.clickToPlay&&"audio"!==Je.type){var e=U("."+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?ce():Je.media.ended?(ge(),ce()):pe())})}E.disableContextMenu&&g(Je.media,"contextmenu",function(e){e.preventDefault()}),g(Je.media,E.events.concat(["keyup","keydown"]).join(" "),function(e){C(Je.container,e.type,!0)})}function Be(){if(r(E.types.html5,Je.type)){for(var e=Je.media.querySelectorAll("source"),t=0;t<e.length;t++)l(e[t]);Je.media.setAttribute("src","https://cdn.selz.com/plyr/blank.mp4"),Je.media.load(),Ze("Cancelled network requests")}}function Xe(n,a){function r(){M.boolean(a)||(a=!0),M.function(n)&&n.call(Ge),a&&(Je.init=!1,Je.container.parentNode.replaceChild(Ge,Je.container),t.body.style.overflow="",C(Ge,"destroyed",!0))}if(!Je.init)return null;switch(Je.type){case"youtube":e.clearInterval(ze.buffering),e.clearInterval(ze.playing),Je.embed.destroy(),r();break;case"vimeo":Je.embed.unload().then(r),e.setTimeout(r,200);break;case"video":case"audio":ee(!0),r()}}function Ue(){if(Je.init)return null;if(Je.browser=n(),M.htmlElement(Je.media)){ne();var e=b.tagName.toLowerCase();"div"===e?(Je.type=b.getAttribute("data-type"),Je.embedId=b.getAttribute("data-video-id"),b.removeAttribute("data-type"),b.removeAttribute("data-video-id")):(Je.type=e,E.crossorigin=null!==b.getAttribute("crossorigin"),E.autoplay=E.autoplay||null!==b.getAttribute("autoplay"),E.loop=E.loop||null!==b.getAttribute("loop")),Je.supported=A(Je.type),Je.supported.basic&&(Je.container=s(b,t.createElement("div")),Je.container.setAttribute("tabindex",0),Z(),Ze(""+Je.browser.name+" "+Je.browser.version),re(),(r(E.types.html5,Je.type)||r(E.types.embed,Je.type)&&!Je.supported.full)&&(Ke(),Qe(),te()),Je.init=!0)}}function Ke(){if(!Je.supported.full)return et("Basic support only",Je.type),l(U(E.selectors.controls.wrapper)),l(U(E.selectors.buttons.play)),void ee(!0);var e=!X(E.selectors.controls.wrapper).length;e&&J(),G()&&(e&&We(),Ye(),ee(),D(),H(),Te(),Ae(),ye(),me(),Le(),he())}function Qe(){e.setTimeout(function(){C(Je.media,"ready")},0),d(Je.media,N.classes.setup,!0),d(Je.container,E.classes.ready,!0),Je.media.plyr=$e,E.autoplay&&ce()}var $e,Je=this,ze={};Je.media=b;var Ge=b.cloneNode(!0),Ze=function(){L("log",arguments)},et=function(){L("warn",arguments)};return Ze("Config",E),$e={getOriginal:function(){return Ge},getContainer:function(){return Je.container},getEmbed:function(){return Je.embed},getMedia:function(){return Je.media},getType:function(){return Je.type},getDuration:ve,getCurrentTime:function(){return Je.media.currentTime},getVolume:function(){return Je.media.volume},isMuted:function(){return Je.media.muted},isReady:function(){return m(Je.container,E.classes.ready)},isLoading:function(){return m(Je.container,E.classes.loading)},isPaused:function(){return Je.media.paused},isLooping:function(){return E.loop.active},on:function(e,t){return g(Je.container,e,t),this},play:ce,pause:pe,loop:me,stop:function(){pe(),ge()},restart:ge,rewind:fe,forward:be,seek:ge,source:De,poster:He,setVolume:Te,setSpeed:ye,togglePlay:de,toggleMute:we,toggleCaptions:Ce,toggleFullscreen:xe,toggleControls:Re,setCaptionIndex:Fe,isFullscreen:function(){return Je.isFullscreen||!1},support:function(e){return q.mime(Je,e)},destroy:Xe},Ue(),Je.init?$e:null}function S(e,n){var a=new XMLHttpRequest;if(!M.string(n)||!M.htmlElement(t.querySelector("#"+n))){var r=t.createElement("div");r.setAttribute("hidden",""),M.string(n)&&r.setAttribute("id",n),t.body.insertBefore(r,t.body.childNodes[0]),"withCredentials"in a&&(a.open("GET",e,!0),a.onload=function(){r.innerHTML=a.responseText},a.send())}}function A(e){var a,r,o=n(),s=o.isIE&&o.version<=9,l=o.isIos,i=/iPhone|iPod/i.test(navigator.userAgent),u=!!t.createElement("audio").canPlayType,c=!!t.createElement("video").canPlayType;switch(e){case"video":a=c,r=a&&!s&&!i;break;case"audio":a=u,r=a&&!s;break;case"vimeo":case"youtube":case"soundcloud":a=!0,r=!s&&!l;break;default:a=u&&c,r=a&&!s}return{basic:a,full:r}}function C(e,n){function a(e,t){m(t,N.classes.hook)||r.push({target:e,media:t})}var r=[],o=[],s=[N.selectors.html5,N.selectors.embed].join(",");if(M.string(e)?e=t.querySelectorAll(e):M.htmlElement(e)?e=[e]:M.nodeList(e)||M.array(e)||M.string(e)||(M.undefined(n)&&M.object(e)&&(n=e),e=t.querySelectorAll(s)),M.nodeList(e)&&(e=Array.prototype.slice.call(e)),!A().basic||!e.length)return!1;for(var l=0;l<e.length;l++){var i=e[l],u=i.querySelectorAll(s);if(u.length)for(var c=0;c<u.length;c++)a(i,u[c]);else y(i,s)&&a(i,i)}return r.forEach(function(e){var t=e.target,a=e.media,r=!1;a===t&&(r=!0);var s={};try{s=JSON.parse(t.getAttribute("data-plyr"))}catch(e){}var l=x({},N,n,s);if(!l.enabled)return null;var i=new E(a,l);if(M.object(i)){if(l.debug){var u=l.events.concat(["setup","statechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled"]);g(i.getContainer(),u.join(" "),function(e){console.log([l.logPrefix,"event:",e.type].join(" "),e.detail.plyr)})}h(i.getContainer(),"setup",!0,{plyr:i}),o.push(i)}}),o}function F(e){if(M.string(e)?e=t.querySelector(e):M.undefined(e)&&(e=t.body),M.htmlElement(e)){var n=e.querySelectorAll("."+N.classes.setup),a=[];return Array.prototype.slice.call(n).forEach(function(e){M.object(e.plyr)&&a.push(e.plyr)}),a}return[]}var I,P={x:0,y:0},N={enabled:!0,debug:!1,autoplay:!1,loop:{active:!1,start:0,end:null,indicator:{start:0,end:0}},seekTime:10,volume:10,volumeMin:0,volumeMax:10,volumeStep:1,defaultSpeed:1,currentSpeed:1,speeds:[.5,1,1.5,2],duration:null,displayDuration:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/2.0.10/plyr.svg",clickToPlay:!0,hideControls:!0,showPosterOnEnd:!1,disableContextMenu:!0,keyboardShortcuts:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},selectors:{html5:"video, audio",embed:"[data-type]",editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{seek:'[data-plyr="seek"]',play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',forward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',settings:'[data-plyr="settings"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',speed:'[data-plyr="speed"]',loop:'[data-plyr="loop"]'},volume:{input:'[data-plyr="volume"]',display:".plyr__volume--display"},progress:{container:".plyr__progress",buffer:".plyr__progress--buffer",played:".plyr__progress--played",looped:".plyr__progress-loop"},captions:".plyr__captions",currentTime:".plyr__time--current",duration:".plyr__time--duration",menu:{quality:".js-plyr__menu__list--quality"}},classes:{setup:"plyr--setup",ready:"plyr--ready",videoWrapper:"plyr__video-wrapper",embedWrapper:"plyr__video-embed",type:"plyr--{0}",stopped:"plyr--stopped",playing:"plyr--playing",muted:"plyr--muted",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",active:"plyr--fullscreen-active"},pip:{enabled:"plyr--pip-enabled",active:"plyr--pip-active"},tabFocus:"tab-focus"},captions:{defaultActive:!1,selectedIndex:0},fullscreen:{enabled:!0,fallback:!0,allowAudio:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],i18n:{restart:"Restart",rewind:"Rewind {seektime} secs",play:"Play",pause:"Pause",forward:"Forward {seektime} secs",played:"played",buffered:"buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",toggleMute:"Toggle Mute",toggleCaptions:"Toggle Captions",toggleFullscreen:"Toggle Fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",speed:"Speed",quality:"Quality",loop:"Loop",loopStart:"Loop start",loopEnd:"Loop end",loopAll:"Loop all",loopNone:"No Loop"},types:{embed:["youtube","vimeo","soundcloud"],html5:["video","audio"]},urls:{vimeo:{api:"https://player.vimeo.com/api/player.js"},youtube:{api:"https://www.youtube.com/iframe_api"},soundcloud:{api:"https://w.soundcloud.com/player/api.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,forward:null,mute:null,volume:null,captions:null,fullscreen:null,speed:null,loop:null},events:["ready","ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied"],logPrefix:""},M={object:function(e){return null!==e&&"object"==typeof e&&e.constructor===Object},array:function(e){return null!==e&&"object"==typeof e&&e.constructor===Array},number:function(e){return null!==e&&("number"==typeof e&&!isNaN(e-0)||"object"==typeof e&&e.constructor===Number)},string:function(e){return null!==e&&("string"==typeof e||"object"==typeof e&&e.constructor===String)},boolean:function(e){return null!==e&&"boolean"==typeof e},nodeList:function(e){return null!==e&&e instanceof NodeList},htmlElement:function(e){return null!==e&&e instanceof HTMLElement},function:function(e){return null!==e&&"function"==typeof e},event:function(e){return null!==e&&"object"==typeof e&&(e.constructor===Event||e.constructor===CustomEvent)},undefined:function(e){return null!==e&&"undefined"==typeof e},empty:function(e){return null===e||this.undefined(e)||(this.string(e)||this.array(e)||this.nodeList(e))&&0===e.length||this.object(e)&&0===Object.keys(e).length}};!function(){var e=function(){var e=!1;return M.function(t.cancelFullScreen)?e="":["webkit","o","moz","ms","khtml"].some(function(n){return M.function(t[n+"CancelFullScreen"])?(e=n,!0):M.function(t.msExitFullscreen)&&t.msFullscreenEnabled?(e="ms",!0):void 0}),e}();I={prefix:e,eventType:"ms"===e?"MSFullscreenChange":e+"fullscreenchange",isFullScreen:function(n){if(!q.fullscreen)return!1;switch(M.undefined(n)&&(n=t.body),this.prefix){case"":return t.fullscreenElement===n;case"moz":return t.mozFullScreenElement===n;default:return t[e+"FullscreenElement"]===n}},requestFullScreen:function(n){return!!q.fullscreen&&(M.htmlElement(n)||(n=t.body),console.log(e),""===e?n.requestFullScreen():n[e+("ms"===e?"RequestFullscreen":"RequestFullScreen")]())},cancelFullScreen:function(){return!!q.fullscreen&&(""===e?t.cancelFullScreen():t[e+("ms"===e?"ExitFullscreen":"CancelFullScreen")]())},element:function(){return q.fullscreen?""===e?t.fullscreenElement:t[e+"FullscreenElement"]:null}}}();var q={fullscreen:I.prefix!==!1,storage:function(){if(!("localStorage"in e))return!1;try{e.localStorage.setItem("___test","OK");var t=e.localStorage.getItem("___test");return e.localStorage.removeItem("___test"),"OK"===t}catch(e){return!1}return!1}(),pip:function(){return M.function(t.createElement("video").webkitSetPresentationMode)}(),airplay:function(){return M.function(e.WebKitPlaybackTargetAvailabilityEvent)}(),mime:function(e,t){var n=e.media;try{if(!M.function(n.canPlayType))return!1;if("video"===e.type)switch(t){case"video/webm":return n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return n.canPlayType('video/ogg; codecs="theora"').replace(/no/,"")}else if("audio"===e.type)switch(t){case"audio/mpeg":return n.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return n.canPlayType('audio/wav; codecs="1"').replace(/no/,"")}}catch(e){return!1}return!1}};return{setup:C,supported:A,loadSprite:S,get:F}}),function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}"function"!=typeof window.CustomEvent&&(e.prototype=window.Event.prototype,window.CustomEvent=e)}();
+!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,o=navigator.appName,i=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10),l=!1,u=!1,c=!1,d=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(l=!0,o="IE",i="11"):(n=r.indexOf("MSIE"))!==-1?(l=!0,o="IE",i=r.substring(n+5)):(n=r.indexOf("Chrome"))!==-1?(c=!0,o="Chrome",i=r.substring(n+7)):(n=r.indexOf("Safari"))!==-1?(d=!0,o="Safari",i=r.substring(n+7),(n=r.indexOf("Version"))!==-1&&(i=r.substring(n+8))):(n=r.indexOf("Firefox"))!==-1?(u=!0,o="Firefox",i=r.substring(n+8)):(e=r.lastIndexOf(" ")+1)<(n=r.lastIndexOf("/"))&&(o=r.substring(e,n),i=r.substring(n+1),o.toLowerCase()===o.toUpperCase()&&(o=navigator.appName)),(a=i.indexOf(";"))!==-1&&(i=i.substring(0,a)),(a=i.indexOf(" "))!==-1&&(i=i.substring(0,a)),s=parseInt(""+i,10),isNaN(s)&&(i=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10)),{name:o,version:s,isIE:l,isFirefox:u,isChrome:c,isSafari:d,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 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],o=r.parentNode,i=r.nextSibling;return a.appendChild(r),i?o.insertBefore(a,i):o.appendChild(a),a}}function i(e){e&&e.parentNode.removeChild(e)}function s(e,t){e.insertBefore(t,e.firstChild)}function l(e,t){for(var n in t)e.setAttribute(n,O.boolean(t[n])&&t[n]?"":t[n])}function u(e,t){if(!O.string(e)||O.empty(e))return{};var n={};return e.split(",").forEach(function(e){e=e.trim();var a=e.charAt(0);switch(a){case".":var r=e.replace(".","");O.object(t)&&O.string(t.class)&&(t.class+=" "+r),n.class=r;break;case"#":n.id=e.replace("#","");break;case"[":e=e.replace(/[\[\]]/g,"");var o=e.split("="),i=o[0],s=o.length>1?o[1].replace(/[\"\']/g,""):"";n[i]=s}}),n}function c(e,n){var a=t.createElement(e);return O.object(n)&&l(a,n),a}function d(e,t,n){var a=c(e,n);s(t,a)}function p(e){return e.replace(".","")}function m(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 f(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))}function b(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 v(e,t,n,a,r){var o=t.split(" ");if(O.boolean(r)||(r=!1),e instanceof NodeList)for(var i=0;i<e.length;i++)e[i]instanceof Node&&v(e[i],arguments[1],arguments[2],arguments[3]);else for(var s=0;s<o.length;s++)e[a?"addEventListener":"removeEventListener"](o[s],n,r)}function g(e,t,n,a){O.undefined(e)||v(e,t,n,!0,a)}function h(e,t,n,a){O.undefined(e)||v(e,t,n,!1,a)}function k(e,t,n,a){if(e&&t){O.boolean(n)||(n=!1);var r=new CustomEvent(t,{bubbles:n,detail:a});e.dispatchEvent(r)}}function w(e,t){if(e)return t=O.boolean(t)?t:!e.getAttribute("aria-pressed"),e.setAttribute("aria-pressed",t),t}function T(e,t){return 0===e||0===t||isNaN(e)||isNaN(t)?0:(e/t*100).toFixed(2)}function E(){var e=arguments;if(e.length){if(1===e.length)return e[0];for(var t=Array.prototype.shift.call(e),n=e.length,a=0;a<n;a++){var r=e[a];for(var o in r)r[o]&&r[o].constructor&&r[o].constructor===Object?(t[o]=t[o]||{},E(t[o],r[o])):t[o]=r[o]}return t}}function C(e){var t=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;return e.match(t)?RegExp.$2:e}function x(e){var t=/^.*(vimeo.com\/|video\/)(\d+).*/;return e.match(t)?RegExp.$2:e}function S(v,S){function F(e,t,n,a){k(e,t,n,E({},a,{plyr:tt}))}function q(t,n){S.debug&&e.console&&(n=Array.prototype.slice.call(n),O.string(S.logPrefix)&&S.logPrefix.length&&n.unshift(S.logPrefix),console[t].apply(console,n))}function j(){return{url:S.iconUrl,absolute:0===S.iconUrl.indexOf("http")||nt.browser.isIE}}function R(e){var n="http://www.w3.org/2000/svg",a=j(),r=(a.absolute?"":a.url)+"#"+S.iconPrefix,o=t.createElementNS(n,"svg");l(o,{role:"presentation"});var i=t.createElementNS(n,"use");return i.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r+"-"+e),o.appendChild(i),o}function V(e){var n=c("span",{class:S.classes.hidden}),a=t.createTextNode(S.i18n[e]);return n.appendChild(a),n}function D(e){var t=c("button"),n={class:"plyr__control"};return"play-large"===e&&(n.class="plyr__play-large",e="play"),E(n,u(S.selectors.buttons[e],n)),t.appendChild(R(e)),t.appendChild(V(e)),l(t,n),rt.buttons[e]=t,t}function H(e){var n=c("progress",E(u(S.selectors.progress[e]),{min:0,max:100,value:0})),a=c("span"),r=t.createTextNode("0");a.appendChild(r),n.appendChild(a);var o="";switch(e){case"played":o=S.i18n.played;break;case"buffer":o=S.i18n.buffered}var i=t.createTextNode("% "+o.toLowerCase());return n.appendChild(i),rt.progress[e]=[n],n}function W(e){var n=c("div",u(S.selectors.controls.wrapper));if(r(S.controls,"restart")&&n.appendChild(D("restart")),r(S.controls,"rewind")&&n.appendChild(D("rewind")),r(S.controls,"play")&&(n.appendChild(D("play")),n.appendChild(D("pause"))),r(S.controls,"fast-forward")&&n.appendChild(D("fast-forward")),r(S.controls,"progress")){var a=c("span",u(S.selectors.progress.container)),o={id:"seek-"+e.id,label:c("label"),input:c("input")};if(l(o.label,{for:o.id,class:S.classes.hidden}),a.appendChild(o.label),l(o.input,E(u(S.selectors.inputs.seek),{id:o.id,type:"range",min:0,max:100,step:.1,value:0})),E(rt.inputs,{seek:o.input}),a.appendChild(rt.inputs.seek),a.appendChild(H("played")),a.appendChild(H("buffer")),S.tooltips.seek){var i=c("span",{role:"tooltip",class:S.classes.tooltip}),s=t.createTextNode("00:00");i.appendChild(s),a.appendChild(i)}rt.progress.container=a,n.appendChild(rt.progress.container)}return n}function B(e,t){function n(e){var t="";switch(e){case"hd2160":t="4K";break;case"hd1440":t="WQHD";break;case"hd1080":t="HD";break;case"hd720":t="HD"}return t.length?['<span class="plyr__menu__value">','<span class="plyr__badge">'+t+"</span>","</span>"].join(""):""}function a(e){switch(e){case"hd2160":return"2160P";case"hd1440":return"1440P";case"hd1080":return"1080P";case"hd720":return"720P";case"large":return"480P";case"medium":return"360P";case"small":return"240P";default:return"Auto"}}if(!O.object(nt.quality)&&(nt.quality={available:e,current:t},O.array(e)&&e.length)){var r=e.filter(function(e){return["tiny","small"].indexOf(e)===-1}),o=r.map(function(e){return["<li>",'<label class="plyr__control">','<input type="radio" name="quality" value="'+e+'"'+(e===nt.quality.current?" checked":"")+">",a(e),n(e),"</label>","</li>"].join("")});o.unshift(['<li role="tab">','<button type="button" class="plyr__control plyr__control--back" aria-haspopup="true" aria-controls="plyr-settings-'+nt.id+'-primary" aria-expanded="false">',S.i18n.quality,"</button>","</li>"].join("")),$(S.selectors.menu.quality).innerHTML=o.join("")}}function Y(){if(nt.supported.full&&("audio"!==nt.type||S.fullscreen.allowAudio)&&S.fullscreen.enabled){var e=M.fullscreen;e||S.fullscreen.fallback&&!G()?(it((e?"Native":"Fallback")+" fullscreen enabled"),m(nt.container,S.classes.fullscreen.enabled,!0)):it("Fullscreen not supported and fallback disabled"),rt.buttons&&rt.buttons.fullscreen&&w(rt.buttons.fullscreen,!1),Z()}}function X(e){O.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?J(e.activeCues[0].getCueAsHTML()):J()}function U(){if("video"===nt.type){$(S.selectors.captions)||nt.videoContainer.insertAdjacentHTML("afterbegin",'<div class="'+p(S.selectors.captions)+'"></div>'),nt.usingTextTracks=!1,nt.media.textTracks&&(nt.usingTextTracks=!0);var e=[],t="";if(nt.media.childNodes.forEach(function(t){"track"===t.nodeName.toLowerCase()&&("captions"!==t.kind&&"subtitles"!==t.kind||e.push(t.getAttribute("src")))}),nt.captionExists=!0,0===e.length?(nt.captionExists=!1,it("No caption track found")):Number(S.captions.selectedIndex)+1>e.length?(nt.captionExists=!1,it("Caption index out of bound")):(t=e[S.captions.selectedIndex],it("Caption track found; URI: "+t)),nt.captionExists){var n=nt.media.textTracks;if([].forEach.call(n,function(e){h(e,"cuechange",X),e.mode="hidden"}),Q(nt),(nt.browser.isIE&&nt.browser.version>=10||nt.browser.isFirefox&&nt.browser.version>=31)&&(it("Detected browser with known TextTrack issues - using manual fallback"),nt.usingTextTracks=!1),nt.usingTextTracks){it("TextTracks supported");var a=n[S.captions.selectedIndex];"captions"!==a.kind&&"subtitles"!==a.kind||(g(a,"cuechange",X),a.activeCues&&a.activeCues.length>0&&X(a))}else if(it("TextTracks not supported so rendering captions manually"),nt.currentCaption="",nt.captions=[],""!==t){var r=new XMLHttpRequest;r.onreadystatechange=function(){if(4===r.readyState)if(200===r.status){var e=r.responseText,t="\r\n";e.indexOf(t+t)===-1&&(t=e.indexOf("\r\r")!==-1?"\r":"\n");var n=e.split(t+t);nt.captions=n.map(function(e){var n=e.split(t),a=0;return n[a].indexOf(":")!==-1&&(a=1),[n[a],n[a+1]]}),nt.captions.shift(),it("Successfully loaded the caption file via AJAX")}else st(S.logPrefix+"There was a problem loading the caption file via AJAX")},r.open("get",t,!0),r.send()}}else m(nt.container,S.classes.captions.enabled)}}function J(e){var t=$(S.selectors.captions);if(O.htmlElement(t)){var n=c("span");t.innerHTML="",O.undefined(e)&&(e=""),O.string(e)?n.innerHTML=e.trim():n.appendChild(e),t.appendChild(n);t.offsetHeight}}function K(e){function t(e,t){var n=[];n=e.split(" --> ");for(var a=0;a<n.length;a++)n[a]=n[a].replace(/(\d+:\d+:\d+\.\d+).*/,"$1");return r(n[t])}function n(e){return t(e,0)}function a(e){return t(e,1)}function r(e){if(null===e||void 0===e)return 0;var t=[],n=[],a=0;t=e.split(","),n=t[0].split(":");for(var r=0,o=n.length;r<o;r++)a+=Math.floor(n[r]*Math.pow(60,o-(r+1)));return a}if(!nt.usingTextTracks&&"video"===nt.type&&nt.supported.full&&(nt.subcount=0,e=O.number(e)?e:nt.media.currentTime,nt.captions[nt.subcount])){for(;a(nt.captions[nt.subcount][0])<e.toFixed(1);)if(nt.subcount++,nt.subcount>nt.captions.length-1){nt.subcount=nt.captions.length-1;break}nt.media.currentTime.toFixed(1)>=n(nt.captions[nt.subcount][0])&&nt.media.currentTime.toFixed(1)<=a(nt.captions[nt.subcount][0])?(nt.currentCaption=nt.captions[nt.subcount][1],J(nt.currentCaption)):J()}}function Q(){if(rt.buttons.captions){m(nt.container,S.classes.captions.enabled,!0);var e=nt.storage.captionsEnabled;O.boolean(e)||(e=S.captions.defaultActive),e&&(m(nt.container,S.classes.captions.active,!0),w(rt.buttons.captions,!0))}}function z(e){return nt.container.querySelectorAll(e)}function $(e){return z(e)[0]}function G(){try{return e.self!==e.top}catch(e){return!0}}function Z(){function e(e){9===e.which&&nt.isFullscreen&&(e.target!==a||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),a.focus()):(e.preventDefault(),n.focus()))}var t=z("input:not([disabled]), button:not([disabled])"),n=t[0],a=t[t.length-1];g(nt.container,"keydown",e)}function ee(e,t){if(O.string(t))d(e,nt.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)d(e,nt.media,t[n])}function te(){if(S.loadSprite){var e=j();e.absolute?(it("AJAX loading absolute SVG sprite"+(nt.browser.isIE?" (due to IE)":"")),A(e.url,"sprite-plyr")):it("Sprite will be used as external resource directly")}r(S.controls,"play-large")&&(rt.buttons.playLarge=D("play-large"),nt.container.appendChild(rt.buttons.playLarge)),nt.id=Math.floor(1e4*Math.random());var n,a=W({id:nt.id,seektime:S.seekTime,speed:ne(),language:"English"});if(O.string(S.selectors.controls.container)&&(n=t.querySelector(S.selectors.controls.container)),O.htmlElement(n)||(n=nt.container),n.appendChild(a),S.tooltips.controls)for(var o=z([S.selectors.controls.wrapper," ",S.selectors.labels," .",S.classes.hidden].join("")),i=o.length-1;i>=0;i--){var s=o[i];m(s,S.classes.hidden,!1),m(s,S.classes.tooltip,!0)}}function ne(){return S.currentSpeed.toFixed(1).toString().replace(".0","")+"&times;"}function ae(){try{return rt.controls=$(S.selectors.controls.wrapper),rt.buttons={play:z(S.selectors.buttons.play),pause:$(S.selectors.buttons.pause),restart:$(S.selectors.buttons.restart),rewind:$(S.selectors.buttons.rewind),forward:$(S.selectors.buttons.forward),fullscreen:$(S.selectors.buttons.fullscreen),settings:$(S.selectors.buttons.settings),pip:$(S.selectors.buttons.pip),speed:$(S.selectors.buttons.speed),loop:$(S.selectors.buttons.loop),mute:$(S.selectors.buttons.mute),captions:$(S.selectors.buttons.captions)},rt.progress={container:$(S.selectors.progress.container),buffer:$(S.selectors.progress.buffer),played:$(S.selectors.progress.played)},O.htmlElement(rt.progress.container)&&(rt.progress.tooltip=rt.progress.container.querySelector("."+S.classes.tooltip)),rt.inputs={seek:$(S.selectors.inputs.seek),volume:$(S.selectors.inputs.volume)},rt.display={volume:$(S.selectors.display.volume),duration:$(S.selectors.display.duration),currentTime:$(S.selectors.display.currentTime)},!0}catch(e){return st("It looks like there is a problem with your custom controls HTML",e),oe(!0),!1}}function re(){m(nt.container,S.selectors.container.replace(".",""),nt.supported.full)}function oe(e){e&&r(S.types.html5,nt.type)?nt.media.setAttribute("controls",""):nt.media.removeAttribute("controls")}function ie(e){var t=S.i18n.play;O.string(S.title)&&S.title.length&&(t+=", "+S.title,nt.container.setAttribute("aria-label",S.title)),nt.supported.full&&(O.htmlElement(rt.buttons.play)&&rt.buttons.play.setAttribute("aria-label",t),O.htmlElement(rt.buttons.playLarge)&&rt.buttons.playLarge.setAttribute("aria-label",t)),O.htmlElement(e)&&e.setAttribute("title",S.i18n.frameTitle.replace("{title}",S.title))}function se(){var t=null;nt.storage={},M.storage&&S.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(S.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?le({volume:parseFloat(t)}):nt.storage=JSON.parse(t)))}function le(t){M.storage&&S.storage.enabled&&(E(nt.storage,t),e.localStorage.setItem(S.storage.key,JSON.stringify(nt.storage)))}function ue(){if(!nt.media)return void st("No media element found!");if(nt.supported.full&&(m(nt.container,S.classes.type.replace("{0}",nt.type),!0),r(S.types.embed,nt.type)&&m(nt.container,S.classes.type.replace("{0}","video"),!0),m(nt.container,S.classes.pip.enabled,M.pip),m(nt.container,S.classes.stopped,S.autoplay),m(nt.container,S.classes.isIos,nt.browser.isIos),m(nt.container,S.classes.isTouch,nt.browser.isTouch),"video"===nt.type)){var e=t.createElement("div");e.setAttribute("class",S.classes.videoWrapper),o(nt.media,e),nt.videoContainer=e}r(S.types.embed,nt.type)&&ce()}function ce(){var n,r=t.createElement("div"),o=nt.type+"-"+Math.floor(1e4*Math.random());switch(nt.type){case"youtube":n=C(nt.embedId);break;case"vimeo":n=x(nt.embedId);break;default:n=nt.embedId}for(var s=z('[id^="'+nt.type+'-"]'),u=s.length-1;u>=0;u--)i(s[u]);if(m(nt.media,S.classes.videoWrapper,!0),m(nt.media,S.classes.embedWrapper,!0),"youtube"===nt.type)nt.media.appendChild(r),r.setAttribute("id",o),O.object(e.YT)?pe(n,r):(a(S.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){pe(n,r)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===nt.type)if(nt.supported.full?nt.media.appendChild(r):r=nt.media,r.setAttribute("id",o),O.object(e.Vimeo))me(n,r);else{a(S.urls.vimeo.api);var c=e.setInterval(function(){O.object(e.Vimeo)&&(e.clearInterval(c),me(n,r))},50)}else if("soundcloud"===nt.type){var d=t.createElement("iframe");d.loaded=!1,g(d,"load",function(){d.loaded=!0}),l(d,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+n,id:o}),r.appendChild(d),nt.media.appendChild(r),e.SC||a(S.urls.soundcloud.api);var p=e.setInterval(function(){e.SC&&d.loaded&&(e.clearInterval(p),fe.call(d))},50)}}function de(){nt.supported.full&&(Ze(),et()),ie($("iframe"))}function pe(t,n){nt.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:S.autoplay?1:0,controls:nt.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:S.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){F(nt.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;nt.media.play=function(){n.playVideo(),nt.media.paused=!1},nt.media.pause=function(){n.pauseVideo(),nt.media.paused=!0},nt.media.stop=function(){n.stopVideo(),nt.media.paused=!0},nt.media.duration=n.getDuration(),nt.media.paused=!0,nt.media.currentTime=0,nt.media.muted=n.isMuted();var a=n.getPlaybackRate(),r=n.getAvailablePlaybackRates();console.warn(a,r),S.title=n.getVideoData().title,nt.supported.full&&nt.media.querySelector("iframe").setAttribute("tabindex","-1"),de(),F(nt.media,"timeupdate"),F(nt.media,"durationchange"),e.clearInterval(at.buffering),at.buffering=e.setInterval(function(){nt.media.buffered=n.getVideoLoadedFraction(),(null===nt.media.lastBuffered||nt.media.lastBuffered<nt.media.buffered)&&F(nt.media,"progress"),nt.media.lastBuffered=nt.media.buffered,1===nt.media.buffered&&(e.clearInterval(at.buffering),F(nt.media,"canplaythrough"))},200)},onStateChange:function(t){var n=t.target;switch(e.clearInterval(at.playing),t.data){case 0:nt.media.paused=!0,F(nt.media,"ended");break;case 1:nt.media.paused=!1,nt.media.seeking&&F(nt.media,"seeked"),nt.media.seeking=!1,F(nt.media,"play"),F(nt.media,"playing"),at.playing=e.setInterval(function(){nt.media.currentTime=n.getCurrentTime(),F(nt.media,"timeupdate")},100),nt.media.duration!==n.getDuration()&&(nt.media.duration=n.getDuration(),F(nt.media,"durationchange"));var a=n.getAvailableQualityLevels(),r=n.getPlaybackQuality();B(a,r);break;case 2:nt.media.paused=!0,F(nt.media,"pause")}F(nt.container,"statechange",!1,{code:t.data})}}})}function me(t,n){nt.embed=new e.Vimeo.Player(n,{id:parseInt(t),loop:S.loop.active,autoplay:S.autoplay,byline:!1,portrait:!1,title:!1}),nt.media.play=function(){nt.embed.play(),nt.media.paused=!1},nt.media.pause=function(){nt.embed.pause(),nt.media.paused=!0},nt.media.stop=function(){nt.embed.stop(),nt.media.paused=!0},nt.media.paused=!0,nt.media.currentTime=0,de(),nt.embed.getCurrentTime().then(function(e){nt.media.currentTime=e,F(nt.media,"timeupdate")}),nt.embed.getDuration().then(function(e){nt.media.duration=e,F(nt.media,"durationchange")}),nt.embed.on("loaded",function(){O.htmlElement(nt.embed.element)&&nt.supported.full&&nt.embed.element.setAttribute("tabindex","-1")}),nt.embed.on("play",function(){nt.media.paused=!1,F(nt.media,"play"),F(nt.media,"playing")}),nt.embed.on("pause",function(){nt.media.paused=!0,F(nt.media,"pause")}),nt.embed.on("timeupdate",function(e){nt.media.seeking=!1,nt.media.currentTime=e.seconds,F(nt.media,"timeupdate")}),nt.embed.on("progress",function(e){nt.media.buffered=e.percent,F(nt.media,"progress"),1===parseInt(e.percent)&&F(nt.media,"canplaythrough")}),nt.embed.on("seeked",function(){nt.media.seeking=!1,F(nt.media,"seeked"),F(nt.media,"play")}),nt.embed.on("ended",function(){nt.media.paused=!0,F(nt.media,"ended")})}function fe(){nt.embed=e.SC.Widget(this),nt.embed.bind(e.SC.Widget.Events.READY,function(){nt.media.play=function(){nt.embed.play(),nt.media.paused=!1},nt.media.pause=function(){nt.embed.pause(),nt.media.paused=!0},nt.media.stop=function(){nt.embed.seekTo(0),nt.embed.pause(),nt.media.paused=!0},nt.media.paused=!0,nt.media.currentTime=0,nt.embed.getDuration(function(e){nt.media.duration=e/1e3,de()}),nt.embed.getPosition(function(e){nt.media.currentTime=e,F(nt.media,"timeupdate")}),nt.embed.bind(e.SC.Widget.Events.PLAY,function(){nt.media.paused=!1,F(nt.media,"play"),F(nt.media,"playing")}),nt.embed.bind(e.SC.Widget.Events.PAUSE,function(){nt.media.paused=!0,F(nt.media,"pause")}),nt.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS,function(e){nt.media.seeking=!1,nt.media.currentTime=e.currentPosition/1e3,F(nt.media,"timeupdate")}),nt.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS,function(e){nt.media.buffered=e.loadProgress,F(nt.media,"progress"),1===parseInt(e.loadProgress)&&F(nt.media,"canplaythrough")}),nt.embed.bind(e.SC.Widget.Events.FINISH,function(){nt.media.paused=!0,F(nt.media,"ended")})})}function be(){"play"in nt.media&&nt.media.play()}function ye(){"pause"in nt.media&&nt.media.pause()}function ve(e){return O.boolean(e)||(e=nt.media.paused),e?be():ye(),e}function ge(e){r(["start","end","all","none","toggle"],e)||(e="toggle");var n=Number(nt.media.currentTime);switch(e){case"start":S.loop.end&&S.loop.end<=n&&(S.loop.end=null),S.loop.start=n,S.loop.indicator.start=rt.progress.played.value;break;case"end":if(S.loop.start>=n)return;S.loop.end=n,S.loop.indicator.end=rt.progress.played.value;break;case"all":S.loop.start=0,S.loop.end=nt.media.duration-2,S.loop.indicator.start=0,S.loop.indicator.end=100;break;case"toggle":S.loop.active?(S.loop.start=0,S.loop.end=null):(S.loop.start=0,S.loop.end=nt.media.duration-2);break;default:S.loop.start=0,S.loop.end=null}S.loop.active=O.number(S.loop.start)&&O.number(S.loop.end);var a=(Ve(S.loop.start,$('[data-plyr-loop="start"]')),null);O.number(S.loop.end)&&(a=Ve(S.loop.end,t.querySelector('[data-loop__value="loopout"]'))),S.loop.active}function he(e){if(O.undefined(e)&&(e=nt.storage.speed||S.defaultSpeed),!O.array(S.speeds))return void st("Invalid speeds format");if(!O.number(e)){var n=S.speeds.indexOf(S.currentSpeed);if(n!==-1){var a=n+1;a>=S.speeds.length&&(a=0),e=S.speeds[a]}else e=S.defaultSpeed}S.currentSpeed=e,nt.media.playbackRate=e,le({speed:e}),t.querySelector('[data-menu="speed"]').innerHTML=ne()}function ke(e){O.number(e)||(e=S.seekTime),Te(nt.media.currentTime-e)}function we(e){O.number(e)||(e=S.seekTime),Te(nt.media.currentTime+e)}function Te(e){var t=0,n=nt.media.paused,a=Ee();O.number(e)?t=e:O.event(e)&&r(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),We(t);try{nt.media.currentTime=t.toFixed(4)}catch(e){}if(r(S.types.embed,nt.type)){switch(nt.type){case"youtube":nt.embed.seekTo(t);break;case"vimeo":nt.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":nt.embed.seekTo(1e3*t)}n&&ye(),F(nt.media,"timeupdate"),nt.media.seeking=!0,F(nt.media,"seeking")}it("Seeking to "+nt.media.currentTime+" seconds"),K(t)}function Ee(){var e=parseInt(S.duration),t=0;return null===nt.media.duration||isNaN(nt.media.duration)||(t=nt.media.duration),isNaN(e)?t:e}function Ce(){m(nt.container,S.classes.playing,!nt.media.paused),m(nt.container,S.classes.stopped,nt.media.paused),Ye(nt.media.paused)}function xe(){P={x:e.pageXOffset||0,y:e.pageYOffset||0}}function Se(){e.scrollTo(P.x,P.y)}function Ae(e){var n=M.fullscreen;if(n){if(!e||e.type!==N.eventType)return N.isFullScreen(nt.container)?N.cancelFullScreen():(xe(),N.requestFullScreen(nt.container)),void(nt.isFullscreen=N.isFullScreen(nt.container));nt.isFullscreen=N.isFullScreen(nt.container)}else nt.isFullscreen=!nt.isFullscreen,t.body.style.overflow=nt.isFullscreen?"hidden":"";m(nt.container,S.classes.fullscreen.active,nt.isFullscreen),Z(nt.isFullscreen),rt.buttons&&rt.buttons.fullscreen&&w(rt.buttons.fullscreen,nt.isFullscreen),F(nt.container,nt.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!nt.isFullscreen&&n&&Se()}function _e(e){if(O.boolean(e)||(e=!nt.media.muted),w(rt.buttons.mute,e),nt.media.muted=e,0===nt.media.volume&&Fe(S.volume),r(S.types.embed,nt.type)){switch(nt.type){case"youtube":nt.embed[nt.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":nt.embed.setVolume(nt.media.muted?0:parseFloat(S.volume/10))}F(nt.media,"volumechange")}}function Fe(e){var t=10,n=0;if(O.undefined(e)&&(e=nt.storage.volume),(null===e||isNaN(e))&&(e=S.volume),e>t&&(e=t),e<n&&(e=n),nt.media.volume=parseFloat(e/t),rt.display.volume&&(rt.display.volume.value=e),r(S.types.embed,nt.type)){switch(nt.type){case"youtube":nt.embed.setVolume(100*nt.media.volume);break;case"vimeo":case"soundcloud":nt.embed.setVolume(nt.media.volume)}F(nt.media,"volumechange")}0===e?nt.media.muted=!0:nt.media.muted&&e>0&&_e()}function Ie(e){var t=nt.media.muted?0:10*nt.media.volume;O.number(e)||(e=1),Fe(t+e)}function Ne(e){var t=nt.media.muted?0:10*nt.media.volume;O.number(e)||(e=1),Fe(t-e)}function Pe(){var e=nt.media.muted?0:10*nt.media.volume;nt.supported.full&&(rt.inputs.volume&&(rt.inputs.volume.value=e),rt.display.volume&&(rt.display.volume.value=e)),le({volume:e}),m(nt.container,S.classes.muted,0===e),nt.supported.full&&rt.buttons.mute&&w(rt.buttons.mute,0===e)}function Le(e){nt.supported.full&&rt.buttons.captions&&(O.boolean(e)||(e=nt.container.className.indexOf(S.classes.captions.active)===-1),nt.captionsEnabled=e,rt.buttons.captions_menu.innerHTML=e?"Off":"On",$('[data-captions="settings"]').innerHTML=Me(),w(rt.buttons.captions,nt.captionsEnabled),m(nt.container,S.classes.captions.active,nt.captionsEnabled),F(nt.container,nt.captionsEnabled?"captionsenabled":"captionsdisabled",!0),le({captionsEnabled:nt.captionsEnabled}))}function Oe(e){S.captions.selectedIndex=e||S.captions.selectedIndex,J(),U(),$('[data-captions="settings"]').innerHTML=Me()}function Me(){return 0===S.tracks.length?"No Subs":nt.captionsEnabled||!O.boolean(nt.captionsEnabled)&&nt.storage.captionsEnabled?S.tracks[S.captions.selectedIndex].label:"Disabled"}function qe(e){var t="waiting"===e.type;clearTimeout(at.loading),at.loading=setTimeout(function(){m(nt.container,S.classes.loading,t),Ye(t)},t?250:0)}function je(e){if(nt.supported.full){var t=rt.progress.played,n=0,a=Ee();if(e)switch(e.type){case"timeupdate":case"seeking":if(rt.controls.pressed)return;n=T(nt.media.currentTime,a),"timeupdate"===e.type&&rt.inputs.seek&&(rt.inputs.seek.value=n);break;case"playing":case"progress":t=rt.progress.buffer,n=function(){var e=nt.media.buffered;return e&&e.length?T(e.end(0),a):O.number(e)?100*e:0}()}O.number(S.loop.start)&&O.number(S.loop.end)&&nt.media.currentTime>=S.loop.end&&Te(S.loop.start),Re(t,n)}}function Re(e,t){if(nt.supported.full){if(O.undefined(t)&&(t=0),O.undefined(e)){if(!O.htmlElement(rt.progress.buffer))return;e=rt.progress.buffer}if(O.htmlElement(e)){e.value=t;var n=e.getElementsByTagName("span")[0];O.htmlElement(n)&&(n.childNodes[0].nodeValue=t)}}}function Ve(e,t){if(t){isNaN(e)&&(e=0),nt.secs=parseInt(e%60),nt.mins=parseInt(e/60%60),nt.hours=parseInt(e/60/60%60);var n=parseInt(Ee()/60/60%60)>0;nt.secs=("0"+nt.secs).slice(-2),nt.mins=("0"+nt.mins).slice(-2);var a=(n?nt.hours+":":"")+nt.mins+":"+nt.secs;return t.innerHTML=a,a}}function De(){if(nt.supported.full){var e=Ee()||0;!rt.display.duration&&S.displayDuration&&nt.media.paused&&Ve(e,rt.display.currentTime),rt.display.duration&&Ve(e,rt.display.duration),Be()}}function He(e){Ve(nt.media.currentTime,rt.display.currentTime),e&&"timeupdate"===e.type&&nt.media.seeking||je(e)}function We(e){O.number(e)||(e=0);var t=Ee(),n=T(e,t);rt.progress&&rt.progress.played&&(rt.progress.played.value=n),rt.buttons&&rt.inputs.seek&&(rt.inputs.seek.value=n)}function Be(e){var t=Ee();if(S.tooltips.seek&&rt.progress.container&&0!==t){var n=rt.progress.container.getBoundingClientRect(),a=0,o=S.classes.tooltip+"--visible";if(e)a=100/n.width*(e.pageX-n.left);else{if(!f(rt.progress.tooltip,o))return;a=rt.progress.tooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100),Ve(t/100*a,rt.progress.tooltip),rt.progress.tooltip.style.left=a+"%",e&&r(["mouseenter","mouseleave"],e.type)&&m(rt.progress.tooltip,o,"mouseenter"===e.type)}}function Ye(t){if(S.hideControls&&"audio"!==nt.type){var n=0,a=!1,o=t,i=f(nt.container,S.classes.loading);if(O.boolean(t)||(t&&t.type?(a="enterfullscreen"===t.type,o=r(["mousemove","touchstart","mouseenter","focus"],t.type),r(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):o=f(nt.container,S.classes.hideControls)),e.clearTimeout(at.hover),o||nt.media.paused||i){if(m(nt.container,S.classes.hideControls,!1),nt.media.paused||i)return;nt.browser.isTouch&&(n=3e3)}o&&nt.media.paused||(at.hover=e.setTimeout(function(){(!rt.controls.pressed&&!rt.controls.hover||a)&&m(nt.container,S.classes.hideControls,!0)},n))}}function Xe(e){if(!O.undefined(e))return void Ue(e);var t;switch(nt.type){case"youtube":t=nt.embed.getVideoUrl();break;case"vimeo":nt.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":nt.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=nt.media.currentSrc}return t||""}function Ue(e){function n(){if(nt.embed=null,i(nt.media),"video"===nt.type&&nt.videoContainer&&i(nt.videoContainer),nt.container&&nt.container.removeAttribute("class"),"type"in e&&(nt.type=e.type,"video"===nt.type)){var n=e.sources[0];"type"in n&&r(S.types.embed,n.type)&&(nt.type=n.type)}switch(nt.supported=_(nt.type),nt.type){case"video":nt.media=t.createElement("video");break;case"audio":nt.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":nt.media=t.createElement("div"),nt.embedId=e.sources[0].src}s(nt.container,nt.media),O.boolean(e.autoplay)&&(S.autoplay=e.autoplay),r(S.types.html5,nt.type)&&(S.crossorigin&&nt.media.setAttribute("crossorigin",""),S.autoplay&&nt.media.setAttribute("autoplay",""),"poster"in e&&nt.media.setAttribute("poster",e.poster),S.loop.active&&nt.media.setAttribute("loop","")),m(nt.container,S.classes.fullscreen.active,nt.isFullscreen),m(nt.container,S.classes.captions.active,nt.captionsEnabled),re(),r(S.types.html5,nt.type)&&ee("source",e.sources),ue(),r(S.types.html5,nt.type)&&("tracks"in e&&ee("track",e.tracks),nt.media.load()),(r(S.types.html5,nt.type)||r(S.types.embed,nt.type)&&!nt.supported.full)&&(Ze(),et()),S.title=e.title,ie()}return O.object(e)&&"sources"in e&&e.sources.length?(m(nt.container,S.classes.ready,!1),ye(),We(),Re(),ze(),void $e(n,!1)):void st("Invalid source format")}function Je(e){"video"===nt.type&&nt.media.setAttribute("poster",e)}function Ke(){function n(){var e=ve(),t=rt.buttons[e?"play":"pause"],n=rt.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var a=f(t,S.classes.tabFocus);setTimeout(function(){n.focus(),a&&(m(t,S.classes.tabFocus,!1),m(n,S.classes.tabFocus,!0))},100)}}function a(){var e=t.activeElement;return e=e&&e!==t.body?t.querySelector(":focus"):null}function o(e){return e.keyCode?e.keyCode:e.which}function s(e){for(var t in rt.buttons){var n=rt.buttons[t];if(O.nodeList(n))for(var a=0;a<n.length;a++)m(n[a],S.classes.tabFocus,n[a]===e);else m(n,S.classes.tabFocus,n===e)}}function l(e){function t(){var e=nt.media.duration;O.number(e)&&Te(e/10*(i-48))}var i=o(e),s="keydown"===e.type,l=s&&i===c;if(O.number(i))if(s){var u=[48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79],d=[38,40];if(r(d,i)){var p=a();if(O.htmlElement(p)&&"radio"===a().type)return}switch(r(u,i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:l||t();break;case 32:case 75:l||n();break;case 38:Ie();break;case 40:Ne();break;case 77:l||_e();break;case 39:we();break;case 37:ke();break;case 70:Ae();break;case 67:l||Le();break;case 73:ge("start");break;case 76:ge();break;case 79:ge("end")}!M.fullscreen&&nt.isFullscreen&&27===i&&Ae(),c=i}else c=null}var u=nt.browser.isIE?"change":"input";if(S.keyboardShortcuts.focused){var c=null;S.keyboardShortcuts.global&&g(e,"keydown keyup",function(e){var t=o(e),n=a(),i=[48,49,50,51,52,53,54,56,57,75,77,70,67,73,76,79],s=I().length;1!==s||!r(i,t)||O.htmlElement(n)&&b(n,S.selectors.editable)||l(e);
+}),g(nt.container,"keydown keyup",l)}g(e,"keyup",function(e){var t=o(e),n=a();9===t&&s(n)}),g(t.body,"click",function(){m($("."+S.classes.tabFocus),S.classes.tabFocus,!1)});for(var d in rt.buttons){var p=rt.buttons[d];g(p,"blur",function(){m(p,"tab-focus",!1)})}y(rt.buttons.play,"click",S.listeners.play,n),y(rt.buttons.playLarge,"click",S.listeners.play,n),y(rt.buttons.pause,"click",S.listeners.pause,n),y(rt.buttons.restart,"click",S.listeners.restart,Te),y(rt.buttons.rewind,"click",S.listeners.rewind,ke),y(rt.buttons.forward,"click",S.listeners.forward,we),y(rt.buttons.speed,"click",S.listeners.speed,function(){var e=t.querySelector('[data-plyr="speed"]:checked').value;he(Number(e))}),y(rt.inputs.seek,u,S.listeners.seek,Te),y(rt.inputs.volume,u,S.listeners.volume,function(){Fe(rt.inputs.volume.value)}),y(rt.buttons.mute,"click",S.listeners.mute,_e),y(rt.buttons.fullscreen,"click",S.listeners.fullscreen,Ae),y(rt.buttons.loop,"click",S.listeners.loop,function(e){var t=e.target.getAttribute("data-loop__value")||e.target.getAttribute("data-loop__type");r(["start","end","all","none"],t)&&ge(t)}),M.fullscreen&&g(t,N.eventType,Ae),y(rt.buttons.captions,"click",S.listeners.captions,Le),y(rt.buttons.lang,"click",S.listeners.lang,function(e){var t=e.target.attributes.getNamedItem("data-index").value;Oe(t)}),g(rt.buttons.settings,"click",function(n){var a=this,r=n.target,o=t.getElementById(r.getAttribute("aria-controls")),s="false"===r.getAttribute("aria-expanded");if(O.htmlElement(o)){var l,u,c,d="tabpanel"===o.getAttribute("role");if(d){var p=a.querySelector('[role="tabpanel"][aria-hidden="false"]');c=p.parentNode,[].forEach.call(a.querySelectorAll('[aria-controls="'+p.getAttribute("id")+'"]'),function(e){e.setAttribute("aria-expanded",!1)}),c.style.width=p.scrollWidth+"px",c.style.height=p.scrollHeight+"px",p.setAttribute("aria-hidden",!0),p.setAttribute("tabindex",-1);var m=o.cloneNode(!0);m.style.position="absolute",m.style.opacity=0,m.setAttribute("aria-hidden",!1),c.appendChild(m),l=m.scrollWidth,u=m.scrollHeight,i(m)}o.setAttribute("aria-hidden",!s),r.setAttribute("aria-expanded",s),o.setAttribute("tabindex",0),d&&(c.style.width=l+"px",c.style.height=u+"px",e.setTimeout(function(){c.style.width="",c.style.height=""},300))}}),g(rt.buttons.pip,"click",function(){nt.media.webkitSetPresentationMode("picture-in-picture"===nt.media.webkitPresentationMode?"inline":"picture-in-picture")}),g(rt.progress.container,"mouseenter mouseleave mousemove",Be),S.hideControls&&(g(nt.container,"mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen",Ye),g(rt.controls,"mouseenter mouseleave",function(e){rt.controls.hover="mouseenter"===e.type}),g(rt.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){rt.controls.pressed=r(["mousedown","touchstart"],e.type)}),g(rt.controls,"focus blur",Ye,!0)),g(rt.inputs.volume,"wheel",function(e){e.preventDefault();var t=e.webkitDirectionInvertedFromDevice,n=.2;(e.deltaY<0||e.deltaX>0)&&(t?Ne(n):Ie(n)),(e.deltaY>0||e.deltaX<0)&&(t?Ie(n):Ne(n))})}function Qe(){if(g(nt.media,"timeupdate seeking",He),g(nt.media,"timeupdate",K),g(nt.media,"durationchange loadedmetadata",De),g(nt.media,"ended",function(){"video"===nt.type&&S.showPosterOnEnd&&("video"===nt.type&&J(),Te(),nt.media.load())}),g(nt.media,"progress playing",je),g(nt.media,"volumechange",Pe),g(nt.media,"play pause ended",Ce),g(nt.media,"waiting canplay seeked",qe),S.clickToPlay&&"audio"!==nt.type){var e=$("."+S.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",g(e,"click",function(){S.hideControls&&nt.browser.isTouch&&!nt.media.paused||(nt.media.paused?be():nt.media.ended?(Te(),be()):ye())})}S.disableContextMenu&&g(nt.media,"contextmenu",function(e){e.preventDefault()}),g(nt.media,S.events.concat(["keyup","keydown"]).join(" "),function(e){F(nt.container,e.type,!0)})}function ze(){if(r(S.types.html5,nt.type)){for(var e=nt.media.querySelectorAll("source"),t=0;t<e.length;t++)i(e[t]);nt.media.setAttribute("src","https://cdn.selz.com/plyr/blank.mp4"),nt.media.load(),it("Cancelled network requests")}}function $e(n,a){function r(){O.boolean(a)||(a=!0),O.function(n)&&n.call(ot),a&&(nt.init=!1,nt.container.parentNode.replaceChild(ot,nt.container),t.body.style.overflow="",F(ot,"destroyed",!0))}if(!nt.init)return null;switch(nt.type){case"youtube":e.clearInterval(at.buffering),e.clearInterval(at.playing),nt.embed.destroy(),r();break;case"vimeo":nt.embed.unload().then(r),e.setTimeout(r,200);break;case"video":case"audio":oe(!0),r()}}function Ge(){if(nt.init)return null;if(nt.browser=n(),O.htmlElement(nt.media)){se();var e=v.tagName.toLowerCase();"div"===e?(nt.type=v.getAttribute("data-type"),nt.embedId=v.getAttribute("data-video-id"),v.removeAttribute("data-type"),v.removeAttribute("data-video-id")):(nt.type=e,S.crossorigin=null!==v.getAttribute("crossorigin"),S.autoplay=S.autoplay||null!==v.getAttribute("autoplay"),S.loop=S.loop||null!==v.getAttribute("loop")),nt.supported=_(nt.type),nt.supported.basic&&(nt.container=o(v,t.createElement("div")),nt.container.setAttribute("tabindex",0),re(),it(""+nt.browser.name+" "+nt.browser.version),ue(),(r(S.types.html5,nt.type)||r(S.types.embed,nt.type)&&!nt.supported.full)&&(Ze(),et(),ie()),nt.init=!0)}}function Ze(){if(!nt.supported.full)return st("Basic support only",nt.type),i($(S.selectors.controls.wrapper)),i($(S.selectors.buttons.play)),void oe(!0);var e=!z(S.selectors.controls.wrapper).length;e&&te(),ae()&&(e&&Ke(),Qe(),oe(),Y(),U(),Oe(),Fe(),Pe(),he(),ge(),He(),Ce())}function et(){e.setTimeout(function(){F(nt.media,"ready")},0),m(nt.media,L.classes.setup,!0),m(nt.container,S.classes.ready,!0),nt.media.plyr=tt,S.autoplay&&be()}var tt,nt=this,at={},rt={buttons:{},display:{},progress:{},inputs:{}};nt.media=v;var ot=v.cloneNode(!0),it=function(){q("log",arguments)},st=function(){q("warn",arguments)};return it("Config",S),it("Support",M),tt={getOriginal:function(){return ot},getContainer:function(){return nt.container},getEmbed:function(){return nt.embed},getMedia:function(){return nt.media},getType:function(){return nt.type},getDuration:Ee,getCurrentTime:function(){return nt.media.currentTime},getVolume:function(){return nt.media.volume},isMuted:function(){return nt.media.muted},isReady:function(){return f(nt.container,S.classes.ready)},isLoading:function(){return f(nt.container,S.classes.loading)},isPaused:function(){return nt.media.paused},isLooping:function(){return S.loop.active},on:function(e,t){return g(nt.container,e,t),this},play:be,pause:ye,loop:ge,stop:function(){ye(),Te()},restart:Te,rewind:ke,forward:we,seek:Te,source:Xe,poster:Je,setVolume:Fe,setSpeed:he,togglePlay:ve,toggleMute:_e,toggleCaptions:Le,toggleFullscreen:Ae,toggleControls:Ye,setCaptionIndex:Oe,isFullscreen:function(){return nt.isFullscreen||!1},support:function(e){return M.mime(nt,e)},destroy:$e},Ge(),nt.init?tt:null}function A(e,n){var a=new XMLHttpRequest;if(!O.string(n)||!O.htmlElement(t.querySelector("#"+n))){var r=t.createElement("div");r.setAttribute("hidden",""),O.string(n)&&r.setAttribute("id",n),t.body.insertBefore(r,t.body.childNodes[0]),"withCredentials"in a&&(a.open("GET",e,!0),a.onload=function(){r.innerHTML=a.responseText},a.send())}}function _(e){var a,r,o=n(),i=o.isIE&&o.version<=9,s=o.isIos,l=/iPhone|iPod/i.test(navigator.userAgent),u=!!t.createElement("audio").canPlayType,c=!!t.createElement("video").canPlayType;switch(e){case"video":a=c,r=a&&!i&&!l;break;case"audio":a=u,r=a&&!i;break;case"vimeo":case"youtube":case"soundcloud":a=!0,r=!i&&!s;break;default:a=u&&c,r=a&&!i}return{basic:a,full:r}}function F(e,n){function a(e,t){f(t,L.classes.hook)||r.push({target:e,media:t})}var r=[],o=[],i=[L.selectors.html5,L.selectors.embed].join(",");if(O.string(e)?e=t.querySelectorAll(e):O.htmlElement(e)?e=[e]:O.nodeList(e)||O.array(e)||O.string(e)||(O.undefined(n)&&O.object(e)&&(n=e),e=t.querySelectorAll(i)),O.nodeList(e)&&(e=Array.prototype.slice.call(e)),!_().basic||!e.length)return!1;for(var s=0;s<e.length;s++){var l=e[s],u=l.querySelectorAll(i);if(u.length)for(var c=0;c<u.length;c++)a(l,u[c]);else b(l,i)&&a(l,l)}return r.forEach(function(e){var t=e.target,a=e.media,r=!1;a===t&&(r=!0);var i={};try{i=JSON.parse(t.getAttribute("data-plyr"))}catch(e){}var s=E({},L,n,i);if(!s.enabled)return null;var l=new S(a,s);if(O.object(l)){if(s.debug){var u=s.events.concat(["setup","statechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled"]);g(l.getContainer(),u.join(" "),function(e){console.log([s.logPrefix,"event:",e.type].join(" "),e.detail.plyr)})}k(l.getContainer(),"setup",!0,{plyr:l}),o.push(l)}}),o}function I(e){if(O.string(e)?e=t.querySelector(e):O.undefined(e)&&(e=t.body),O.htmlElement(e)){var n=e.querySelectorAll("."+L.classes.setup),a=[];return Array.prototype.slice.call(n).forEach(function(e){O.object(e.plyr)&&a.push(e.plyr)}),a}return[]}var N,P={x:0,y:0},L={enabled:!0,debug:!1,autoplay:!1,loop:{active:!1,start:0,end:null,indicator:{start:0,end:0}},seekTime:10,volume:10,defaultSpeed:1,currentSpeed:1,speeds:[.5,1,1.5,2],duration:null,displayDuration:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/2.0.10/plyr.svg",clickToPlay:!0,hideControls:!0,showPosterOnEnd:!1,disableContextMenu:!0,quality:{options:!1},keyboardShortcuts:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},tracks:[],selectors:{html5:"video, audio",embed:"[data-type]",editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',forward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',fullscreen:'[data-plyr="fullscreen"]',settings:'[data-plyr="settings"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',speed:'[data-plyr="speed"]',loop:'[data-plyr="loop"]',captions:'[data-plyr="captions"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]'},display:{volume:".plyr__volume--display",currentTime:".plyr__time--current",duration:".plyr__time--duration"},progress:{container:".plyr__progress",buffer:".plyr__progress--buffer",played:".plyr__progress--played",loop:".plyr__progress-loop"},captions:".plyr__captions",menu:{quality:".js-plyr__menu__list--quality"}},classes:{setup:"plyr--setup",ready:"plyr--ready",videoWrapper:"plyr__video-wrapper",embedWrapper:"plyr__video-embed",type:"plyr--{0}",stopped:"plyr--stopped",playing:"plyr--playing",muted:"plyr--muted",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",active:"plyr--fullscreen-active"},pip:{enabled:"plyr--pip-enabled",active:"plyr--pip-active"},tabFocus:"tab-focus"},captions:{defaultActive:!1,selectedIndex:0},fullscreen:{enabled:!0,fallback:!0,allowAudio:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],i18n:{restart:"Restart",rewind:"Rewind {seektime} secs",play:"Play",pause:"Pause",forward:"Forward {seektime} secs",seek:"Seek",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",toggleMute:"Toggle Mute",toggleCaptions:"Toggle Captions",toggleFullscreen:"Toggle Fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",speed:"Speed",quality:"Quality",loop:"Loop",loopStart:"Loop start",loopEnd:"Loop end",loopAll:"Loop all",loopNone:"No Loop"},types:{embed:["youtube","vimeo","soundcloud"],html5:["video","audio"]},urls:{vimeo:{api:"https://player.vimeo.com/api/player.js"},youtube:{api:"https://www.youtube.com/iframe_api"},soundcloud:{api:"https://w.soundcloud.com/player/api.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,forward:null,mute:null,volume:null,captions:null,fullscreen:null,speed:null,loop:null},events:["ready","ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied"],logPrefix:""},O={object:function(e){return null!==e&&"object"==typeof e&&e.constructor===Object},array:function(e){return null!==e&&"object"==typeof e&&e.constructor===Array},number:function(e){return null!==e&&("number"==typeof e&&!isNaN(e-0)||"object"==typeof e&&e.constructor===Number)},string:function(e){return null!==e&&("string"==typeof e||"object"==typeof e&&e.constructor===String)},boolean:function(e){return null!==e&&"boolean"==typeof e},nodeList:function(e){return null!==e&&e instanceof NodeList},htmlElement:function(e){return null!==e&&e instanceof HTMLElement},function:function(e){return null!==e&&"function"==typeof e},event:function(e){return null!==e&&"object"==typeof e&&(e.constructor===Event||e.constructor===CustomEvent)},undefined:function(e){return null!==e&&"undefined"==typeof e},empty:function(e){return null===e||this.undefined(e)||(this.string(e)||this.array(e)||this.nodeList(e))&&0===e.length||this.object(e)&&0===Object.keys(e).length}};!function(){var e=function(){var e=!1;return O.function(t.cancelFullScreen)?e="":["webkit","o","moz","ms","khtml"].some(function(n){return O.function(t[n+"CancelFullScreen"])?(e=n,!0):O.function(t.msExitFullscreen)&&t.msFullscreenEnabled?(e="ms",!0):void 0}),e}();N={prefix:e,eventType:"ms"===e?"MSFullscreenChange":e+"fullscreenchange",isFullScreen:function(n){if(!M.fullscreen)return!1;switch(O.undefined(n)&&(n=t.body),this.prefix){case"":return t.fullscreenElement===n;case"moz":return t.mozFullScreenElement===n;default:return t[e+"FullscreenElement"]===n}},requestFullScreen:function(n){return!!M.fullscreen&&(O.htmlElement(n)||(n=t.body),console.log(e),""===e?n.requestFullScreen():n[e+("ms"===e?"RequestFullscreen":"RequestFullScreen")]())},cancelFullScreen:function(){return!!M.fullscreen&&(""===e?t.cancelFullScreen():t[e+("ms"===e?"ExitFullscreen":"CancelFullScreen")]())},element:function(){return M.fullscreen?""===e?t.fullscreenElement:t[e+"FullscreenElement"]:null}}}();var M={fullscreen:N.prefix!==!1,storage:function(){if(!("localStorage"in e))return!1;try{e.localStorage.setItem("___test","OK");var t=e.localStorage.getItem("___test");return e.localStorage.removeItem("___test"),"OK"===t}catch(e){return!1}return!1}(),pip:function(){return O.function(t.createElement("video").webkitSetPresentationMode)}(),airplay:function(){return O.function(e.WebKitPlaybackTargetAvailabilityEvent)}(),mime:function(e,t){var n=e.media;try{if(!O.function(n.canPlayType))return!1;if("video"===e.type)switch(t){case"video/webm":return n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return n.canPlayType('video/ogg; codecs="theora"').replace(/no/,"")}else if("audio"===e.type)switch(t){case"audio/mpeg":return n.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return n.canPlayType('audio/wav; codecs="1"').replace(/no/,"")}}catch(e){return!1}return!1}};return{setup:F,supported:_,loadSprite:A,get:I}}),function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}"function"!=typeof window.CustomEvent&&(e.prototype=window.Event.prototype,window.CustomEvent=e)}(); \ No newline at end of file
diff --git a/notes.md b/notes.md
index 373e7edd..8cc39a76 100644
--- a/notes.md
+++ b/notes.md
@@ -15,4 +15,12 @@
- No Vimeo or YouTube caption support
#### Bugs
-- Fix audio setup bug when calling .setup() again \ No newline at end of file
+- Fix audio setup bug when calling .setup() again
+
+#### Breaking changes
+- Custom controls HTML removed (temporarily, will return)
+- Selectors changes (new `input` and `display` object) - DOCUMENT
+
+## Added
+- Seek i8n label
+- Loop i8n labels \ No newline at end of file
diff --git a/readme.md b/readme.md
index c417c6cc..fade70e2 100644
--- a/readme.md
+++ b/readme.md
@@ -34,7 +34,7 @@ Check out the [changelog](changelog.md) to see what's new with Plyr.
## Features currently being developed
- Playback speed selection
-- Quality selection
+- Quality selection
- Caption language selection
- AirPlay
- Picture in Picture (MacOS Sierra + Safari)
@@ -126,7 +126,7 @@ Note: `data-video-id` value can now be the ID or URL for the video. This attribu
```
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
+### JavaScript
Include the `plyr.js` script before the closing `</body>` tag and then call `plyr.setup()`. More info on `setup()` can be found under [initialising](#initialising).
```html
@@ -159,7 +159,7 @@ The SVG sprite is loaded automatically from our CDN (provided by [Fastly](https:
## Advanced
### LESS & SASS/SCSS
-You can use `plyr.less` or `plyr.scss` file included in `/src` as part of your build and change variables to suit your design. The LESS and SASS require you to use the [autoprefixer](https://www.npmjs.com/package/gulp-autoprefixer) plugin (you should already) as all declerations use the W3C definitions - e.g. `appearance: none;` will be prefixed to `-webkit-appearance: none;` by autoprefixer.
+You can use `plyr.less` or `plyr.scss` file included in `/src` as part of your build and change variables to suit your design. The LESS and SASS require you to use the [autoprefixer](https://www.npmjs.com/package/gulp-autoprefixer) plugin (you should already) as all declerations use the W3C definitions - e.g. `appearance: none;` will be prefixed to `-webkit-appearance: none;` by autoprefixer.
The HTML markup uses the BEM methodology with `plyr` as the block, e.g. `.plyr__controls`. You can change the class hooks in the options to match any custom CSS you write. Check out the JavaScript source for more on this.
@@ -167,7 +167,7 @@ The HTML markup uses the BEM methodology with `plyr` as the block, e.g. `.plyr__
The icons used in the Plyr controls are loaded in an SVG sprite. The sprite is automatically loaded from our CDN by default. If you already have an icon build system in place, you can include the source plyr icons (see `/src/sprite` for source icons).
#### Using the `iconUrl` option
-You can however specify your own `iconUrl` option and Plyr will determine if the url is absolute and requires loading by AJAX/CORS due to current browser limitations or if it's a relative path, just use the path directly.
+You can however specify your own `iconUrl` option and Plyr will determine if the url is absolute and requires loading by AJAX/CORS due to current browser limitations or if it's a relative path, just use the path directly.
If you're using the `<base>` tag on your site, you may need to use something like this:
[svgfixer.js](https://gist.github.com/leonderijke/c5cf7c5b2e424c0061d2)
@@ -213,7 +213,7 @@ Passing a [string selector](https://developer.mozilla.org/en-US/docs/Web/API/Doc
plyr.setup('.js-player', options);
```
-The NodeList, HTMLElement or string selector can be the target `<video>`, `<audio>` or `[data-type]` (for embeds) element itself or a container element.
+The NodeList, HTMLElement or string selector can be the target `<video>`, `<audio>` or `[data-type]` (for embeds) element itself or a container element.
Passing just the options object:
```javascript
@@ -223,7 +223,7 @@ plyr.setup(options);
`setup()` will return an array of *instances* that can be used with the [API](#api) methods. See the [API](#api) section for more info.
#### RangeTouch
-Some touch browsers (particularly Mobile Safari on iOS) seem to have issues with `<input type="range">` elements whereby touching the track to set the value doesn't work and sliding the thumb can be tricky. To combat this, I've created [RangeTouch](https://rangetouch.com) which I'd recommend including in your solution. It's a tiny script with a nice benefit for users on touch devices.
+Some touch browsers (particularly Mobile Safari on iOS) seem to have issues with `<input type="range">` elements whereby touching the track to set the value doesn't work and sliding the thumb can be tricky. To combat this, I've created [RangeTouch](https://rangetouch.com) which I'd recommend including in your solution. It's a tiny script with a nice benefit for users on touch devices.
#### Options
Options must be passed as an object to the `setup()` method as above or as JSON in `data-plyr` attribute on each of your target elements:
@@ -369,24 +369,12 @@ Note the single quotes encapsulating the JSON and double quotes on the object ke
<td>Displays the duration of the media on the "metadataloaded" event (on startup) in the current time display. This will only work if the `preload` attribute is not set to `none` (or is not set at all) and you choose not to display the duration (see <code>controls</code> option).</td>
</tr>
<tr>
- <td><code>selectors</code></td>
- <td>Object</td>
- <td>&mdash;</td>
- <td>See <code>plyr.js</code> in <code>/src</code> for more info. You probably don't need to change any of these.</td>
- </tr>
- <tr>
<td><code>listeners</code></td>
<td>Object</td>
<td>&mdash;</td>
<td>Allows early binding of event listeners to the controls. See <code>controls</code> above for list of controls and see <code>plyr.js</code> in <code>/src</code> for more info.</td>
</tr>
<tr>
- <td><code>classes</code></td>
- <td>Object</td>
- <td>&mdash;</td>
- <td>Similar to above, these are the classes added to the player when state changes occur.</td>
- </tr>
- <tr>
<td><code>captions</code></td>
<td>Object</td>
<td>&mdash;</td>
@@ -468,7 +456,7 @@ This will return an array of all instances that were setup. Another way is to us
var players = plyr.get('.js-player');
```
-If no argument is passed, it will find all instances in the current document. This will return an array of all instances that were found in the given selector.
+If no argument is passed, it will find all instances in the current document. This will return an array of all instances that were found in the given selector.
A final option is to access the instance through the event handlers:
@@ -930,7 +918,7 @@ YouTube and Vimeo are currently supported and function much like a HTML5 video.
Plyr references a custom version of the Vimeo Froogaloop API as Vimeo have neglected to maintain the library and there were bugs with their version. You don't need to worry about including your own versions of the Vimeo or YouTube JavaScript APIs.
-The embed third party API's can be accessed through the `getEmbed()` API method.
+The embed third party API's can be accessed through the `getEmbed()` API method.
More info on the respective API's here:
@@ -940,7 +928,7 @@ More info on the respective API's here:
*Please note*: not all API methods may work 100%. Your mileage may vary. It's better to use the universal plyr API where possible.
## Shortcuts
-By default, a player will bind the following keyboard shortcuts when it has focus. If you have the `global` option to `true` and there's only one player in the document then the shortcuts will work when any element has focus, apart from an element that requires input.
+By default, a player will bind the following keyboard shortcuts when it has focus. If you have the `global` option to `true` and there's only one player in the document then the shortcuts will work when any element has focus, apart from an element that requires input.
<table class="table" width="100%">
<thead>
@@ -955,7 +943,7 @@ By default, a player will bind the following keyboard shortcuts when it has focu
<td><code>0</code> to <code>9</code></td>
<td>✔</td>
<td>Seek from 0 to 90% respectively</td>
- </tr>
+ </tr>
<tr>
<td><code>space</code></td>
<td></td>
@@ -1019,7 +1007,7 @@ By default, a player will bind the following keyboard shortcuts when it has focu
</tbody>
</table>
-## Streaming
+## Streaming
Because Plyr is an extension of the standard HTML5 video and audio elements, third party streaming plugins can be used with Plyr. Massive thanks to Matias Russitto ([@russitto](https://github.com/russitto)) for working on this. Here's a few examples:
- Using [hls.js](https://github.com/dailymotion/hls.js) - [Demo](http://codepen.io/sampotts/pen/JKEMqB)
@@ -1027,7 +1015,7 @@ Because Plyr is an extension of the standard HTML5 video and audio elements, thi
- Using [dash.js](https://github.com/Dash-Industry-Forum/dash.js) - [Demo](http://codepen.io/sampotts/pen/BzpJXN)
## Fullscreen
-Fullscreen in Plyr is supported by all browsers that [currently support it](http://caniuse.com/#feat=fullscreen).
+Fullscreen in Plyr is supported by all browsers that [currently support it](http://caniuse.com/#feat=fullscreen).
## Browser support
@@ -1119,7 +1107,7 @@ Also these links helped created Plyr:
## Thanks
[![Fastly](https://www.fastly.com/sites/all/themes/custom/fastly2016/logo.png)](https://www.fastly.com/)
-Thanks to [Fastly](https://www.fastly.com/) for providing the CDN services.
+Thanks to [Fastly](https://www.fastly.com/) for providing the CDN services.
## Copyright and License
[The MIT license](license.md).
diff --git a/src/js/plyr.js b/src/js/plyr.js
index 21edc662..57bf29ce 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -28,204 +28,241 @@
// Globals
var scroll = {
- x: 0,
- y: 0
- },
+ x: 0,
+ y: 0
+ };
- // Default config
- defaults = {
- enabled: true,
- debug: false,
- autoplay: false,
- loop: {
- active: false,
+ // Default config
+ var defaults = {
+ enabled: true,
+ debug: false,
+ autoplay: false,
+ loop: {
+ active: false,
+ start: 0,
+ end: null,
+ indicator: {
start: 0,
- end: null,
- indicator: {
- start: 0,
- end: 0
- }
- },
- seekTime: 10,
- volume: 10,
- volumeMin: 0,
- volumeMax: 10,
- volumeStep: 1,
- defaultSpeed: 1.0,
- currentSpeed: 1,
- speeds: [0.5, 1.0, 1.5, 2.0],
- duration: null,
- displayDuration: true,
- loadSprite: true,
- iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/2.0.10/plyr.svg',
- clickToPlay: true,
- hideControls: true,
- showPosterOnEnd: false,
- disableContextMenu: true,
- quality: {
- options: false
+ end: 0
+ }
+ },
+ seekTime: 10,
+ volume: 10,
+ defaultSpeed: 1.0,
+ currentSpeed: 1,
+ speeds: [0.5, 1.0, 1.5, 2.0],
+ duration: null,
+ displayDuration: true,
+ loadSprite: true,
+ iconPrefix: 'plyr',
+ iconUrl: 'https://cdn.plyr.io/2.0.10/plyr.svg',
+ clickToPlay: true,
+ hideControls: true,
+ showPosterOnEnd: false,
+ disableContextMenu: true,
+ quality: {
+ options: false
+ },
+ keyboardShortcuts: {
+ focused: true,
+ global: false
+ },
+ tooltips: {
+ controls: false,
+ seek: true
+ },
+ tracks: [],
+ selectors: {
+ html5: 'video, audio',
+ embed: '[data-type]',
+ editable: 'input, textarea, select, [contenteditable]',
+ container: '.plyr',
+ controls: {
+ container: null,
+ wrapper: '.plyr__controls'
},
- keyboardShortcuts: {
- focused: true,
- global: false
+ labels: '[data-plyr]',
+ buttons: {
+ play: '[data-plyr="play"]',
+ pause: '[data-plyr="pause"]',
+ restart: '[data-plyr="restart"]',
+ rewind: '[data-plyr="rewind"]',
+ forward: '[data-plyr="fast-forward"]',
+ mute: '[data-plyr="mute"]',
+ fullscreen: '[data-plyr="fullscreen"]',
+ settings: '[data-plyr="settings"]',
+ pip: '[data-plyr="pip"]',
+ airplay: '[data-plyr="airplay"]',
+ speed: '[data-plyr="speed"]',
+ loop: '[data-plyr="loop"]',
+ captions: '[data-plyr="captions"]',
+ //captions_menu: '[data-plyr="captions_menu"]',
+ //captions_lang: '[data-plyr="captions_lang"]',
},
- tooltips: {
- controls: false,
- seek: true
+ inputs: {
+ seek: '[data-plyr="seek"]',
+ volume: '[data-plyr="volume"]'
},
- tracks: [],
- selectors: {
- html5: 'video, audio',
- embed: '[data-type]',
- editable: 'input, textarea, select, [contenteditable]',
- container: '.plyr',
- controls: {
- container: null,
- wrapper: '.plyr__controls'
- },
- labels: '[data-plyr]',
- buttons: {
- seek: '[data-plyr="seek"]',
- play: '[data-plyr="play"]',
- pause: '[data-plyr="pause"]',
- restart: '[data-plyr="restart"]',
- rewind: '[data-plyr="rewind"]',
- forward: '[data-plyr="fast-forward"]',
- mute: '[data-plyr="mute"]',
- captions: '[data-plyr="captions"]',
- captions_menu: '[data-plyr="captions_menu"]',
- captions_lang: '[data-plyr="captions_lang"]',
- fullscreen: '[data-plyr="fullscreen"]',
- settings: '[data-plyr="settings"]',
- pip: '[data-plyr="pip"]',
- airplay: '[data-plyr="airplay"]',
- speed: '[data-plyr="speed"]',
- loop: '[data-plyr="loop"]'
- },
- volume: {
- input: '[data-plyr="volume"]',
- display: '.plyr__volume--display'
- },
- progress: {
- container: '.plyr__progress',
- buffer: '.plyr__progress--buffer',
- played: '.plyr__progress--played',
- looped: '.plyr__progress-loop'
- },
- captions: '.plyr__captions',
+ display: {
+ volume: '.plyr__volume--display',
currentTime: '.plyr__time--current',
- duration: '.plyr__time--duration',
- menu: {
- quality: '.js-plyr__menu__list--quality'
- }
+ duration: '.plyr__time--duration'
},
- classes: {
- setup: 'plyr--setup',
- ready: 'plyr--ready',
- videoWrapper: 'plyr__video-wrapper',
- embedWrapper: 'plyr__video-embed',
- type: 'plyr--{0}',
- stopped: 'plyr--stopped',
- playing: 'plyr--playing',
- muted: 'plyr--muted',
- loading: 'plyr--loading',
- hover: 'plyr--hover',
- tooltip: 'plyr__tooltip',
- hidden: 'plyr__sr-only',
- hideControls: 'plyr--hide-controls',
- isIos: 'plyr--is-ios',
- isTouch: 'plyr--is-touch',
- captions: {
- enabled: 'plyr--captions-enabled',
- active: 'plyr--captions-active'
- },
- fullscreen: {
- enabled: 'plyr--fullscreen-enabled',
- active: 'plyr--fullscreen-active'
- },
- pip: {
- enabled: 'plyr--pip-enabled',
- active: 'plyr--pip-active'
- },
- tabFocus: 'tab-focus'
+ progress: {
+ container: '.plyr__progress',
+ buffer: '.plyr__progress--buffer',
+ played: '.plyr__progress--played',
+ loop: '.plyr__progress-loop'
},
+ captions: '.plyr__captions',
+ menu: {
+ quality: '.js-plyr__menu__list--quality'
+ }
+ },
+ classes: {
+ setup: 'plyr--setup',
+ ready: 'plyr--ready',
+ videoWrapper: 'plyr__video-wrapper',
+ embedWrapper: 'plyr__video-embed',
+ type: 'plyr--{0}',
+ stopped: 'plyr--stopped',
+ playing: 'plyr--playing',
+ muted: 'plyr--muted',
+ loading: 'plyr--loading',
+ hover: 'plyr--hover',
+ tooltip: 'plyr__tooltip',
+ hidden: 'plyr__sr-only',
+ hideControls: 'plyr--hide-controls',
+ isIos: 'plyr--is-ios',
+ isTouch: 'plyr--is-touch',
captions: {
- defaultActive: false,
- selectedIndex: 0
+ enabled: 'plyr--captions-enabled',
+ active: 'plyr--captions-active'
},
fullscreen: {
- enabled: true,
- fallback: true,
- allowAudio: false
+ enabled: 'plyr--fullscreen-enabled',
+ active: 'plyr--fullscreen-active'
},
- storage: {
- enabled: true,
- key: 'plyr'
+ pip: {
+ enabled: 'plyr--pip-enabled',
+ active: 'plyr--pip-active'
},
- controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
- i18n: {
- restart: 'Restart',
- rewind: 'Rewind {seektime} secs',
- play: 'Play',
- pause: 'Pause',
- forward: 'Forward {seektime} secs',
- played: 'played',
- buffered: 'buffered',
- currentTime: 'Current time',
- duration: 'Duration',
- volume: 'Volume',
- toggleMute: 'Toggle Mute',
- toggleCaptions: 'Toggle Captions',
- toggleFullscreen: 'Toggle Fullscreen',
- frameTitle: 'Player for {title}',
- captions: 'Captions',
- settings: 'Settings',
- speed: 'Speed',
- quality: 'Quality',
- loop: 'Loop',
- loopStart: 'Loop start',
- loopEnd: 'Loop end',
- loopAll: 'Loop all',
- loopNone: 'No Loop',
- },
- types: {
- embed: ['youtube', 'vimeo', 'soundcloud'],
- html5: ['video', 'audio']
- },
- // URLs
- urls: {
- vimeo: {
- api: 'https://player.vimeo.com/api/player.js',
- },
- youtube: {
- api: 'https://www.youtube.com/iframe_api'
- },
- soundcloud: {
- api: 'https://w.soundcloud.com/player/api.js'
- }
+ tabFocus: 'tab-focus'
+ },
+ captions: {
+ defaultActive: false,
+ selectedIndex: 0
+ },
+ fullscreen: {
+ enabled: true,
+ fallback: true,
+ allowAudio: false
+ },
+ storage: {
+ enabled: true,
+ key: 'plyr'
+ },
+ controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'],
+ i18n: {
+ restart: 'Restart',
+ rewind: 'Rewind {seektime} secs',
+ play: 'Play',
+ pause: 'Pause',
+ forward: 'Forward {seektime} secs',
+ seek: 'Seek',
+ played: 'Played',
+ buffered: 'Buffered',
+ currentTime: 'Current time',
+ duration: 'Duration',
+ volume: 'Volume',
+ toggleMute: 'Toggle Mute',
+ toggleCaptions: 'Toggle Captions',
+ toggleFullscreen: 'Toggle Fullscreen',
+ frameTitle: 'Player for {title}',
+ captions: 'Captions',
+ settings: 'Settings',
+ speed: 'Speed',
+ quality: 'Quality',
+ loop: 'Loop',
+ loopStart: 'Loop start',
+ loopEnd: 'Loop end',
+ loopAll: 'Loop all',
+ loopNone: 'No Loop',
+ },
+ types: {
+ embed: ['youtube', 'vimeo', 'soundcloud'],
+ html5: ['video', 'audio']
+ },
+ // URLs
+ urls: {
+ vimeo: {
+ api: 'https://player.vimeo.com/api/player.js',
},
- // Custom control listeners
- listeners: {
- seek: null,
- play: null,
- pause: null,
- restart: null,
- rewind: null,
- forward: null,
- mute: null,
- volume: null,
- captions: null,
- captions_lang: null,
- fullscreen: null,
- speed: null,
- loop: null
+ youtube: {
+ api: 'https://www.youtube.com/iframe_api'
},
- // 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', 'seeked', 'emptied'],
- // Logging
- logPrefix: ''
- };
+ soundcloud: {
+ api: 'https://w.soundcloud.com/player/api.js'
+ }
+ },
+ // Custom control listeners
+ listeners: {
+ seek: null,
+ play: null,
+ pause: null,
+ restart: null,
+ rewind: null,
+ forward: null,
+ mute: null,
+ volume: null,
+ captions: null,
+ //captions_lang: null,
+ fullscreen: null,
+ speed: null,
+ loop: 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', 'seeked', 'emptied'],
+ // Logging
+ logPrefix: ''
+ };
+
+ // Check variable types
+ var is = {
+ object: function(input) {
+ return input !== null && typeof(input) === 'object' && input.constructor === Object;
+ },
+ array: function(input) {
+ return input !== null && typeof(input) === 'object' && input.constructor === Array;
+ },
+ number: function(input) {
+ return input !== null && (typeof(input) === 'number' && !isNaN(input - 0) || (typeof input === 'object' && input.constructor === Number));
+ },
+ string: function(input) {
+ return input !== null && (typeof input === 'string' || (typeof input === 'object' && input.constructor === String));
+ },
+ boolean: function(input) {
+ return input !== null && typeof input === 'boolean';
+ },
+ nodeList: function(input) {
+ return input !== null && input instanceof NodeList;
+ },
+ htmlElement: function(input) {
+ return input !== null && input instanceof HTMLElement;
+ },
+ function: function(input) {
+ return input !== null && typeof input === 'function';
+ },
+ event: function(input) {
+ return input !== null && typeof input === 'object' && (input.constructor === Event || input.constructor === CustomEvent);
+ },
+ undefined: function(input) {
+ return input !== null && typeof input === 'undefined';
+ },
+ empty: function(input) {
+ return input === null || this.undefined(input) || ((this.string(input) || this.array(input) || this.nodeList(input)) && input.length === 0) || (this.object(input) && Object.keys(input).length === 0);
+ }
+ };
// Credits: http://paypal.github.io/accessible-html5-video-player/
// Unfortunately, due to mixed support, UA sniffing is required
@@ -386,13 +423,83 @@
}
}
- // Insert a HTML element
- function insertElement(type, parent, attributes) {
+ // Get an attribute object from a string selector
+ function getAttributesFromSelector(selector, existingAttributes) {
+ // For example:
+ // '.test' to { class: 'test' }
+ // '#test' to { id: 'test' }
+ // '[data-test="test"]' to { 'data-test': 'test' }
+
+ if (!is.string(selector) || is.empty(selector)) {
+ return {};
+ }
+
+ var attributes = {};
+
+ selector.split(',').forEach(function(selector) {
+ // Remove whitespace
+ selector = selector.trim();
+
+ // Get the first character
+ var start = selector.charAt(0);
+
+ switch (start) {
+ case '.':
+ // Classname selector
+ var className = selector.replace('.', '');
+
+ // Add to existing classname
+ if (is.object(existingAttributes) && is.string(existingAttributes.class)) {
+ existingAttributes.class += ' ' + className;
+ }
+
+ attributes.class = className;
+ break;
+
+ case '#':
+ // ID selector
+ attributes.id = selector.replace('#', '');
+ break;
+
+ case '[':
+ // Strip the []
+ selector = selector.replace(/[\[\]]/g, '');
+
+ // Get the parts if
+ var parts = selector.split('=');
+ var key = parts[0];
+
+ // Get the value if provided
+ var value = parts.length > 1 ? parts[1].replace(/[\"\']/g, '') : '';
+
+ // Attribute selector
+ attributes[key] = value;
+
+ break;
+ }
+ });
+
+ return attributes;
+ }
+
+ // Create a DocumentFragment
+ function createElement(type, attributes) {
// Create a new <element>
var element = document.createElement(type);
// Set all passed attributes
- setAttributes(element, attributes);
+ if (is.object(attributes)) {
+ setAttributes(element, attributes);
+ }
+
+ // Return built element
+ return element;
+ }
+
+ // Insert a DocumentFragment
+ function insertElement(type, parent, attributes) {
+ // Create a new <element>
+ var element = createElement(type, attributes);
// Inject the new element
prependChild(parent, element);
@@ -557,8 +664,8 @@
}
// First object is the destination
- var destination = Array.prototype.shift.call(objects),
- length = objects.length;
+ var destination = Array.prototype.shift.call(objects);
+ var length = objects.length;
// Loop through all objects to merge
for (var i = 0; i < length; i++) {
@@ -577,43 +684,6 @@
return destination;
}
- // Check variable types
- var is = {
- object: function(input) {
- return input !== null && typeof(input) === 'object' && input.constructor === Object;
- },
- array: function(input) {
- return input !== null && typeof(input) === 'object' && input.constructor === Array;
- },
- number: function(input) {
- return input !== null && (typeof(input) === 'number' && !isNaN(input - 0) || (typeof input === 'object' && input.constructor === Number));
- },
- string: function(input) {
- return input !== null && (typeof input === 'string' || (typeof input === 'object' && input.constructor === String));
- },
- boolean: function(input) {
- return input !== null && typeof input === 'boolean';
- },
- nodeList: function(input) {
- return input !== null && input instanceof NodeList;
- },
- htmlElement: function(input) {
- return input !== null && input instanceof HTMLElement;
- },
- function: function(input) {
- return input !== null && typeof input === 'function';
- },
- event: function(input) {
- return input !== null && typeof input === 'object' && (input.constructor === Event || input.constructor === CustomEvent);
- },
- undefined: function(input) {
- return input !== null && typeof input === 'undefined';
- },
- empty: function(input) {
- return input === null || this.undefined(input) || ((this.string(input) || this.array(input) || this.nodeList(input)) && input.length === 0) || (this.object(input) && Object.keys(input).length === 0);
- }
- };
-
// Parse YouTube ID from url
function parseYouTubeId(url) {
var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
@@ -789,6 +859,12 @@
var plyr = this;
var timers = {};
var api;
+ var elements = {
+ buttons: {},
+ display: {},
+ progress: {},
+ inputs: {}
+ }
// Set media
plyr.media = media;
@@ -820,8 +896,9 @@
logger('warn', arguments)
};
- // Log config options
+ // Log config options and support
log('Config', config);
+ log('Support', support);
// Get icon URL
function getIconUrl() {
@@ -831,118 +908,221 @@
};
}
+ // Build a list of available captions
function buildCaptionsMenu() {
var trackSubs = '';
- if (Array.isArray(config.tracks) && config.tracks.length > 0) {
- for (var i in config.tracks) {
- var track = config.tracks[i];
- if (typeof track == 'function') continue;
- trackSubs += '<button type="button" class="plyr__control" data-plyr="captions_lang" data-lang="'+track.srclang+'" data-index="'+i+'">'+track.label+'</button>';
- }
+
+ if (is.array(config.tracks) && !is.empty(config.tracks)) {
+ config.tracks.forEach(function(track, index) {
+ if (is.function(track)) {
+ return;
+ }
+ trackSubs += '<button type="button" class="plyr__control" data-plyr="captions-lang" data-lang="' + track.srclang + '" data-index="' + index + '">' + track.label + '</button>';
+ });
}
return trackSubs;
}
- // Build the default HTML
- function buildControls() {
- // Create html array
- var html = [];
+ // Create <svg> icon
+ function createIcon(type) {
+ var namespace = 'http://www.w3.org/2000/svg';
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(
- '<button type="button" data-plyr="play" class="plyr__play-large">',
- '<svg><use xlink:href="' + iconPath + '-play" /></svg>',
- '<span class="plyr__sr-only">' + config.i18n.play + '</span>',
- '</button>'
- );
- /* beautify ignore:end */
+ // Create <svg>
+ var icon = document.createElementNS(namespace, 'svg');
+ setAttributes(icon, {
+ role: 'presentation'
+ });
+
+ // Create the <use> to reference sprite
+ var use = document.createElementNS(namespace, 'use');
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', iconPath + '-' + type);
+
+ // Add <use> to <svg>
+ icon.appendChild(use);
+
+ return icon;
+ }
+
+ // Create hidden text label
+ function createLabel(type) {
+ var label = createElement('span', {
+ class: config.classes.hidden
+ });
+
+ var text = document.createTextNode(config.i18n[type]);
+
+ label.appendChild(text);
+
+ return label;
+ }
+
+ // Create a <button>
+ function createButton(type) {
+ var button = createElement('button');
+ var attributes = {
+ class: 'plyr__control'
+ }
+
+ // Large play button
+ // TODO: use config
+ if (type === 'play-large') {
+ attributes.class = 'plyr__play-large';
+ type = 'play';
}
- html.push('<div class="plyr__controls">');
+ // Merge attributes
+ extend(attributes, getAttributesFromSelector(config.selectors.buttons[type], attributes));
+
+ // Add the icon
+ button.appendChild(createIcon(type));
+
+ // Add the label
+ button.appendChild(createLabel(type));
+
+ // Set element attributes
+ setAttributes(button, attributes);
+
+ elements.buttons[type] = button;
+
+ return button;
+ }
+
+ // Create a <progress>
+ function createProgress(type) {
+ var progress = createElement('progress', extend(getAttributesFromSelector(config.selectors.progress[type]), {
+ min: 0,
+ max: 100,
+ value: 0
+ }));
+
+ // Create the label inside
+ var value = createElement('span');
+ var text = document.createTextNode('0');
+ value.appendChild(text);
+ progress.appendChild(value);
+
+ var suffix = '';
+ switch (type) {
+ case 'played':
+ suffix = config.i18n.played;
+ break;
+
+ case 'buffer':
+ suffix = config.i18n.buffered;
+ break;
+ }
+
+ var label = document.createTextNode('% ' + suffix.toLowerCase());
+ progress.appendChild(label);
+
+ elements.progress[type] = [progress];
+
+ return progress;
+ }
+
+ // Build the default HTML
+ function createControls(data) {
+ // Create the container
+ var controls = createElement('div', getAttributesFromSelector(config.selectors.controls.wrapper));
// Restart button
if (inArray(config.controls, 'restart')) {
- /* beautify ignore:start */
- html.push(
- '<button type="button" class="plyr__control" data-plyr="restart">',
- '<svg><use xlink:href="' + iconPath + '-restart" /></svg>',
- '<span class="plyr__sr-only">' + config.i18n.restart + '</span>',
- '</button>'
- );
- /* beautify ignore:end */
+ controls.appendChild(createButton('restart'));
}
// Rewind button
if (inArray(config.controls, 'rewind')) {
- /* beautify ignore:start */
- html.push(
- '<button type="button" class="plyr__control" data-plyr="rewind">',
- '<svg><use xlink:href="' + iconPath + '-rewind" /></svg>',
- '<span class="plyr__sr-only">' + config.i18n.rewind + '</span>',
- '</button>'
- );
- /* beautify ignore:end */
+ controls.appendChild(createButton('rewind'));
}
// Play Pause button
// TODO: This should be a toggle button really?
if (inArray(config.controls, 'play')) {
- /* beautify ignore:start */
- html.push(
- '<button type="button" class="plyr__control" data-plyr="play">',
- '<svg><use xlink:href="' + iconPath + '-play" /></svg>',
- '<span class="plyr__sr-only">' + config.i18n.play + '</span>',
- '</button>',
- '<button type="button" class="plyr__control" data-plyr="pause">',
- '<svg><use xlink:href="' + iconPath + '-pause" /></svg>',
- '<span class="plyr__sr-only">' + config.i18n.pause + '</span>',
- '</button>'
- );
- /* beautify ignore:end */
+ controls.appendChild(createButton('play'));
+ controls.appendChild(createButton('pause'));
}
// Fast forward button
if (inArray(config.controls, 'fast-forward')) {
- /* beautify ignore:start */
- html.push(
- '<button type="button" class="plyr__control" data-plyr="fast-forward">',
- '<svg><use xlink:href="' + iconPath + '-fast-forward" /></svg>',
- '<span class="plyr__sr-only">' + config.i18n.forward + '</span>',
- '</button>'
- );
- /* beautify ignore:end */
+ controls.appendChild(createButton('fast-forward'));
}
// Progress
if (inArray(config.controls, 'progress')) {
+ var container = createElement('span', getAttributesFromSelector(config.selectors.progress.container));
+
+ // TODO: Add loop display indicator
+
+ // Seeking
+ var seek = {
+ id: "seek-" + data.id,
+ label: createElement('label'),
+ input: createElement('input')
+ };
+
+ // Seek label
+ setAttributes(seek.label, {
+ for: seek.id,
+ class: config.classes.hidden
+ });
+ container.appendChild(seek.label);
+
+ // Seek input
+ setAttributes(seek.input, extend(getAttributesFromSelector(config.selectors.inputs.seek), {
+ id: seek.id,
+ type: 'range',
+ min: 0,
+ max: 100,
+ step: 0.1,
+ value: 0
+ }));
+ extend(elements.inputs, {
+ seek: seek.input
+ });
+ container.appendChild(elements.inputs.seek);
+
+ container.appendChild(createProgress('played'));
+
+ container.appendChild(createProgress('buffer'));
+
// Create progress
/* beautify ignore:start */
- html.push(
+ /*html.push(
'<span class="plyr__progress">',
- '<div class="plyr__progress-loop"></div>',
+ //'<div class="plyr__progress-loop"></div>',
'<label for="seek-{id}" class="plyr__sr-only">Seek</label>',
'<input id="seek-{id}" class="plyr__progress--seek" type="range" min="0" max="100" step="0.1" value="0" data-plyr="seek">',
'<progress class="plyr__progress--played" max="100" value="0" role="presentation"></progress>',
'<progress class="plyr__progress--buffer" max="100" value="0">',
'<span>0</span>% ' + config.i18n.buffered,
'</progress>'
- );
+ );&/
/* beautify ignore:end */
// Seek tooltip
if (config.tooltips.seek) {
- html.push('<span class="plyr__tooltip">00:00</span>');
+ //html.push('<span class="plyr__tooltip">00:00</span>');
+ var tooltip = createElement('span', {
+ role: 'tooltip',
+ class: config.classes.tooltip
+ });
+
+ var value = document.createTextNode('00:00');
+ tooltip.appendChild(value);
+ container.appendChild(tooltip);
}
// Close
- html.push('</span>');
+ //html.push('</span>');
+ elements.progress.container = container;
+ controls.appendChild(elements.progress.container);
}
+ return controls;
+
// Media current time display
if (inArray(config.controls, 'current-time')) {
/* beautify ignore:start */
@@ -986,8 +1166,8 @@
html.push(
'<span class="plyr__volume">',
'<label for="volume-{id}" class="plyr__sr-only">' + config.i18n.volume + '</label>',
- '<input id="volume-{id}" class="plyr__volume--input" type="range" min="' + config.volumeMin + '" max="' + config.volumeMax + '" value="' + config.volume + '" data-plyr="volume">',
- '<progress class="plyr__volume--display" max="' + config.volumeMax + '" value="' + config.volumeMin + '" role="presentation"></progress>',
+ '<input id="volume-{id}" class="plyr__volume--input" type="range" min="' + 0 + '" max="' + 10 + '" value="' + config.volume + '" data-plyr="volume">',
+ '<progress class="plyr__volume--display" max="' + 10 + '" value="' + 0 + '" role="presentation"></progress>',
'</span>'
);
/* beautify ignore:end */
@@ -1019,7 +1199,7 @@
'</li>';
}
- if(config.qualityOptions){
+ if (is.array(config.quality.options)) {
var showQuality = '<button type="button" class="plyr__control plyr__control--forward" id="plyr-settings-{id}-quality-toggle" aria-haspopup="true" aria-controls="plyr-settings-{id}-quality" aria-expanded="false">'+
config.i18n.quality +'<span class="plyr__menu__value">Auto</span>'+
'</button>';
@@ -1044,11 +1224,11 @@
'</li>',
'<li role="tab">',
- showQuality,
+ //showQuality,
'<button type="button" class="plyr__control plyr__control--forward" id="plyr-settings-{id}-quality-toggle" aria-haspopup="true" aria-controls="plyr-settings-{id}-quality" aria-expanded="false">',
- config.i18n.quality +
- '<span class="plyr__menu__value">{quality}</span>'
+ config.i18n.quality,
+ '<span class="plyr__menu__value">{quality}</span>',
'</button>',
'</li>',
@@ -1362,8 +1542,8 @@
}
// Toggle state
- if (plyr.buttons && plyr.buttons.fullscreen) {
- toggleState(plyr.buttons.fullscreen, false);
+ if (elements.buttons && elements.buttons.fullscreen) {
+ toggleState(elements.buttons.fullscreen, false);
}
// Setup focus trap
@@ -1537,31 +1717,31 @@
// Set the current caption
function setCaption(caption) {
var captions = getElement(config.selectors.captions);
- var content = document.createElement('span');
- if(captions) {
- // Empty the container
- captions.innerHTML = '';
+ if (is.htmlElement(captions)) {
+ var content = createElement('span');
+
+ // Empty the container
+ captions.innerHTML = '';
- // Default to empty
- if (is.undefined(caption)) {
- caption = '';
- }
+ // Default to empty
+ if (is.undefined(caption)) {
+ caption = '';
+ }
- // Set the span content
- if (is.string(caption)) {
- content.innerHTML = caption.trim();
- } else {
- content.appendChild(caption);
- }
+ // Set the span content
+ if (is.string(caption)) {
+ content.innerHTML = caption.trim();
+ } else {
+ content.appendChild(caption);
+ }
- // Set new caption text
- captions.appendChild(content);
+ // Set new caption text
+ captions.appendChild(content);
- // Force redraw (for Safari)
- var redraw = captions.offsetHeight;
+ // Force redraw (for Safari)
+ var redraw = captions.offsetHeight;
}
-
}
// Captions functions
@@ -1646,7 +1826,7 @@
// Display captions container and button (for initialization)
function showCaptions() {
// If there's no caption toggle, bail
- if (!plyr.buttons.captions) {
+ if (!elements.buttons.captions) {
return;
}
@@ -1662,7 +1842,7 @@
if (active) {
toggleClass(plyr.container, config.classes.captions.active, true);
- toggleState(plyr.buttons.captions, true);
+ toggleState(elements.buttons.captions, true);
}
}
@@ -1738,29 +1918,23 @@
}
}
- // Make a copy of the html
- var html = config.html;
-
- // Insert custom video controls
- log('Injecting custom controls');
-
- // If no controls are specified, create default
- if (!html) {
- html = buildControls();
+ // Larger overlaid play button
+ if (inArray(config.controls, 'play-large')) {
+ elements.buttons.playLarge = createButton('play-large');
+ plyr.container.appendChild(elements.buttons.playLarge);
}
- // Replace seek time instances
- html = replaceAll(html, '{seektime}', config.seekTime);
-
- // Replace speed time instances
- html = replaceAll(html, '{speed}', getSpeedDisplayValue());
-
- // Replace current captions language
- html = replaceAll(html, '{lang}', 'English');
-
- // Replace all id references with random numbers
+ // Create a unique ID
plyr.id = Math.floor(Math.random() * (10000));
- html = replaceAll(html, '{id}', plyr.id);
+
+ // Create controls
+ var controls = createControls({
+ id: plyr.id,
+ seektime: config.seekTime,
+ speed: getSpeedDisplayValue(),
+ // TODO: Set language automatically based on UA?
+ language: 'English'
+ });
// Controls container
var target;
@@ -1776,7 +1950,8 @@
}
// Inject controls HTML
- target.insertAdjacentHTML('beforeend', html);
+ // target.insertAdjacentHTML('beforeend', html);
+ target.appendChild(controls);
// Setup tooltips
if (config.tooltips.controls) {
@@ -1798,11 +1973,10 @@
// Find the UI controls and store references
function findElements() {
try {
- plyr.controls = getElement(config.selectors.controls.wrapper);
+ elements.controls = getElement(config.selectors.controls.wrapper);
// Buttons
- plyr.buttons = {
- seek: getElement(config.selectors.buttons.seek),
+ elements.buttons = {
play: getElements(config.selectors.buttons.play),
pause: getElement(config.selectors.buttons.pause),
restart: getElement(config.selectors.buttons.restart),
@@ -1811,51 +1985,46 @@
fullscreen: getElement(config.selectors.buttons.fullscreen),
settings: getElement(config.selectors.buttons.settings),
pip: getElement(config.selectors.buttons.pip),
- lang: getElement(config.selectors.buttons.captions_lang),
+ //lang: getElement(config.selectors.buttons.captions_lang),
speed: getElement(config.selectors.buttons.speed),
- loop: getElement(config.selectors.buttons.loop)
+ loop: getElement(config.selectors.buttons.loop),
+ mute: getElement(config.selectors.buttons.mute),
+ captions: getElement(config.selectors.buttons.captions)
};
// Inputs
- plyr.buttons.mute = getElement(config.selectors.buttons.mute);
- plyr.buttons.captions = getElement(config.selectors.buttons.captions);
- plyr.buttons.captions_menu = getElement(config.selectors.buttons.captions_menu);
+ // TODO: ??
+ // elements.buttons.captions_menu = getElement(config.selectors.buttons.captions_menu);
// Progress
- plyr.progress = {
- container: getElement(config.selectors.progress.container)
+ // TODO: text for played?
+ elements.progress = {
+ container: getElement(config.selectors.progress.container),
+ buffer: getElement(config.selectors.progress.buffer),
+ played: getElement(config.selectors.progress.played)
};
- // Progress - Buffering
- plyr.progress.buffer = (function() {
- var bar = getElement(config.selectors.progress.buffer);
-
- return {
- bar: bar,
- text: is.htmlElement(bar) && bar.getElementsByTagName('span')[0]
- };
- })();
-
- // 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);
+ if (is.htmlElement(elements.progress.container)) {
+ elements.progress.tooltip = elements.progress.container.querySelector('.' + config.classes.tooltip);
+ }
- // Volume
- plyr.volume = {
- input: getElement(config.selectors.volume.input),
- display: getElement(config.selectors.volume.display)
+ // Inputs
+ elements.inputs = {
+ seek: getElement(config.selectors.inputs.seek),
+ volume: getElement(config.selectors.inputs.volume)
};
- // Timing
- plyr.duration = getElement(config.selectors.duration);
- plyr.currentTime = getElement(config.selectors.currentTime);
- plyr.seekTime = getElements(config.selectors.seekTime);
+ // Display
+ elements.display = {
+ volume: getElement(config.selectors.display.volume),
+ duration: getElement(config.selectors.display.duration),
+ currentTime: getElement(config.selectors.display.currentTime),
+ };
return true;
- } catch (e) {
- warn('It looks like there is a problem with your controls HTML', e);
+ } catch (error) {
+ warn('It looks like there is a problem with your custom controls HTML', error);
// Restore native video controls
toggleNativeControls(true);
@@ -1892,9 +2061,12 @@
}
// If there's a play button, set label
- if (plyr.supported.full && plyr.buttons.play) {
- for (var i = plyr.buttons.play.length - 1; i >= 0; i--) {
- plyr.buttons.play[i].setAttribute('aria-label', label);
+ if (plyr.supported.full) {
+ if (is.htmlElement(elements.buttons.play)) {
+ elements.buttons.play.setAttribute('aria-label', label);
+ }
+ if (is.htmlElement(elements.buttons.playLarge)) {
+ elements.buttons.playLarge.setAttribute('aria-label', label);
}
}
@@ -2525,7 +2697,7 @@
config.loop.end = null;
}
config.loop.start = currentTime;
- config.loop.indicator.start = plyr.progress.played.value;
+ config.loop.indicator.start = elements.progress.played.value;
break;
case 'end':
@@ -2533,7 +2705,7 @@
return;
}
config.loop.end = currentTime;
- config.loop.indicator.end = plyr.progress.played.value;
+ config.loop.indicator.end = elements.progress.played.value;
break;
case 'all':
@@ -2797,8 +2969,8 @@
focusTrap(plyr.isFullscreen);
// Set button state
- if (plyr.buttons && plyr.buttons.fullscreen) {
- toggleState(plyr.buttons.fullscreen, plyr.isFullscreen);
+ if (elements.buttons && elements.buttons.fullscreen) {
+ toggleState(elements.buttons.fullscreen, plyr.isFullscreen);
}
// Trigger an event
@@ -2818,7 +2990,7 @@
}
// Set button state
- toggleState(plyr.buttons.mute, muted);
+ toggleState(elements.buttons.mute, muted);
// Set mute on the player
plyr.media.muted = muted;
@@ -2838,7 +3010,7 @@
case 'vimeo':
case 'soundcloud':
- plyr.embed.setVolume(plyr.media.muted ? 0 : parseFloat(config.volume / config.volumeMax));
+ plyr.embed.setVolume(plyr.media.muted ? 0 : parseFloat(config.volume / 10));
break;
}
@@ -2849,8 +3021,8 @@
// Set volume
function setVolume(volume) {
- var max = config.volumeMax,
- min = config.volumeMin;
+ var max = 10;
+ var min = 0;
// Load volume from storage if no value specified
if (is.undefined(volume)) {
@@ -2875,8 +3047,8 @@
plyr.media.volume = parseFloat(volume / max);
// Set the display
- if (plyr.volume.display) {
- plyr.volume.display.value = volume;
+ if (elements.display.volume) {
+ elements.display.volume.value = volume;
}
// Embeds
@@ -2906,10 +3078,10 @@
// Increase volume
function increaseVolume(step) {
- var volume = plyr.media.muted ? 0 : (plyr.media.volume * config.volumeMax);
+ var volume = plyr.media.muted ? 0 : (plyr.media.volume * 10);
if (!is.number(step)) {
- step = config.volumeStep;
+ step = 1;
}
setVolume(volume + step);
@@ -2917,10 +3089,10 @@
// Decrease volume
function decreaseVolume(step) {
- var volume = plyr.media.muted ? 0 : (plyr.media.volume * config.volumeMax);
+ var volume = plyr.media.muted ? 0 : (plyr.media.volume * 10);
if (!is.number(step)) {
- step = config.volumeStep;
+ step = 1;
}
setVolume(volume - step);
@@ -2929,15 +3101,15 @@
// Update volume UI and storage
function updateVolume() {
// Get the current volume
- var volume = plyr.media.muted ? 0 : (plyr.media.volume * config.volumeMax);
+ var volume = plyr.media.muted ? 0 : (plyr.media.volume * 10);
// Update the <input type="range"> if present
if (plyr.supported.full) {
- if (plyr.volume.input) {
- plyr.volume.input.value = volume;
+ if (elements.inputs.volume) {
+ elements.inputs.volume.value = volume;
}
- if (plyr.volume.display) {
- plyr.volume.display.value = volume;
+ if (elements.display.volume) {
+ elements.display.volume.value = volume;
}
}
@@ -2950,15 +3122,15 @@
toggleClass(plyr.container, config.classes.muted, (volume === 0));
// Update checkbox for mute state
- if (plyr.supported.full && plyr.buttons.mute) {
- toggleState(plyr.buttons.mute, (volume === 0));
+ if (plyr.supported.full && elements.buttons.mute) {
+ toggleState(elements.buttons.mute, (volume === 0));
}
}
// Toggle captions
function toggleCaptions(show) {
// If there's no full support, or there's no caption toggle
- if (!plyr.supported.full || !plyr.buttons.captions) {
+ if (!plyr.supported.full || !elements.buttons.captions) {
return;
}
@@ -2969,11 +3141,11 @@
// Set global
plyr.captionsEnabled = show;
- plyr.buttons.captions_menu.innerHTML = show ? 'Off' : 'On';
+ elements.buttons.captions_menu.innerHTML = show ? 'Off' : 'On';
getElement('[data-captions="settings"]').innerHTML = getSubsLangValue();
// Toggle state
- toggleState(plyr.buttons.captions, plyr.captionsEnabled);
+ toggleState(elements.buttons.captions, plyr.captionsEnabled);
// Add class hook
toggleClass(plyr.container, config.classes.captions.active, plyr.captionsEnabled);
@@ -3003,13 +3175,13 @@
function getSubsLangValue() {
if (config.tracks.length === 0) {
- return 'No Subs';
+ return 'No Subs';
}
if (plyr.captionsEnabled || !is.boolean(plyr.captionsEnabled) && plyr.storage.captionsEnabled) {
- return config.tracks[config.captions.selectedIndex].label;
+ return config.tracks[config.captions.selectedIndex].label;
} else {
- return 'Disabled';
+ return 'Disabled';
}
}
@@ -3036,7 +3208,7 @@
return;
}
- var progress = plyr.progress.played,
+ var progress = elements.progress.played,
value = 0,
duration = getDuration();
@@ -3045,15 +3217,15 @@
// Video playing
case 'timeupdate':
case 'seeking':
- if (plyr.controls.pressed) {
+ if (elements.controls.pressed) {
return;
}
value = getPercentage(plyr.media.currentTime, duration);
// Set seek range value only if it's a 'natural' time event
- if (event.type === 'timeupdate' && plyr.buttons.seek) {
- plyr.buttons.seek.value = value;
+ if (event.type === 'timeupdate' && elements.inputs.seek) {
+ elements.inputs.seek.value = value;
}
break;
@@ -3061,7 +3233,7 @@
// Check buffer status
case 'playing':
case 'progress':
- progress = plyr.progress.buffer;
+ progress = elements.progress.buffer;
value = (function() {
var buffered = plyr.media.buffered;
@@ -3099,23 +3271,21 @@
}
// Default to buffer or bail
if (is.undefined(progress)) {
- if (plyr.progress && plyr.progress.buffer) {
- progress = plyr.progress.buffer;
+ if (is.htmlElement(elements.progress.buffer)) {
+ progress = elements.progress.buffer;
} else {
return;
}
}
- // One progress element passed
+ // Update value and label
if (is.htmlElement(progress)) {
progress.value = value;
- } else if (progress) {
- // Object of progress + text element
- if (progress.bar) {
- progress.bar.value = value;
- }
- if (progress.text) {
- progress.text.innerHTML = value;
+
+ // Update text label inside
+ var label = progress.getElementsByTagName('span')[0];
+ if (is.htmlElement(label)) {
+ label.childNodes[0].nodeValue = value;
}
}
}
@@ -3163,13 +3333,13 @@
var duration = getDuration() || 0;
// If there's only one time display, display duration there
- if (!plyr.duration && config.displayDuration && plyr.media.paused) {
- updateTimeDisplay(duration, plyr.currentTime);
+ if (!elements.display.duration && config.displayDuration && plyr.media.paused) {
+ updateTimeDisplay(duration, elements.display.currentTime);
}
// If there's a duration element, update content
- if (plyr.duration) {
- updateTimeDisplay(duration, plyr.duration);
+ if (elements.display.duration) {
+ updateTimeDisplay(duration, elements.display.duration);
}
// Update the tooltip (if visible)
@@ -3179,7 +3349,7 @@
// Handle time change event
function timeUpdate(event) {
// Duration
- updateTimeDisplay(plyr.media.currentTime, plyr.currentTime);
+ updateTimeDisplay(plyr.media.currentTime, elements.display.currentTime);
// Ignore updates while seeking
if (event && event.type === 'timeupdate' && plyr.media.seeking) {
@@ -3201,13 +3371,13 @@
value = getPercentage(time, duration);
// Update progress
- if (plyr.progress && plyr.progress.played) {
- plyr.progress.played.value = value;
+ if (elements.progress && elements.progress.played) {
+ elements.progress.played.value = value;
}
// Update seek range input
- if (plyr.buttons && plyr.buttons.seek) {
- plyr.buttons.seek.value = value;
+ if (elements.buttons && elements.inputs.seek) {
+ elements.inputs.seek.value = value;
}
}
@@ -3216,19 +3386,19 @@
var duration = getDuration();
// Bail if setting not true
- if (!config.tooltips.seek || !plyr.progress.container || duration === 0) {
+ if (!config.tooltips.seek || !elements.progress.container || duration === 0) {
return;
}
// Calculate percentage
- var clientRect = plyr.progress.container.getBoundingClientRect(),
+ var clientRect = elements.progress.container.getBoundingClientRect(),
percent = 0,
visible = config.classes.tooltip + '--visible';
// Determine percentage, if already visible
if (!event) {
- if (hasClass(plyr.progress.tooltip, visible)) {
- percent = plyr.progress.tooltip.style.left.replace('%', '');
+ if (hasClass(elements.progress.tooltip, visible)) {
+ percent = elements.progress.tooltip.style.left.replace('%', '');
} else {
return;
}
@@ -3244,15 +3414,15 @@
}
// Display the time a click would seek to
- updateTimeDisplay(((duration / 100) * percent), plyr.progress.tooltip);
+ updateTimeDisplay(((duration / 100) * percent), elements.progress.tooltip);
// Set position
- plyr.progress.tooltip.style.left = percent + "%";
+ elements.progress.tooltip.style.left = percent + "%";
// Show/hide the tooltip
// If the event is a moues in/out and percentage is inside bounds
if (event && inArray(['mouseenter', 'mouseleave'], event.type)) {
- toggleClass(plyr.progress.tooltip, visible, (event.type === 'mouseenter'));
+ toggleClass(elements.progress.tooltip, visible, (event.type === 'mouseenter'));
}
}
@@ -3314,7 +3484,7 @@
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) {
+ if ((elements.controls.pressed || elements.controls.hover) && !isEnterFullscreen) {
return;
}
@@ -3518,8 +3688,8 @@
var play = togglePlay();
// Determine which buttons
- var trigger = plyr.buttons[play ? 'play' : 'pause'],
- target = plyr.buttons[play ? 'pause' : 'play'];
+ var trigger = elements.buttons[play ? 'play' : 'pause'];
+ var target = elements.buttons[play ? 'pause' : 'play'];
// Get the last play button to account for the large play button
if (target && target.length > 1) {
@@ -3563,8 +3733,8 @@
// Detect tab focus
function checkTabFocus(focused) {
- for (var button in plyr.buttons) {
- var element = plyr.buttons[button];
+ for (var button in elements.buttons) {
+ var element = elements.buttons[button];
if (is.nodeList(element)) {
for (var i = 0; i < element.length; i++) {
@@ -3750,8 +3920,8 @@
on(document.body, 'click', function() {
toggleClass(getElement('.' + config.classes.tabFocus), config.classes.tabFocus, false);
});
- for (var button in plyr.buttons) {
- var element = plyr.buttons[button];
+ for (var button in elements.buttons) {
+ var element = elements.buttons[button];
on(element, 'blur', function() {
toggleClass(element, 'tab-focus', false);
@@ -3759,42 +3929,43 @@
}
// Play
- proxy(plyr.buttons.play, 'click', config.listeners.play, _togglePlay);
+ proxy(elements.buttons.play, 'click', config.listeners.play, _togglePlay);
+ proxy(elements.buttons.playLarge, 'click', config.listeners.play, _togglePlay);
// Pause
- proxy(plyr.buttons.pause, 'click', config.listeners.pause, _togglePlay);
+ proxy(elements.buttons.pause, 'click', config.listeners.pause, _togglePlay);
// Restart
- proxy(plyr.buttons.restart, 'click', config.listeners.restart, seek);
+ proxy(elements.buttons.restart, 'click', config.listeners.restart, seek);
// Rewind
- proxy(plyr.buttons.rewind, 'click', config.listeners.rewind, rewind);
+ proxy(elements.buttons.rewind, 'click', config.listeners.rewind, rewind);
// Fast forward
- proxy(plyr.buttons.forward, 'click', config.listeners.forward, forward);
+ proxy(elements.buttons.forward, 'click', config.listeners.forward, forward);
// Speed-up
- proxy(plyr.buttons.speed, 'click', config.listeners.speed, function() {
+ proxy(elements.buttons.speed, 'click', config.listeners.speed, function() {
var speedValue = document.querySelector('[data-plyr="speed"]:checked').value;
setSpeed(Number(speedValue));
});
// Seek
- proxy(plyr.buttons.seek, inputEvent, config.listeners.seek, seek);
+ proxy(elements.inputs.seek, inputEvent, config.listeners.seek, seek);
// Set volume
- proxy(plyr.volume.input, inputEvent, config.listeners.volume, function() {
- setVolume(plyr.volume.input.value);
+ proxy(elements.inputs.volume, inputEvent, config.listeners.volume, function() {
+ setVolume(elements.inputs.volume.value);
});
// Mute
- proxy(plyr.buttons.mute, 'click', config.listeners.mute, toggleMute);
+ proxy(elements.buttons.mute, 'click', config.listeners.mute, toggleMute);
// Fullscreen
- proxy(plyr.buttons.fullscreen, 'click', config.listeners.fullscreen, toggleFullscreen);
+ proxy(elements.buttons.fullscreen, 'click', config.listeners.fullscreen, toggleFullscreen);
// Looping
- proxy(plyr.buttons.loop, 'click', config.listeners.loop, function(event) {
+ proxy(elements.buttons.loop, 'click', config.listeners.loop, function(event) {
var value = event.target.getAttribute('data-loop__value') || event.target.getAttribute('data-loop__type');
if (inArray(['start', 'end', 'all', 'none'], value)) {
@@ -3808,16 +3979,17 @@
}
// Captions
- proxy(plyr.buttons.captions, 'click', config.listeners.captions toggleCaptions);
- // ?? on(plyr.buttons.captions_menu, 'click', toggleCaptions);
+ proxy(elements.buttons.captions, 'click', config.listeners.captions, toggleCaptions);
+ // TODO: ??
+ // on(elements.buttons.captions_menu, 'click', toggleCaptions);
// Language
- proxy(plyr.buttons.lang, 'click', config.listeners.lang, function(e) {
+ proxy(elements.buttons.lang, 'click', config.listeners.lang, function(e) {
var langIndex = e.target.attributes.getNamedItem("data-index").value;
setCaptionIndex(langIndex);
});
// Settings
- on(plyr.buttons.settings, 'click', function(event) {
+ on(elements.buttons.settings, 'click', function(event) {
var menu = this,
toggle = event.target,
target = document.getElementById(toggle.getAttribute('aria-controls')),
@@ -3877,13 +4049,13 @@
});
// Picture in picture
- on(plyr.buttons.pip, 'click', function() {
+ on(elements.buttons.pip, 'click', function() {
// TODO: Check support here
plyr.media.webkitSetPresentationMode(plyr.media.webkitPresentationMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture');
});
// Seek tooltip
- on(plyr.progress.container, 'mouseenter mouseleave mousemove', updateSeekTooltip);
+ on(elements.progress.container, 'mouseenter mouseleave mousemove', updateSeekTooltip);
// Toggle controls visibility based on mouse movement
if (config.hideControls) {
@@ -3891,27 +4063,27 @@
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) {
- plyr.controls.hover = event.type === 'mouseenter';
+ on(elements.controls, 'mouseenter mouseleave', function(event) {
+ elements.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) {
- plyr.controls.pressed = inArray(['mousedown', 'touchstart'], event.type);
+ on(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function(event) {
+ elements.controls.pressed = inArray(['mousedown', 'touchstart'], event.type);
});
// Focus in/out on controls
- on(plyr.controls, 'focus blur', toggleControls, true);
+ on(elements.controls, 'focus blur', toggleControls, true);
}
// Adjust volume on scroll
- on(plyr.volume.input, 'wheel', function(event) {
+ on(elements.inputs.volume, 'wheel', function(event) {
event.preventDefault();
// Detect "natural" scroll - suppored on OS X Safari only
// Other browsers on OS X will be inverted until support improves
var inverted = event.webkitDirectionInvertedFromDevice,
- step = (config.volumeStep / 5);
+ step = (1 / 5);
// Scroll down (or up on natural) to decrease
if (event.deltaY < 0 || event.deltaX > 0) {