aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Potts <sam@potts.es>2017-08-16 00:36:23 +1000
committerSam Potts <sam@potts.es>2017-08-16 00:36:23 +1000
commit0148c76c30d87dc6df79a8ef7264d0efd29988a3 (patch)
treede5d3e80763dd7290bc8e89b0fb027a3e756021b
parent18b2cbb2e9f442ad1fe22543403bdccbf119a014 (diff)
downloadplyr-0148c76c30d87dc6df79a8ef7264d0efd29988a3.tar.lz
plyr-0148c76c30d87dc6df79a8ef7264d0efd29988a3.tar.xz
plyr-0148c76c30d87dc6df79a8ef7264d0efd29988a3.zip
ESLint, comments, quality and speed menus
-rw-r--r--.eslintrc.json19
-rw-r--r--.jshintignore0
-rw-r--r--.jshintrc55
-rw-r--r--demo/dist/demo.css2
-rw-r--r--demo/dist/demo.js2
-rw-r--r--demo/index.html203
-rw-r--r--demo/src/js/main.js17
-rw-r--r--demo/src/less/components/base.less21
-rw-r--r--demo/src/less/components/buttons.less260
-rw-r--r--demo/src/less/components/examples.less12
-rw-r--r--demo/src/less/components/type.less12
-rw-r--r--demo/src/less/variables.less8
-rw-r--r--dist/plyr.js5
-rw-r--r--src/js/plyr.js775
14 files changed, 764 insertions, 627 deletions
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 00000000..a4552c73
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,19 @@
+{
+ "env": {
+ "browser": true
+ },
+ "rules": {
+ "no-const-assign": "warn",
+ "no-this-before-super": "warn",
+ "no-undef": "warn",
+ "no-unreachable": "warn",
+ "no-unused-vars": "warn",
+ "constructor-super": "warn",
+ "valid-typeof": "warn",
+ "indent": ["error", 4, {
+ "SwitchCase": 1
+ }],
+ "quotes": ["error", "single"],
+ "semi": ["error", "always"]
+ }
+} \ No newline at end of file
diff --git a/.jshintignore b/.jshintignore
deleted file mode 100644
index e69de29b..00000000
--- a/.jshintignore
+++ /dev/null
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index 6f066d0c..00000000
--- a/.jshintrc
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- // Settings
- "passfail" : false, // Stop on first error.
- "maxerr" : 100, // Maximum error before stopping.
-
- // Predefined globals whom JSHint will ignore.
- "browser" : true, // Standard browser globals e.g. `window`, `document`.
- "node" : false,
- "rhino" : false,
- "couch" : false,
- "wsh" : false, // Windows Scripting Host.
- "jquery" : false,
-
- // Development.
- "debug" : false, // Allow debugger statements e.g. browser breakpoints.
- "devel" : false, // Allow developments statements e.g. `console.log();`.
-
- // ECMAScript 5.
- "strict" : false, // Require `use strict` pragma in every file.
- "globalstrict" : false, // Allow global "use strict" (also enables 'strict').
-
- // The Good Parts.
- "asi" : true, // Tolerate Automatic Semicolon Insertion (no semicolons).
- "laxbreak" : true, // Tolerate unsafe line breaks e.g. `return [\n] x` without semicolons.
- "bitwise" : false, // Prohibit bitwise operators (&, |, ^, etc.).
- "boss" : false, // Tolerate assignments inside if, for & while. Usually conditions & loops are for comparison, not assignments.
- "curly" : true, // Require {} for every new block or scope.
- "eqeqeq" : true, // Require triple equals i.e. `===`.
- "eqnull" : false, // Tolerate use of `== null`.
- "evil" : false, // Tolerate use of `eval`.
- "expr" : false, // Tolerate `ExpressionStatement` as Programs.
- "forin" : false, // Tolerate `for in` loops without `hasOwnPrototype`.
- "immed" : true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`
- "latedef" : false, // Prohipit variable use before definition.
- "loopfunc" : true, // Allow functions to be defined within loops.
- "noarg" : true, // Prohibit use of `arguments.caller` and `arguments.callee`.
- "regexp" : true, // Prohibit `.` and `[^...]` in regular expressions.
- "regexdash" : false, // Tolerate unescaped last dash i.e. `[-...]`.
- "scripturl" : true, // Tolerate script-targeted URLs.
- "shadow" : false, // Allows re-define variables later in code e.g. `var x=1; x=2;`.
- "supernew" : false, // Tolerate `new function () { ... };` and `new Object;`.
- "undef" : true, // Require all non-global variables be declared before they are used.
-
- // Personal styling preferences.
- "newcap" : true, // Require capitalization of all constructor functions e.g. `new F()`.
- "noempty" : true, // Prohibit use of empty blocks.
- "nonew" : true, // Prohibit use of constructors for side-effects.
- "nomen" : true, // Prohibit use of initial or trailing underbars in names.
- "onevar" : false, // Allow only one `var` statement per function.
- "plusplus" : false, // Prohibit use of `++` & `--`.
- "sub" : false, // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`.
- "trailing" : true, // Prohibit trailing whitespaces.
- "white" : true, // Check against strict whitespace and indentation rules.
- "indent" : 4 // Specify indentation spacing
-} \ No newline at end of file
diff --git a/demo/dist/demo.css b/demo/dist/demo.css
index 27e0b00c..e16e5357 100644
--- a/demo/dist/demo.css
+++ b/demo/dist/demo.css
@@ -1 +1 @@
-/*! normalize.css v2.1.3 | MIT License | git.io/normalize */a.logo,img,legend{border:0}a,h1,h2{color:#1aafff}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,small,summary{display:block}figure,li,ul{margin:0}[hidden],template{display:none}header,section{margin-bottom:20px}li,nav ul,ul{list-style:none;padding:0}legend,li,nav ul,ul{padding:0}.btn__bar,sub,sup{position:relative}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a{background:0 0;text-decoration:none;transition:color .3s ease}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}.btn__bar,nav li{white-space:nowrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}@font-face{font-family:Avenir;src:url(https://cdn.plyr.io/fonts/avenir-medium.woff2) format("woff2"),url(https://cdn.plyr.io/fonts/avenir-medium.woff) format("woff");font-style:normal;font-weight:500}@font-face{font-family:Avenir;src:url(https://cdn.plyr.io/fonts/avenir-bold.woff2) format("woff2"),url(https://cdn.plyr.io/fonts/avenir-bold.woff) format("woff");font-style:normal;font-weight:600}html{font-size:100%;background:#fff}body{font-family:Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.5;text-align:center;color:#55646b;font-weight:500;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;max-width:800px;margin:auto;padding:10px}h1,h2{letter-spacing:-.025em;margin:0 0 10px;line-height:1.2;font-weight:600}h1{font-size:64px;font-size:4rem}p,small{margin:0 0 20px}small{padding:0 10px;font-size:14px;font-size:.875rem}a:focus,a:hover{color:#343f4a}a:focus,button:focus{outline:#343f4a dotted thin;outline-offset:1px}.color--vimeo{color:#19b7ed}.color--youtube{color:#cc181e}*,::after,::before{box-sizing:border-box}.btn__bar ul,nav li{display:inline-block}header{padding:20px}header p{font-size:18px;font-size:1.125rem}@media (min-width:480px){header{padding-top:60px;padding-bottom:60px}section{margin-bottom:40px}}.icon{fill:currentColor;width:18px;height:18px;vertical-align:-3px}.btn,.btn__count,.error main,video{vertical-align:middle}a svg,button svg,label svg{pointer-events:none}.btn .icon,a .icon{margin-right:10px}.btn:not(.btn-large) .icon{width:16px;height:16px}nav ul{margin:0;font-size:0}nav li{margin-top:10px;font-size:16px;font-size:1rem}nav li+li{margin-left:20px}.btn__bar{margin:0 auto 20px}.btn__bar::before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background:#f2f5f7}.btn__bar ul{position:relative;z-index:1}.btn__bar li{margin:0}.btn__bar li:first-child .btn{border-radius:4px 0 0 4px}.btn__bar li:last-child .btn{border-radius:0 4px 4px 0}.btn__bar li+li .btn{margin-left:-1px}.btn__bar li.active .btn{position:relative;z-index:1}.btn__bar li.active .btn .icon{color:inherit}.btn__bar li.active+li .btn:hover{z-index:0}.btn__bar .btn{position:relative;display:block;border-radius:0}.btn__bar .btn:focus,.btn__bar .btn:hover{z-index:1}@media (min-width:560px){.btn__bar{margin-bottom:40px}}.btn,.btn__count{display:inline-block;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:600}.btn{padding:10px 12px;background:#fff;border:1px solid #dbe3e8;color:#55646b;transition:all .2s ease;font-size:14px;font-size:.875rem}.btn:focus,.btn:hover{border-color:#cbd0d3}.btn--large{padding:10px 20px;font-size:16px;font-size:1rem}.btn--primary,.btn__bar li.active .btn{background-color:#1aafff;border-color:#1aafff;color:#fff}.btn--primary:focus,.btn--primary:hover{color:#fff;border-color:#00a6ff}.btn--youtube .icon{color:#cc181e}.btn--vimeo .icon{color:#19b7ed}.btn--twitter .icon{color:#4BAAF4}.btn__count{position:relative;margin-left:10px;padding:10px 15px;background:#fff;border:1px solid #dbe3e8}.btn__count::before,.plyr__video-wrapper::after{content:"";position:absolute}.btn__count::before{display:block;width:8px;height:8px;left:1px;top:50%;margin-top:-4px;background:inherit;border:inherit;border-width:1px 0 0 1px;transform:rotate(-45deg) translate(-50%,-50%)}.error body,html.error{height:100%}.error body{width:100%;display:table;table-layout:fixed}.error main{display:table-cell;width:100%}video{max-width:100%}.plyr{margin:0 auto;border-radius:6px}.plyr--audio{max-width:520px}.plyr__video-wrapper::after{pointer-events:none;top:0;bottom:0;left:0;right:0;border:1px solid rgba(0,0,0,.15);border-radius:inherit}.plyr__cite{margin-top:20px} \ No newline at end of file
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */a.logo,img,legend{border:0}a,h1,h2{color:#3498db}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,small,summary{display:block}figure,li,ul{margin:0}[hidden],template{display:none}li,nav ul,ul{list-style:none;padding:0}legend,li,nav ul,ul{padding:0}.btn__bar,sub,sup{position:relative}.btn__bar,body{max-width:1200px}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a{background:0 0;text-decoration:none;border-bottom:1px dotted currentColor;transition:background .3s ease,color .3s ease,border .3s ease}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}.btn__bar,nav li{white-space:nowrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}@font-face{font-family:Avenir;src:url(https://cdn.plyr.io/fonts/avenir-medium.woff2) format("woff2"),url(https://cdn.plyr.io/fonts/avenir-medium.woff) format("woff");font-style:normal;font-weight:500}@font-face{font-family:Avenir;src:url(https://cdn.plyr.io/fonts/avenir-bold.woff2) format("woff2"),url(https://cdn.plyr.io/fonts/avenir-bold.woff) format("woff");font-style:normal;font-weight:700}html{font-size:100%;height:100%;background:fixed #f2f5f7}body{font-family:Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.5;text-align:center;color:#55646b;font-weight:500;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin:0 auto 20px;padding:10px}h1,h2{letter-spacing:-.025em;margin:0 0 10px;line-height:1.2;font-weight:700}h1{font-size:64px;font-size:4rem}p,small{margin:0 0 20px}small{padding:0 10px;font-size:14px;font-size:.875rem}a:focus,a:hover{color:#343f4a;border-bottom-color:transparent}a:focus{outline:#343f4a dotted thin;outline-offset:1px}.color--vimeo{color:#19b7ed}.color--youtube{color:#cc181e}*,::after,::before{box-sizing:border-box}.btn__bar ul,nav li{display:inline-block}header{padding:20px;margin-bottom:20px}header p{font-size:18px;font-size:1.125rem}@media (min-width:480px){body{margin-bottom:40px}header{padding-top:60px;padding-bottom:60px}}.icon{fill:currentColor;width:18px;height:18px;vertical-align:-3px}.btn,.btn__count,.error main,video{vertical-align:middle}a svg,button svg,label svg{pointer-events:none}.btn .icon,a .icon{margin-right:10px}.btn:not(.btn-large) .icon{width:16px;height:16px}nav ul{margin:0;font-size:0}nav li{margin-top:10px;font-size:16px;font-size:1rem}nav li+li{margin-left:20px}.btn__bar{margin:0 auto 20px}.btn__bar::before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background:#dbe3e8}.btn__bar ul{position:relative;z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn__bar li{margin:0}.btn__bar li:first-child .btn{border-radius:4px 0 0 4px}.btn__bar li:last-child .btn{border-radius:0 4px 4px 0}.btn__bar li+li .btn{margin-left:-1px}.btn__bar li.active .btn{position:relative;z-index:1}.btn__bar li.active .btn .icon{color:inherit}.btn__bar li.active+li .btn:hover{z-index:0}.btn__bar .btn{position:relative;display:block;border-radius:0}.btn__bar .btn:focus,.btn__bar .btn:hover{z-index:1}@media (min-width:560px){.btn__bar{margin-bottom:40px}}.btn,.btn__count{display:inline-block;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:700}.btn{padding:10px 12px;background:linear-gradient(#f8fafb,#e9eef1);border:1px solid #cbd0d3;box-shadow:0 1px 1px rgba(0,0,0,.05);text-shadow:0 1px 1px #fff;color:#55646b;transition:background .1s ease,color .1s ease;font-size:14px;font-size:.875rem}.btn:focus,.btn:hover{border-color:#b5bcc0;color:#55646b;outline:0}.btn--large{padding:10px 20px;font-size:16px;font-size:1rem}.btn--primary,.btn__bar li.active .btn{background-image:linear-gradient(#3498db,#258cd1);background-color:#3498db;border-color:#217dbb;box-shadow:0 1px 1px rgba(0,0,0,.15);text-shadow:0 1px 1px rgba(0,0,0,.1);color:#fff}.btn--primary:focus,.btn--primary:hover{color:#fff;border-color:#196090}.btn--youtube .icon{color:#cc181e}.btn--vimeo .icon{color:#19b7ed}.btn--twitter .icon{color:#4BAAF4}.btn__count{position:relative;margin-left:10px;padding:10px 15px;background:#fff;border:1px solid #cbd0d3}.btn__count::before,.plyr__video-wrapper::after{content:"";position:absolute}.btn__count::before{display:block;width:8px;height:8px;left:1px;top:50%;margin-top:-4px;background:inherit;border:inherit;border-width:1px 0 0 1px;transform:rotate(-45deg) translate(-50%,-50%)}.error body,html.error{height:100%}.error body{width:100%;display:table;table-layout:fixed}.error main{display:table-cell;width:100%}video{max-width:100%}.plyr{margin:0 auto;border-radius:6px}.plyr--audio{max-width:520px}.plyr__video-wrapper::after{pointer-events:none;top:0;bottom:0;left:0;right:0;border:1px solid rgba(0,0,0,.15);border-radius:inherit}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:5px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block} \ No newline at end of file
diff --git a/demo/dist/demo.js b/demo/dist/demo.js
index dbb9dd10..10982d16 100644
--- a/demo/dist/demo.js
+++ b/demo/dist/demo.js
@@ -1 +1 @@
-"document"in self&&("classList"in document.createElement("_")?!function(){"use strict";var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function(e){var t=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(e){var i,n=arguments.length;for(i=0;i<n;i++)e=arguments[i],t.call(this,e)}};t("add"),t("remove")}if(e.classList.toggle("c3",!1),e.classList.contains("c3")){var i=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,t){return 1 in arguments&&!this.contains(e)==!t?t:i.call(this,e)}}e=null}():!function(e){"use strict";if("Element"in e){var t="classList",i="prototype",n=e.Element[i],o=Object,r=String[i].trim||function(){return this.replace(/^\s+|\s+$/g,"")},s=Array[i].indexOf||function(e){for(var t=0,i=this.length;t<i;t++)if(t in this&&this[t]===e)return t;return-1},a=function(e,t){this.name=e,this.code=DOMException[e],this.message=t},c=function(e,t){if(""===t)throw new a("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(t))throw new a("INVALID_CHARACTER_ERR","String contains an invalid character");return s.call(e,t)},l=function(e){for(var t=r.call(e.getAttribute("class")||""),i=t?t.split(/\s+/):[],n=0,o=i.length;n<o;n++)this.push(i[n]);this._updateClassName=function(){e.setAttribute("class",this.toString())}},u=l[i]=[],d=function(){return new l(this)};if(a[i]=Error[i],u.item=function(e){return this[e]||null},u.contains=function(e){return e+="",c(this,e)!==-1},u.add=function(){var e,t=arguments,i=0,n=t.length,o=!1;do e=t[i]+"",c(this,e)===-1&&(this.push(e),o=!0);while(++i<n);o&&this._updateClassName()},u.remove=function(){var e,t,i=arguments,n=0,o=i.length,r=!1;do for(e=i[n]+"",t=c(this,e);t!==-1;)this.splice(t,1),r=!0,t=c(this,e);while(++n<o);r&&this._updateClassName()},u.toggle=function(e,t){e+="";var i=this.contains(e),n=i?t!==!0&&"remove":t!==!1&&"add";return n&&this[n](e),t===!0||t===!1?t:!i},u.toString=function(){return this.join(" ")},o.defineProperty){var p={get:d,enumerable:!0,configurable:!0};try{o.defineProperty(n,t,p)}catch(e){e.number===-2146823252&&(p.enumerable=!1,o.defineProperty(n,t,p))}}else o[i].__defineGetter__&&n.__defineGetter__(t,d)}}(self)),function(){window.loadSprite=function(e,t){function i(e,t){e.innerHTML=t,n.insertBefore(e,n.childNodes[0])}if("string"==typeof e){var n=document.body,o="cache-",r="string"==typeof t,s=!1,a=function(){if(!r)return!1;var e="___test";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}();if(!r||0===document.querySelectorAll("#"+t).length){var c=document.createElement("div");if(c.setAttribute("hidden",""),r&&c.setAttribute("id",t),a){var l=localStorage.getItem(o+t);if(s=null!==l){var u=JSON.parse(l);i(c,u.content)}}var d=new XMLHttpRequest;if(!("withCredentials"in d))return;d.open("GET",e,!0),d.onload=function(){a&&localStorage.setItem(o+t,JSON.stringify({content:d.responseText})),i(c,d.responseText)},d.send()}}}}(),function(){function e(e,t,i){if(e)if(e.classList)e.classList[i?"add":"remove"](t);else{var n=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=n+(i?" "+t:"")}}function t(t,s){if(t in o&&(s||t!==r)&&(r.length||t!==o.video)){switch(t){case o.video:i.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"}],poster:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0}]});break;case o.audio:i.source({type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]});break;case o.youtube:i.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://www.youtube.com/watch?v=bTqVqk7FSmY",type:"youtube"}]});break;case o.vimeo:i.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://vimeo.com/76979871",type:"vimeo"}]})}r=t;for(var a=n.length-1;a>=0;a--)e(n[a].parentElement,"active",!1);e(document.querySelector('[data-source="'+t+'"]').parentElement,"active",!0),[].forEach.call(document.querySelectorAll(".plyr__cite"),function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+t).removeAttribute("hidden")}}var i=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",tooltips:{controls:!0},captions:{defaultActive:!0},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","fullscreen","pip","airplay"]});window.player=i,window.loadSprite("dist/demo.svg","demo-sprite");var n=document.querySelectorAll("[data-source]"),o={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},r=window.location.hash.replace("#",""),s=window.history&&window.history.pushState;if([].forEach.call(n,function(e){e.addEventListener("click",function(){var e=this.getAttribute("data-source");t(e),s&&history.pushState({type:e},"","#"+e)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&t(e.state.type)}),s){var a=!r.length;a&&(r=o.video),r in o&&history.replaceState({type:r},"",a?"":"#"+r),r!==o.video&&t(r,!0)}}(),"plyr.io"===window.location.host&&(!function(e,t,i,n,o,r,s){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,r=t.createElement(i),s=t.getElementsByTagName(i)[0],r.async=1,r.src=n,s.parentNode.insertBefore(r,s)}(window,document,"script","//www.google-analytics.com/analytics.js","ga"),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview")); \ No newline at end of file
+"document"in self&&("classList"in document.createElement("_")?!function(){"use strict";var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function(e){var t=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(e){var i,n=arguments.length;for(i=0;i<n;i++)e=arguments[i],t.call(this,e)}};t("add"),t("remove")}if(e.classList.toggle("c3",!1),e.classList.contains("c3")){var i=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,t){return 1 in arguments&&!this.contains(e)==!t?t:i.call(this,e)}}e=null}():!function(e){"use strict";if("Element"in e){var t="classList",i="prototype",n=e.Element[i],o=Object,r=String[i].trim||function(){return this.replace(/^\s+|\s+$/g,"")},s=Array[i].indexOf||function(e){for(var t=0,i=this.length;t<i;t++)if(t in this&&this[t]===e)return t;return-1},a=function(e,t){this.name=e,this.code=DOMException[e],this.message=t},c=function(e,t){if(""===t)throw new a("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(t))throw new a("INVALID_CHARACTER_ERR","String contains an invalid character");return s.call(e,t)},l=function(e){for(var t=r.call(e.getAttribute("class")||""),i=t?t.split(/\s+/):[],n=0,o=i.length;n<o;n++)this.push(i[n]);this._updateClassName=function(){e.setAttribute("class",this.toString())}},u=l[i]=[],d=function(){return new l(this)};if(a[i]=Error[i],u.item=function(e){return this[e]||null},u.contains=function(e){return e+="",c(this,e)!==-1},u.add=function(){var e,t=arguments,i=0,n=t.length,o=!1;do e=t[i]+"",c(this,e)===-1&&(this.push(e),o=!0);while(++i<n);o&&this._updateClassName()},u.remove=function(){var e,t,i=arguments,n=0,o=i.length,r=!1;do for(e=i[n]+"",t=c(this,e);t!==-1;)this.splice(t,1),r=!0,t=c(this,e);while(++n<o);r&&this._updateClassName()},u.toggle=function(e,t){e+="";var i=this.contains(e),n=i?t!==!0&&"remove":t!==!1&&"add";return n&&this[n](e),t===!0||t===!1?t:!i},u.toString=function(){return this.join(" ")},o.defineProperty){var p={get:d,enumerable:!0,configurable:!0};try{o.defineProperty(n,t,p)}catch(h){h.number===-2146823252&&(p.enumerable=!1,o.defineProperty(n,t,p))}}else o[i].__defineGetter__&&n.__defineGetter__(t,d)}}(self)),function(){window.loadSprite=function(e,t){function i(e,t){e.innerHTML=t,n.insertBefore(e,n.childNodes[0])}if("string"==typeof e){var n=document.body,o="cache-",r="string"==typeof t,s=!1,a=function(){if(!r)return!1;var e="___test";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(t){return!1}}();if(!r||0===document.querySelectorAll("#"+t).length){var c=document.createElement("div");if(c.setAttribute("hidden",""),r&&c.setAttribute("id",t),a){var l=localStorage.getItem(o+t);if(s=null!==l){var u=JSON.parse(l);i(c,u.content)}}var d=new XMLHttpRequest;if(!("withCredentials"in d))return;d.open("GET",e,!0),d.onload=function(){a&&localStorage.setItem(o+t,JSON.stringify({content:d.responseText})),i(c,d.responseText)},d.send()}}}}(),function(){function e(e,t,i){if(e)if(e.classList)e.classList[i?"add":"remove"](t);else{var n=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=n+(i?" "+t:"")}}function t(t,s){if(t in o&&(s||t!==r)&&(r.length||t!==o.video)){switch(t){case o.video:i.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"}],poster:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.en.vtt","default":!0}]});break;case o.audio:i.source({type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]});break;case o.youtube:i.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://www.youtube.com/watch?v=bTqVqk7FSmY",type:"youtube"}]});break;case o.vimeo:i.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://vimeo.com/76979871",type:"vimeo"}]})}r=t;for(var a=n.length-1;a>=0;a--)e(n[a].parentElement,"active",!1);e(document.querySelector('[data-source="'+t+'"]').parentElement,"active",!0),[].forEach.call(document.querySelectorAll(".plyr__cite"),function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+t).removeAttribute("hidden")}}var i=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",tooltips:{controls:!0},captions:{defaultActive:!0},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","fullscreen","pip","airplay"]});window.player=i,window.loadSprite("dist/demo.svg","demo-sprite");var n=document.querySelectorAll("[data-source]"),o={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},r=window.location.hash.replace("#",""),s=window.history&&window.history.pushState;if([].forEach.call(n,function(e){e.addEventListener("click",function(){var e=this.getAttribute("data-source");t(e),s&&history.pushState({type:e},"","#"+e)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&t(e.state.type)}),s){var a=!r.length;a&&(r=o.video),r in o&&history.replaceState({type:r},"",a?"":"#"+r),r!==o.video&&t(r,!0)}}(),"plyr.io"===window.location.host&&(!function(e,t,i,n,o,r,s){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,r=t.createElement(i),s=t.getElementsByTagName(i)[0],r.async=1,r.src=n,s.parentNode.insertBefore(r,s)}(window,document,"script","//www.google-analytics.com/analytics.js","ga"),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview")); \ No newline at end of file
diff --git a/demo/index.html b/demo/index.html
index 5dd88d5e..7af0e372 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -1,113 +1,124 @@
<!doctype html>
<html lang="en">
- <head>
- <meta charset="utf-8" />
- <title>Plyr - A simple HTML5 media player</title>
- <meta name="description" content="A simple HTML5 media player with custom controls and WebVTT captions.">
- <meta name="author" content="Sam Potts">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- Styles -->
- <link rel="stylesheet" href="../dist/plyr.css">
+<head>
+ <meta charset="utf-8" />
+ <title>Plyr - A simple HTML5 media player</title>
+ <meta name="description" content="A simple HTML5 media player with custom controls and WebVTT captions.">
+ <meta name="author" content="Sam Potts">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- Docs styles -->
- <link rel="stylesheet" href="dist/demo.css">
- </head>
- <body>
- <header>
- <h1>Plyr</h1>
- <p>A simple, accessible HTML5 media player by <a href="https://twitter.com/sam_potts" target="_blank">@sam_potts</a></p>
- <nav>
- <ul>
- <li>
- <a href="https://github.com/sampotts/plyr" target="_blank" class="btn btn--large btn--primary" data-shr-network="github">
- <svg class="icon"><use xlink:href="#icon-github"/></svg>Download on GitHub
- </a>
- </li>
- <li>
- <a href="https://twitter.com/intent/tweet?text=A+simple+HTML5+media+player+with+custom+controls+and+WebVTT+captions.&url=http%3A%2F%2Fplyr.io&via=Sam_Potts" target="_blank" class="btn btn--large btn--twitter" data-shr-network="twitter">
- <svg class="icon"><use xlink:href="#icon-twitter"/></svg>Tweet
- </a>
- </li>
- </ul>
- </nav>
- </header>
+ <!-- Styles -->
+ <link rel="stylesheet" href="../dist/plyr.css">
- <main role="main" id="main">
- <nav class="btn__bar">
- <ul>
- <li class="active">
- <button type="button" class="btn" data-source="video">Video</button>
- </li>
- <li>
- <button type="button" class="btn" data-source="audio">Audio</button>
- </li>
- <li>
- <button type="button" class="btn btn--youtube" data-source="youtube"><svg class="icon"><use xlink:href="#icon-youtube"/></svg>YouTube</button>
- </li>
- <li>
- <button type="button" class="btn btn--vimeo" data-source="vimeo"><svg class="icon"><use xlink:href="#icon-vimeo"/></svg>Vimeo</button>
- </li>
- </ul>
- </nav>
+ <!-- Docs styles -->
+ <link rel="stylesheet" href="dist/demo.css">
+</head>
- <video controls crossorigin playsinline poster="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg" id="player">
- <!-- Video files -->
- <source src="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4" type="video/mp4">
-
- <!-- Text track file -->
- <track kind="captions" label="English" srclang="en" src="webvtt/View_From_A_Blue_Moon_Trailer-HD.en.vtt" default>
- <track kind="captions" label="Français" srclang="fr" src="webvtt/View_From_A_Blue_Moon_Trailer-HD.fr.vtt">
-
- <!-- Fallback for browsers that don't support the <video> element -->
- <a href="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4" download>Download</a>
- </video>
+<body>
+ <header>
+ <h1>Plyr</h1>
+ <p>A simple, accessible HTML5 media player by <a href="https://twitter.com/sam_potts" target="_blank">@sam_potts</a></p>
+ <nav>
+ <ul>
+ <li>
+ <a href="https://github.com/sampotts/plyr" target="_blank" class="btn btn--large btn--primary" data-shr-network="github">
+ <svg class="icon"><use xlink:href="#icon-github"/></svg>Download on GitHub
+ </a>
+ </li>
+ <li>
+ <a href="https://twitter.com/intent/tweet?text=A+simple+HTML5+media+player+with+custom+controls+and+WebVTT+captions.&url=http%3A%2F%2Fplyr.io&via=Sam_Potts" target="_blank" class="btn btn--large btn--twitter" data-shr-network="twitter">
+ <svg class="icon"><use xlink:href="#icon-twitter"/></svg>Tweet
+ </a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main role="main" id="main">
+ <nav class="btn__bar">
<ul>
- <li class="plyr__cite plyr__cite--video" hidden>
- <small>
- <a href="http://viewfromabluemoon.com/" target="_blank">View From A Blue Moon</a> &copy; Brainfarm
- </small>
+ <li class="active">
+ <button type="button" class="btn" data-source="video">Video</button>
</li>
- <li class="plyr__cite plyr__cite--audio" hidden>
- <small>
- <a href="http://www.kishibashi.com/" target="_blank">Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;</a> &copy; Kishi Bashi
- </small>
+ <li>
+ <button type="button" class="btn" data-source="audio">Audio</button>
</li>
- <li class="plyr__cite plyr__cite--youtube" hidden>
- <small>
- <a href="https://www.youtube.com/watch?v=bTqVqk7FSmY" target="_blank">View From A Blue Moon</a> on
- <span class="color--youtube">
- <svg class="icon">
- <use xlink:href="#icon-youtube"/>
- </svg> YouTube
- </span>
- </small>
+ <li>
+ <button type="button" class="btn btn--youtube" data-source="youtube"><svg class="icon"><use xlink:href="#icon-youtube"/></svg>YouTube</button>
</li>
- <li class="plyr__cite plyr__cite--vimeo" hidden>
- <small>
- <a href="https://vimeo.com/ondemand/viewfromabluemoon4k" target="_blank">View From A Blue Moon</a> on
- <span class="color--vimeo">
- <svg class="icon">
- <use xlink:href="#icon-vimeo"/>
- </svg> Vimeo
- </span>
- </small>
+ <li>
+ <button type="button" class="btn btn--vimeo" data-source="vimeo"><svg class="icon"><use xlink:href="#icon-vimeo"/></svg>Vimeo</button>
</li>
</ul>
- </main>
+ </nav>
+
+ <video controls crossorigin playsinline muted autoplay loop poster="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg" id="player">
+ <!-- Video files -->
+ <source src="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4" type="video/mp4">
+
+ <!-- Text track file -->
+ <track kind="captions" label="English" srclang="en" src="webvtt/View_From_A_Blue_Moon_Trailer-HD.en.vtt" default>
+ <track kind="captions" label="Français" srclang="fr" src="webvtt/View_From_A_Blue_Moon_Trailer-HD.fr.vtt">
+
+ <!-- Fallback for browsers that don't support the <video> element -->
+ <a href="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4" download>Download</a>
+ </video>
+
+ <ul>
+ <li class="plyr__cite plyr__cite--video" hidden>
+ <small>
+ <a href="http://viewfromabluemoon.com/" target="_blank">View From A Blue Moon</a> &copy; Brainfarm
+ </small>
+ </li>
+ <li class="plyr__cite plyr__cite--audio" hidden>
+ <small>
+ <a href="http://www.kishibashi.com/" target="_blank">Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;</a> &copy; Kishi Bashi
+ </small>
+ </li>
+ <li class="plyr__cite plyr__cite--youtube" hidden>
+ <small>
+ <a href="https://www.youtube.com/watch?v=bTqVqk7FSmY" target="_blank">View From A Blue Moon</a> on
+ <span class="color--youtube">
+ <svg class="icon">
+ <use xlink:href="#icon-youtube"/>
+ </svg> YouTube
+ </span>
+ </small>
+ </li>
+ <li class="plyr__cite plyr__cite--vimeo" hidden>
+ <small>
+ <a href="https://vimeo.com/ondemand/viewfromabluemoon4k" target="_blank">View From A Blue Moon</a> on
+ <span class="color--vimeo">
+ <svg class="icon">
+ <use xlink:href="#icon-vimeo"/>
+ </svg> Vimeo
+ </span>
+ </small>
+ </li>
+ </ul>
+ </main>
+
+ <!-- Plyr core script -->
+ <script src="../src/js/plyr.js"></script>
- <!-- Plyr core script -->
- <script src="../src/js/plyr.js"></script>
+ <!-- Docs script -->
+ <script src="dist/demo.js"></script>
- <!-- Docs script -->
- <script src="dist/demo.js"></script>
+ <!-- Rangetouch to fix <input type="range"> on touch devices (see https://rangetouch.com) -->
+ <script src="https://cdn.rangetouch.com/1.0.1/rangetouch.js" async></script>
- <!-- Rangetouch to fix <input type="range"> on touch devices (see https://rangetouch.com) -->
- <script src="https://cdn.rangetouch.com/1.0.1/rangetouch.js" async></script>
+ <!-- Sharing libary (https://shr.one) -->
+ <script src="https://cdn.shr.one/1.0.1/shr.js"></script>
+ <script>
+ if (window.shr) {
+ window.shr.setup({
+ count: {
+ classname: 'btn__count'
+ }
+ });
+ }
+ </script>
+</body>
- <!-- Sharing libary (https://shr.one) -->
- <script src="https://cdn.shr.one/1.0.1/shr.js"></script>
- <script>if(window.shr) { window.shr.setup({ count: { classname: 'btn__count' } }); }</script>
- </body>
-</html>
+</html> \ No newline at end of file
diff --git a/demo/src/js/main.js b/demo/src/js/main.js
index 3d44b94f..2ff94121 100644
--- a/demo/src/js/main.js
+++ b/demo/src/js/main.js
@@ -142,12 +142,11 @@
type: 'audio',
title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',
sources: [{
- src: 'https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',
- type: 'audio/mp3'
- },
- {
- src: 'https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',
- type: 'audio/ogg'
+ src: 'https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',
+ type: 'audio/mp3'
+ }, {
+ src: 'https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',
+ type: 'audio/ogg'
}]
});
break;
@@ -200,15 +199,15 @@ if (window.location.host === 'plyr.io') {
(function(i, s, o, g, r, a, m) {
i.GoogleAnalyticsObject = r;
i[r] = i[r] || function() {
- (i[r].q = i[r].q || []).push(arguments)
+ (i[r].q = i[r].q || []).push(arguments);
};
i[r].l = 1 * new Date();
a = s.createElement(o);
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
- m.parentNode.insertBefore(a, m)
+ m.parentNode.insertBefore(a, m);
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
window.ga('create', 'UA-40881672-11', 'auto');
window.ga('send', 'pageview');
-}
+} \ No newline at end of file
diff --git a/demo/src/less/components/base.less b/demo/src/less/components/base.less
index 7f71dbb4..7e5f97c6 100644
--- a/demo/src/less/components/base.less
+++ b/demo/src/less/components/base.less
@@ -15,12 +15,17 @@
// Base
html {
- background: @body-background;
+ height: 100%;
+ background: @body-background fixed;
}
body {
- max-width: @container-width;
- margin: auto;
+ margin: 0 auto @padding-base;
padding: (@padding-base / 2);
+ max-width: @example-width-video;
+
+ @media (min-width: @screen-sm) {
+ margin-bottom: (@padding-base * 2);
+ }
}
// Header
@@ -31,18 +36,8 @@ header {
p {
.font-size(18);
}
-
@media (min-width: @screen-sm) {
padding-top: (@padding-base * 3);
padding-bottom: (@padding-base * 3);
}
-}
-
-// Sections
-section {
- margin-bottom: @padding-base;
-
- @media (min-width: @screen-sm) {
- margin-bottom: (@padding-base * 2);
- }
} \ No newline at end of file
diff --git a/demo/src/less/components/buttons.less b/demo/src/less/components/buttons.less
index d1538967..c99a0836 100644
--- a/demo/src/less/components/buttons.less
+++ b/demo/src/less/components/buttons.less
@@ -3,160 +3,170 @@
// ==========================================================================
nav {
- ul {
- list-style: none;
- margin: 0;
- padding: 0;
- font-size: 0;
- }
- li {
- display: inline-block;
- margin-top: (@padding-base / 2);
- .font-size();
- white-space: nowrap;
- }
- li + li {
- margin-left: @padding-base;
- }
+ ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ font-size: 0;
+ }
+ li {
+ display: inline-block;
+ margin-top: (@padding-base / 2);
+ .font-size();
+ white-space: nowrap;
+ }
+ li + li {
+ margin-left: @padding-base;
+ }
}
// Tabs
.btn__bar {
- position: relative;
- margin: 0 auto @padding-base;
- white-space: nowrap;
-
- &::before {
- content: "";
- position: absolute;
- top: 50%;
- left: 0;
- right: 0;
- height: 1px;
- background: @off-white;
- }
-
- ul {
- position: relative;
- z-index: 1;
- display: inline-block;
- }
- li {
- margin: 0;
-
- &:first-child .btn {
- border-radius: 4px 0 0 4px;
- }
- &:last-child .btn {
- border-radius: 0 4px 4px 0;
- }
- & + li .btn {
- margin-left: -1px;
- }
-
- &.active .btn {
- &:extend(.btn--primary);
- position: relative;
- z-index: 1;
-
- .icon {
- color: inherit;
- }
- }
- &.active + li .btn:hover {
- z-index: 0;
- }
- }
- .btn {
- position: relative;
- display: block;
- border-radius: 0;
-
- &:hover,
- &:focus {
- z-index: 1;
- }
- }
-
- @media (min-width: 560px) {
- margin-bottom: (@padding-base * 2);
- }
+ position: relative;
+ margin: 0 auto @padding-base;
+ max-width: @example-width-video;
+ white-space: nowrap;
+
+ &::before {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: @gray-lighter;
+ }
+
+ ul {
+ position: relative;
+ z-index: 1;
+ display: inline-block;
+ user-select: none;
+ }
+ li {
+ margin: 0;
+
+ &:first-child .btn {
+ border-radius: 4px 0 0 4px;
+ }
+ &:last-child .btn {
+ border-radius: 0 4px 4px 0;
+ }
+ & + li .btn {
+ margin-left: -1px;
+ }
+
+ &.active .btn {
+ &:extend(.btn--primary);
+ box-shadow: inset 0 1px 1px rgba(0,0,0, .2);
+ position: relative;
+ z-index: 1;
+
+ .icon {
+ color: inherit;
+ }
+ }
+ &.active + li .btn:hover {
+ z-index: 0;
+ }
+ }
+ .btn {
+ position: relative;
+ display: block;
+ border-radius: 0;
+
+ &:hover,
+ &:focus {
+ z-index: 1;
+ }
+ }
+
+ @media (min-width: 560px) {
+ margin-bottom: (@padding-base * 2);
+ }
}
// Shared
.btn,
.btn__count {
- display: inline-block;
- vertical-align: middle;
- border-radius: @border-radius-base;
- user-select: none;
- font-weight: @font-weight-bold;
+ display: inline-block;
+ vertical-align: middle;
+ border-radius: @border-radius-base;
+ user-select: none;
+ font-weight: @font-weight-bold;
}
// Buttons
.btn {
- padding: (@padding-base / 2) ((@padding-base / 2) + 2);
- background: #fff;
- border: 1px solid @gray-lighter;
- color: @gray;
- transition: all .2s ease;
- .font-size(@font-size-small);
-
- &:hover,
- &:focus {
- border-color: @gray-light;
- }
+ padding: (@padding-base / 2) ((@padding-base / 2) + 2);
+ background: linear-gradient(lighten(@off-white, 2%), darken(@off-white, 3%));
+ border: 1px solid @gray-light;
+ box-shadow: 0 1px 1px rgba(0,0,0, .05);
+ text-shadow: 0 1px 1px #fff;
+ color: @gray;
+ transition: background .1s ease, color .1s ease;
+ .font-size(@font-size-small);
+
+ &:hover,
+ &:focus {
+ border-color: darken(@gray-light, 8%);
+ color: @gray;
+ outline: 0;
+ }
}
// Sizes
.btn--large {
- padding: (@padding-base / 2) @padding-base;
- .font-size();
+ padding: (@padding-base / 2) @padding-base;
+ .font-size();
}
// Styles
.btn--primary {
- background-color: @link-color;
- border-color: @link-color;
- color: #fff;
-
- &:hover,
- &:focus {
- color: #fff;
- border-color: darken(@link-color, 5%);
- }
+ background-image: linear-gradient(@link-color, darken(@link-color, 5%));
+ background-color: @link-color;
+ border-color: darken(@link-color, 10%);
+ box-shadow: 0 1px 1px rgba(0,0,0, .15);
+ text-shadow: 0 1px 1px rgba(0,0,0, .1);
+ color: #fff;
+
+ &:hover,
+ &:focus {
+ color: #fff;
+ border-color: darken(@link-color, 20%);
+ }
}
.btn--youtube .icon {
- color: @color-youtube;
+ color: @color-youtube;
}
.btn--vimeo .icon {
- color: @color-vimeo;
+ color: @color-vimeo;
}
.btn--twitter .icon {
- color: @color-twitter;
+ color: @color-twitter;
}
// Count bubble
.btn__count {
- position: relative;
- margin-left: (@padding-base / 2);
- padding: (@padding-base / 2) (@padding-base * .75);
- background: #fff;
- border: 1px solid @gray-lighter;
-
- &::before {
- content: "";
- position: absolute;
- display: block;
- width: @arrow-size;
- height: @arrow-size;
- left: 1px;
- top: 50%;
- margin-top: -(@arrow-size / 2);
-
- background: inherit;
- border: inherit;
- border-width: 1px 0 0 1px;
- transform: rotate(-45deg) translate(-50%, -50%);
- }
+ position: relative;
+ margin-left: (@padding-base / 2);
+ padding: (@padding-base / 2) (@padding-base * .75);
+ background: #fff;
+ border: 1px solid @gray-light;
+
+ &::before {
+ content: "";
+ position: absolute;
+ display: block;
+ width: @arrow-size;
+ height: @arrow-size;
+ left: 1px;
+ top: 50%;
+ margin-top: -(@arrow-size / 2);
+
+ background: inherit;
+ border: inherit;
+ border-width: 1px 0 0 1px;
+ transform: rotate(-45deg) translate(-50%, -50%);
+ }
}
diff --git a/demo/src/less/components/examples.less b/demo/src/less/components/examples.less
index ff22e37b..a9e72d21 100644
--- a/demo/src/less/components/examples.less
+++ b/demo/src/less/components/examples.less
@@ -30,5 +30,17 @@ video {
// Style full supported player
.plyr__cite {
+ display: none;
margin-top: @padding-base;
+
+ .icon {
+ margin-right: (@padding-base / 4);
+ }
+}
+
+.plyr--video:not(.plyr--youtube):not(.plyr--vimeo) ~ ul .plyr__cite--video,
+.plyr--audio ~ ul .plyr__cite--audio,
+.plyr--youtube ~ ul .plyr__cite--youtube,
+.plyr--vimeo ~ ul .plyr__cite--vimeo {
+ display: block;
}
diff --git a/demo/src/less/components/type.less b/demo/src/less/components/type.less
index 1f16161a..951be36d 100644
--- a/demo/src/less/components/type.less
+++ b/demo/src/less/components/type.less
@@ -51,22 +51,22 @@ li {
a {
text-decoration: none;
color: @link-color;
- transition: color .3s ease;
+ border-bottom: 1px dotted currentColor;
+ transition: background .3s ease, color .3s ease, border .3s ease;
&:hover,
&:focus {
color: @gray-dark;
+ border-bottom-color: rgba(0,0,0,0);
+ }
+ &:focus {
+ .tab-focus();
}
&.logo {
border: 0;
}
}
-a:focus,
-button:focus {
- .tab-focus();
-}
-
.color--vimeo {
color: @color-vimeo;
}
diff --git a/demo/src/less/variables.less b/demo/src/less/variables.less
index 25e91674..4768cdd6 100644
--- a/demo/src/less/variables.less
+++ b/demo/src/less/variables.less
@@ -9,7 +9,7 @@
@gray-lighter: #dbe3e8;
@off-white: #f2f5f7;
-@brand-primary: #1aafff;
+@brand-primary: #3498db;
@brand-secondary: #02BD9B;
// Brands
@@ -18,14 +18,14 @@
@color-vimeo: #19b7ed;
// Base
-@body-background: #fff;
+@body-background: @off-white; //linear-gradient(to left top, @brand-secondary, @brand-primary);
// Type
@font-size-base: 16;
@font-size-small: 14;
@font-size-h1: 64;
@font-weight-base: 500;
-@font-weight-bold: 600;
+@font-weight-bold: 700;
// Elements
@link-color: @brand-primary;
@@ -45,4 +45,4 @@
// Examples
@example-width-audio: 520px;
-@container-width: 800px;
+@example-width-video: 1200px;
diff --git a/dist/plyr.js b/dist/plyr.js
index 5ec4df76..b3831074 100644
--- a/dist/plyr.js
+++ b/dist/plyr.js
@@ -1,2 +1,3 @@
-(function(e,t,n){"use strict";"object"==typeof exports?module.exports=n(require):"function"==typeof define&&define.amd?define(n):t[e]=n()}).call(this,"Plyr",this,function(e){"use strict";function t(e,t){function n(e,t,n,i){a.event(e,t,n,a.extend({},i,{plyr:me}))}function l(){function e(e){9===e.which&&me.fullscreen.active&&(e.target!==i||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),i.focus()):(e.preventDefault(),n.focus()))}var t=c("input:not([disabled]), button:not([disabled])"),n=t[0],i=t[t.length-1];a.on(me.elements.container,"keydown",e,!1)}function c(e){return me.elements.container.querySelectorAll(e)}function u(e){return c(e)[0]}function d(e){a.is.string(e)?(a.removeElement(me.elements[e]),me.elements[e]=null):a.removeElement(e)}function p(e,t){a.is.string(t)?a.insertElement(e,me.media,{src:t}):a.is.array(t)&&t.forEach(function(t){a.insertElement(e,me.media,t)})}function m(){return{url:me.config.iconUrl,absolute:0===me.config.iconUrl.indexOf("http")||me.browser.isIE}}function f(e,t){var n="http://www.w3.org/2000/svg",i=m(),o=(i.absolute?"":i.url)+"#"+me.config.iconPrefix,s=document.createElementNS(n,"svg");a.setAttributes(s,a.extend(t,{role:"presentation"}));var r=document.createElementNS(n,"use");return r.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o+"-"+e),s.appendChild(r),s}function g(e){var t=me.config.i18n[e];switch(e){case"pip":t="PIP";break;case"airplay":t="AirPlay"}return a.createElement("span",{class:me.config.classes.hidden},t)}function y(e){var t=a.createElement("span",{class:me.config.classes.menu.value});return t.appendChild(a.createElement("span",{class:me.config.classes.menu.badge},e)),t}function b(e,t){var n,i,o,s=a.createElement("button");switch(a.is.object(t)||(t={}),"class"in t?t.class.indexOf(me.config.classes.control)===-1&&(t.class+=" "+me.config.classes.control):t.class=me.config.classes.control,e){case"mute":o="toggleMute",n="volume",i="muted";break;case"captions":o="toggleCaptions",n="captions-off",i="captions-on";break;case"fullscreen":o="toggleFullscreen",n="enter-fullscreen",i="exit-fullscreen";break;case"play-large":t.class="plyr__play-large",e="play",o="play",n="play";break;default:o=e,n=e}return a.extend(t,a.getAttributesFromSelector(me.config.selectors.buttons[e],t)),a.is.string(i)&&s.appendChild(f(i,{class:"icon--"+i})),s.appendChild(f(n)),s.appendChild(g(o)),a.setAttributes(s,t),me.elements.buttons[e]=s,s}function v(e,t){var n=a.createElement("label",{for:t.id,class:me.config.classes.hidden},me.config.i18n[e]),i=a.createElement("input",a.extend(a.getAttributesFromSelector(me.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.1,value:0,autocomplete:"off"},t));return me.elements.inputs[e]=i,{label:n,input:i}}function h(e,t){var n=a.createElement("progress",a.extend(a.getAttributesFromSelector(me.config.selectors.display[e]),{min:0,max:100,value:0},t));if("volume"!==e){n.appendChild(a.createElement("span",null,"0"));var i="";switch(e){case"played":i=me.config.i18n.played;break;case"buffer":i=me.config.i18n.buffered}n.textContent="% "+i.toLowerCase()}return me.elements.display[e]=n,n}function w(e){var t=a.createElement("span",{class:"plyr__time"});return t.appendChild(a.createElement("span",{class:me.config.classes.hidden},me.config.i18n[e])),t.appendChild(a.createElement("span",a.getAttributesFromSelector(me.config.selectors.display[e]),"00:00")),me.elements.display[e]=t,t}function k(e){if(!a.is.empty(me.config.controls)){var t=a.createElement("div",a.getAttributesFromSelector(me.config.selectors.controls.wrapper));if(a.inArray(me.config.controls,"restart")&&t.appendChild(b("restart")),a.inArray(me.config.controls,"rewind")&&t.appendChild(b("rewind")),a.inArray(me.config.controls,"play")&&(t.appendChild(b("play")),t.appendChild(b("pause"))),a.inArray(me.config.controls,"fast-forward")&&t.appendChild(b("fast-forward")),a.inArray(me.config.controls,"progress")){var n=a.createElement("span",a.getAttributesFromSelector(me.config.selectors.progress)),i=v("seek",{id:"plyr-seek-"+e.id});if(n.appendChild(i.label),n.appendChild(i.input),n.appendChild(h("played")),n.appendChild(h("buffer")),me.config.tooltips.seek){var o=a.createElement("span",{role:"tooltip",class:me.config.classes.tooltip},"00:00");n.appendChild(o),me.elements.display.seekTooltip=o}me.elements.progress=n,t.appendChild(me.elements.progress)}if(a.inArray(me.config.controls,"current-time")&&t.appendChild(w("currentTime")),a.inArray(me.config.controls,"duration")&&t.appendChild(w("duration")),a.inArray(me.config.controls,"mute")&&t.appendChild(b("mute")),a.inArray(me.config.controls,"volume")){var s=a.createElement("span",{class:"plyr__volume"}),l={max:10,value:me.config.volume},c=v("volume",a.extend(l,{id:"plyr-volume-"+e.id}));s.appendChild(c.label),s.appendChild(c.input);var u=h("volume",l);s.appendChild(u),t.appendChild(s)}if(a.inArray(me.config.controls,"captions")&&t.appendChild(b("captions")),a.inArray(me.config.controls,"settings")&&!a.is.empty(me.config.settings)){var d=a.createElement("div",{class:"plyr__menu"});d.appendChild(b("settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var p=a.createElement("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,"aria-hidden":!0,"aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),m=a.createElement("div"),f=a.createElement("div",{id:"plyr-settings-"+e.id+"-home","aria-hidden":!1,"aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),g=a.createElement("ul",{role:"tablist"});me.config.settings.forEach(function(t){var n=a.createElement("li",{role:"tab",hidden:""}),i=a.createElement("button",a.extend(a.getAttributesFromSelector(me.config.selectors.buttons.settings),{type:"button",class:me.config.classes.control+" "+me.config.classes.control+"--forward",id:"plyr-settings-"+e.id+"-"+t+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+t,"aria-expanded":!1}),me.config.i18n[t]),o=a.createElement("span",{class:me.config.classes.menu.value});o.innerHTML=e[t],i.appendChild(o),n.appendChild(i),g.appendChild(n),me.elements.settings.tabs[t]=n}),f.appendChild(g),m.appendChild(f),me.config.settings.forEach(function(t){var n=a.createElement("div",{id:"plyr-settings-"+e.id+"-"+t,"aria-hidden":!0,"aria-labelled-by":"plyr-settings-"+e.id+"-"+t+"-tab",role:"tabpanel",tabindex:-1,hidden:""}),i=a.createElement("button",{type:"button",class:me.config.classes.control+" "+me.config.classes.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},me.config.i18n[t]);n.appendChild(i);var o=a.createElement("ul");n.appendChild(o),m.appendChild(n),me.elements.settings.panes[t]=n}),p.appendChild(m),d.appendChild(p),t.appendChild(d),me.elements.settings.form=p,me.elements.settings.menu=d}return a.inArray(me.config.controls,"pip")&&r.pip&&t.appendChild(b("pip")),a.inArray(me.config.controls,"airplay")&&r.airplay&&t.appendChild(b("airplay")),a.inArray(me.config.controls,"fullscreen")&&t.appendChild(b("fullscreen")),a.inArray(me.config.controls,"play-large")&&(me.elements.buttons.playLarge=b("play-large"),me.elements.container.appendChild(me.elements.buttons.playLarge)),me.elements.controls=t,E(),S(),t}}function C(){function e(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?y(t):null}function n(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"}}var i=me.elements.settings.panes.quality.querySelector("ul");return a.is.empty(me.config.quality.options)?(me.elements.settings.tabs.quality.setAttribute("hidden",""),void me.elements.settings.panes.quality.setAttribute("hidden","")):(me.elements.settings.tabs.quality.removeAttribute("hidden"),me.elements.settings.panes.quality.removeAttribute("hidden"),a.emptyElement(i),void(a.is.array(t)&&!a.is.empty(t)&&t.filter(function(e){return!a.inArray(["tiny","small"],e)}).forEach(function(t){var o=a.createElement("li"),s=a.createElement("label",{class:me.config.classes.control}),r=a.createElement("input",a.extend(a.getAttributesFromSelector(me.config.selectors.inputs.quality),{type:"radio",name:"plyr-quality",value:t}));t===me.config.quality.selected&&(r.checked=!0),s.appendChild(r),s.appendChild(document.createTextNode(n(t)));var l=e(t);a.is.htmlElement(l)&&s.appendChild(l),o.appendChild(s),i.appendChild(o)})))}function E(){var e=["start","end","all","reset"],t=me.elements.settings.panes.loop.querySelector("ul");me.elements.settings.tabs.loop.removeAttribute("hidden"),me.elements.settings.panes.loop.removeAttribute("hidden"),a.emptyElement(t),e.forEach(function(e){var n=a.createElement("li"),i=a.createElement("button",a.extend(a.getAttributesFromSelector(me.config.selectors.buttons.loop),{type:"button",class:me.config.classes.control,"data-plyr-loop-action":e}),me.config.i18n[e]);if(a.inArray(["start","end"],e)){var o=y("00:00");i.appendChild(o)}n.appendChild(i),t.appendChild(n)})}function A(){var e=me.elements.settings.panes.captions.querySelector("ul");if(me.elements.settings.tabs.captions.removeAttribute("hidden"),me.elements.settings.panes.captions.removeAttribute("hidden"),a.emptyElement(e),!a.is.empty(me.captions.tracks)){var t=[].map.call(me.captions.tracks,function(e){return{language:e.language,badge:!0,label:a.is.empty(e.label)?e.language.toUpperCase():e.label}});t.unshift({language:"off",label:me.config.i18n.none}),t.forEach(function(t){var n=a.createElement("li"),i=a.createElement("label",{class:me.config.classes.control}),o=a.createElement("input",a.extend(a.getAttributesFromSelector(me.config.selectors.inputs.language),{type:"radio",name:"plyr-language",value:t.language}));t.language.toLowerCase()===me.config.captions.language.toLowerCase()&&(o.checked=!0),i.appendChild(o),i.appendChild(document.createTextNode(t.label||t.language)),t.badge&&i.appendChild(y(t.language.toUpperCase())),n.appendChild(i),e.appendChild(n)})}}function S(){var e=me.elements.settings.panes.speed.querySelector("ul");me.elements.settings.tabs.speed.removeAttribute("hidden"),me.elements.settings.panes.speed.removeAttribute("hidden"),a.emptyElement(e),me.config.speed.options.forEach(function(t){var n=a.createElement("li"),i=a.createElement("label",{class:me.config.classes.control}),o=a.createElement("input",a.extend(a.getAttributesFromSelector(me.config.selectors.inputs.speed),{type:"radio",name:"plyr-speed",value:t}));i.appendChild(o),i.insertAdjacentHTML("beforeend",U(t)),n.appendChild(i),e.appendChild(n)}),T(e)}function T(e){var t=me.config.speed.selected;if(a.inArray(me.config.speed.options,t)){a.is.htmlElement(e)||(e=me.elements.settings.panes.speed.querySelector("ul"));var n=e.querySelector('[value="'+t+'"]');if(a.is.htmlElement(n)){n.checked=!0;var i=me.elements.settings.tabs.speed.querySelector("."+me.config.classes.menu.value);i.innerHTML=U(t)}}}function x(){if(me.supported.full&&("audio"!==me.type||me.config.fullscreen.allowAudio)&&me.config.fullscreen.enabled){var e=r.fullscreen;e||me.config.fullscreen.fallback&&!a.inFrame()?(ge((e?"Native":"Fallback")+" fullscreen enabled"),a.toggleClass(me.elements.container,me.config.classes.fullscreen.enabled,!0)):ge("Fullscreen not supported and fallback disabled"),me.elements.buttons&&me.elements.buttons.fullscreen&&a.toggleState(me.elements.buttons.fullscreen,!1),l()}}function P(e){if(a.inArray(["video","vimeo"],me.type)&&("video"!==me.type||r.textTracks)&&(a.is.htmlElement(me.elements.captions)||(me.elements.captions=a.createElement("div",a.getAttributesFromSelector(me.config.selectors.captions)),a.insertAfter(me.elements.captions,me.elements.wrapper)),me.captions.tracks=a.is.array(e)?e:me.media.textTracks,a.toggleClass(me.elements.container,me.config.classes.captions.enabled,!a.is.empty(me.captions.tracks)),!a.is.empty(me.captions.tracks))){if(_(),"video"===me.type){var t=me.config.captions.language.toLowerCase();[].forEach.call(me.captions.tracks,function(e){a.off(e,"cuechange",I),e.mode="hidden",e.language===t&&(me.captions.currentTrack=e)}),a.is.track(me.captions.currentTrack)||(ye("No language found to match "+t+" in tracks"),me.captions.currentTrack=me.captions.tracks[0]);var n=me.captions.currentTrack;a.is.track(n)&&a.inArray(["captions","subtitles"],n.kind)&&(a.on(n,"cuechange",I),n.activeCues&&n.activeCues.length>0&&I(n))}A()}}function F(){return!r.textTracks||a.is.empty(me.captions.tracks)?"No Subs":me.captions.enabled?me.captions.currentTrack.label:"Disabled"}function I(e){a.is.event(e)&&(e=e.target);var t=e.activeCues[0];a.is.cue(t)?N(t.getCueAsHTML()):N()}function N(e){if(a.is.htmlElement(me.elements.captions)){var t=a.createElement("span");a.emptyElement(me.elements.captions),a.is.undefined(e)&&(e=""),a.is.string(e)?t.textContent=e.trim():t.appendChild(e),me.elements.captions.appendChild(t)}else ye("No captions element to render to")}function _(){if(me.elements.buttons.captions){var e=me.storage.captions;a.is.boolean(e)?me.config.captions.active=e:e=me.config.captions.active,e&&(a.toggleClass(me.elements.container,me.config.classes.captions.active,!0),a.toggleState(me.elements.buttons.captions,!0))}}function L(){if(me.config.loadSprite){var e=m();e.absolute?(ge("AJAX loading absolute SVG sprite"+(me.browser.isIE?" (due to IE)":"")),a.loadSprite(e.url,"sprite-plyr")):ge("Sprite will be used as external resource directly")}me.id=Math.floor(1e4*Math.random());var t=null;t=a.is.string(me.config.controls)?me.config.controls:a.is.function(me.config.controls)?me.config.controls({id:me.id,seektime:me.config.seekTime}):k({id:me.id,seektime:me.config.seekTime,speed:U(),quality:"HD",captions:F(),loop:"None"});var n;if(a.is.string(me.config.selectors.controls.container)&&(n=document.querySelector(me.config.selectors.controls.container)),a.is.htmlElement(n)||(n=me.elements.container),a.is.htmlElement(t)?n.appendChild(t):n.insertAdjacentHTML("beforeend",t),a.is.htmlElement(me.elements.controls)&&q(),me.config.tooltips.controls)for(var i=c([me.config.selectors.controls.wrapper," ",me.config.selectors.labels," .",me.config.classes.hidden].join("")),o=i.length-1;o>=0;o--){var s=i[o];a.toggleClass(s,me.config.classes.hidden,!1),a.toggleClass(s,me.config.classes.tooltip,!0)}}function q(){try{return me.elements.controls=u(me.config.selectors.controls.wrapper),me.elements.buttons={play:c(me.config.selectors.buttons.play),pause:u(me.config.selectors.buttons.pause),restart:u(me.config.selectors.buttons.restart),rewind:u(me.config.selectors.buttons.rewind),forward:u(me.config.selectors.buttons.forward),mute:u(me.config.selectors.buttons.mute),pip:u(me.config.selectors.buttons.pip),airplay:u(me.config.selectors.buttons.airplay),settings:u(me.config.selectors.buttons.settings),captions:u(me.config.selectors.buttons.captions),fullscreen:u(me.config.selectors.buttons.fullscreen)},me.elements.progress=u(me.config.selectors.progress),me.elements.inputs={seek:u(me.config.selectors.inputs.seek),volume:u(me.config.selectors.inputs.volume)},me.elements.display={buffer:u(me.config.selectors.display.buffer),played:u(me.config.selectors.display.played),volume:u(me.config.selectors.display.volume),duration:u(me.config.selectors.display.duration),currentTime:u(me.config.selectors.display.currentTime)},a.is.htmlElement(me.elements.progress)&&(me.elements.display.seekTooltip=me.elements.progress.querySelector("."+me.config.classes.tooltip)),!0}catch(e){return ye("It looks like there is a problem with your custom controls HTML",e),V(!0),!1}}function M(){a.toggleClass(me.elements.container,me.config.selectors.container.replace(".",""),me.supported.full)}function V(e){e&&a.inArray(o.html5,me.type)?me.media.setAttribute("controls",""):me.media.removeAttribute("controls")}function O(e){var t=me.config.i18n.play;if(a.is.string(me.config.title)&&!a.is.empty(me.config.title)&&(t+=", "+me.config.title,me.elements.container.setAttribute("aria-label",me.config.title)),me.supported.full&&(a.is.htmlElement(me.elements.buttons.play)&&me.elements.buttons.play.setAttribute("aria-label",t),a.is.htmlElement(me.elements.buttons.playLarge)&&me.elements.buttons.playLarge.setAttribute("aria-label",t)),a.is.htmlElement(e)){var n=a.is.string(me.config.title)&&!a.is.empty(me.config.title)?me.config.title:"video";e.setAttribute("title",me.config.i18n.frameTitle.replace("{title}",n))}}function D(){var e=null;me.storage={},r.storage&&me.config.storage.enabled&&(window.localStorage.removeItem("plyr-volume"),e=window.localStorage.getItem(me.config.storage.key),e&&(/^\d+(\.\d+)?$/.test(e)?j({volume:parseFloat(e)}):me.storage=JSON.parse(e)))}function j(e){r.storage&&me.config.storage.enabled&&(a.extend(me.storage,e),window.localStorage.setItem(me.config.storage.key,JSON.stringify(me.storage)))}function R(){return me.media?(me.supported.full&&(a.toggleClass(me.elements.container,me.config.classes.type.replace("{0}",me.type),!0),a.inArray(o.embed,me.type)&&a.toggleClass(me.elements.container,me.config.classes.type.replace("{0}","video"),!0),a.toggleClass(me.elements.container,me.config.classes.pip.enabled,r.pip&&"video"===me.type),a.toggleClass(me.elements.container,me.config.classes.airplay.enabled,r.airplay&&a.inArray(o.html5,me.type)),a.toggleClass(me.elements.container,me.config.classes.stopped,me.config.autoplay),a.toggleClass(me.elements.container,me.config.classes.isIos,me.browser.isIos),a.toggleClass(me.elements.container,me.config.classes.isTouch,r.touch)),a.inArray(["video","youtube","vimeo"],me.type)&&(me.elements.wrapper=a.createElement("div",{class:me.config.classes.video}),a.wrap(me.media,me.elements.wrapper)),void(a.inArray(o.embed,me.type)&&H())):void ye("No media element found!")}function H(){var e,t=me.type+"-"+Math.floor(1e4*Math.random());switch(me.type){case"youtube":e=a.parseYouTubeId(me.embedId);break;default:e=me.embedId}for(var n=c('[id^="'+me.type+'-"]'),i=n.length-1;i>=0;i--)a.removeElement(n[i]);if(a.toggleClass(me.elements.wrapper,me.config.classes.embed,!0),"youtube"===me.type)me.media.setAttribute("id",t),a.is.object(window.YT)?Y(e):(a.injectScript(me.config.urls.youtube.api),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){Y(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===me.type)if(me.media.setAttribute("id",t),a.is.object(window.Vimeo))W(e);else{a.injectScript(me.config.urls.vimeo.api);var o=window.setInterval(function(){a.is.object(window.Vimeo)&&(window.clearInterval(o),W(e))},50)}else if("soundcloud"===me.type){var s=a.createElement("iframe");s.loaded=!1,a.on(s,"load",function(){s.loaded=!0}),a.setAttributes(s,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+e,id:t}),me.media.appendChild(s),window.SC||a.injectScript(me.config.urls.soundcloud.api);var r=window.setInterval(function(){window.SC&&s.loaded&&(window.clearInterval(r),Q.call(s))},50)}}function B(){me.supported.full&&(ue(),de()),O(u("iframe"))}function Y(e){me.embed=new window.YT.Player(me.media.id,{videoId:e,playerVars:{autoplay:me.config.autoplay?1:0,controls:me.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:me.config.captions.active?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,playsinline:1,origin:window.location.href},events:{onError:function(e){n(me.elements.container,"error",!0,{code:e.data,embed:e.target})},onPlaybackQualityChange:function(e){var t=e.target,n=t.getPlaybackQuality();console.warn("quality change",n)},onPlaybackRateChange:function(e){var t=e.target;me.media.playbackRate=t.getPlaybackRate(),n(me.media,"ratechange")},onReady:function(e){var t=e.target;me.media.play=function(){t.playVideo(),me.media.paused=!1},me.media.pause=function(){t.pauseVideo(),me.media.paused=!0},me.media.stop=function(){t.stopVideo(),me.media.paused=!0},me.media.duration=t.getDuration(),me.media.paused=!0,me.media.currentTime=0,me.media.muted=t.isMuted(),me.config.speed.selected=t.getPlaybackRate(),me.config.speed.options=t.getAvailablePlaybackRates(),S(),me.config.title=t.getVideoData().title,me.supported.full&&me.media.setAttribute("tabindex",-1),B(),n(me.media,"timeupdate"),n(me.media,"durationchange"),window.clearInterval(fe.buffering),fe.buffering=window.setInterval(function(){me.media.buffered=t.getVideoLoadedFraction(),(null===me.media.lastBuffered||me.media.lastBuffered<me.media.buffered)&&n(me.media,"progress"),me.media.lastBuffered=me.media.buffered,1===me.media.buffered&&(window.clearInterval(fe.buffering),n(me.media,"canplaythrough"))},200)},onStateChange:function(e){var t=e.target;switch(window.clearInterval(fe.playing),e.data){case 0:if(me.config.loop.active){t.stopVideo(),t.playVideo();break}me.media.paused=!0,n(me.media,"ended");break;case 1:me.media.paused=!1,me.media.seeking&&n(me.media,"seeked"),me.media.seeking=!1,n(me.media,"play"),n(me.media,"playing"),fe.playing=window.setInterval(function(){me.media.currentTime=t.getCurrentTime(),n(me.media,"timeupdate")},100),me.media.duration!==t.getDuration()&&(me.media.duration=t.getDuration(),n(me.media,"durationchange"));var i=t.getAvailableQualityLevels(),o=t.getPlaybackQuality();C(i,o);break;case 2:me.media.paused=!0,n(me.media,"pause")}n(me.elements.container,"statechange",!1,{code:e.data})}}})}function W(e){me.embed=new window.Vimeo.Player(me.media,{id:e,loop:me.config.loop.active,autoplay:me.config.autoplay,byline:!1,portrait:!1,title:!1}),me.media.play=function(){me.embed.play(),me.media.paused=!1},me.media.pause=function(){me.embed.pause(),me.media.paused=!0},me.media.stop=function(){me.embed.stop(),me.media.paused=!0},me.media.paused=!0,me.media.currentTime=0,B(),me.embed.getCurrentTime().then(function(e){me.media.currentTime=e,n(me.media,"timeupdate")}),me.embed.getDuration().then(function(e){me.media.duration=e,n(me.media,"durationchange")}),me.embed.getTextTracks().then(function(e){P(e),me.config.captions.active&&me.embed.enableTextTrack(me.config.captions.language.toLowerCase())}),me.embed.on("cuechange",function(e){var t=null;e.cues.length&&(t=a.stripHTML(e.cues[0].text)),N(t)}),me.embed.on("loaded",function(){a.is.htmlElement(me.embed.element)&&me.supported.full&&me.embed.element.setAttribute("tabindex",-1)}),me.embed.on("play",function(){me.media.paused=!1,n(me.media,"play"),n(me.media,"playing")}),me.embed.on("pause",function(){me.media.paused=!0,n(me.media,"pause")}),me.embed.on("timeupdate",function(e){me.media.seeking=!1,me.media.currentTime=e.seconds,n(me.media,"timeupdate")}),me.embed.on("progress",function(e){me.media.buffered=e.percent,n(me.media,"progress"),1===parseInt(e.percent)&&n(me.media,"canplaythrough")}),me.embed.on("seeked",function(){me.media.seeking=!1,n(me.media,"seeked"),n(me.media,"play")}),me.embed.on("ended",function(){me.media.paused=!0,n(me.media,"ended")})}function Q(){me.embed=window.SC.Widget(this),me.embed.bind(window.SC.Widget.Events.READY,function(){me.media.play=function(){me.embed.play(),me.media.paused=!1},me.media.pause=function(){me.embed.pause(),me.media.paused=!0},me.media.stop=function(){me.embed.seekTo(0),me.embed.pause(),me.media.paused=!0},me.media.paused=!0,me.media.currentTime=0,me.embed.getDuration(function(e){me.media.duration=e/1e3,B()}),me.embed.getPosition(function(e){me.media.currentTime=e,n(me.media,"timeupdate")}),me.embed.bind(window.SC.Widget.Events.PLAY,function(){me.media.paused=!1,n(me.media,"play"),n(me.media,"playing")}),me.embed.bind(window.SC.Widget.Events.PAUSE,function(){me.media.paused=!0,n(me.media,"pause")}),me.embed.bind(window.SC.Widget.Events.PLAY_PROGRESS,function(e){me.media.seeking=!1,me.media.currentTime=e.currentPosition/1e3,n(me.media,"timeupdate")}),me.embed.bind(window.SC.Widget.Events.LOAD_PROGRESS,function(e){me.media.buffered=e.loadProgress,n(me.media,"progress"),1===parseInt(e.loadProgress)&&n(me.media,"canplaythrough")}),me.embed.bind(window.SC.Widget.Events.FINISH,function(){me.media.paused=!0,n(me.media,"ended")})})}function U(e){return a.is.number(e)||(e=me.config.speed.selected),1===e?"Normal":e+"&times;"}function z(){a.toggleClass(me.elements.container,me.config.classes.playing,!me.media.paused),a.toggleClass(me.elements.container,me.config.classes.stopped,me.media.paused),me.toggleControls(me.media.paused)}function J(e){var t=me.elements.settings.form,n=me.elements.buttons.settings,i=a.is.boolean(e)?e:"true"===t.getAttribute("aria-hidden");if(a.is.event(e)){var o=t.contains(e.target),s=e.target===me.elements.buttons.settings;if(o||!o&&!s&&i)return;s&&e.stopPropagation()}t.setAttribute("aria-hidden",!i),n.setAttribute("aria-expanded",i),i?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1)}function X(e){var t,n,i=e.cloneNode(!0);return i.style.position="absolute",i.style.opacity=0,i.setAttribute("aria-hidden",!1),[].forEach.call(i.querySelectorAll("input[name]"),function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(i),t=i.scrollWidth,n=i.scrollHeight,a.removeElement(i),{width:t,height:n}}function $(e){var t=me.elements.settings.menu,n=e.target,i="false"===n.getAttribute("aria-expanded"),o=document.getElementById(n.getAttribute("aria-controls"));if(a.is.htmlElement(o)){var s="tabpanel"===o.getAttribute("role");if(s){var l=t.querySelector('[role="tabpanel"][aria-hidden="false"]'),c=l.parentNode;if([].forEach.call(t.querySelectorAll('[aria-controls="'+l.getAttribute("id")+'"]'),function(e){e.setAttribute("aria-expanded",!1)}),r.transitions&&!r.reducedMotion){c.style.width=l.scrollWidth+"px",c.style.height=l.scrollHeight+"px";var u=X(o),d=function(e){e.target===c&&a.inArray(["width","height"],e.propertyName)&&(c.style.width="",c.style.height="",a.off(c,a.transitionEnd,d))};a.on(c,a.transitionEnd,d),c.style.width=u.width+"px",c.style.height=u.height+"px"}l.setAttribute("aria-hidden",!0),l.setAttribute("tabindex",-1),o.setAttribute("aria-hidden",!i),n.setAttribute("aria-expanded",i),o.removeAttribute("tabindex")}}}function G(){var e=me.media.muted?0:10*me.media.volume;me.supported.full&&(me.elements.inputs.volume&&(me.elements.inputs.volume.value=e),me.elements.display.volume&&(me.elements.display.volume.value=e)),j({volume:e}),a.toggleClass(me.elements.container,me.config.classes.muted,0===e),me.supported.full&&me.elements.buttons.mute&&a.toggleState(me.elements.buttons.mute,0===e)}function K(e){me.loading="waiting"===e.type,clearTimeout(fe.loading),fe.loading=setTimeout(function(){a.toggleClass(me.elements.container,me.config.classes.loading,me.loading),me.toggleControls(me.loading)},me.loading?250:0)}function Z(e){if(me.supported.full){var t=me.elements.display.played,n=0,i=me.getDuration();if(e)switch(e.type){case"timeupdate":case"seeking":if(me.elements.controls.pressed)return;n=a.getPercentage(me.media.currentTime,i),"timeupdate"===e.type&&me.elements.inputs.seek&&(me.elements.inputs.seek.value=n);break;case"playing":case"progress":t=me.elements.display.buffer,n=function(){var e=me.media.buffered;return e&&e.length?a.getPercentage(e.end(0),i):a.is.number(e)?100*e:0}()}ee(t,n)}}function ee(e,t){if(me.supported.full){if(a.is.undefined(t)&&(t=0),a.is.undefined(e)){if(!a.is.htmlElement(me.elements.display.buffer))return;e=me.elements.display.buffer}if(a.is.htmlElement(e)){e.value=t;var n=e.getElementsByTagName("span")[0];a.is.htmlElement(n)&&(n.childNodes[0].nodeValue=t)}}}function te(e,t){if(t){isNaN(e)&&(e=0);var n=parseInt(e%60),i=parseInt(e/60%60),o=parseInt(e/60/60%60),a=me.getDuration(),s=parseInt(a/60/60%60)>0;n=("0"+n).slice(-2),i=("0"+i).slice(-2);var r=(s?o+":":"")+i+":"+n;return t.textContent=r,r}}function ne(){if(me.supported.full){var e=me.getDuration()||0;!me.elements.display.duration&&me.config.displayDuration&&me.media.paused&&te(e,me.elements.display.currentTime),me.elements.display.duration&&te(e,me.elements.display.duration),ae()}}function ie(e){te(me.media.currentTime,me.elements.display.currentTime),e&&"timeupdate"===e.type&&me.media.seeking||Z(e)}function oe(e){a.is.number(e)||(e=0);var t=me.getDuration(),n=a.getPercentage(e,t);me.elements.progress&&me.elements.display.played&&(me.elements.display.played.value=n),me.elements.buttons&&me.elements.inputs.seek&&(me.elements.inputs.seek.value=n)}function ae(e){var t=me.getDuration();if(me.config.tooltips.seek&&a.is.htmlElement(me.elements.inputs.seek)&&a.is.htmlElement(me.elements.display.seekTooltip)&&0!==t){var n=me.elements.inputs.seek.getBoundingClientRect(),i=0,o=me.config.classes.tooltip+"--visible";if(a.is.event(e))i=100/n.width*(e.pageX-n.left);else{if(!a.hasClass(me.elements.display.seekTooltip,o))return;i=me.elements.display.seekTooltip.style.left.replace("%","")}i<0?i=0:i>100&&(i=100),te(t/100*i,me.elements.display.seekTooltip),me.elements.display.seekTooltip.style.left=i+"%",a.is.event(e)&&a.inArray(["mouseenter","mouseleave"],e.type)&&a.toggleClass(me.elements.display.seekTooltip,o,"mouseenter"===e.type)}}function se(e){return a.is.object(e)&&"sources"in e&&e.sources.length?(oe(),ee(),ce(),void me.destroy(function(){if(d(me.media),d("captions"),d("wrapper"),me.elements.container&&me.elements.container.removeAttribute("class"),"type"in e&&(me.type=e.type,"video"===me.type)){var t=e.sources[0];"type"in t&&a.inArray(o.embed,t.type)&&(me.type=t.type)}switch(me.supported=a.checkSupport(me.type,me.config.inline),me.type){case"video":me.media=a.createElement("video");break;case"audio":me.media=a.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":me.media=a.createElement("div"),me.embedId=e.sources[0].src}a.prependChild(me.elements.container,me.media),a.is.boolean(e.autoplay)&&(me.config.autoplay=e.autoplay),a.inArray(o.html5,me.type)&&(me.config.crossorigin&&me.media.setAttribute("crossorigin",""),me.config.autoplay&&me.media.setAttribute("autoplay",""),"poster"in e&&me.media.setAttribute("poster",e.poster),me.config.loop.active&&me.media.setAttribute("loop",""),me.config.inline&&me.media.setAttribute("playsinline","")),a.toggleClass(me.elements.container,me.config.classes.fullscreen.active,me.fullscreen.active),a.toggleClass(me.elements.container,me.config.classes.captions.active,me.captions.enabled),M(),a.inArray(o.html5,me.type)&&p("source",e.sources),R(),a.inArray(o.html5,me.type)&&("tracks"in e&&p("track",e.tracks),me.media.load()),(a.inArray(o.html5,me.type)||a.inArray(o.embed,me.type)&&!me.supported.full)&&(ue(),de()),me.config.title=e.title,O()},!1)):void ye("Invalid source format")}function re(){function e(){var e=me.togglePlay(),t=me.elements.buttons[e?"play":"pause"],n=me.elements.buttons[e?"pause":"play"];if(n){var i=a.hasClass(t,me.config.classes.tabFocus);setTimeout(function(){a.is.htmlElement(n)&&n.focus(),i&&(a.toggleClass(t,me.config.classes.tabFocus,!1),a.toggleClass(n,me.config.classes.tabFocus,!0))},100)}}function t(e){return e.keyCode?e.keyCode:e.which}function n(e){a.toggleClass(c("."+me.config.classes.tabFocus),me.config.classes.tabFocus,!1),me.elements.container.contains(e)&&a.toggleClass(e,me.config.classes.tabFocus,!0)}function i(n){function i(){var e=me.media.duration;a.is.number(e)&&me.seek(e/10*(o-48))}var o=t(n),s="keydown"===n.type,c=s&&o===l;if(a.is.number(o))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(a.inArray(d,o)){var p=a.getFocusElement();if(a.is.htmlElement(p)&&"radio"===a.getFocusElement().type)return}switch(a.inArray(u,o)&&(n.preventDefault(),n.stopPropagation()),o){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:c||i();break;case 32:case 75:c||e();break;case 38:me.increaseVolume();break;case 40:me.decreaseVolume();break;case 77:c||me.toggleMute();break;case 39:me.forward();break;case 37:me.rewind();break;case 70:me.toggleFullscreen();break;case 67:c||me.toggleCaptions();break;case 73:me.loop("start");break;case 76:me.loop();break;case 79:me.loop("end")}!r.fullscreen&&me.fullscreen.active&&27===o&&me.toggleFullscreen(),
-l=o}else l=null}var o=me.browser.isIE?"change":"input";if(me.config.keyboard.focused){var l=null;me.config.keyboard.global&&a.on(window,"keydown keyup",function(e){var n=t(e),o=a.getFocusElement(),s=[48,49,50,51,52,53,54,56,57,75,77,70,67,73,76,79];!a.inArray(s,n)||a.is.htmlElement(o)&&a.matches(o,me.config.selectors.editable)||i(e)},!1),a.on(me.elements.container,"keydown keyup",i,!1)}a.on(window,"keyup",function(e){var i=t(e),o=a.getFocusElement();9===i&&n(o)}),a.on(document.body,"click",function(){a.toggleClass(u("."+me.config.classes.tabFocus),me.config.classes.tabFocus,!1)});for(var d in me.elements.buttons){var p=me.elements.buttons[d];a.on(p,"blur",function(){a.toggleClass(p,"tab-focus",!1)})}var m=function(e,t,n){a.is.function(t)&&t.call(this,e),a.is.function(n)&&n.call(this,e)};a.proxy(me.elements.buttons.play,"click",me.config.listeners.play,e),a.proxy(me.elements.buttons.playLarge,"click",me.config.listeners.play,e),a.proxy(me.elements.buttons.pause,"click",me.config.listeners.pause,e),a.proxy(me.elements.buttons.restart,"click",me.config.listeners.restart,function(){me.restart()}),a.proxy(me.elements.buttons.rewind,"click",me.config.listeners.rewind,function(){me.rewind()}),a.proxy(me.elements.buttons.forward,"click",me.config.listeners.forward,function(){me.forward()}),a.proxy(me.elements.buttons.mute,"click",me.config.listeners.mute,function(){me.toggleMute()}),a.proxy(me.elements.buttons.captions,"click",me.config.listeners.captions,function(){me.toggleCaptions()}),a.proxy(me.elements.buttons.fullscreen,"click",me.config.listeners.fullscreen,function(e){me.toggleFullscreen(e)}),a.proxy(me.elements.buttons.pip,"click",me.config.listeners.pip,function(){me.togglePictureInPicture()}),a.proxy(me.elements.buttons.airplay,"click",me.config.listeners.airplay,function(){me.airPlay()}),a.on(me.elements.buttons.settings,"click",J),a.on(document.documentElement,"click",J),a.on(me.elements.settings.form,"click",$),a.on(me.elements.settings.form,"click",function(e){a.matches(e.target,me.config.selectors.inputs.language)?m.call(this,e,me.config.listeners.language,function(){me.setLanguage(e.target.value.toLowerCase())}):a.matches(e.target,me.config.selectors.inputs.quality)?m.call(this,e,me.config.listeners.quality,function(){me.setQuality(e.target.value)}):a.matches(e.target,me.config.selectors.inputs.speed)?m.call(this,e,me.config.listeners.speed,function(){me.setSpeed(parseFloat(e.target.value))}):a.matches(e.target,me.config.selectors.buttons.loop)&&m.call(this,e,me.config.listeners.loop,function(){ye("Set loop")})}),a.proxy(me.elements.inputs.seek,o,me.config.listeners.seek,function(e){var t=me.getDuration();me.seek(e.target.value/e.target.max*t)}),a.proxy(me.elements.inputs.volume,o,me.config.listeners.volume,function(){me.setVolume(event.target.value)}),a.on(me.elements.progress,"mouseenter mouseleave mousemove",ae),me.config.hideControls&&(a.on(me.elements.container,"mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen",function(e){me.toggleControls(e)}),a.on(me.elements.controls,"mouseenter mouseleave",function(e){me.elements.controls.hover="mouseenter"===e.type}),a.on(me.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){me.elements.controls.pressed=a.inArray(["mousedown","touchstart"],e.type)}),a.on(me.elements.controls,"focus blur",function(e){me.toggleControls(e)},!0,!0)),a.proxy(me.elements.inputs.volume,"wheel",me.config.listeners.volume,function(e){var t=e.webkitDirectionInvertedFromDevice,n=.2,i=0;(e.deltaY<0||e.deltaX>0)&&(t?(me.decreaseVolume(n),i=-1):(me.increaseVolume(n),i=1)),(e.deltaY>0||e.deltaX<0)&&(t?(me.increaseVolume(n),i=1):(me.decreaseVolume(n),i=-1)),(1===i&&me.media.volume<1||i===-1&&me.media.volume>0)&&e.preventDefault()},!1),r.fullscreen&&a.on(document,s.eventType,function(e){me.toggleFullscreen(e)})}function le(){if(a.on(me.media,"timeupdate seeking",ie),a.on(me.media,"durationchange loadedmetadata",ne),a.on(me.media,"ended",function(){"video"===me.type&&me.config.showPosterOnEnd&&("video"===me.type&&N(),me.restart(),me.media.load())}),a.on(me.media,"progress playing",Z),a.on(me.media,"volumechange",G),a.on(me.media,"play pause ended",z),a.on(me.media,"waiting canplay seeked",K),me.config.clickToPlay&&"audio"!==me.type){var e=u("."+me.config.classes.video);if(!e)return;e.style.cursor="pointer",a.on(e,"click",function(){me.config.hideControls&&r.touch&&!me.media.paused||(me.media.paused?me.play():me.media.ended?(me.restart(),me.play()):me.pause())})}me.config.disableContextMenu&&a.on(me.media,"contextmenu",function(e){e.preventDefault()},!1),a.on(me.media,"ratechange",function(e){me.config.speed.selected=me.media.playbackRate,T(),j({speed:me.config.speed.selected})}),a.on(me.media,me.config.events.concat(["keyup","keydown"]).join(" "),function(e){n(me.elements.container,e.type,!0)})}function ce(){if(a.inArray(o.html5,me.type)){for(var e=me.media.querySelectorAll("source"),t=0;t<e.length;t++)a.removeElement(e[t]);me.media.setAttribute("src","https://cdn.selz.com/plyr/blank.mp4"),me.media.load(),ge("Cancelled network requests")}}function ue(){return me.supported.full?(a.is.htmlElement(me.elements.controls)||(L(),re()),void(a.is.htmlElement(me.elements.controls)&&(le(),V(),x(),P(),me.setVolume(),G(),me.setSpeed(),me.loop(),ie(),z()))):(ye("Basic support only",me.type),d("controls"),d("buttons.play"),void V(!0))}function de(){me.ready=!0,window.setTimeout(function(){n(me.elements.container,"ready",!0)},0),me.config.autoplay&&me.play()}function pe(e){if(null===e||a.is.undefined(e)||!a.is.htmlElement(e))return void be("Setup failed: no suitable element passed");if(e.plyr)return ye("Target already setup"),void(me=e.plyr);if(!me.config.enabled)return void be("Setup failed: disabled by config");if(!a.checkSupport().basic)return void be("Setup failed: no support");me.elements.original=e.cloneNode(!0);var t=e.tagName.toLowerCase();switch(t){case"div":if(me.type=e.getAttribute("data-type"),me.embedId=e.getAttribute("data-video-id"),a.is.empty(me.type))return void be("Setup failed: embed type missing");if(a.is.empty(me.embedId))return void be("Setup failed: video id missing");e.removeAttribute("data-type"),e.removeAttribute("data-video-id");break;case"iframe":break;case"video":case"audio":me.type=t,me.config.crossorigin=null!==e.getAttribute("crossorigin"),me.config.autoplay=me.config.autoplay||null!==e.getAttribute("autoplay"),me.config.inline=null!==e.getAttribute("playsinline"),me.config.loop.active=me.config.loop||null!==e.getAttribute("loop");break;default:return void be("Setup failed: unsupported type")}if(me.browser=a.getBrowser(),D(),me.supported=a.checkSupport(me.type,me.config.inline),!me.supported.basic)return void be("Setup failed: no support");if(e.plyr=me,me.elements.container=a.wrap(e,a.createElement("div")),me.elements.container.setAttribute("tabindex",0),M(),ge(me.browser.name+" "+me.browser.version),R(),me.config.debug){var n=me.config.events.concat(["setup","statechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled"]);a.on(me.elements.container,n.join(" "),function(e){ge("event: "+e.type)})}(a.inArray(o.html5,me.type)||a.inArray(o.embed,me.type)&&!me.supported.full)&&(ue(),de(),O())}var me=this,fe={};me.ready=!1,me.media=e,a.is.string(me.media)&&(me.media=document.querySelectorAll(me.media)),(window.jQuery&&me.media instanceof jQuery||a.is.nodeList(me.media)||a.is.array(me.media))&&(me.media=me.media[0]),me.config=a.extend({},i,t,function(){try{return JSON.parse(me.media.getAttribute("data-plyr"))}catch(e){}}()),me.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},me.captions={enabled:!1,captions:[],tracks:[],currentTrack:null},me.fullscreen={active:!1};var ge=function(){},ye=function(){},be=function(){};me.config.debug&&"console"in window&&(ge=console.log,ye=console.warn,be=console.error,ge("Debugging enabled")),ge("Config",me.config),ge("Support",r),me.core={getElement:u,getElements:c,trigger:n,setCaption:N,setupCaptions:P,toggleNativeControls:V,updateTimeDisplay:te,updateSeekDisplay:oe,updateSource:se,updateStorage:j,timers:fe,support:r,log:ge,warn:ye,error:be},pe(me.media)}var n={x:0,y:0},i={enabled:!0,title:"",debug:!1,autoplay:!1,seekTime:10,volume:10,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,selectors:{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"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress--buffer",played:".plyr__progress--played",loop:".plyr__progress--loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",menu:{quality:".js-plyr__menu__list--quality"}},classes:{video:"plyr__video-wrapper",embed:"plyr__video-embed",control:"plyr__control",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",menu:{value:"plyr__menu__value",badge:"plyr__badge"},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"},airplay:{enabled:"plyr--airplay-enabled",active:"plyr--airplay-active"},tabFocus:"tab-focus"},quality:{selected:"auto",options:[]},loop:{active:!1,start:0,end:null,indicator:{start:0,end:0}},speed:{selected:1,options:[.25,.5,.75,1,1.25,1.5,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:window.navigator.language.split("-")[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"],settings:["captions","quality","speed","loop"],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",start:"Start",end:"End",all:"All",reset:"Reset",none:"None"},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,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied"],logPrefix:""},o={embed:["youtube","vimeo","soundcloud"],html5:["video","audio"]},a={is:{object:function(e){return null!==e&&"object"==typeof e&&e.constructor===Object},array:function(e){return null!==e&&Array.isArray(e)},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&&e instanceof Event},cue:function(e){return null!==e&&(e instanceof window.TextTrackCue||e instanceof window.VTTCue)},track:function(e){return null!==e&&e instanceof window.TextTrack},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}},getBrowser:function(){var e,t,n,i=navigator.userAgent,o=navigator.appName,a=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10),r=!1,l=!1,c=!1,u=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(r=!0,o="IE",a="11"):(t=i.indexOf("MSIE"))!==-1?(r=!0,o="IE",a=i.substring(t+5)):(t=i.indexOf("Chrome"))!==-1?(c=!0,o="Chrome",a=i.substring(t+7)):(t=i.indexOf("Safari"))!==-1?(u=!0,o="Safari",a=i.substring(t+7),(t=i.indexOf("Version"))!==-1&&(a=i.substring(t+8))):(t=i.indexOf("Firefox"))!==-1?(l=!0,o="Firefox",a=i.substring(t+8)):(e=i.lastIndexOf(" ")+1)<(t=i.lastIndexOf("/"))&&(o=i.substring(e,t),a=i.substring(t+1),o.toLowerCase()===o.toUpperCase()&&(o=navigator.appName)),(n=a.indexOf(";"))!==-1&&(a=a.substring(0,n)),(n=a.indexOf(" "))!==-1&&(a=a.substring(0,n)),s=parseInt(""+a,10),isNaN(s)&&(a=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10)),{name:o,version:s,isIE:r,isOldIE:r&&s<=9,isFirefox:l,isChrome:c,isSafari:u,isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)}},checkSupport:function(e,t){var n=!1,i=!1,o=a.getBrowser(),s=o.isIPhone&&t&&r.inline;switch(e){case"video":n=r.video,i=n&&!o.isOldIE&&(!o.isIPhone||s);break;case"audio":n=r.audio,i=n&&!o.isOldIE;break;case"youtube":n=r.video,i=n&&!o.isOldIE&&(!o.isIPhone||s);break;case"vimeo":case"soundcloud":n=!0,i=!o.isOldIE&&!o.isIos;break;default:n=r.audio&&r.video,i=n&&!o.isOldIE}return{basic:n,full:i}},injectScript:function(e){if(!document.querySelectorAll('script[src="'+e+'"]').length){var t=document.createElement("script");t.src=e;var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n)}},inFrame:function(){try{return window.self!==window.top}catch(e){return!0}},inArray:function(e,t){return a.is.array(e)&&e.indexOf(t)!==-1},replaceAll:function(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)},wrap:function(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var i=n>0?t.cloneNode(!0):t,o=e[n],a=o.parentNode,s=o.nextSibling;return i.appendChild(o),s?a.insertBefore(i,s):a.appendChild(i),i}},removeElement:function(e){a.is.htmlElement(e)&&a.is.htmlElement(e.parentNode)&&e.parentNode.removeChild(e)},prependChild:function(e,t){e.insertBefore(t,e.firstChild)},insertAfter:function(e,t){t.parentNode.insertBefore(e,t.nextSibling)},createElement:function(e,t,n){var i=document.createElement(e);return a.is.object(t)&&a.setAttributes(i,t),a.is.string(n)&&(i.textContent=n),i},insertElement:function(e,t,n,i){var o=a.createElement(e,n,i);a.prependChild(t,o)},emptyElement:function(e){for(var t=e.childNodes.length;t--;)e.removeChild(e.lastChild)},setAttributes:function(e,t){for(var n in t)e.setAttribute(n,t[n])},getAttributesFromSelector:function(e,t){if(!a.is.string(e)||a.is.empty(e))return{};var n={};return e.split(",").forEach(function(e){e=e.trim();var i=e.charAt(0);switch(i){case".":var o=e.replace(".","");a.is.object(t)&&a.is.string(t.class)&&(t.class+=" "+o),n.class=o;break;case"#":n.id=e.replace("#","");break;case"[":e=e.replace(/[\[\]]/g,"");var s=e.split("="),r=s[0],l=s.length>1?s[1].replace(/[\"\']/g,""):"";n[r]=l}}),n},toggleClass:function(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var i=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=i+(n?" "+t:"")}},hasClass:function(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))},matches:function(e,t){var n=Element.prototype,i=n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(e){return[].indexOf.call(document.querySelectorAll(e),this)!==-1};return i.call(e,t)},getFocusElement:function(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null},proxy:function(e,t,n,i,o,s){a.on(e,t,function(t){n&&n.apply(e,[t]),i.apply(e,[t])},o,s)},toggleListener:function(e,t,n,i,o,s){if(null!==e&&!a.is.undefined(e)){if(t=t.split(" "),a.is.boolean(s)||(s=!1),a.is.boolean(o)||(o=!0),e instanceof NodeList){var l=1===arguments.length?[arguments[0]]:Array.apply(null,arguments);return l.shift(),void[].forEach.call(e,function(e){e instanceof Node&&a.toggleListener.apply(null,[e].concat(l))})}var c=s;r.passiveListeners&&(c={passive:o,capture:s}),t.forEach(function(t){e[i?"addEventListener":"removeEventListener"](t,n,c)})}},on:function(e,t,n,i,o){a.toggleListener(e,t,n,!0,i,o)},off:function(e,t,n,i,o){a.toggleListener(e,t,n,!1,i,o)},event:function(e,t,n,i){if(e&&t){a.is.boolean(n)||(n=!1);var o;a.is.function(window.CustomEvent)?o=window.CustomEvent:(o=function(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},o.prototype=window.Event.prototype);var s=new o(t,{bubbles:n,detail:i});e.dispatchEvent(s)}},toggleState:function(e,t){if(e)return t=a.is.boolean(t)?t:!e.getAttribute("aria-pressed"),e.setAttribute("aria-pressed",t),t},getPercentage:function(e,t){return 0===e||0===t||isNaN(e)||isNaN(t)?0:(e/t*100).toFixed(2)},extend:function(){var e=arguments;if(e.length){if(1===e.length)return e[0];var t=Array.prototype.shift.call(e);a.is.object(t)||(t={});for(var n=e.length,i=0;i<n;i++){var o=e[i];a.is.object(o)||(o={});for(var s in o)o[s]&&o[s].constructor&&o[s].constructor===Object?(t[s]=t[s]||{},a.extend(t[s],o[s])):t[s]=o[s]}return t}},parseYouTubeId:function(e){var t=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;return e.match(t)?RegExp.$2:e},stripHTML:function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText},loadSprite:function(e,t){function n(e,t){e.innerHTML=t,document.body.insertBefore(e,document.body.childNodes[0])}if("string"==typeof e){var i="cache-",o="string"==typeof t,a=!1;if(!o||!document.querySelectorAll("#"+t).length){var s=document.createElement("div");if(s.setAttribute("hidden",""),o&&s.setAttribute("id",t),r.storage){var l=window.localStorage.getItem(i+t);if(a=null!==l){var c=JSON.parse(l);n(s,c.content)}}var u=new XMLHttpRequest;if(!("withCredentials"in u))return;u.open("GET",e,!0),u.onload=function(){r.storage&&window.localStorage.setItem(i+t,JSON.stringify({content:u.responseText})),n(s,u.responseText)},u.send()}}},transitionEnd:function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return t[n];return!1}()},s=function(){var e=function(){var e=!1;return a.is.function(document.cancelFullScreen)?e="":["webkit","o","moz","ms","khtml"].some(function(t){return a.is.function(document[t+"CancelFullScreen"])?(e=t,!0):a.is.function(document.msExitFullscreen)&&document.msFullscreenEnabled?(e="ms",!0):void 0}),e}();return{prefix:e,eventType:"ms"===e?"MSFullscreenChange":e+"fullscreenchange",isFullScreen:function(t){if(!r.fullscreen)return!1;switch(a.is.undefined(t)&&(t=document.body),this.prefix){case"":return document.fullscreenElement===t;case"moz":return document.mozFullScreenElement===t;default:return document[e+"FullscreenElement"]===t}},requestFullScreen:function(t){return!!r.fullscreen&&(a.is.htmlElement(t)||(t=document.body),""===e?t.requestFullScreen():t[e+("ms"===e?"RequestFullscreen":"RequestFullScreen")]())},cancelFullScreen:function(){return!!r.fullscreen&&(""===e?document.cancelFullScreen():document[e+("ms"===e?"ExitFullscreen":"CancelFullScreen")]())},element:function(){return r.fullscreen?""===e?document.fullscreenElement:document[e+"FullscreenElement"]:null}}}(),r={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),fullscreen:s.prefix!==!1,storage:function(){if(!("localStorage"in window))return!1;var e="___test";try{return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}return!1}(),pip:function(){var e=a.getBrowser();return!e.isIPhone&&a.is.function(a.createElement("video").webkitSetPresentationMode)}(),airplay:a.is.function(window.WebKitPlaybackTargetAvailabilityEvent),inline:"playsInline"in document.createElement("video"),mime:function(e,t){var n=e.media;try{if(!a.is.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},textTracks:"textTracks"in document.createElement("video"),passiveListeners:function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t)}catch(e){}return e}(),touch:"ontouchstart"in document.documentElement,transitions:a.transitionEnd!==!1,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches};return t.prototype.play=function(){var e=this;return"play"in e.media&&e.media.play(),e},t.prototype.pause=function(){var e=this;return"pause"in e.media&&e.media.pause(),e},t.prototype.togglePlay=function(e){var t=this;return a.is.boolean(e)||(e=t.media.paused),e?t.play():t.pause(),e},t.prototype.stop=function(){var e=this;return e.restart(),e.pause(),e},t.prototype.restart=function(){var e=this;return e.seek(),e},t.prototype.rewind=function(e){var t=this;return a.is.number(e)||(e=t.config.seekTime),t.seek(t.media.currentTime-e),t},t.prototype.forward=function(e){var t=this;return a.is.number(e)||(e=t.config.seekTime),t.seek(t.media.currentTime+e),t},t.prototype.seek=function(e){var t=this,n=0,i=t.media.paused,s=t.getDuration();if(a.is.number(e)&&(n=e),n<0?n=0:n>s&&(n=s),t.core.updateSeekDisplay(n),a.inArray(o.embed,t.type)){switch(console.warn(t.type,typeof t.embed,typeof t.embed.seekTo),t.type){case"youtube":t.embed.seekTo(n);break;case"vimeo":t.embed.setCurrentTime(n);break;case"soundcloud":t.embed.seekTo(1e3*n)}i&&t.pause(),t.core.trigger(t.media,"timeupdate"),t.media.seeking=!0,t.core.trigger(t.media,"seeking")}else t.media.currentTime=n.toFixed(4);return t.core.log("Seeking to "+t.media.currentTime+" seconds"),t},t.prototype.setVolume=function(e){var t=this,n=10,i=0;if(a.is.undefined(e)&&(e=t.storage.volume),(null===e||isNaN(e))&&(e=t.config.volume),e>n&&(e=n),e<i&&(e=i),t.media.volume=parseFloat(e/n),t.elements.display.volume&&(t.elements.display.volume.value=e),a.inArray(o.embed,t.type)){switch(t.type){case"youtube":t.embed.setVolume(100*t.media.volume);break;case"vimeo":case"soundcloud":t.embed.setVolume(t.media.volume)}t.core.trigger(t.media,"volumechange")}return 0===e?t.media.muted=!0:t.media.muted&&e>0&&t.toggleMute(),t},t.prototype.increaseVolume=function(e){var t=this,n=t.media.muted?0:10*t.media.volume;return a.is.number(e)||(e=1),t.setVolume(n+e),t},t.prototype.decreaseVolume=function(e){var t=this,n=t.media.muted?0:10*t.media.volume;return a.is.number(e)||(e=1),t.setVolume(n-e),t},t.prototype.toggleMute=function(e){var t=this;if(a.is.boolean(e)||(e=!t.media.muted),a.toggleState(t.elements.buttons.mute,e),t.media.muted=e,0===t.media.volume&&t.volume(t.config.volume),a.inArray(o.embed,t.type)){switch(t.type){case"youtube":t.embed[t.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":t.embed.setVolume(t.media.muted?0:parseFloat(t.config.volume/10))}t.core.trigger(t.media,"volumechange")}return t},t.prototype.setSpeed=function(e){var t=this;if(a.is.number(e)||(e=parseFloat(t.storage.speed||t.config.speed.selected)),e<.1&&(e=.1),e>2&&(e=2),!a.inArray(t.config.speed.options,e))return void t.core.warn("Unsupported speed ("+e+")");switch(t.type){case"youtube":t.embed.setPlaybackRate(e);break;case"vimeo":e=null,t.core.warn("Vimeo playback rate change is not supported");break;default:t.media.playbackRate=e}return t.core.updateStorage({speed:e}),t},t.prototype.setQuality=function(e){var t=this;if(a.is.string(e)||(e=parseFloat(t.storage.quality||t.config.quality.selected)),!a.inArray(t.config.quality.options,e))return void t.core.warn("Unsupported quality option ("+e+")");switch(t.type){case"youtube":t.embed.setPlaybackQuality(e);break;default:t.core.warn("Quality options are only available for YouTube")}return t.core.updateStorage({quality:e}),t},t.prototype.loop=function(e){var t=this;a.inArray(["start","end","all","none","toggle"],e)||(e="toggle");var n=Number(t.media.currentTime);switch(e){case"start":t.config.loop.end&&t.config.loop.end<=n&&(t.config.loop.end=null),t.config.loop.start=n,t.config.loop.indicator.start=t.elements.display.played.value;break;case"end":if(t.config.loop.start>=n)return;t.config.loop.end=n,t.config.loop.indicator.end=t.elements.display.played.value;break;case"all":t.config.loop.start=0,t.config.loop.end=t.media.duration-2,t.config.loop.indicator.start=0,t.config.loop.indicator.end=100;break;case"toggle":t.config.loop.active?(t.config.loop.start=0,t.config.loop.end=null):(t.config.loop.start=0,t.config.loop.end=t.media.duration-2);break;default:t.config.loop.start=0,t.config.loop.end=null}t.config.loop.active=a.is.number(t.config.loop.start)&&a.is.number(t.config.loop.end);var i=(t.core.updateTimeDisplay(t.config.loop.start,t.core.getElement('[data-plyr-loop="start"]')),null);return a.is.number(t.config.loop.end)&&(i=t.core.updateTimeDisplay(t.config.loop.end,t.core.getElement('[data-loop__value="loopout"]'))),t.config.loop.active,t},t.prototype.source=function(e){var t=this;if(a.is.object(e))return t.core.updateSource(e),t;var n;switch(t.type){case"youtube":n=t.embed.getVideoUrl();break;case"vimeo":t.embed.getVideoUrl.then(function(e){n=e});break;case"soundcloud":t.embed.getCurrentSound(function(e){n=e.permalink_url});break;default:n=t.media.currentSrc}return n},t.prototype.poster=function(e){var t=this;return a.is.string(e)?("video"===t.type?t.media.setAttribute("poster",e):t.core.warn("Poster can only be set on HTML5 video"),t):t.media.getAttribute("poster")},t.prototype.toggleCaptions=function(e){var t=this;if(t.supported.full&&t.elements.buttons.captions)return a.is.boolean(e)||(e=t.elements.container.className.indexOf(t.config.classes.captions.active)===-1),t.captions.enabled=e,a.toggleState(t.elements.buttons.captions,t.captions.enabled),a.toggleClass(t.elements.container,t.config.classes.captions.active,t.captions.enabled),t.core.trigger(t.elements.container,t.captions.enabled?"captionsenabled":"captionsdisabled",!0),t.core.updateStorage({captions:t.captions.enabled}),t},t.prototype.setLanguage=function(e){var t=this;return a.is.string(e)?(t.config.captions.language=e.toLowerCase(),t.core.setCaption(),t.core.setupCaptions(),t):void t.core.warn("Language is required")},t.prototype.getLanguage=function(){return this.config.captions.language},t.prototype.toggleFullscreen=function(e){function t(){n={x:window.pageXOffset||0,y:window.pageYOffset||0}}function i(){window.scrollTo(n.x,n.y)}var o=this,l=r.fullscreen;if(l){if(!a.is.event(e)||e.type!==s.eventType)return s.isFullScreen(o.elements.container)?s.cancelFullScreen():(t(),s.requestFullScreen(o.elements.container)),void(o.fullscreen.active=s.isFullScreen(o.elements.container));o.fullscreen.active=s.isFullScreen(o.elements.container)}else o.fullscreen.active=!o.fullscreen.active,document.body.style.overflow=o.fullscreen.active?"hidden":"";return a.toggleClass(o.elements.container,o.config.classes.fullscreen.active,o.fullscreen.active),o.elements.buttons&&o.elements.buttons.fullscreen&&a.toggleState(o.elements.buttons.fullscreen,o.fullscreen.active),o.core.trigger(o.elements.container,o.fullscreen.active?"enterfullscreen":"exitfullscreen",!0),!o.fullscreen.active&&l&&i(),o},t.prototype.togglePictureInPicture=function(e){var t=this,n={pip:"picture-in-picture",inline:"inline"};if(t.core.support.pip)return a.is.boolean(e)||(e=t.media.webkitPresentationMode===n.inline),t.media.webkitSetPresentationMode(e?n.pip:n.inline),t},t.prototype.airPlay=function(){var e=this;if(e.core.support.airplay)return e.media.webkitShowPlaybackTargetPicker(),e},t.prototype.toggleControls=function(e){var t=this;if(t.config.hideControls&&"audio"!==t.type){var n=0,i=e,o=!1,s=a.hasClass(t.elements.container,t.config.classes.loading);if(a.is.boolean(e)||(a.is.event(e)?(o="enterfullscreen"===e.type,i=a.inArray(["mousemove","touchstart","mouseenter","focus"],e.type),a.inArray(["mousemove","touchmove"],e.type)&&(n=2e3),"focus"===e.type&&(n=3e3)):i=a.hasClass(t.elements.container,t.config.classes.hideControls)),window.clearTimeout(t.core.timers.hover),i||t.media.paused||s){if(a.toggleClass(t.elements.container,t.config.classes.hideControls,!1),t.media.paused||s)return;r.touch&&(n=3e3)}return i&&t.media.paused||(t.core.timers.hover=window.setTimeout(function(){(!t.elements.controls.pressed&&!t.elements.controls.hover||o)&&a.toggleClass(t.elements.container,t.config.classes.hideControls,!0)},n)),t}},t.prototype.on=function(e,t){var n=this;return a.on(n.elements.container,e,t),n},t.prototype.off=function(e,t){var n=this;return a.off(n.elements.container,e,t),n},t.prototype.supports=function(e){return r.mime(this,e)},t.prototype.destroy=function(e,t){function n(){if(null!==i){if(a.is.boolean(t)||(t=!0),document.body.style.overflow="",t){var n=i.elements.container.parentNode;a.is.htmlElement(n)&&n.replaceChild(i.elements.original,i.elements.container)}i.core.trigger(i.elements.original,"destroyed",!0),a.is.function(e)&&e.call(i.elements.original),i=null}}var i=this;switch(i.type){case"youtube":window.clearInterval(i.core.timers.buffering),window.clearInterval(i.core.timers.playing),i.embed.destroy(),n();break;case"vimeo":i.embed.unload().then(n),window.setTimeout(n,200);break;case"video":case"audio":i.core.toggleNativeControls(!0),n()}},t.prototype.getDuration=function(){var e=this,t=parseInt(e.config.duration),n=0;return null===e.media.duration||isNaN(e.media.duration)||(n=e.media.duration),isNaN(t)?n:t},t}); \ No newline at end of file
+(function(e,t,n){"use strict";"object"==typeof exports?module.exports=n(require):"function"==typeof define&&define.amd?define(n):t[e]=n()}).call(this,"Plyr",this,function(){"use strict";function e(e,t){function r(e,t,n,i){o.event(e,t,n,o.extend({},i,{plyr:fe}))}function l(){function e(e){9===e.which&&fe.fullscreen.active&&(e.target!==i||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),i.focus()):(e.preventDefault(),n.focus()))}var t=c("input:not([disabled]), button:not([disabled])"),n=t[0],i=t[t.length-1];o.on(fe.elements.container,"keydown",e,!1)}function c(e){return fe.elements.container.querySelectorAll(e)}function u(e){return c(e)[0]}function d(e){o.is.string(e)?(o.removeElement(fe.elements[e]),fe.elements[e]=null):o.removeElement(e)}function p(e,t){o.is.string(t)?o.insertElement(e,fe.media,{src:t}):o.is.array(t)&&t.forEach(function(t){o.insertElement(e,fe.media,t)})}function m(){return{url:fe.config.iconUrl,absolute:0===fe.config.iconUrl.indexOf("http")||fe.browser.isIE}}function f(e,t){var n="http://www.w3.org/2000/svg",i=m(),a=(i.absolute?"":i.url)+"#"+fe.config.iconPrefix,s=document.createElementNS(n,"svg");o.setAttributes(s,o.extend(t,{role:"presentation"}));var r=document.createElementNS(n,"use");return r.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a+"-"+e),s.appendChild(r),s}function g(e){var t=fe.config.i18n[e];switch(e){case"pip":t="PIP";break;case"airplay":t="AirPlay"}return o.createElement("span",{"class":fe.config.classes.hidden},t)}function y(e){var t=o.createElement("span",{"class":fe.config.classes.menu.value});return t.appendChild(o.createElement("span",{"class":fe.config.classes.menu.badge},e)),t}function b(e,t){var n,i,a,s=o.createElement("button");switch(o.is.object(t)||(t={}),"class"in t?t["class"].indexOf(fe.config.classes.control)===-1&&(t["class"]+=" "+fe.config.classes.control):t["class"]=fe.config.classes.control,e){case"mute":a="toggleMute",n="volume",i="muted";break;case"captions":a="toggleCaptions",n="captions-off",i="captions-on";break;case"fullscreen":a="toggleFullscreen",n="enter-fullscreen",i="exit-fullscreen";break;case"play-large":t["class"]="plyr__play-large",e="play",a="play",n="play";break;default:a=e,n=e}return o.extend(t,o.getAttributesFromSelector(fe.config.selectors.buttons[e],t)),o.is.string(i)&&s.appendChild(f(i,{"class":"icon--"+i})),s.appendChild(f(n)),s.appendChild(g(a)),o.setAttributes(s,t),fe.elements.buttons[e]=s,s}function v(e,t){var n=o.createElement("label",{"for":t.id,"class":fe.config.classes.hidden},fe.config.i18n[e]),i=o.createElement("input",o.extend(o.getAttributesFromSelector(fe.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.1,value:0,autocomplete:"off"},t));return fe.elements.inputs[e]=i,{label:n,input:i}}function h(e,t){var n=o.createElement("progress",o.extend(o.getAttributesFromSelector(fe.config.selectors.display[e]),{min:0,max:100,value:0},t));if("volume"!==e){n.appendChild(o.createElement("span",null,"0"));var i="";switch(e){case"played":i=fe.config.i18n.played;break;case"buffer":i=fe.config.i18n.buffered}n.textContent="% "+i.toLowerCase()}return fe.elements.display[e]=n,n}function w(e){var t=o.createElement("span",{"class":"plyr__time"});return t.appendChild(o.createElement("span",{"class":fe.config.classes.hidden},fe.config.i18n[e])),t.appendChild(o.createElement("span",o.getAttributesFromSelector(fe.config.selectors.display[e]),"00:00")),fe.elements.display[e]=t,t}function k(e){if(!o.is.empty(fe.config.controls)){var t=o.createElement("div",o.getAttributesFromSelector(fe.config.selectors.controls.wrapper));if(o.inArray(fe.config.controls,"restart")&&t.appendChild(b("restart")),o.inArray(fe.config.controls,"rewind")&&t.appendChild(b("rewind")),o.inArray(fe.config.controls,"play")&&(t.appendChild(b("play")),t.appendChild(b("pause"))),o.inArray(fe.config.controls,"fast-forward")&&t.appendChild(b("fast-forward")),o.inArray(fe.config.controls,"progress")){var n=o.createElement("span",o.getAttributesFromSelector(fe.config.selectors.progress)),i=v("seek",{id:"plyr-seek-"+e.id});if(n.appendChild(i.label),n.appendChild(i.input),n.appendChild(h("played")),n.appendChild(h("buffer")),fe.config.tooltips.seek){var a=o.createElement("span",{role:"tooltip","class":fe.config.classes.tooltip},"00:00");n.appendChild(a),fe.elements.display.seekTooltip=a}fe.elements.progress=n,t.appendChild(fe.elements.progress)}if(o.inArray(fe.config.controls,"current-time")&&t.appendChild(w("currentTime")),o.inArray(fe.config.controls,"duration")&&t.appendChild(w("duration")),o.inArray(fe.config.controls,"mute")&&t.appendChild(b("mute")),o.inArray(fe.config.controls,"volume")){var r=o.createElement("span",{"class":"plyr__volume"}),l={max:1,step:.05,value:fe.config.volume},c=v("volume",o.extend(l,{id:"plyr-volume-"+e.id}));r.appendChild(c.label),r.appendChild(c.input);var u=h("volume",l);r.appendChild(u),t.appendChild(r)}if(o.inArray(fe.config.controls,"captions")&&t.appendChild(b("captions")),o.inArray(fe.config.controls,"settings")&&!o.is.empty(fe.config.settings)){var d=o.createElement("div",{"class":"plyr__menu"});d.appendChild(b("settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var p=o.createElement("form",{"class":"plyr__menu__container",id:"plyr-settings-"+e.id,"aria-hidden":!0,"aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),m=o.createElement("div"),f=o.createElement("div",{id:"plyr-settings-"+e.id+"-home","aria-hidden":!1,"aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),g=o.createElement("ul",{role:"tablist"});fe.config.settings.forEach(function(t){var n=o.createElement("li",{role:"tab",hidden:""}),i=o.createElement("button",o.extend(o.getAttributesFromSelector(fe.config.selectors.buttons.settings),{type:"button","class":fe.config.classes.control+" "+fe.config.classes.control+"--forward",id:"plyr-settings-"+e.id+"-"+t+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+t,"aria-expanded":!1}),fe.config.i18n[t]),a=o.createElement("span",{"class":fe.config.classes.menu.value});a.innerHTML=e[t],i.appendChild(a),n.appendChild(i),g.appendChild(n),fe.elements.settings.tabs[t]=n}),f.appendChild(g),m.appendChild(f),fe.config.settings.forEach(function(t){var n=o.createElement("div",{id:"plyr-settings-"+e.id+"-"+t,"aria-hidden":!0,"aria-labelled-by":"plyr-settings-"+e.id+"-"+t+"-tab",role:"tabpanel",tabindex:-1,hidden:""}),i=o.createElement("button",{type:"button","class":fe.config.classes.control+" "+fe.config.classes.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},fe.config.i18n[t]);n.appendChild(i);var a=o.createElement("ul");n.appendChild(a),m.appendChild(n),fe.elements.settings.panes[t]=n}),p.appendChild(m),d.appendChild(p),t.appendChild(d),fe.elements.settings.form=p,fe.elements.settings.menu=d}return o.inArray(fe.config.controls,"pip")&&s.pip&&t.appendChild(b("pip")),o.inArray(fe.config.controls,"airplay")&&s.airplay&&t.appendChild(b("airplay")),o.inArray(fe.config.controls,"fullscreen")&&t.appendChild(b("fullscreen")),o.inArray(fe.config.controls,"play-large")&&(fe.elements.buttons.playLarge=b("play-large"),fe.elements.container.appendChild(fe.elements.buttons.playLarge)),fe.elements.controls=t,T(),P(),t}}function C(e,t){var n=fe.elements.settings.tabs[e],i=fe.elements.settings.panes[e];o.is.htmlElement(n)&&(t?n.removeAttribute("hidden"):n.setAttribute("hidden","")),o.is.htmlElement(i)&&(t?i.removeAttribute("hidden"):i.setAttribute("hidden",""))}function E(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?y(t):null}var i=fe.elements.settings.panes.quality.querySelector("ul");o.is.array(e)?fe.quality.options=e.filter(function(e){return o.inArray(fe.config.quality.options,e)}):fe.quality.options=fe.config.quality.options,o.is.string(t)&&o.inArray(fe.quality.options,t)&&(fe.quality.selected=t);var a=!o.is.empty(fe.quality.options)&&"youtube"===fe.type;C("quality",a),a&&(o.emptyElement(i),fe.quality.options.forEach(function(e){var t=o.createElement("li"),a=o.createElement("label",{"class":fe.config.classes.control}),s=o.createElement("input",o.extend(o.getAttributesFromSelector(fe.config.selectors.inputs.quality),{type:"radio",name:"plyr-quality",value:e}));a.appendChild(s),a.appendChild(document.createTextNode(A("quality",e)));var r=n(e);o.is.htmlElement(r)&&a.appendChild(r),t.appendChild(a),i.appendChild(t)}),S("quality",i))}function A(e,t){if("speed"===e)return 1===t?"Normal":t+"&times;";if("quality"===e)switch(t){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";case"tiny":return"Tiny";case"default":return"Auto";default:return t}}function S(e,t){var n=fe[e].selected;if(o.is.empty(n)&&(n=fe.config[e]["default"]),o.inArray(fe[e].options,n)){o.is.htmlElement(t)||(t=fe.elements.settings.panes[e].querySelector("ul"));var i=t.querySelector('[value="'+n+'"]');if(o.is.htmlElement(i)){i.checked=!0;var a=fe.elements.settings.tabs[e].querySelector("."+fe.config.classes.menu.value);a.innerHTML=A(e,n)}}}function T(){var e=["start","end","all","reset"],t=fe.elements.settings.panes.loop.querySelector("ul");fe.elements.settings.tabs.loop.removeAttribute("hidden"),fe.elements.settings.panes.loop.removeAttribute("hidden"),o.emptyElement(t),e.forEach(function(e){var n=o.createElement("li"),i=o.createElement("button",o.extend(o.getAttributesFromSelector(fe.config.selectors.buttons.loop),{type:"button","class":fe.config.classes.control,"data-plyr-loop-action":e}),fe.config.i18n[e]);if(o.inArray(["start","end"],e)){var a=y("00:00");i.appendChild(a)}n.appendChild(i),t.appendChild(n)})}function x(){var e=fe.elements.settings.panes.captions.querySelector("ul");if(fe.elements.settings.tabs.captions.removeAttribute("hidden"),fe.elements.settings.panes.captions.removeAttribute("hidden"),o.emptyElement(e),!o.is.empty(fe.captions.tracks)){var t=[].map.call(fe.captions.tracks,function(e){return{language:e.language,badge:!0,label:o.is.empty(e.label)?e.language.toUpperCase():e.label}});t.unshift({language:"off",label:fe.config.i18n.none}),t.forEach(function(t){var n=o.createElement("li"),i=o.createElement("label",{"class":fe.config.classes.control}),a=o.createElement("input",o.extend(o.getAttributesFromSelector(fe.config.selectors.inputs.language),{type:"radio",name:"plyr-language",value:t.language}));t.language.toLowerCase()===fe.config.captions.language.toLowerCase()&&(a.checked=!0),i.appendChild(a),i.appendChild(document.createTextNode(t.label||t.language)),t.badge&&i.appendChild(y(t.language.toUpperCase())),n.appendChild(i),e.appendChild(n)})}}function P(e,t){o.is.array(e)?fe.speed.options=e.filter(function(e){return o.inArray(fe.config.speed.options,e)}):fe.speed.options=fe.config.speed.options,o.is.number(t)&&o.inArray(fe.speed.options,t)&&(fe.speed.selected=t);var n=!o.is.empty(fe.speed.options);if(C("speed",n),n){var i=fe.elements.settings.panes.speed.querySelector("ul");fe.elements.settings.tabs.speed.removeAttribute("hidden"),fe.elements.settings.panes.speed.removeAttribute("hidden"),o.emptyElement(i),fe.speed.options.forEach(function(e){var t=o.createElement("li"),n=o.createElement("label",{"class":fe.config.classes.control}),a=o.createElement("input",o.extend(o.getAttributesFromSelector(fe.config.selectors.inputs.speed),{type:"radio",name:"plyr-speed",value:e}));n.appendChild(a),n.insertAdjacentHTML("beforeend",A("speed",e)),t.appendChild(n),i.appendChild(t)}),S("speed",i)}}function F(){if(fe.supported.full&&("audio"!==fe.type||fe.config.fullscreen.allowAudio)&&fe.config.fullscreen.enabled){var e=s.fullscreen;e||fe.config.fullscreen.fallback&&!o.inFrame()?(ye((e?"Native":"Fallback")+" fullscreen enabled"),o.toggleClass(fe.elements.container,fe.config.classes.fullscreen.enabled,!0)):ye("Fullscreen not supported and fallback disabled"),fe.elements.buttons&&fe.elements.buttons.fullscreen&&o.toggleState(fe.elements.buttons.fullscreen,!1),l()}}function I(e){if(o.inArray(["video","vimeo"],fe.type)&&("video"!==fe.type||s.textTracks)&&(o.is.htmlElement(fe.elements.captions)||(fe.elements.captions=o.createElement("div",o.getAttributesFromSelector(fe.config.selectors.captions)),o.insertAfter(fe.elements.captions,fe.elements.wrapper)),fe.captions.tracks=o.is.array(e)?e:fe.media.textTracks,o.toggleClass(fe.elements.container,fe.config.classes.captions.enabled,!o.is.empty(fe.captions.tracks)),!o.is.empty(fe.captions.tracks))){if(_(),"video"===fe.type){var t=fe.config.captions.language.toLowerCase();[].forEach.call(fe.captions.tracks,function(e){o.off(e,"cuechange",N),e.mode="hidden",e.language===t&&(fe.captions.currentTrack=e)}),o.is.track(fe.captions.currentTrack)||(be("No language found to match "+t+" in tracks"),fe.captions.currentTrack=fe.captions.tracks[0]);var n=fe.captions.currentTrack;o.is.track(n)&&o.inArray(["captions","subtitles"],n.kind)&&(o.on(n,"cuechange",N),n.activeCues&&n.activeCues.length>0&&N(n))}x()}}function q(){return!s.textTracks||o.is.empty(fe.captions.tracks)?"None":fe.captions.enabled?fe.captions.currentTrack.label:"Disabled"}function N(e){o.is.event(e)&&(e=e.target);var t=e.activeCues[0];o.is.cue(t)?L(t.getCueAsHTML()):L()}function L(e){if(o.is.htmlElement(fe.elements.captions)){var t=o.createElement("span");o.emptyElement(fe.elements.captions),o.is.undefined(e)&&(e=""),o.is.string(e)?t.textContent=e.trim():t.appendChild(e),fe.elements.captions.appendChild(t)}else be("No captions element to render to")}function _(){if(fe.elements.buttons.captions){var e=fe.storage.captions;o.is["boolean"](e)?fe.config.captions.active=e:e=fe.config.captions.active,e&&(o.toggleClass(fe.elements.container,fe.config.classes.captions.active,!0),o.toggleState(fe.elements.buttons.captions,!0))}}function M(){if(fe.config.loadSprite){var e=m();e.absolute?(ye("AJAX loading absolute SVG sprite"+(fe.browser.isIE?" (due to IE)":"")),o.loadSprite(e.url,"sprite-plyr")):ye("Sprite will be used as external resource directly")}fe.id=Math.floor(1e4*Math.random());var t=null;t=o.is.string(fe.config.controls)?fe.config.controls:o.is["function"](fe.config.controls)?fe.config.controls({id:fe.id,seektime:fe.config.seekTime}):k({id:fe.id,seektime:fe.config.seekTime,speed:"-",quality:"-",captions:q(),loop:"None"});var n;if(o.is.string(fe.config.selectors.controls.container)&&(n=document.querySelector(fe.config.selectors.controls.container)),o.is.htmlElement(n)||(n=fe.elements.container),o.is.htmlElement(t)?n.appendChild(t):n.insertAdjacentHTML("beforeend",t),o.is.htmlElement(fe.elements.controls)&&V(),fe.config.tooltips.controls)for(var i=c([fe.config.selectors.controls.wrapper," ",fe.config.selectors.labels," .",fe.config.classes.hidden].join("")),a=i.length-1;a>=0;a--){var s=i[a];o.toggleClass(s,fe.config.classes.hidden,!1),o.toggleClass(s,fe.config.classes.tooltip,!0)}}function V(){try{return fe.elements.controls=u(fe.config.selectors.controls.wrapper),fe.elements.buttons={play:c(fe.config.selectors.buttons.play),pause:u(fe.config.selectors.buttons.pause),restart:u(fe.config.selectors.buttons.restart),rewind:u(fe.config.selectors.buttons.rewind),forward:u(fe.config.selectors.buttons.forward),mute:u(fe.config.selectors.buttons.mute),pip:u(fe.config.selectors.buttons.pip),airplay:u(fe.config.selectors.buttons.airplay),settings:u(fe.config.selectors.buttons.settings),captions:u(fe.config.selectors.buttons.captions),fullscreen:u(fe.config.selectors.buttons.fullscreen)},fe.elements.progress=u(fe.config.selectors.progress),fe.elements.inputs={seek:u(fe.config.selectors.inputs.seek),volume:u(fe.config.selectors.inputs.volume)},fe.elements.display={buffer:u(fe.config.selectors.display.buffer),played:u(fe.config.selectors.display.played),volume:u(fe.config.selectors.display.volume),duration:u(fe.config.selectors.display.duration),currentTime:u(fe.config.selectors.display.currentTime)},o.is.htmlElement(fe.elements.progress)&&(fe.elements.display.seekTooltip=fe.elements.progress.querySelector("."+fe.config.classes.tooltip)),!0}catch(e){return be("It looks like there is a problem with your custom controls HTML",e),D(!0),!1}}function O(){o.toggleClass(fe.elements.container,fe.config.selectors.container.replace(".",""),fe.supported.full)}function D(e){e&&o.inArray(i.html5,fe.type)?fe.media.setAttribute("controls",""):fe.media.removeAttribute("controls")}function j(e){var t=fe.config.i18n.play;if(o.is.string(fe.config.title)&&!o.is.empty(fe.config.title)&&(t+=", "+fe.config.title,fe.elements.container.setAttribute("aria-label",fe.config.title)),fe.supported.full&&(o.is.htmlElement(fe.elements.buttons.play)&&fe.elements.buttons.play.setAttribute("aria-label",t),o.is.htmlElement(fe.elements.buttons.playLarge)&&fe.elements.buttons.playLarge.setAttribute("aria-label",t)),o.is.htmlElement(e)){var n=o.is.string(fe.config.title)&&!o.is.empty(fe.config.title)?fe.config.title:"video";e.setAttribute("title",fe.config.i18n.frameTitle.replace("{title}",n))}}function R(){var e=null;fe.storage={},s.storage&&fe.config.storage.enabled&&(window.localStorage.removeItem("plyr-volume"),e=window.localStorage.getItem(fe.config.storage.key),e&&(/^\d+(\.\d+)?$/.test(e)?H({volume:parseFloat(e)}):fe.storage=JSON.parse(e)))}function H(e){s.storage&&fe.config.storage.enabled&&(o.extend(fe.storage,e),window.localStorage.setItem(fe.config.storage.key,JSON.stringify(fe.storage)))}function B(){return fe.media?(fe.supported.full&&(o.toggleClass(fe.elements.container,fe.config.classes.type.replace("{0}",fe.type),!0),o.inArray(i.embed,fe.type)&&o.toggleClass(fe.elements.container,fe.config.classes.type.replace("{0}","video"),!0),o.toggleClass(fe.elements.container,fe.config.classes.pip.enabled,s.pip&&"video"===fe.type),o.toggleClass(fe.elements.container,fe.config.classes.airplay.enabled,s.airplay&&o.inArray(i.html5,fe.type)),o.toggleClass(fe.elements.container,fe.config.classes.stopped,fe.config.autoplay),o.toggleClass(fe.elements.container,fe.config.classes.isIos,fe.browser.isIos),o.toggleClass(fe.elements.container,fe.config.classes.isTouch,s.touch)),o.inArray(["video","youtube","vimeo"],fe.type)&&(fe.elements.wrapper=o.createElement("div",{"class":fe.config.classes.video}),o.wrap(fe.media,fe.elements.wrapper)),void(o.inArray(i.embed,fe.type)&&Y())):void be("No media element found!")}function Y(){var e,t=fe.type+"-"+Math.floor(1e4*Math.random());switch(fe.type){case"youtube":e=o.parseYouTubeId(fe.embedId);break;default:e=fe.embedId}for(var n=c('[id^="'+fe.type+'-"]'),i=n.length-1;i>=0;i--)o.removeElement(n[i]);if(o.toggleClass(fe.elements.wrapper,fe.config.classes.embed,!0),"youtube"===fe.type)fe.media.setAttribute("id",t),o.is.object(window.YT)?Q(e):(o.injectScript(fe.config.urls.youtube.api),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){Q(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===fe.type)if(fe.media.setAttribute("id",t),o.is.object(window.Vimeo))U(e);else{o.injectScript(fe.config.urls.vimeo.api);var a=window.setInterval(function(){o.is.object(window.Vimeo)&&(window.clearInterval(a),U(e))},50)}else if("soundcloud"===fe.type){var s=o.createElement("iframe");s.loaded=!1,o.on(s,"load",function(){s.loaded=!0}),o.setAttributes(s,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+e,id:t}),fe.media.appendChild(s),window.SC||o.injectScript(fe.config.urls.soundcloud.api);var r=window.setInterval(function(){window.SC&&s.loaded&&(window.clearInterval(r),z.call(s))},50)}}function W(){fe.supported.full&&(de(),pe()),j(u("iframe"))}function Q(e){fe.embed=new window.YT.Player(fe.media.id,{videoId:e,playerVars:{autoplay:fe.config.autoplay?1:0,controls:fe.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,origin:window.location.hostname,widget_referrer:window.location.href},events:{onError:function(e){r(fe.elements.container,"error",!0,{code:e.data,embed:e.target})},onPlaybackQualityChange:function(e){var t=e.target;fe.media.quality=t.getPlaybackQuality(),r(fe.media,"qualitychange")},onPlaybackRateChange:function(e){var t=e.target;fe.media.playbackRate=t.getPlaybackRate(),r(fe.media,"ratechange")},onReady:function(e){var t=e.target;fe.media.play=function(){t.playVideo(),fe.media.paused=!1},fe.media.pause=function(){t.pauseVideo(),fe.media.paused=!0},fe.media.stop=function(){t.stopVideo(),fe.media.paused=!0},fe.media.duration=t.getDuration(),fe.media.paused=!0,fe.media.currentTime=0,fe.media.muted=t.isMuted(),P(t.getAvailablePlaybackRates(),t.getPlaybackRate()),fe.config.title=t.getVideoData().title,fe.supported.full&&fe.media.setAttribute("tabindex",-1),W(),r(fe.media,"timeupdate"),r(fe.media,"durationchange"),window.clearInterval(ge.buffering),ge.buffering=window.setInterval(function(){fe.media.buffered=t.getVideoLoadedFraction(),(null===fe.media.lastBuffered||fe.media.lastBuffered<fe.media.buffered)&&r(fe.media,"progress"),fe.media.lastBuffered=fe.media.buffered,1===fe.media.buffered&&(window.clearInterval(ge.buffering),r(fe.media,"canplaythrough"))},200)},onStateChange:function(e){var t=e.target;switch(window.clearInterval(ge.playing),e.data){case 0:if(fe.config.loop.active){t.stopVideo(),t.playVideo();break}fe.media.paused=!0,r(fe.media,"ended");break;case 1:fe.media.paused=!1,fe.media.seeking&&r(fe.media,"seeked"),fe.media.seeking=!1,r(fe.media,"play"),r(fe.media,"playing"),ge.playing=window.setInterval(function(){fe.media.currentTime=t.getCurrentTime(),r(fe.media,"timeupdate")},100),fe.media.duration!==t.getDuration()&&(fe.media.duration=t.getDuration(),r(fe.media,"durationchange")),E(t.getAvailableQualityLevels(),t.getPlaybackQuality());break;case 2:fe.media.paused=!0,r(fe.media,"pause")}r(fe.elements.container,"statechange",!1,{code:e.data})}}})}function U(e){fe.embed=new window.Vimeo.Player(fe.media,{id:e,loop:fe.config.loop.active,autoplay:fe.config.autoplay,byline:!1,portrait:!1,title:!1}),fe.media.play=function(){fe.embed.play(),fe.media.paused=!1},fe.media.pause=function(){fe.embed.pause(),fe.media.paused=!0},fe.media.stop=function(){fe.embed.stop(),fe.media.paused=!0},fe.media.paused=!0,fe.media.currentTime=0,W(),fe.embed.getCurrentTime().then(function(e){fe.media.currentTime=e,r(fe.media,"timeupdate")}),fe.embed.getDuration().then(function(e){fe.media.duration=e,r(fe.media,"durationchange")}),fe.embed.getTextTracks().then(function(e){I(e),fe.config.captions.active&&fe.embed.enableTextTrack(fe.config.captions.language.toLowerCase())}),fe.embed.on("cuechange",function(e){var t=null;e.cues.length&&(t=o.stripHTML(e.cues[0].text)),L(t)}),fe.embed.on("loaded",function(){o.is.htmlElement(fe.embed.element)&&fe.supported.full&&fe.embed.element.setAttribute("tabindex",-1)}),fe.embed.on("play",function(){fe.media.paused=!1,r(fe.media,"play"),r(fe.media,"playing")}),fe.embed.on("pause",function(){fe.media.paused=!0,r(fe.media,"pause")}),fe.embed.on("timeupdate",function(e){fe.media.seeking=!1,fe.media.currentTime=e.seconds,r(fe.media,"timeupdate")}),fe.embed.on("progress",function(e){fe.media.buffered=e.percent,r(fe.media,"progress"),1===parseInt(e.percent)&&r(fe.media,"canplaythrough")}),fe.embed.on("seeked",function(){fe.media.seeking=!1,r(fe.media,"seeked"),r(fe.media,"play")}),fe.embed.on("ended",function(){fe.media.paused=!0,r(fe.media,"ended")})}function z(){fe.embed=window.SC.Widget(this),fe.embed.bind(window.SC.Widget.Events.READY,function(){fe.media.play=function(){fe.embed.play(),fe.media.paused=!1},fe.media.pause=function(){fe.embed.pause(),fe.media.paused=!0},fe.media.stop=function(){fe.embed.seekTo(0),fe.embed.pause(),fe.media.paused=!0},fe.media.paused=!0,fe.media.currentTime=0,fe.embed.getDuration(function(e){fe.media.duration=e/1e3,W()}),fe.embed.getPosition(function(e){fe.media.currentTime=e,r(fe.media,"timeupdate")}),fe.embed.bind(window.SC.Widget.Events.PLAY,function(){fe.media.paused=!1,r(fe.media,"play"),r(fe.media,"playing")}),fe.embed.bind(window.SC.Widget.Events.PAUSE,function(){fe.media.paused=!0,r(fe.media,"pause")}),fe.embed.bind(window.SC.Widget.Events.PLAY_PROGRESS,function(e){fe.media.seeking=!1,fe.media.currentTime=e.currentPosition/1e3,r(fe.media,"timeupdate")}),fe.embed.bind(window.SC.Widget.Events.LOAD_PROGRESS,function(e){fe.media.buffered=e.loadProgress,r(fe.media,"progress"),1===parseInt(e.loadProgress)&&r(fe.media,"canplaythrough")}),fe.embed.bind(window.SC.Widget.Events.FINISH,function(){fe.media.paused=!0,r(fe.media,"ended")})})}function J(){o.toggleClass(fe.elements.container,fe.config.classes.playing,!fe.media.paused),o.toggleClass(fe.elements.container,fe.config.classes.stopped,fe.media.paused),fe.toggleControls(fe.media.paused)}function X(e){var t=fe.elements.settings.form,n=fe.elements.buttons.settings,i=o.is["boolean"](e)?e:"true"===t.getAttribute("aria-hidden");if(o.is.event(e)){var a=t.contains(e.target),s=e.target===fe.elements.buttons.settings;if(a||!a&&!s&&i)return;s&&e.stopPropagation()}t.setAttribute("aria-hidden",!i),n.setAttribute("aria-expanded",i),i?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1)}function $(e){var t,n,i=e.cloneNode(!0);return i.style.position="absolute",i.style.opacity=0,i.setAttribute("aria-hidden",!1),[].forEach.call(i.querySelectorAll("input[name]"),function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(i),t=i.scrollWidth,n=i.scrollHeight,o.removeElement(i),{width:t,height:n}}function G(e){var t=fe.elements.settings.menu,n=e.target,i="false"===n.getAttribute("aria-expanded"),a=document.getElementById(n.getAttribute("aria-controls"));if(o.is.htmlElement(a)){var r="tabpanel"===a.getAttribute("role");if(r){var l=t.querySelector('[role="tabpanel"][aria-hidden="false"]'),c=l.parentNode;if([].forEach.call(t.querySelectorAll('[aria-controls="'+l.getAttribute("id")+'"]'),function(e){e.setAttribute("aria-expanded",!1)}),s.transitions&&!s.reducedMotion){c.style.width=l.scrollWidth+"px",c.style.height=l.scrollHeight+"px";var u=$(a),d=function(e){e.target===c&&o.inArray(["width","height"],e.propertyName)&&(c.style.width="",c.style.height="",o.off(c,o.transitionEnd,d))};o.on(c,o.transitionEnd,d),c.style.width=u.width+"px",c.style.height=u.height+"px"}l.setAttribute("aria-hidden",!0),l.setAttribute("tabindex",-1),a.setAttribute("aria-hidden",!i),n.setAttribute("aria-expanded",i),a.removeAttribute("tabindex")}}}function K(){if(fe.supported.full){var e=fe.media.muted?0:fe.media.volume;fe.elements.inputs.volume&&(fe.elements.inputs.volume.value=e),fe.elements.display.volume&&(fe.elements.display.volume.value=e)}fe.core.updateStorage({volume:fe.media.volume}),o.toggleClass(fe.elements.container,fe.config.classes.muted,fe.media.muted),fe.supported.full&&fe.elements.buttons.mute&&o.toggleState(fe.elements.buttons.mute,fe.media.muted)}function Z(e){fe.loading="waiting"===e.type,clearTimeout(ge.loading),ge.loading=setTimeout(function(){o.toggleClass(fe.elements.container,fe.config.classes.loading,fe.loading),fe.toggleControls(fe.loading)},fe.loading?250:0)}function ee(e){if(fe.supported.full){var t=fe.elements.display.played,n=0,i=fe.getDuration();if(e)switch(e.type){case"timeupdate":case"seeking":if(fe.elements.controls.pressed)return;n=o.getPercentage(fe.media.currentTime,i),"timeupdate"===e.type&&fe.elements.inputs.seek&&(fe.elements.inputs.seek.value=n);break;case"playing":case"progress":t=fe.elements.display.buffer,n=function(){var e=fe.media.buffered;return e&&e.length?o.getPercentage(e.end(0),i):o.is.number(e)?100*e:0}()}te(t,n)}}function te(e,t){if(fe.supported.full){if(o.is.undefined(t)&&(t=0),o.is.undefined(e)){if(!o.is.htmlElement(fe.elements.display.buffer))return;e=fe.elements.display.buffer}if(o.is.htmlElement(e)){e.value=t;var n=e.getElementsByTagName("span")[0];o.is.htmlElement(n)&&(n.childNodes[0].nodeValue=t)}}}function ne(e,t){if(t){isNaN(e)&&(e=0);var n=parseInt(e%60),i=parseInt(e/60%60),o=parseInt(e/60/60%60),a=fe.getDuration(),s=parseInt(a/60/60%60)>0;n=("0"+n).slice(-2),i=("0"+i).slice(-2);var r=(s?o+":":"")+i+":"+n;return t.textContent=r,r}}function ie(){if(fe.supported.full){var e=fe.getDuration()||0;!fe.elements.display.duration&&fe.config.displayDuration&&fe.media.paused&&ne(e,fe.elements.display.currentTime),fe.elements.display.duration&&ne(e,fe.elements.display.duration),se()}}function oe(e){ne(fe.media.currentTime,fe.elements.display.currentTime),e&&"timeupdate"===e.type&&fe.media.seeking||ee(e)}function ae(e){o.is.number(e)||(e=0);var t=fe.getDuration(),n=o.getPercentage(e,t);fe.elements.progress&&fe.elements.display.played&&(fe.elements.display.played.value=n),fe.elements.buttons&&fe.elements.inputs.seek&&(fe.elements.inputs.seek.value=n)}function se(e){var t=fe.getDuration();if(fe.config.tooltips.seek&&o.is.htmlElement(fe.elements.inputs.seek)&&o.is.htmlElement(fe.elements.display.seekTooltip)&&0!==t){var n=fe.elements.inputs.seek.getBoundingClientRect(),i=0,a=fe.config.classes.tooltip+"--visible";if(o.is.event(e))i=100/n.width*(e.pageX-n.left);else{if(!o.hasClass(fe.elements.display.seekTooltip,a))return;i=fe.elements.display.seekTooltip.style.left.replace("%","")}i<0?i=0:i>100&&(i=100),ne(t/100*i,fe.elements.display.seekTooltip),fe.elements.display.seekTooltip.style.left=i+"%",o.is.event(e)&&o.inArray(["mouseenter","mouseleave"],e.type)&&o.toggleClass(fe.elements.display.seekTooltip,a,"mouseenter"===e.type)}}function re(e){return o.is.object(e)&&"sources"in e&&e.sources.length?(ae(),te(),ue(),void fe.destroy(function(){if(d(fe.media),d("captions"),d("wrapper"),fe.elements.container&&fe.elements.container.removeAttribute("class"),"type"in e&&(fe.type=e.type,"video"===fe.type)){var t=e.sources[0];"type"in t&&o.inArray(i.embed,t.type)&&(fe.type=t.type)}switch(fe.supported=o.checkSupport(fe.type,fe.config.inline),fe.type){case"video":fe.media=o.createElement("video");break;case"audio":fe.media=o.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":fe.media=o.createElement("div"),fe.embedId=e.sources[0].src}o.prependChild(fe.elements.container,fe.media),o.is["boolean"](e.autoplay)&&(fe.config.autoplay=e.autoplay),o.inArray(i.html5,fe.type)&&(fe.config.crossorigin&&fe.media.setAttribute("crossorigin",""),fe.config.autoplay&&fe.media.setAttribute("autoplay",""),"poster"in e&&fe.media.setAttribute("poster",e.poster),fe.config.loop.active&&fe.media.setAttribute("loop",""),fe.config.muted&&fe.media.setAttribute("muted",""),fe.config.inline&&fe.media.setAttribute("playsinline","")),o.toggleClass(fe.elements.container,fe.config.classes.fullscreen.active,fe.fullscreen.active),o.toggleClass(fe.elements.container,fe.config.classes.captions.active,fe.captions.enabled),O(),o.inArray(i.html5,fe.type)&&p("source",e.sources),B(),o.inArray(i.html5,fe.type)&&("tracks"in e&&p("track",e.tracks),fe.media.load()),(o.inArray(i.html5,fe.type)||o.inArray(i.embed,fe.type)&&!fe.supported.full)&&(de(),pe()),fe.config.title=e.title,j()},!1)):void be("Invalid source format")}function le(){function e(){var e=fe.togglePlay(),t=fe.elements.buttons[e?"play":"pause"],n=fe.elements.buttons[e?"pause":"play"];if(n){var i=o.hasClass(t,fe.config.classes.tabFocus);setTimeout(function(){o.is.htmlElement(n)&&n.focus(),i&&(o.toggleClass(t,fe.config.classes.tabFocus,!1),o.toggleClass(n,fe.config.classes.tabFocus,!0))},100)}}function t(e){return e.keyCode?e.keyCode:e.which}function n(e){o.toggleClass(c("."+fe.config.classes.tabFocus),fe.config.classes.tabFocus,!1),fe.elements.container.contains(e)&&o.toggleClass(e,fe.config.classes.tabFocus,!0)}function i(n){function i(){var e=fe.media.duration;o.is.number(e)&&fe.seek(e/10*(a-48))}var a=t(n),r="keydown"===n.type,l=r&&a===d;if(o.is.number(a))if(r){var c=[48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79],u=[38,40];if(o.inArray(u,a)){var p=o.getFocusElement();if(o.is.htmlElement(p)&&"radio"===o.getFocusElement().type)return;
+}switch(o.inArray(c,a)&&(n.preventDefault(),n.stopPropagation()),a){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:l||i();break;case 32:case 75:l||e();break;case 38:fe.increaseVolume();break;case 40:fe.decreaseVolume();break;case 77:l||fe.toggleMute();break;case 39:fe.forward();break;case 37:fe.rewind();break;case 70:fe.toggleFullscreen();break;case 67:l||fe.toggleCaptions();break;case 73:fe.setLoop("start");break;case 76:fe.setLoop();break;case 79:fe.setLoop("end")}!s.fullscreen&&fe.fullscreen.active&&27===a&&fe.toggleFullscreen(),d=a}else d=null}function r(e){o.toggleClass(e.target,"tab-focus",!1)}var l=fe.browser.isIE?"change":"input";if(fe.config.keyboard.focused){var d=null;fe.config.keyboard.global&&o.on(window,"keydown keyup",function(e){var n=t(e),a=o.getFocusElement(),s=[48,49,50,51,52,53,54,56,57,75,77,70,67,73,76,79];!o.inArray(s,n)||o.is.htmlElement(a)&&o.matches(a,fe.config.selectors.editable)||i(e)},!1),o.on(fe.elements.container,"keydown keyup",i,!1)}o.on(window,"keyup",function(e){var i=t(e),a=o.getFocusElement();9===i&&n(a)}),o.on(document.body,"click",function(){o.toggleClass(u("."+fe.config.classes.tabFocus),fe.config.classes.tabFocus,!1)});for(var p in fe.elements.buttons)o.on(fe.elements.buttons[p],"blur",r);var m=function(e,t,n){o.is["function"](t)&&t.call(this,e),o.is["function"](n)&&n.call(this,e)};o.proxy(fe.elements.buttons.play,"click",fe.config.listeners.play,e),o.proxy(fe.elements.buttons.playLarge,"click",fe.config.listeners.play,e),o.proxy(fe.elements.buttons.pause,"click",fe.config.listeners.pause,e),o.proxy(fe.elements.buttons.restart,"click",fe.config.listeners.restart,function(){fe.restart()}),o.proxy(fe.elements.buttons.rewind,"click",fe.config.listeners.rewind,function(){fe.rewind()}),o.proxy(fe.elements.buttons.forward,"click",fe.config.listeners.forward,function(){fe.forward()}),o.proxy(fe.elements.buttons.mute,"click",fe.config.listeners.mute,function(){fe.toggleMute()}),o.proxy(fe.elements.buttons.captions,"click",fe.config.listeners.captions,function(){fe.toggleCaptions()}),o.proxy(fe.elements.buttons.fullscreen,"click",fe.config.listeners.fullscreen,function(e){fe.toggleFullscreen(e)}),o.proxy(fe.elements.buttons.pip,"click",fe.config.listeners.pip,function(){fe.togglePictureInPicture()}),o.proxy(fe.elements.buttons.airplay,"click",fe.config.listeners.airplay,function(){fe.airPlay()}),o.on(fe.elements.buttons.settings,"click",X),o.on(document.documentElement,"click",X),o.on(fe.elements.settings.form,"click",G),o.on(fe.elements.settings.form,"click",function(e){o.matches(e.target,fe.config.selectors.inputs.language)?m.call(this,e,fe.config.listeners.language,function(){fe.setLanguage(e.target.value.toLowerCase())}):o.matches(e.target,fe.config.selectors.inputs.quality)?m.call(this,e,fe.config.listeners.quality,function(){fe.setQuality(e.target.value)}):o.matches(e.target,fe.config.selectors.inputs.speed)?m.call(this,e,fe.config.listeners.speed,function(){fe.setSpeed(parseFloat(e.target.value))}):o.matches(e.target,fe.config.selectors.buttons.loop)&&m.call(this,e,fe.config.listeners.loop,function(){be("Set loop")})}),o.proxy(fe.elements.inputs.seek,l,fe.config.listeners.seek,function(e){var t=fe.getDuration();fe.seek(e.target.value/e.target.max*t)}),o.proxy(fe.elements.inputs.volume,l,fe.config.listeners.volume,function(){fe.setVolume(event.target.value)}),o.on(fe.elements.progress,"mouseenter mouseleave mousemove",se),fe.config.hideControls&&(o.on(fe.elements.container,"mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen",function(e){fe.toggleControls(e)}),o.on(fe.elements.controls,"mouseenter mouseleave",function(e){fe.elements.controls.hover="mouseenter"===e.type}),o.on(fe.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){fe.elements.controls.pressed=o.inArray(["mousedown","touchstart"],e.type)}),o.on(fe.elements.controls,"focus blur",function(e){fe.toggleControls(e)},!0,!0)),o.proxy(fe.elements.inputs.volume,"wheel",fe.config.listeners.volume,function(e){var t=e.webkitDirectionInvertedFromDevice,n=.2,i=0;(e.deltaY<0||e.deltaX>0)&&(t?(fe.decreaseVolume(n),i=-1):(fe.increaseVolume(n),i=1)),(e.deltaY>0||e.deltaX<0)&&(t?(fe.increaseVolume(n),i=1):(fe.decreaseVolume(n),i=-1)),(1===i&&fe.media.volume<1||i===-1&&fe.media.volume>0)&&e.preventDefault()},!1),s.fullscreen&&o.on(document,a.eventType,function(e){fe.toggleFullscreen(e)})}function ce(){if(o.on(fe.media,"timeupdate seeking",oe),o.on(fe.media,"durationchange loadedmetadata",ie),o.on(fe.media,"ended",function(){"video"===fe.type&&fe.config.showPosterOnEnd&&("video"===fe.type&&L(),fe.restart(),fe.media.load())}),o.on(fe.media,"progress playing",ee),o.on(fe.media,"volumechange",K),o.on(fe.media,"play pause ended",J),o.on(fe.media,"waiting canplay seeked",Z),fe.config.clickToPlay&&"audio"!==fe.type){var e=u("."+fe.config.classes.video);if(!e)return;e.style.cursor="pointer",o.on(e,"click",function(){fe.config.hideControls&&s.touch&&!fe.media.paused||(fe.media.paused?fe.play():fe.media.ended?(fe.restart(),fe.play()):fe.pause())})}fe.config.disableContextMenu&&o.on(fe.media,"contextmenu",function(e){e.preventDefault()},!1),o.on(fe.media,"ratechange",function(){fe.speed.selected=fe.media.playbackRate,S("speed"),H({speed:fe.speed.selected})}),o.on(fe.media,"qualitychange",function(){fe.quality.selected=fe.media.quality,S("quality"),H({quality:fe.quality.selected})}),o.on(fe.media,fe.config.events.concat(["keyup","keydown"]).join(" "),function(e){r(fe.elements.container,e.type,!0)})}function ue(){if(o.inArray(i.html5,fe.type)){for(var e=fe.media.querySelectorAll("source"),t=0;t<e.length;t++)o.removeElement(e[t]);fe.media.setAttribute("src","https://cdn.selz.com/plyr/blank.mp4"),fe.media.load(),ye("Cancelled network requests")}}function de(){return fe.supported.full?(o.is.htmlElement(fe.elements.controls)||(M(),le()),void(o.is.htmlElement(fe.elements.controls)&&(ce(),D(),F(),I(),fe.setVolume(),K(),fe.setSpeed(),fe.setLoop(),oe(),J()))):(be("Basic support only",fe.type),d("controls"),d("buttons.play"),void D(!0))}function pe(){fe.ready=!0,window.setTimeout(function(){r(fe.elements.container,"ready",!0)},0),fe.config.autoplay&&fe.play()}function me(e){if(null===e||o.is.undefined(e)||!o.is.htmlElement(e))return void ve("Setup failed: no suitable element passed");if(e.plyr)return be("Target already setup"),void(fe=e.plyr);if(!fe.config.enabled)return void ve("Setup failed: disabled by config");if(!o.checkSupport().basic)return void ve("Setup failed: no support");fe.elements.original=e.cloneNode(!0);var t=e.tagName.toLowerCase();switch(t){case"div":if(fe.type=e.getAttribute("data-type"),fe.embedId=e.getAttribute("data-video-id"),o.is.empty(fe.type))return void ve("Setup failed: embed type missing");if(o.is.empty(fe.embedId))return void ve("Setup failed: video id missing");e.removeAttribute("data-type"),e.removeAttribute("data-video-id");break;case"iframe":break;case"video":case"audio":fe.type=t,null!==e.getAttribute("crossorigin")&&(fe.config.crossorigin=!0),null!==e.getAttribute("autoplay")&&(fe.config.autoplay=!0),null!==e.getAttribute("playsinline")&&(fe.config.inline=!0),null!==e.getAttribute("muted")&&(fe.config.muted=!0),null!==e.getAttribute("loop")&&(fe.config.loop.active=!0);break;default:return void ve("Setup failed: unsupported type")}return fe.browser=o.getBrowser(),R(),fe.supported=o.checkSupport(fe.type,fe.config.inline),fe.supported.basic?(e.plyr=fe,fe.elements.container=o.wrap(e,o.createElement("div")),fe.elements.container.setAttribute("tabindex",0),O(),ye(fe.browser.name+" "+fe.browser.version),B(),fe.config.debug&&o.on(fe.elements.container,fe.config.events.join(" "),function(e){ye("event: "+e.type)}),void((o.inArray(i.html5,fe.type)||o.inArray(i.embed,fe.type)&&!fe.supported.full)&&(de(),pe(),j()))):void ve("Setup failed: no support")}var fe=this,ge={};fe.ready=!1,fe.media=e,o.is.string(fe.media)&&(fe.media=document.querySelectorAll(fe.media)),(window.jQuery&&fe.media instanceof jQuery||o.is.nodeList(fe.media)||o.is.array(fe.media))&&(fe.media=fe.media[0]),fe.config=o.extend({},n,t,function(){try{return JSON.parse(fe.media.getAttribute("data-plyr"))}catch(e){}}()),fe.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},fe.captions={enabled:!1,captions:[],tracks:[],currentTrack:null},fe.fullscreen={active:!1},fe.speed={selected:null,options:[]},fe.quality={selected:null,options:[]},fe.loop={indicator:{start:0,end:0}};var ye=function(){},be=function(){},ve=function(){};fe.config.debug&&"console"in window&&(ye=console.log,be=console.warn,ve=console.error,ye("Debugging enabled")),ye("Config",fe.config),ye("Support",s),fe.core={getElement:u,getElements:c,trigger:r,setCaption:L,setupCaptions:I,toggleNativeControls:D,updateTimeDisplay:ne,updateSeekDisplay:ae,updateSource:re,updateStorage:H,timers:ge,support:s,log:ye,warn:be,error:ve},me(fe.media)}var t={x:0,y:0},n={enabled:!0,title:"",debug:!1,logPrefix:"",autoplay:!1,seekTime:10,volume:1,muted:!1,displayDuration:!0,clickToPlay:!0,hideControls:!0,showPosterOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/2.0.10/plyr.svg",duration:null,quality:{"default":"default",options:["hd2160","hd1440","hd1080","hd720","large","medium","small","tiny","default"]},loop:{active:!1,start:null,end:null},speed:{"default":1,options:[.25,.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:window.navigator.language.split("-")[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"],settings:["captions","quality","speed","loop"],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",start:"Start",end:"End",all:"All",reset:"Reset",none:"None"},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,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","qualitychange","qualityrequested","controlshidden","controlsshown","statechange"],selectors:{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"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress--buffer",played:".plyr__progress--played",loop:".plyr__progress--loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",menu:{quality:".js-plyr__menu__list--quality"}},classes:{video:"plyr__video-wrapper",embed:"plyr__video-embed",control:"plyr__control",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",menu:{value:"plyr__menu__value",badge:"plyr__badge"},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"},airplay:{enabled:"plyr--airplay-enabled",active:"plyr--airplay-active"},tabFocus:"tab-focus"}},i={embed:["youtube","vimeo","soundcloud"],html5:["video","audio"]},o={is:{object:function(e){return null!==e&&"object"==typeof e&&e.constructor===Object},array:function(e){return null!==e&&Array.isArray(e)},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&&e instanceof Event},cue:function(e){return null!==e&&(e instanceof window.TextTrackCue||e instanceof window.VTTCue)},track:function(e){return null!==e&&e instanceof window.TextTrack},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}},getBrowser:function(){var e,t,n,i=navigator.userAgent,o=navigator.appName,a=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10),r=!1,l=!1,c=!1,u=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(r=!0,o="IE",a="11"):(t=i.indexOf("MSIE"))!==-1?(r=!0,o="IE",a=i.substring(t+5)):(t=i.indexOf("Chrome"))!==-1?(c=!0,o="Chrome",a=i.substring(t+7)):(t=i.indexOf("Safari"))!==-1?(u=!0,o="Safari",a=i.substring(t+7),(t=i.indexOf("Version"))!==-1&&(a=i.substring(t+8))):(t=i.indexOf("Firefox"))!==-1?(l=!0,o="Firefox",a=i.substring(t+8)):(e=i.lastIndexOf(" ")+1)<(t=i.lastIndexOf("/"))&&(o=i.substring(e,t),a=i.substring(t+1),o.toLowerCase()===o.toUpperCase()&&(o=navigator.appName)),(n=a.indexOf(";"))!==-1&&(a=a.substring(0,n)),(n=a.indexOf(" "))!==-1&&(a=a.substring(0,n)),s=parseInt(""+a,10),isNaN(s)&&(a=""+parseFloat(navigator.appVersion),s=parseInt(navigator.appVersion,10)),{name:o,version:s,isIE:r,isOldIE:r&&s<=9,isFirefox:l,isChrome:c,isSafari:u,isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)}},checkSupport:function(e,t){var n=!1,i=!1,a=o.getBrowser(),r=a.isIPhone&&t&&s.inline;switch(e){case"video":n=s.video,i=n&&!a.isOldIE&&(!a.isIPhone||r);break;case"audio":n=s.audio,i=n&&!a.isOldIE;break;case"youtube":n=s.video,i=n&&!a.isOldIE&&(!a.isIPhone||r);break;case"vimeo":case"soundcloud":n=!0,i=!a.isOldIE&&!a.isIos;break;default:n=s.audio&&s.video,i=n&&!a.isOldIE}return{basic:n,full:i}},injectScript:function(e){if(!document.querySelectorAll('script[src="'+e+'"]').length){var t=document.createElement("script");t.src=e;var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n)}},inFrame:function(){try{return window.self!==window.top}catch(e){return!0}},inArray:function(e,t){return o.is.array(e)&&e.indexOf(t)!==-1},replaceAll:function(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)},wrap:function(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var i=n>0?t.cloneNode(!0):t,o=e[n],a=o.parentNode,s=o.nextSibling;return i.appendChild(o),s?a.insertBefore(i,s):a.appendChild(i),i}},removeElement:function(e){o.is.htmlElement(e)&&o.is.htmlElement(e.parentNode)&&e.parentNode.removeChild(e)},prependChild:function(e,t){e.insertBefore(t,e.firstChild)},insertAfter:function(e,t){t.parentNode.insertBefore(e,t.nextSibling)},createElement:function(e,t,n){var i=document.createElement(e);return o.is.object(t)&&o.setAttributes(i,t),o.is.string(n)&&(i.textContent=n),i},insertElement:function(e,t,n,i){var a=o.createElement(e,n,i);o.prependChild(t,a)},emptyElement:function(e){for(var t=e.childNodes.length;t--;)e.removeChild(e.lastChild)},setAttributes:function(e,t){for(var n in t)e.setAttribute(n,t[n])},getAttributesFromSelector:function(e,t){if(!o.is.string(e)||o.is.empty(e))return{};var n={};return e.split(",").forEach(function(e){e=e.trim();var i=e.charAt(0);switch(i){case".":var a=e.replace(".","");o.is.object(t)&&o.is.string(t["class"])&&(t["class"]+=" "+a),n["class"]=a;break;case"#":n.id=e.replace("#","");break;case"[":e=e.replace(/[\[\]]/g,"");var s=e.split("="),r=s[0],l=s.length>1?s[1].replace(/[\"\']/g,""):"";n[r]=l}}),n},toggleClass:function(e,t,n){if(o.is.htmlElement(e)){var i=!1;if(e.classList)i=e.classList.contains(t),e.classList[n?"add":"remove"](t);else{i=o.inArray(e.className.split(" "),t);var a=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=a+(n?" "+t:"")}return n&&!i||!n&&i}return null},hasClass:function(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))},matches:function(e,t){var n=Element.prototype,i=n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(e){return[].indexOf.call(document.querySelectorAll(e),this)!==-1};return i.call(e,t)},getFocusElement:function(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null},proxy:function(e,t,n,i,a,s){o.on(e,t,function(t){n&&n.apply(e,[t]),i.apply(e,[t])},a,s)},toggleListener:function(e,t,n,i,a,r){if(null!==e&&!o.is.undefined(e)){if(t=t.split(" "),o.is["boolean"](r)||(r=!1),o.is["boolean"](a)||(a=!0),e instanceof NodeList){var l=1===arguments.length?[arguments[0]]:Array.apply(null,arguments);return l.shift(),void[].forEach.call(e,function(e){e instanceof Node&&o.toggleListener.apply(null,[e].concat(l))})}var c=r;s.passiveListeners&&(c={passive:a,capture:r}),t.forEach(function(t){e[i?"addEventListener":"removeEventListener"](t,n,c)})}},on:function(e,t,n,i,a){o.toggleListener(e,t,n,!0,i,a)},off:function(e,t,n,i,a){o.toggleListener(e,t,n,!1,i,a)},event:function(e,t,n,i){if(e&&t){o.is["boolean"](n)||(n=!1);var a;o.is["function"](window.CustomEvent)?a=window.CustomEvent:(a=function(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},a.prototype=window.Event.prototype);var s=new a(t,{bubbles:n,detail:i});e.dispatchEvent(s)}},toggleState:function(e,t){if(e)return t=o.is["boolean"](t)?t:!e.getAttribute("aria-pressed"),e.setAttribute("aria-pressed",t),t},getPercentage:function(e,t){return 0===e||0===t||isNaN(e)||isNaN(t)?0:(e/t*100).toFixed(2)},extend:function(){var e=arguments;if(e.length){if(1===e.length)return e[0];var t=Array.prototype.shift.call(e);o.is.object(t)||(t={});for(var n=e.length,i=0;i<n;i++){var a=e[i];o.is.object(a)||(a={});for(var s in a)a[s]&&a[s].constructor&&a[s].constructor===Object?(t[s]=t[s]||{},o.extend(t[s],a[s])):t[s]=a[s]}return t}},parseYouTubeId:function(e){var t=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;return e.match(t)?RegExp.$2:e},stripHTML:function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText},loadSprite:function(e,t){function n(e,t){e.innerHTML=t,document.body.insertBefore(e,document.body.childNodes[0])}if("string"==typeof e){var i="cache-",o="string"==typeof t,a=!1;if(!o||!document.querySelectorAll("#"+t).length){var r=document.createElement("div");if(r.setAttribute("hidden",""),o&&r.setAttribute("id",t),s.storage){var l=window.localStorage.getItem(i+t);if(a=null!==l){var c=JSON.parse(l);n(r,c.content)}}var u=new XMLHttpRequest;if(!("withCredentials"in u))return;u.open("GET",e,!0),u.onload=function(){s.storage&&window.localStorage.setItem(i+t,JSON.stringify({content:u.responseText})),n(r,u.responseText)},u.send()}}},transitionEnd:function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return t[n];return!1}()},a=function(){var e=function(){var e=!1;return o.is["function"](document.cancelFullScreen)?e="":["webkit","o","moz","ms","khtml"].some(function(t){return o.is["function"](document[t+"CancelFullScreen"])?(e=t,!0):o.is["function"](document.msExitFullscreen)&&document.msFullscreenEnabled?(e="ms",!0):void 0}),e}();return{prefix:e,eventType:"ms"===e?"MSFullscreenChange":e+"fullscreenchange",isFullScreen:function(t){if(!s.fullscreen)return!1;switch(o.is.undefined(t)&&(t=document.body),this.prefix){case"":return document.fullscreenElement===t;case"moz":return document.mozFullScreenElement===t;default:return document[e+"FullscreenElement"]===t}},requestFullScreen:function(t){return!!s.fullscreen&&(o.is.htmlElement(t)||(t=document.body),""===e?t.requestFullScreen():t[e+("ms"===e?"RequestFullscreen":"RequestFullScreen")]())},cancelFullScreen:function(){return!!s.fullscreen&&(""===e?document.cancelFullScreen():document[e+("ms"===e?"ExitFullscreen":"CancelFullScreen")]())},element:function(){return s.fullscreen?""===e?document.fullscreenElement:document[e+"FullscreenElement"]:null}}}(),s={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),fullscreen:a.prefix!==!1,storage:function(){if(!("localStorage"in window))return!1;var e="___test";try{return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(t){return!1}}(),pip:function(){var e=o.getBrowser();return!e.isIPhone&&o.is["function"](o.createElement("video").webkitSetPresentationMode)}(),airplay:o.is["function"](window.WebKitPlaybackTargetAvailabilityEvent),inline:"playsInline"in document.createElement("video"),mime:function(e,t){var n=e.media;try{if(!o.is["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(i){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),passiveListeners:function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t)}catch(n){}return e}(),touch:"ontouchstart"in document.documentElement,transitions:o.transitionEnd!==!1,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches};return e.prototype.play=function(){var e=this;return"play"in e.media&&e.media.play(),e},e.prototype.pause=function(){var e=this;return"pause"in e.media&&e.media.pause(),e},e.prototype.togglePlay=function(e){var t=this;return o.is["boolean"](e)||(e=t.media.paused),e?t.play():t.pause(),e},e.prototype.stop=function(){var e=this;return e.restart(),e.pause(),e},e.prototype.restart=function(){var e=this;return e.seek(),e},e.prototype.rewind=function(e){var t=this;return o.is.number(e)||(e=t.config.seekTime),t.seek(t.media.currentTime-e),t},e.prototype.forward=function(e){var t=this;return o.is.number(e)||(e=t.config.seekTime),t.seek(t.media.currentTime+e),t},e.prototype.seek=function(e){var t=this,n=0,a=t.media.paused,s=t.getDuration();if(o.is.number(e)&&(n=e),n<0?n=0:n>s&&(n=s),t.core.updateSeekDisplay(n),o.inArray(i.embed,t.type)){switch(t.type){case"youtube":t.embed.seekTo(n);break;case"vimeo":t.embed.setCurrentTime(n);break;case"soundcloud":t.embed.seekTo(1e3*n)}a&&t.pause(),t.core.trigger(t.media,"timeupdate"),t.media.seeking=!0,t.core.trigger(t.media,"seeking")}else t.media.currentTime=n.toFixed(4);return t.core.log("Seeking to "+t.media.currentTime+" seconds"),t},e.prototype.setVolume=function(e){var t=this,n=1,a=0,s=!o.is.undefined(e);if(o.is.string(e)&&(e=parseFloat(e)),o.is.number(e)||(e=t.storage.volume),o.is.number(e)||(e=t.config.volume),e>n&&(e=n),e<a&&(e=a),t.media.volume=e,o.inArray(i.embed,t.type)){switch(t.type){case"youtube":t.embed.setVolume(100*t.media.volume);break;case"vimeo":case"soundcloud":t.embed.setVolume(t.media.volume)}t.core.trigger(t.media,"volumechange")}return 0===e?t.toggleMute(!0):t.media.muted&&s&&t.toggleMute(),t},e.prototype.increaseVolume=function(e){var t=this,n=t.media.muted?0:t.media.volume;return o.is.number(e)||(e=1),t.setVolume(n+e),t},e.prototype.decreaseVolume=function(e){var t=this,n=t.media.muted?0:t.media.volume;return o.is.number(e)||(e=1),t.setVolume(n-e),t},e.prototype.toggleMute=function(e){var t=this;if(o.is["boolean"](e)||(e=!t.media.muted),o.toggleState(t.elements.buttons.mute,e),t.media.muted=e,t.media.muted||0!==t.media.volume||t.setVolume(t.config.volume),o.inArray(i.embed,t.type)){switch(t.type){case"youtube":t.embed[t.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":t.embed.setVolume(t.media.muted?0:t.config.volume)}t.core.trigger(t.media,"volumechange")}return t},e.prototype.setSpeed=function(e){var t=this;if(o.is.number(e)||(e=parseFloat(t.storage.speed||t.speed.selected||t.config.speed["default"])),e<.1&&(e=.1),e>2&&(e=2),!o.inArray(t.config.speed.options,e))return void t.core.warn("Unsupported speed ("+e+")");switch(t.type){case"youtube":t.embed.setPlaybackRate(e);break;case"vimeo":e=null,t.core.warn("Vimeo playback rate change is not supported");break;default:t.media.playbackRate=e}return t},e.prototype.setQuality=function(e){var t=this;if(o.is.string(e)||(e=parseFloat(t.storage.quality||t.config.quality.selected)),!o.inArray(t.config.quality.options,e))return void t.core.warn("Unsupported quality option ("+e+")");switch(t.type){case"youtube":t.core.trigger(t.media,"qualityrequested",!1,{quality:e}),t.embed.setPlaybackQuality(e);break;default:t.core.warn("Quality options are only available for YouTube")}return t},e.prototype.setLoop=function(e){var t=this;o.inArray(["start","end","all","none","toggle"],e)||(e="toggle");var n=Number(t.media.currentTime);switch(e){case"start":t.config.loop.end&&t.config.loop.end<=n&&(t.config.loop.end=null),t.config.loop.start=n,t.config.loop.indicator.start=t.elements.display.played.value;break;case"end":if(t.config.loop.start>=n)return;t.config.loop.end=n,t.config.loop.indicator.end=t.elements.display.played.value;break;case"all":t.config.loop.start=0,t.config.loop.end=t.media.duration-2,t.config.loop.indicator.start=0,t.config.loop.indicator.end=100;break;case"toggle":t.config.loop.active?(t.config.loop.start=0,t.config.loop.end=null):(t.config.loop.start=0,t.config.loop.end=t.media.duration-2);break;default:t.config.loop.start=0,t.config.loop.end=null}return t},e.prototype.source=function(e){var t=this;if(o.is.object(e))return t.core.updateSource(e),t;var n;switch(t.type){case"youtube":n=t.embed.getVideoUrl();break;case"vimeo":t.embed.getVideoUrl.then(function(e){n=e});break;case"soundcloud":t.embed.getCurrentSound(function(e){n=e.permalink_url});break;default:n=t.media.currentSrc}return n},e.prototype.poster=function(e){var t=this;return o.is.string(e)?("video"===t.type?t.media.setAttribute("poster",e):t.core.warn("Poster can only be set on HTML5 video"),t):t.media.getAttribute("poster")},e.prototype.toggleCaptions=function(e){var t=this;if(t.supported.full&&t.elements.buttons.captions)return o.is["boolean"](e)||(e=t.elements.container.className.indexOf(t.config.classes.captions.active)===-1),t.captions.enabled=e,o.toggleState(t.elements.buttons.captions,t.captions.enabled),o.toggleClass(t.elements.container,t.config.classes.captions.active,t.captions.enabled),t.core.trigger(t.media,t.captions.enabled?"captionsenabled":"captionsdisabled"),t.core.updateStorage({captions:t.captions.enabled}),t},e.prototype.setLanguage=function(e){var t=this;return o.is.string(e)?(t.config.captions.language=e.toLowerCase(),t.core.setCaption(),t.core.setupCaptions(),t):void t.core.warn("Language is required")},e.prototype.getLanguage=function(){return this.config.captions.language},e.prototype.toggleFullscreen=function(e){function n(){t={x:window.pageXOffset||0,y:window.pageYOffset||0}}function i(){window.scrollTo(t.x,t.y)}var r=this,l=s.fullscreen;if(l){if(!o.is.event(e)||e.type!==a.eventType)return a.isFullScreen(r.elements.container)?a.cancelFullScreen():(n(),a.requestFullScreen(r.elements.container)),void(r.fullscreen.active=a.isFullScreen(r.elements.container));r.fullscreen.active=a.isFullScreen(r.elements.container)}else r.fullscreen.active=!r.fullscreen.active,document.body.style.overflow=r.fullscreen.active?"hidden":"";return o.toggleClass(r.elements.container,r.config.classes.fullscreen.active,r.fullscreen.active),r.elements.buttons&&r.elements.buttons.fullscreen&&o.toggleState(r.elements.buttons.fullscreen,r.fullscreen.active),r.core.trigger(r.media,r.fullscreen.active?"enterfullscreen":"exitfullscreen",!0),!r.fullscreen.active&&l&&i(),r},e.prototype.togglePictureInPicture=function(e){var t=this,n={pip:"picture-in-picture",inline:"inline"};if(t.core.support.pip)return o.is["boolean"](e)||(e=t.media.webkitPresentationMode===n.inline),t.media.webkitSetPresentationMode(e?n.pip:n.inline),t},e.prototype.airPlay=function(){var e=this;if(e.core.support.airplay)return e.media.webkitShowPlaybackTargetPicker(),e},e.prototype.toggleControls=function(e){var t=this;if(t.config.hideControls&&"audio"!==t.type){var n=0,i=e,a=!1,r=o.hasClass(t.elements.container,t.config.classes.loading);if(o.is["boolean"](e)||(o.is.event(e)?(a="enterfullscreen"===e.type,i=o.inArray(["mousemove","touchstart","mouseenter","focus"],e.type),o.inArray(["mousemove","touchmove"],e.type)&&(n=2e3),"focus"===e.type&&(n=3e3)):i=o.hasClass(t.elements.container,t.config.classes.hideControls)),window.clearTimeout(t.core.timers.hover),i||t.media.paused||r){var l=o.toggleClass(t.elements.container,t.config.classes.hideControls,!1);if(l&&t.core.trigger(t.media,"controlsshown"),t.media.paused||r)return;s.touch&&(n=3e3)}return i&&t.media.paused||(t.core.timers.hover=window.setTimeout(function(){if(!t.elements.controls.pressed&&!t.elements.controls.hover||a){var e=o.toggleClass(t.elements.container,t.config.classes.hideControls,!0);e&&t.core.trigger(t.media,"controlshidden")}},n)),t}},e.prototype.on=function(e,t){var n=this;return o.on(n.elements.container,e,t),n},e.prototype.off=function(e,t){var n=this;return o.off(n.elements.container,e,t),n},e.prototype.supports=function(e){return s.mime(this,e)},e.prototype.destroy=function(e,t){function n(){if(null!==i){if(o.is["boolean"](t)||(t=!0),document.body.style.overflow="",t){var n=i.elements.container.parentNode;o.is.htmlElement(n)&&n.replaceChild(i.elements.original,i.elements.container)}i.core.trigger(i.elements.original,"destroyed",!0),o.is["function"](e)&&e.call(i.elements.original),i=null}}var i=this;switch(i.type){case"youtube":window.clearInterval(i.core.timers.buffering),window.clearInterval(i.core.timers.playing),i.embed.destroy(),n();break;case"vimeo":i.embed.unload().then(n),window.setTimeout(n,200);break;case"video":case"audio":i.core.toggleNativeControls(!0),n()}},e.prototype.getDuration=function(){var e=this,t=parseInt(e.config.duration),n=0;
+return null===e.media.duration||isNaN(e.media.duration)||(n=e.media.duration),isNaN(t)?n:t},e}); \ No newline at end of file
diff --git a/src/js/plyr.js b/src/js/plyr.js
index 5965992a..0ea5ce29 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -6,7 +6,7 @@
// ==========================================================================
(function(name, context, definition) {
- /* global define,module,require,YUI */
+ /* global define,module,require */
'use strict';
if (typeof exports === 'object') {
@@ -16,7 +16,7 @@
} else {
context[name] = definition();
}
-}).call(this, 'Plyr', this, function(require) {
+}).call(this, 'Plyr', this, function() {
'use strict';
/* global jQuery, console */
@@ -28,128 +28,66 @@
// Default config
var defaults = {
+ // Disable
enabled: true,
+
+ // Custom media title
title: '',
+
+ // Logging to console
debug: false,
+ logPrefix: '',
+
+ // Auto play (if supported)
autoplay: false,
+
+ // Default time to skip when rewind/fast forward
seekTime: 10,
- volume: 10,
- duration: null,
+
+ // Default volume
+ volume: 1,
+ muted: false,
+
+ // Display the media duration
displayDuration: true,
- loadSprite: true,
- iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/2.0.10/plyr.svg',
+
+ // Click video to play
clickToPlay: true,
+
+ // Auto hide the controls
hideControls: true,
+
+ // Revert to poster on finish (HTML5 - will cause reload)
showPosterOnEnd: false,
+
+ // Disable the standard context menu
disableContextMenu: true,
- // Selectors
- // Change these to match your template if using custom HTML
- selectors: {
- 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"]',
- captions: '[data-plyr="captions"]',
- fullscreen: '[data-plyr="fullscreen"]',
- pip: '[data-plyr="pip"]',
- airplay: '[data-plyr="airplay"]',
- settings: '[data-plyr="settings"]',
- loop: '[data-plyr="loop"]'
- },
- inputs: {
- seek: '[data-plyr="seek"]',
- volume: '[data-plyr="volume"]',
- speed: '[data-plyr="speed"]',
- language: '[data-plyr="language"]',
- quality: '[data-plyr="quality"]'
- },
- display: {
- currentTime: '.plyr__time--current',
- duration: '.plyr__time--duration',
- buffer: '.plyr__progress--buffer',
- played: '.plyr__progress--played',
- loop: '.plyr__progress--loop',
- volume: '.plyr__volume--display',
- },
- progress: '.plyr__progress',
- captions: '.plyr__captions',
- menu: {
- quality: '.js-plyr__menu__list--quality'
- }
- },
+ // Sprite (for icons)
+ loadSprite: true,
+ iconPrefix: 'plyr',
+ iconUrl: 'https://cdn.plyr.io/2.0.10/plyr.svg',
- // Class hooks added to the player in different states
- classes: {
- video: 'plyr__video-wrapper',
- embed: 'plyr__video-embed',
- control: 'plyr__control',
- 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',
- menu: {
- value: 'plyr__menu__value',
- badge: 'plyr__badge'
- },
- 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'
- },
- airplay: {
- enabled: 'plyr--airplay-enabled',
- active: 'plyr--airplay-active'
- },
- tabFocus: 'tab-focus'
- },
+ // Pass a custom duration
+ duration: null,
- // Quality settings
+ // Quality default
quality: {
- selected: 'auto',
- options: []
+ default: 'default',
+ options: ['hd2160', 'hd1440', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny', 'default']
},
// Set loops
loop: {
active: false,
- start: 0,
- end: null,
- indicator: {
- start: 0,
- end: 0
- }
+ start: null,
+ end: null
},
- // Speed up/down
+ // Speed default and options to display
speed: {
- selected: 1,
- options: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2]
+ default: 1,
+ options: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
},
// Keyboard shortcut settings
@@ -167,7 +105,7 @@
// Captions settings
captions: {
active: false,
- language: window.navigator.language.split("-")[0]
+ language: window.navigator.language.split('-')[0]
},
// Fullscreen settings
@@ -266,9 +204,10 @@
language: null
},
- // Events to watch on HTML5 media elements and bubble
- // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
+ // Events to watch and bubble
events: [
+ // Events to watch on HTML5 media elements and bubble
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
'ended',
'progress',
'stalled',
@@ -286,11 +225,107 @@
'error',
'seeking',
'seeked',
- 'emptied'
+ 'emptied',
+ 'ratechange',
+
+ // Custom events
+ 'enterfullscreen',
+ 'exitfullscreen',
+ 'captionsenabled',
+ 'captionsdisabled',
+ 'qualitychange',
+ 'qualityrequested',
+ 'controlshidden',
+ 'controlsshown',
+
+ // YouTube
+ 'statechange'
],
- // Logging
- logPrefix: ''
+ // Selectors
+ // Change these to match your template if using custom HTML
+ selectors: {
+ 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"]',
+ captions: '[data-plyr="captions"]',
+ fullscreen: '[data-plyr="fullscreen"]',
+ pip: '[data-plyr="pip"]',
+ airplay: '[data-plyr="airplay"]',
+ settings: '[data-plyr="settings"]',
+ loop: '[data-plyr="loop"]'
+ },
+ inputs: {
+ seek: '[data-plyr="seek"]',
+ volume: '[data-plyr="volume"]',
+ speed: '[data-plyr="speed"]',
+ language: '[data-plyr="language"]',
+ quality: '[data-plyr="quality"]'
+ },
+ display: {
+ currentTime: '.plyr__time--current',
+ duration: '.plyr__time--duration',
+ buffer: '.plyr__progress--buffer',
+ played: '.plyr__progress--played',
+ loop: '.plyr__progress--loop',
+ volume: '.plyr__volume--display',
+ },
+ progress: '.plyr__progress',
+ captions: '.plyr__captions',
+ menu: {
+ quality: '.js-plyr__menu__list--quality'
+ }
+ },
+
+ // Class hooks added to the player in different states
+ classes: {
+ video: 'plyr__video-wrapper',
+ embed: 'plyr__video-embed',
+ control: 'plyr__control',
+ 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',
+ menu: {
+ value: 'plyr__menu__value',
+ badge: 'plyr__badge'
+ },
+ 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'
+ },
+ airplay: {
+ enabled: 'plyr--airplay-enabled',
+ active: 'plyr--airplay-active'
+ },
+ tabFocus: 'tab-focus'
+ }
};
// Types
@@ -304,13 +339,13 @@
// Check variable types
is: {
object: function(input) {
- return input !== null && typeof(input) === 'object' && input.constructor === Object;
+ return input !== null && typeof input === 'object' && input.constructor === Object;
},
array: function(input) {
return input !== null && Array.isArray(input);
},
number: function(input) {
- return input !== null && (typeof(input) === 'number' && !isNaN(input - 0) || (typeof input === 'object' && input.constructor === Number));
+ 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));
@@ -658,15 +693,23 @@
},
// Toggle class on an element
- toggleClass: function(element, className, state) {
- if (element) {
+ toggleClass: function(element, className, toggle) {
+ if (utils.is.htmlElement(element)) {
+ var contains = false;
+
if (element.classList) {
- element.classList[state ? 'add' : 'remove'](className);
+ contains = element.classList.contains(className);
+ element.classList[toggle ? 'add' : 'remove'](className);
} else {
+ contains = utils.inArray(element.className.split(' '), className);
var name = (' ' + element.className + ' ').replace(/\s+/g, ' ').replace(' ' + className + ' ', '');
- element.className = name + (state ? ' ' + className : '');
+ element.className = name + (toggle ? ' ' + className : '');
}
+
+ return toggle && !contains || !toggle && contains;
}
+
+ return null;
},
// Has class name
@@ -989,7 +1032,7 @@
MozTransition: 'transitionend',
OTransition: 'oTransitionEnd otransitionend',
transition: 'transitionend'
- }
+ };
for (var type in events) {
if (element.style[type] !== undefined) {
@@ -1099,8 +1142,6 @@
} catch (e) {
return false;
}
-
- return false;
})(),
// Picture-in-picture support
@@ -1173,7 +1214,7 @@
supported = true;
}
});
- window.addEventListener("test", null, options);
+ window.addEventListener('test', null, options);
} catch (e) {}
return supported;
@@ -1195,7 +1236,6 @@
function Plyr(media, options) {
var player = this;
var timers = {};
- var api = {};
player.ready = false;
// Get the media element
@@ -1248,6 +1288,26 @@
active: false
};
+ // Speed
+ player.speed = {
+ selected: null,
+ options: []
+ };
+
+ // Quality
+ player.quality = {
+ selected: null,
+ options: []
+ };
+
+ // Loop
+ player.loop = {
+ indicator: {
+ start: 0,
+ end: 0
+ }
+ };
+
// Debugging
var log = function() {};
var warn = function() {};
@@ -1333,7 +1393,7 @@
function getIconUrl() {
return {
url: player.config.iconUrl,
- absolute: (player.config.iconUrl.indexOf("http") === 0) || player.browser.isIE
+ absolute: (player.config.iconUrl.indexOf('http') === 0) || player.browser.isIE
};
}
@@ -1485,7 +1545,7 @@
return {
label: label,
input: input
- }
+ };
}
// Create a <progress>
@@ -1626,7 +1686,8 @@
// Set the attributes
var attributes = {
- max: 10,
+ max: 1,
+ step: 0.05,
value: player.config.volume
};
@@ -1784,28 +1845,62 @@
return controls;
}
+ // Hide/show a tab
+ function toggleTab(setting, toggle) {
+ var tab = player.elements.settings.tabs[setting];
+ var pane = player.elements.settings.panes[setting];
+
+ if (utils.is.htmlElement(tab)) {
+ if (toggle) {
+ tab.removeAttribute('hidden');
+ } else {
+ tab.setAttribute('hidden', '');
+ }
+ }
+
+ if (utils.is.htmlElement(pane)) {
+ if (toggle) {
+ pane.removeAttribute('hidden');
+ } else {
+ pane.setAttribute('hidden', '');
+ }
+ }
+ }
+
// Set the YouTube quality menu
// TODO: Support for HTML5
- // YouTube: "hd2160", "hd1440", "hd1080", "hd720", "large", "medium", "small", "tiny", "auto"
- function setQualityMenu() {
+ function setQualityMenu(options, selected) {
var list = player.elements.settings.panes.quality.querySelector('ul');
- if (utils.is.empty(player.config.quality.options)) {
- player.elements.settings.tabs.quality.setAttribute('hidden', '');
- player.elements.settings.panes.quality.setAttribute('hidden', '');
- return;
+ // Set options if passed and filter based on config
+ if (utils.is.array(options)) {
+ player.quality.options = options.filter(function(quality) {
+ return utils.inArray(player.config.quality.options, quality);
+ });
+ } else {
+ player.quality.options = player.config.quality.options;
}
- // Show the pane and tab
- player.elements.settings.tabs.quality.removeAttribute('hidden');
- player.elements.settings.panes.quality.removeAttribute('hidden');
+ // Set selected if passed
+ if (utils.is.string(selected) && utils.inArray(player.quality.options, selected)) {
+ player.quality.selected = selected;
+ }
+
+ // Toggle the pane and tab
+ var toggle = !utils.is.empty(player.quality.options) && player.type === 'youtube';
+ toggleTab('quality', toggle);
+
+ // If we're hiding, nothing more to do
+ if (!toggle) {
+ return;
+ }
// Empty the menu
utils.emptyElement(list);
// Get the badge HTML for HD, 4K etc
function getBadge(quality) {
- var label = "";
+ var label = '';
switch (quality) {
case 'hd2160':
@@ -1829,9 +1924,45 @@
return createBadge(label);
}
- // Translate the quality key into a nice label
- function getLabel(quality) {
- switch (quality) {
+ player.quality.options.forEach(function(quality) {
+ var item = utils.createElement('li');
+
+ var label = utils.createElement('label', {
+ class: player.config.classes.control
+ });
+
+ var radio = utils.createElement('input', utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.quality), {
+ type: 'radio',
+ name: 'plyr-quality',
+ value: quality,
+ }));
+
+ label.appendChild(radio);
+ label.appendChild(document.createTextNode(getLabel('quality', quality)));
+
+ var badge = getBadge(quality);
+ if (utils.is.htmlElement(badge)) {
+ label.appendChild(badge);
+ }
+
+ item.appendChild(label);
+ list.appendChild(item);
+ });
+
+ setSelectedSetting('quality', list);
+ }
+
+ // Translate a value into a nice label
+ // TODO: Localisation
+ function getLabel(setting, value) {
+ if (setting === 'speed') {
+ if (value === 1) {
+ return 'Normal';
+ }
+
+ return value + '&times;';
+ } else if (setting === 'quality') {
+ switch (value) {
case 'hd2160':
return '2160P';
case 'hd1440':
@@ -1846,44 +1977,47 @@
return '360P';
case 'small':
return '240P';
- default:
+ case 'tiny':
+ return 'Tiny';
+ case 'default':
return 'Auto';
+ default:
+ return value;
}
}
+ }
- if (utils.is.array(options) && !utils.is.empty(options)) {
- options.filter(function(quality) {
- // Remove any unwanted quality levels
- return !utils.inArray(['tiny', 'small'], quality);
- }).forEach(function(quality) {
- var item = utils.createElement('li');
-
- var label = utils.createElement('label', {
- class: player.config.classes.control
- });
+ // Update the selected setting
+ function setSelectedSetting(setting, list) {
+ var value = player[setting].selected;
- var radio = utils.createElement('input', utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.quality), {
- type: 'radio',
- name: 'plyr-quality',
- value: quality,
- }));
+ if (utils.is.empty(value)) {
+ value = player.config[setting].default;
+ }
- if (quality === player.config.quality.selected) {
- radio.checked = true;
- }
+ // Unsupported quality
+ if (!utils.inArray(player[setting].options, value)) {
+ return;
+ }
- label.appendChild(radio);
- label.appendChild(document.createTextNode(getLabel(quality)));
+ // Get the list if we need to
+ if (!utils.is.htmlElement(list)) {
+ list = player.elements.settings.panes[setting].querySelector('ul');
+ }
- var badge = getBadge(quality);
- if (utils.is.htmlElement(badge)) {
- label.appendChild(badge);
- }
+ // Find the radio option
+ var target = list.querySelector('[value="' + value + '"]');
- item.appendChild(label);
- list.appendChild(item);
- });
+ if (!utils.is.htmlElement(target)) {
+ return;
}
+
+ // Check it
+ target.checked = true;
+
+ // Find the label
+ var label = player.elements.settings.tabs[setting].querySelector('.' + player.config.classes.menu.value);
+ label.innerHTML = getLabel(setting, value);
}
// Set the looping options
@@ -1939,7 +2073,7 @@
language: track.language,
badge: true,
label: !utils.is.empty(track.label) ? track.label : track.language.toUpperCase()
- }
+ };
});
// Add the "None" option to turn off captions
@@ -1979,7 +2113,31 @@
}
// Set a list of available captions languages
- function setSpeedMenu() {
+ function setSpeedMenu(options, selected) {
+ // Set options if passed and filter based on config
+ if (utils.is.array(options)) {
+ player.speed.options = options.filter(function(speed) {
+ return utils.inArray(player.config.speed.options, speed);
+ });
+ } else {
+ player.speed.options = player.config.speed.options;
+ }
+
+ // Set selected if passed
+ if (utils.is.number(selected) && utils.inArray(player.speed.options, selected)) {
+ player.speed.selected = selected;
+ }
+
+ // Toggle the pane and tab
+ var toggle = !utils.is.empty(player.speed.options);
+ toggleTab('speed', toggle);
+
+ // If we're hiding, nothing more to do
+ if (!toggle) {
+ return;
+ }
+
+ // Get the list to populate
var list = player.elements.settings.panes.speed.querySelector('ul');
// Show the pane and tab
@@ -1990,7 +2148,7 @@
utils.emptyElement(list);
// Create items
- player.config.speed.options.forEach(function(speed) {
+ player.speed.options.forEach(function(speed) {
var item = utils.createElement('li');
var label = utils.createElement('label', {
@@ -2004,41 +2162,12 @@
}));
label.appendChild(radio);
- label.insertAdjacentHTML('beforeend', getSpeedLabel(speed));
+ label.insertAdjacentHTML('beforeend', getLabel('speed', speed));
item.appendChild(label);
list.appendChild(item);
});
- setSelectedSpeed(list);
- }
-
- // Update the UI
- function setSelectedSpeed(list) {
- var speed = player.config.speed.selected;
-
- // Unsupported speed
- if (!utils.inArray(player.config.speed.options, speed)) {
- return;
- }
-
- // Get the list if we need to
- if (!utils.is.htmlElement(list)) {
- list = player.elements.settings.panes.speed.querySelector('ul');
- }
-
- // Find the radio option
- var target = list.querySelector('[value="' + speed + '"]');
-
- if (!utils.is.htmlElement(target)) {
- return;
- }
-
- // Check it
- target.checked = true;
-
- // Find the label
- var label = player.elements.settings.tabs.speed.querySelector('.' + player.config.classes.menu.value);
- label.innerHTML = getSpeedLabel(speed);
+ setSelectedSetting('speed', list);
}
// Setup fullscreen
@@ -2139,7 +2268,7 @@
// Get current selected caption language
function getLanguage() {
if (!support.textTracks || utils.is.empty(player.captions.tracks)) {
- return 'No Subs';
+ return 'None';
}
if (player.captions.enabled) {
@@ -2188,9 +2317,6 @@
// Set new caption text
player.elements.captions.appendChild(content);
-
- // Force redraw (for Safari)
- // var redraw = captions.offsetHeight;
} else {
warn('No captions element to render to');
}
@@ -2228,7 +2354,7 @@
// Only load external sprite using AJAX
if (iconUrl.absolute) {
log('AJAX loading absolute SVG sprite' + (player.browser.isIE ? ' (due to IE)' : ''));
- utils.loadSprite(iconUrl.url, "sprite-plyr");
+ utils.loadSprite(iconUrl.url, 'sprite-plyr');
} else {
log('Sprite will be used as external resource directly');
}
@@ -2257,9 +2383,9 @@
controls = createControls({
id: player.id,
seektime: player.config.seekTime,
- speed: getSpeedLabel(),
+ speed: '-',
// TODO: Get current quality
- quality: 'HD',
+ quality: '-',
captions: getLanguage(),
// TODO: Get loop
loop: 'None'
@@ -2276,7 +2402,7 @@
// Inject into the container by default
if (!utils.is.htmlElement(target)) {
- target = player.elements.container
+ target = player.elements.container;
}
// Inject controls HTML
@@ -2505,7 +2631,6 @@
// Setup YouTube/Vimeo
function setupEmbed() {
- //var container = utils.createElement('div');
var mediaId;
var id = player.type + '-' + Math.floor(Math.random() * (10000));
@@ -2624,18 +2749,22 @@
player.embed = new window.YT.Player(player.media.id, {
videoId: videoId,
playerVars: {
- autoplay: (player.config.autoplay ? 1 : 0),
- controls: (player.supported.full ? 0 : 1),
- rel: 0,
- showinfo: 0,
- iv_load_policy: 3,
- cc_load_policy: (player.config.captions.active ? 1 : 0),
- cc_lang_pref: 'en',
- wmode: 'transparent',
- modestbranding: 1,
- disablekb: 1,
- playsinline: 1,
- origin: window.location.href
+ autoplay: (player.config.autoplay ? 1 : 0), // Autoplay
+ controls: (player.supported.full ? 0 : 1), // Only show controls if not fully supported
+ rel: 0, // No related vids
+ showinfo: 0, // Hide info
+ iv_load_policy: 3, // Hide annotations
+ modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)
+ disablekb: 1, // Disable keyboard as we handle it
+ playsinline: 1, // Allow iOS inline playback
+
+ // Tracking for stats
+ origin: window.location.hostname,
+ widget_referrer: window.location.href,
+
+ // Captions is flaky on YouTube
+ //cc_load_policy: (player.config.captions.active ? 1 : 0),
+ //cc_lang_pref: 'en',
},
events: {
'onError': function(event) {
@@ -2649,10 +2778,10 @@
var instance = event.target;
// Get current quality
- var quality = instance.getPlaybackQuality();
+ player.media.quality = instance.getPlaybackQuality();
- // var set = player.setPlaybackQuality();
- console.warn('quality change', quality);
+ // Trigger timeupdate
+ trigger(player.media, 'qualitychange');
},
'onPlaybackRateChange': function(event) {
// Get the instance
@@ -2687,9 +2816,7 @@
player.media.muted = instance.isMuted();
// Get available speeds
- player.config.speed.selected = instance.getPlaybackRate();
- player.config.speed.options = instance.getAvailablePlaybackRates();
- setSpeedMenu();
+ setSpeedMenu(instance.getAvailablePlaybackRates(), instance.getPlaybackRate());
// Set title
player.config.title = instance.getVideoData().title;
@@ -2795,9 +2922,7 @@
}
// Get quality
- var qualityOptions = instance.getAvailableQualityLevels();
- var quality = instance.getPlaybackQuality();
- setQualityMenu(qualityOptions, quality);
+ setQualityMenu(instance.getAvailableQualityLevels(), instance.getPlaybackQuality());
break;
@@ -3005,19 +3130,6 @@
});
}
- // Get the current speed value
- function getSpeedLabel(speed) {
- if (!utils.is.number(speed)) {
- speed = player.config.speed.selected;
- }
-
- if (speed === 1) {
- return 'Normal';
- }
-
- return speed + '&times;';
- }
-
// Check playing state
function checkPlaying() {
utils.toggleClass(player.elements.container, player.config.classes.playing, !player.media.paused);
@@ -3067,7 +3179,7 @@
var height;
var clone = tab.cloneNode(true);
- clone.style.position = "absolute";
+ clone.style.position = 'absolute';
clone.style.opacity = 0;
clone.setAttribute('aria-hidden', false);
@@ -3143,8 +3255,8 @@
container.style.height = '';
// Only listen once
- utils.off(container, utils.transitionEnd, restore)
- }
+ utils.off(container, utils.transitionEnd, restore);
+ };
// Listen for the transition finishing and restore auto height/width
utils.on(container, utils.transitionEnd, restore);
@@ -3166,30 +3278,29 @@
// Update volume UI and storage
function updateVolume() {
- // Get the current volume
- var volume = player.media.muted ? 0 : (player.media.volume * 10);
-
// Update the <input type="range"> if present
if (player.supported.full) {
+ var value = player.media.muted ? 0 : player.media.volume;
+
if (player.elements.inputs.volume) {
- player.elements.inputs.volume.value = volume;
+ player.elements.inputs.volume.value = value;
}
if (player.elements.display.volume) {
- player.elements.display.volume.value = volume;
+ player.elements.display.volume.value = value;
}
}
// Update the volume in storage
- updateStorage({
- volume: volume
+ player.core.updateStorage({
+ volume: player.media.volume
});
// Toggle class if muted
- utils.toggleClass(player.elements.container, player.config.classes.muted, (volume === 0));
+ utils.toggleClass(player.elements.container, player.config.classes.muted, player.media.muted);
// Update checkbox for mute state
if (player.supported.full && player.elements.buttons.mute) {
- utils.toggleState(player.elements.buttons.mute, (volume === 0));
+ utils.toggleState(player.elements.buttons.mute, player.media.muted);
}
}
@@ -3428,7 +3539,7 @@
updateTimeDisplay(((duration / 100) * percent), player.elements.display.seekTooltip);
// Set position
- player.elements.display.seekTooltip.style.left = percent + "%";
+ player.elements.display.seekTooltip.style.left = percent + '%';
// Show/hide the tooltip
// If the event is a moues in/out and percentage is inside bounds
@@ -3523,6 +3634,9 @@
if (player.config.loop.active) {
player.media.setAttribute('loop', '');
}
+ if (player.config.muted) {
+ player.media.setAttribute('muted', '');
+ }
if (player.config.inline) {
player.media.setAttribute('playsinline', '');
}
@@ -3670,7 +3784,7 @@
if (utils.inArray(checkFocus, code)) {
var focused = utils.getFocusElement();
- if (utils.is.htmlElement(focused) && utils.getFocusElement().type === "radio") {
+ if (utils.is.htmlElement(focused) && utils.getFocusElement().type === 'radio') {
return;
}
}
@@ -3746,15 +3860,15 @@
break;
case 73:
- player.loop('start');
+ player.setLoop('start');
break;
case 76:
- player.loop();
+ player.setLoop();
break;
case 79:
- player.loop('end');
+ player.setLoop('end');
break;
}
@@ -3780,15 +3894,17 @@
checkTabFocus(focused);
}
});
+
utils.on(document.body, 'click', function() {
utils.toggleClass(getElement('.' + player.config.classes.tabFocus), player.config.classes.tabFocus, false);
});
+
for (var button in player.elements.buttons) {
- var element = player.elements.buttons[button];
+ utils.on(player.elements.buttons[button], 'blur', onBlur);
+ }
- utils.on(element, 'blur', function() {
- utils.toggleClass(element, 'tab-focus', false);
- });
+ function onBlur(event) {
+ utils.toggleClass(event.target, 'tab-focus', false);
}
// Trigger custom and default handlers
@@ -3799,7 +3915,7 @@
if (utils.is.function(defaultHandler)) {
defaultHandler.call(this, event);
}
- }
+ };
// Play
utils.proxy(player.elements.buttons.play, 'click', player.config.listeners.play, togglePlay);
@@ -3890,7 +4006,7 @@
warn('Set loop');
/*if (utils.inArray(['start', 'end', 'all', 'none'], value)) {
- player.loop(value);
+ player.setLoop(value);
}*/
});
}
@@ -4027,7 +4143,7 @@
}
// Set cursor
- wrapper.style.cursor = "pointer";
+ wrapper.style.cursor = 'pointer';
// On click play, pause ore restart
utils.on(wrapper, 'click', function() {
@@ -4055,16 +4171,30 @@
}
// Speed change
- utils.on(player.media, 'ratechange', function(event) {
+ utils.on(player.media, 'ratechange', function() {
// Store current speed
- player.config.speed.selected = player.media.playbackRate;
+ player.speed.selected = player.media.playbackRate;
// Update UI
- setSelectedSpeed();
+ setSelectedSetting('speed');
// Save speed to localStorage
updateStorage({
- speed: player.config.speed.selected
+ speed: player.speed.selected
+ });
+ });
+
+ // Quality change
+ utils.on(player.media, 'qualitychange', function() {
+ // Store current quality
+ player.quality.selected = player.media.quality;
+
+ // Update UI
+ setSelectedSetting('quality');
+
+ // Save speed to localStorage
+ updateStorage({
+ quality: player.quality.selected
});
});
@@ -4155,7 +4285,7 @@
player.setSpeed();
// Set loop
- player.loop();
+ player.setLoop();
// Reset time display
timeUpdate();
@@ -4242,10 +4372,22 @@
case 'video':
case 'audio':
player.type = type;
- player.config.crossorigin = media.getAttribute('crossorigin') !== null;
- player.config.autoplay = player.config.autoplay || (media.getAttribute('autoplay') !== null);
- player.config.inline = media.getAttribute('playsinline') !== null;
- player.config.loop.active = player.config.loop || (media.getAttribute('loop') !== null);
+
+ if (media.getAttribute('crossorigin') !== null) {
+ player.config.crossorigin = true;
+ }
+ if (media.getAttribute('autoplay') !== null) {
+ player.config.autoplay = true;
+ }
+ if (media.getAttribute('playsinline') !== null) {
+ player.config.inline = true;
+ }
+ if (media.getAttribute('muted') !== null) {
+ player.config.muted = true;
+ }
+ if (media.getAttribute('loop') !== null) {
+ player.config.loop.active = true;
+ }
break;
default:
@@ -4288,9 +4430,7 @@
// Listen for events if debugging
if (player.config.debug) {
- var events = player.config.events.concat(['setup', 'statechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled']);
-
- utils.on(player.elements.container, events.join(' '), function(event) {
+ utils.on(player.elements.container, player.config.events.join(' '), function(event) {
log('event: ' + event.type);
});
}
@@ -4455,8 +4595,6 @@
// Set the current time
// Embeds
if (utils.inArray(types.embed, player.type)) {
- console.warn(player.type, typeof player.embed, typeof player.embed.seekTo);
-
switch (player.type) {
case 'youtube':
player.embed.seekTo(targetTime);
@@ -4497,16 +4635,21 @@
// Set volume
Plyr.prototype.setVolume = function(volume) {
var player = this;
- var max = 10;
+ var max = 1;
var min = 0;
+ var isSet = !utils.is.undefined(volume);
+
+ if (utils.is.string(volume)) {
+ volume = parseFloat(volume);
+ }
// Load volume from storage if no value specified
- if (utils.is.undefined(volume)) {
+ if (!utils.is.number(volume)) {
volume = player.storage.volume;
}
// Use config if all else fails
- if (volume === null || isNaN(volume)) {
+ if (!utils.is.number(volume)) {
volume = player.config.volume;
}
@@ -4520,15 +4663,11 @@
}
// Set the player volume
- player.media.volume = parseFloat(volume / max);
-
- // Set the display
- if (player.elements.display.volume) {
- player.elements.display.volume.value = volume;
- }
+ player.media.volume = volume;
- // Embeds
+ // Trigger volumechange for embeds
if (utils.inArray(types.embed, player.type)) {
+ // Set media volume
switch (player.type) {
case 'youtube':
player.embed.setVolume(player.media.volume * 100);
@@ -4540,14 +4679,13 @@
break;
}
- // Trigger volumechange for embeds
player.core.trigger(player.media, 'volumechange');
}
// Toggle muted state
if (volume === 0) {
- player.media.muted = true;
- } else if (player.media.muted && volume > 0) {
+ player.toggleMute(true);
+ } else if (player.media.muted && isSet) {
player.toggleMute();
}
@@ -4558,7 +4696,7 @@
// Increase volume
Plyr.prototype.increaseVolume = function(step) {
var player = this;
- var volume = player.media.muted ? 0 : (player.media.volume * 10);
+ var volume = player.media.muted ? 0 : player.media.volume;
if (!utils.is.number(step)) {
step = 1;
@@ -4573,7 +4711,7 @@
// Decrease volume
Plyr.prototype.decreaseVolume = function(step) {
var player = this;
- var volume = player.media.muted ? 0 : (player.media.volume * 10);
+ var volume = player.media.muted ? 0 : player.media.volume;
if (!utils.is.number(step)) {
step = 1;
@@ -4600,9 +4738,9 @@
// Set mute on the player
player.media.muted = muted;
- // If volume is 0 after unmuting, set to default
- if (player.media.volume === 0) {
- player.volume(player.config.volume);
+ // If volume is 0 after unmuting, restore default volume
+ if (!player.media.muted && player.media.volume === 0) {
+ player.setVolume(player.config.volume);
}
// Embeds
@@ -4614,7 +4752,7 @@
case 'vimeo':
case 'soundcloud':
- player.embed.setVolume(player.media.muted ? 0 : parseFloat(player.config.volume / 10));
+ player.embed.setVolume(player.media.muted ? 0 : player.config.volume);
break;
}
@@ -4632,7 +4770,7 @@
// Load speed from storage or default value
if (!utils.is.number(speed)) {
- speed = parseFloat(player.storage.speed || player.config.speed.selected);
+ speed = parseFloat(player.storage.speed || player.speed.selected || player.config.speed.default);
}
// Set min/max
@@ -4665,11 +4803,6 @@
break;
}
- // Save speed to localStorage
- player.core.updateStorage({
- speed: speed
- });
-
// Allow chaining
return player;
};
@@ -4691,7 +4824,12 @@
// Set media speed
switch (player.type) {
case 'youtube':
+ player.core.trigger(player.media, 'qualityrequested', false, {
+ quality: quality
+ });
+
player.embed.setPlaybackQuality(quality);
+
break;
default:
@@ -4699,11 +4837,6 @@
break;
}
- // Save speed to localStorage
- player.core.updateStorage({
- quality: quality
- });
-
// Allow chaining
return player;
};
@@ -4711,7 +4844,7 @@
// Toggle loop
// TODO: Finish logic
// TODO: Set the indicator on load as user may pass loop as config
- Plyr.prototype.loop = function(type) {
+ Plyr.prototype.setLoop = function(type) {
var player = this;
// Set default to be a true toggle
@@ -4762,7 +4895,7 @@
}
// Check if can loop
- player.config.loop.active = utils.is.number(player.config.loop.start) && utils.is.number(player.config.loop.end);
+ /*player.config.loop.active = utils.is.number(player.config.loop.start) && utils.is.number(player.config.loop.end);
var start = player.core.updateTimeDisplay(player.config.loop.start, player.core.getElement('[data-plyr-loop="start"]'));
var end = null;
@@ -4787,7 +4920,7 @@
} else {
//getElement('[data-menu="loop"]').innerHTML = player.config.i18n.loopNone;
//getElement(player.config.selectors.progress.looped).style.width = '0px';
- }
+ }*/
// Allow chaining
return player;
@@ -4871,7 +5004,7 @@
utils.toggleClass(player.elements.container, player.config.classes.captions.active, player.captions.enabled);
// Trigger an event
- player.core.trigger(player.elements.container, player.captions.enabled ? 'captionsenabled' : 'captionsdisabled', true);
+ player.core.trigger(player.media, player.captions.enabled ? 'captionsenabled' : 'captionsdisabled');
// Save captions state to localStorage
player.core.updateStorage({
@@ -4970,7 +5103,7 @@
}
// Trigger an event
- player.core.trigger(player.elements.container, player.fullscreen.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ player.core.trigger(player.media, player.fullscreen.active ? 'enterfullscreen' : 'exitfullscreen', true);
// Restore scroll position
if (!player.fullscreen.active && nativeSupport) {
@@ -5067,7 +5200,13 @@
// If the mouse is not over the controls, set a timeout to hide them
if (show || player.media.paused || loading) {
- utils.toggleClass(player.elements.container, player.config.classes.hideControls, false);
+ // Check if controls toggled
+ var toggled = utils.toggleClass(player.elements.container, player.config.classes.hideControls, false);
+
+ // Trigger event
+ if (toggled) {
+ player.core.trigger(player.media, 'controlsshown');
+ }
// Always show controls when paused or if touch
if (player.media.paused || loading) {
@@ -5089,7 +5228,13 @@
return;
}
- utils.toggleClass(player.elements.container, player.config.classes.hideControls, true);
+ // Check if controls toggled
+ var toggled = utils.toggleClass(player.elements.container, player.config.classes.hideControls, true);
+
+ // Trigger event
+ if (toggled) {
+ player.core.trigger(player.media, 'controlshidden');
+ }
}, delay);
}