From e206edc1f6a09e6c2584e83a60d2632202545733 Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Sun, 11 Mar 2018 02:03:35 +1100 Subject: [PATCH] Event listener fixes, loadScript promise, ads tweaks --- demo/dist/demo.css | 2 +- demo/dist/demo.js | 3 +- demo/dist/demo.js.map | 2 +- demo/dist/demo.min.js | 2 +- demo/dist/demo.min.js.map | 2 +- demo/index.html | 2 +- demo/src/js/demo.js | 1 + dist/plyr.css | 2 +- dist/plyr.js | 3053 ++++++++++++++++--------------- dist/plyr.js.map | 2 +- dist/plyr.min.js | 2 +- dist/plyr.min.js.map | 2 +- dist/plyr.polyfilled.js | 3053 ++++++++++++++++--------------- dist/plyr.polyfilled.js.map | 2 +- dist/plyr.polyfilled.min.js | 2 +- dist/plyr.polyfilled.min.js.map | 2 +- src/js/controls.js | 6 + src/js/defaults.js | 3 +- src/js/listeners.js | 578 +++--- src/js/plugins/ads.js | 113 +- src/js/plugins/vimeo.js | 11 +- src/js/plugins/youtube.js | 4 +- src/js/plyr.js | 26 +- src/js/ui.js | 4 +- src/js/utils.js | 66 +- 25 files changed, 3559 insertions(+), 3386 deletions(-) diff --git a/demo/dist/demo.css b/demo/dist/demo.css index 5b2e78ee..bd1e5be7 100644 --- a/demo/dist/demo.css +++ b/demo/dist/demo.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:300;src:url(https://cdn.plyr.io/static/fonts/gordita-light.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-light.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:400;src:url(https://cdn.plyr.io/static/fonts/gordita-regular.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-regular.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:500;src:url(https://cdn.plyr.io/static/fonts/gordita-medium.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-medium.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:600;src:url(https://cdn.plyr.io/static/fonts/gordita-bold.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-bold.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:900;src:url(https://cdn.plyr.io/static/fonts/gordita-black.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-black.woff) format("woff")}@keyframes fadein{0%{opacity:0}100%{opacity:1}}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a,button.faux-link{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:border-box}body,html{display:flex;width:100%}html{background:linear-gradient(to left top,#4dc1ff,#0074b3);background-attachment:fixed;height:100%}body{align-items:center;display:flex;flex-direction:column;min-height:100%}.grid{flex:1;overflow:auto}main{margin:auto;padding-bottom:1px;text-align:center}aside{align-items:center;background:#fff;color:#55646b;display:flex;flex-shrink:0;justify-content:center;padding:15px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:10px}aside p{margin:0}aside a,aside button.faux-link{color:#4baaf4}aside a.tab-focus,aside button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(75,170,244,.35);outline:0}.grid{margin:0 auto;padding:20px}@media only screen and (min-width:768px){.grid{align-items:center;display:flex;max-width:1280px;width:100%}.grid>*{flex:1}}html{font-size:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:15px;font-size:.9375rem;color:#fff;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif;font-weight:500;line-height:1.75;text-shadow:0 1px 1px rgba(0,0,0,.15)}button,input,select,textarea{font:inherit}p,small{margin:0 0 20px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;font-weight:600;letter-spacing:-.025em;margin:0 0 10px}.button,.button__count{align-items:center;background:#fff;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);color:#55646b;display:inline-flex;padding:15px;position:relative;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{color:#343f4a}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1);transform:translateY(-1px)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{transform:translateY(1px)}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;margin-left:10px}.button__count::before{border:5px solid transparent;border-left-width:0;border-right-color:#fff;content:'';height:0;position:absolute;right:100%;top:50%;transform:translateY(-50%);width:0}header{padding-bottom:20px;text-align:center}header .call-to-action{margin-top:30px}@media only screen and (min-width:768px){header{margin-right:60px;max-width:360px;padding-bottom:40px;text-align:left}}.icon{fill:currentColor;height:16px;vertical-align:-3px;width:16px}a svg,button svg,button.faux-link svg,label svg{pointer-events:none}.btn .icon,a .icon,button.faux-link .icon{margin-right:6px}button.faux-link{background:0 0;border:0;border-radius:0;cursor:pointer;font:inherit;line-height:1.75;margin:0;padding:0;position:relative;text-align:inherit;text-shadow:inherit;-moz-user-select:text;vertical-align:baseline;width:auto}a,button.faux-link{border-bottom:1px dotted currentColor;color:#fff;font-weight:600;position:relative;text-decoration:none;transition:all .2s ease}a::after,button.faux-link::after{background:currentColor;content:'';height:1px;left:50%;position:absolute;top:100%;transform:translateX(-50%);transition:width .2s ease;width:0}a:focus,a:hover,button.faux-link:focus,button.faux-link:hover{border-bottom-color:transparent;outline:0}a:focus::after,a:hover::after,button.faux-link:focus::after,button.faux-link:hover::after{width:100%}a.tab-focus,button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}a.no-border::after,button.no-border.faux-link::after{display:none}li,ul{list-style:none;margin:0;padding:0}audio,img,video{max-width:100%;vertical-align:middle}nav{display:flex;justify-content:center;margin-bottom:20px}video{max-width:100%;vertical-align:middle}.plyr{border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.2);margin:20px auto}.plyr.plyr--audio{max-width:480px}.plyr__video-wrapper::after{border:1px solid rgba(0,0,0,.15);border-radius:inherit;bottom:0;content:'';left:0;pointer-events:none;position:absolute;right:0;top:0}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:4px}.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}@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:inherit;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui button.faux-link,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:12px;left:0;padding:10px;position:absolute;text-align:center;transform:translateY(-40px);transition:transform .4s ease-in-out;width:100%}.plyr__captions span{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions span div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr--hide-controls .plyr__captions{transform:translateY(-15px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__control[aria-pressed=false] .icon--pressed,.plyr__control[aria-pressed=false] .label--pressed,.plyr__control[aria-pressed=true] .icon--not-pressed,.plyr__control[aria-pressed=true] .label--not-pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu:first-child,.plyr__controls .plyr__menu:first-child+[data-plyr=pause],.plyr__controls .plyr__progress:first-child,.plyr__controls .plyr__progress:first-child+[data-plyr=pause],.plyr__controls .plyr__time:first-child,.plyr__controls .plyr__time:first-child+[data-plyr=pause],.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0}.plyr__controls .plyr__volume{margin-left:5px}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:10px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:5px}}.plyr--video .plyr__controls{background:linear-gradient(transparent,rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:35px 10px 10px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:2}.plyr--video .plyr__controls .plyr__control svg{-webkit-filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15));filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__controls .plyr__control.plyr__tab-focus,.plyr--video .plyr__controls .plyr__control:hover,.plyr--video .plyr__controls .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__video-embed>div{padding-bottom:200%;position:relative;transform:translateY(-35.9375%)}.plyr--full-ui .plyr__video-embed iframe{pointer-events:none}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:13px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:1}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container ul{list-style:none;margin:0;overflow:hidden;padding:7px}.plyr__menu__container ul li{margin-top:2px}.plyr__menu__container ul li:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;padding:4px 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%);transition:border-color .2s ease}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container label.plyr__control{padding-left:7px}.plyr__menu__container label.plyr__control input[type=radio]+span{background:rgba(0,0,0,.1);border-radius:100%;display:block;flex-shrink:0;height:16px;margin-right:10px;position:relative;transition:all .3s ease;width:16px}.plyr__menu__container label.plyr__control input[type=radio]+span::after{background:#fff;border-radius:100%;content:'';height:6px;left:5px;opacity:0;position:absolute;top:5px;transform:scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container label.plyr__control input[type=radio]:checked+span{background:#1aafff}.plyr__menu__container label.plyr__control input[type=radio]:checked+span::after{opacity:1;transform:scale(1)}.plyr__menu__container label.plyr__control input[type=radio]:focus+span{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__menu__container label.plyr__control.plyr__tab-focus input[type=radio]+span,.plyr__menu__container label.plyr__control:hover input[type=radio]+span{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-7px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr__progress{display:flex;flex:1;position:relative}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;left:0}.plyr__progress--buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin:-3px 0 0;padding:0;position:absolute;top:50%;width:100%}.plyr__progress--buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress--buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress--buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress--buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress--buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress--buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress--buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress--buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress--buffer{background-color:rgba(183,197,205,.66)}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value),transparent var(--value))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__time{font-size:11px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:12px;font-weight:500;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__volume{flex:1;position:relative}.plyr__volume input[type=range]{position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:50px}}@media (min-width:768px){.plyr__volume{max-width:80px}}.plyr--is-ios .plyr__volume,.plyr--is-ios [data-plyr=mute]{display:none!important}.plyr--has-error{pointer-events:none}.plyr--has-error::after{align-items:center;background:#000;color:#fff;content:attr(data-plyr-error);display:flex;font-size:13px;height:100%;justify-content:center;left:0;position:absolute;text-align:center;text-shadow:0 1px 1px #000;top:0;width:100%;z-index:10}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:3}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr--full-ui [hidden]{display:none}.plyr--full-ui [aria-hidden=true]{display:none}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.no-border{border:0}[hidden]{display:none}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;opacity:.001;overflow:hidden;padding:0;position:absolute;width:1px} \ No newline at end of file +@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:300;src:url(https://cdn.plyr.io/static/fonts/gordita-light.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-light.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:400;src:url(https://cdn.plyr.io/static/fonts/gordita-regular.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-regular.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:500;src:url(https://cdn.plyr.io/static/fonts/gordita-medium.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-medium.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:600;src:url(https://cdn.plyr.io/static/fonts/gordita-bold.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-bold.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:900;src:url(https://cdn.plyr.io/static/fonts/gordita-black.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-black.woff) format("woff")}@keyframes fadein{0%{opacity:0}100%{opacity:1}}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a,button.faux-link{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:border-box}body,html{display:flex;width:100%}html{background:linear-gradient(to left top,#4dc1ff,#0074b3);background-attachment:fixed;height:100%}body{align-items:center;display:flex;flex-direction:column;min-height:100%}.grid{flex:1;overflow:auto}main{margin:auto;padding-bottom:1px;text-align:center}aside{align-items:center;background:#fff;color:#55646b;display:flex;flex-shrink:0;justify-content:center;padding:15px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:10px}aside p{margin:0}aside a,aside button.faux-link{color:#4baaf4}aside a.tab-focus,aside button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(75,170,244,.35);outline:0}.grid{margin:0 auto;padding:20px}@media only screen and (min-width:768px){.grid{align-items:center;display:flex;max-width:1280px;width:100%}.grid>*{flex:1}}html{font-size:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:15px;font-size:.9375rem;color:#fff;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif;font-weight:500;line-height:1.75;text-shadow:0 1px 1px rgba(0,0,0,.15)}button,input,select,textarea{font:inherit}p,small{margin:0 0 20px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;font-weight:600;letter-spacing:-.025em;margin:0 0 10px}.button,.button__count{align-items:center;background:#fff;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);color:#55646b;display:inline-flex;padding:15px;position:relative;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{color:#343f4a}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1);transform:translateY(-1px)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{transform:translateY(1px)}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;margin-left:10px}.button__count::before{border:5px solid transparent;border-left-width:0;border-right-color:#fff;content:'';height:0;position:absolute;right:100%;top:50%;transform:translateY(-50%);width:0}header{padding-bottom:20px;text-align:center}header .call-to-action{margin-top:30px}@media only screen and (min-width:768px){header{margin-right:60px;max-width:360px;padding-bottom:40px;text-align:left}}.icon{fill:currentColor;height:16px;vertical-align:-3px;width:16px}a svg,button svg,button.faux-link svg,label svg{pointer-events:none}.btn .icon,a .icon,button.faux-link .icon{margin-right:6px}button.faux-link{background:0 0;border:0;border-radius:0;cursor:pointer;font:inherit;line-height:1.75;margin:0;padding:0;position:relative;text-align:inherit;text-shadow:inherit;-moz-user-select:text;vertical-align:baseline;width:auto}a,button.faux-link{border-bottom:1px dotted currentColor;color:#fff;font-weight:600;position:relative;text-decoration:none;transition:all .2s ease}a::after,button.faux-link::after{background:currentColor;content:'';height:1px;left:50%;position:absolute;top:100%;transform:translateX(-50%);transition:width .2s ease;width:0}a:focus,a:hover,button.faux-link:focus,button.faux-link:hover{border-bottom-color:transparent;outline:0}a:focus::after,a:hover::after,button.faux-link:focus::after,button.faux-link:hover::after{width:100%}a.tab-focus,button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}a.no-border::after,button.no-border.faux-link::after{display:none}li,ul{list-style:none;margin:0;padding:0}audio,img,video{max-width:100%;vertical-align:middle}nav{display:flex;justify-content:center;margin-bottom:20px}video{max-width:100%;vertical-align:middle}.plyr{border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.2);margin:20px auto}.plyr.plyr--audio{max-width:480px}.plyr__video-wrapper::after{border:1px solid rgba(0,0,0,.15);border-radius:inherit;bottom:0;content:'';left:0;pointer-events:none;position:absolute;right:0;top:0}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:4px}.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}@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:inherit;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui button.faux-link,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:12px;left:0;padding:10px;position:absolute;text-align:center;transform:translateY(-40px);transition:transform .4s ease-in-out;width:100%}.plyr__captions span{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions span div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr--hide-controls .plyr__captions{transform:translateY(-15px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__control[aria-pressed=false] .icon--pressed,.plyr__control[aria-pressed=false] .label--pressed,.plyr__control[aria-pressed=true] .icon--not-pressed,.plyr__control[aria-pressed=true] .label--not-pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu:first-child,.plyr__controls .plyr__menu:first-child+[data-plyr=pause],.plyr__controls .plyr__progress:first-child,.plyr__controls .plyr__progress:first-child+[data-plyr=pause],.plyr__controls .plyr__time:first-child,.plyr__controls .plyr__time:first-child+[data-plyr=pause],.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0}.plyr__controls .plyr__volume{margin-left:5px}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:10px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:5px}}.plyr--video .plyr__controls{background:linear-gradient(transparent,rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:35px 10px 10px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:2}.plyr--video .plyr__controls .plyr__control svg{-webkit-filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15));filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__controls .plyr__control.plyr__tab-focus,.plyr--video .plyr__controls .plyr__control:hover,.plyr--video .plyr__controls .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__video-embed>div{padding-bottom:200%;position:relative;transform:translateY(-35.9375%)}.plyr--full-ui .plyr__video-embed iframe{pointer-events:none}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:13px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:1}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container ul{list-style:none;margin:0;overflow:hidden;padding:7px}.plyr__menu__container ul li{margin-top:2px}.plyr__menu__container ul li:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;padding:4px 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%);transition:border-color .2s ease}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container label.plyr__control{padding-left:7px}.plyr__menu__container label.plyr__control input[type=radio]+span{background:rgba(0,0,0,.1);border-radius:100%;display:block;flex-shrink:0;height:16px;margin-right:10px;position:relative;transition:all .3s ease;width:16px}.plyr__menu__container label.plyr__control input[type=radio]+span::after{background:#fff;border-radius:100%;content:'';height:6px;left:5px;opacity:0;position:absolute;top:5px;transform:scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container label.plyr__control input[type=radio]:checked+span{background:#1aafff}.plyr__menu__container label.plyr__control input[type=radio]:checked+span::after{opacity:1;transform:scale(1)}.plyr__menu__container label.plyr__control input[type=radio]:focus+span{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__menu__container label.plyr__control.plyr__tab-focus input[type=radio]+span,.plyr__menu__container label.plyr__control:hover input[type=radio]+span{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-7px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr__progress{display:flex;flex:1;position:relative}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;left:0}.plyr__progress--buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin:-3px 0 0;padding:0;position:absolute;top:50%;width:100%}.plyr__progress--buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress--buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress--buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress--buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress--buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress--buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress--buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress--buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress--buffer{background-color:rgba(183,197,205,.66)}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value),transparent var(--value))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__time{font-size:11px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:12px;font-weight:500;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__volume{flex:1;position:relative}.plyr__volume input[type=range]{position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:50px}}@media (min-width:768px){.plyr__volume{max-width:80px}}.plyr--is-ios .plyr__volume,.plyr--is-ios [data-plyr=mute]{display:none!important}.plyr--has-error{pointer-events:none}.plyr--has-error::after{align-items:center;background:#000;color:#fff;content:attr(data-plyr-error);display:flex;font-size:13px;height:100%;justify-content:center;left:0;position:absolute;text-align:center;text-shadow:0 1px 1px #000;top:0;width:100%;z-index:10}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{position:absolute;width:100%;height:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr--full-ui [hidden]{display:none}.plyr--full-ui [aria-hidden=true]{display:none}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.no-border{border:0}[hidden]{display:none}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;opacity:.001;overflow:hidden;padding:0;position:absolute;width:1px} \ No newline at end of file diff --git a/demo/dist/demo.js b/demo/dist/demo.js index 97c934f0..7bef1b80 100644 --- a/demo/dist/demo.js +++ b/demo/dist/demo.js @@ -55,7 +55,8 @@ document.addEventListener('DOMContentLoaded', function () { google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c' }, ads: { - enabled: true + enabled: true, + publisherId: 'plyrio' } }); diff --git a/demo/dist/demo.js.map b/demo/dist/demo.js.map index b447a70b..331edca0 100644 --- a/demo/dist/demo.js.map +++ b/demo/dist/demo.js.map @@ -1 +1 @@ -{"version":3,"sources":["demo/src/js/demo.js"],"names":["document","addEventListener","window","shr","setup","tabClassName","target","classList","remove","event","keyCode","activeElement","add","player","Plyr","buttons","querySelectorAll","types","currentType","location","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","video","source","audio","youtube","vimeo","from","forEach","button","parentElement","querySelector","setAttribute","removeAttribute","getAttribute","replaceState","host","i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","ga"],"mappings":"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","file":"demo.js","sourcesContent":["// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\ndocument.addEventListener('DOMContentLoaded', () => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4',\n type: 'video/mp4',\n }],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi – “It All Began With A Burst”',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n});\n\n// Google analytics\n// For demo site (https://plyr.io) only\n/* eslint-disable */\nif (window.location.host === 'plyr.io') {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n}\n/* eslint-enable */\n"]} \ No newline at end of file +{"version":3,"sources":["demo/src/js/demo.js"],"names":["document","addEventListener","window","shr","setup","tabClassName","target","classList","remove","event","keyCode","activeElement","add","player","Plyr","buttons","querySelectorAll","types","currentType","location","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","video","source","audio","youtube","vimeo","from","forEach","button","parentElement","querySelector","setAttribute","removeAttribute","getAttribute","replaceState","host","i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","ga"],"mappings":"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","file":"demo.js","sourcesContent":["// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\ndocument.addEventListener('DOMContentLoaded', () => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: 'plyrio',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4',\n type: 'video/mp4',\n }],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi – “It All Began With A Burst”',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n});\n\n// Google analytics\n// For demo site (https://plyr.io) only\n/* eslint-disable */\nif (window.location.host === 'plyr.io') {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n}\n/* eslint-enable */\n"]} \ No newline at end of file diff --git a/demo/dist/demo.min.js b/demo/dist/demo.min.js index 112a6146..cf18501d 100644 --- a/demo/dist/demo.min.js +++ b/demo/dist/demo.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";var e,t,o,i,r,a;document.addEventListener("DOMContentLoaded",function(){window.shr&&window.shr.setup({count:{classname:"button__count"}});document.addEventListener("focusout",function(e){e.target.classList.remove("tab-focus")}),document.addEventListener("keydown",function(e){9===e.keyCode&&setTimeout(function(){document.activeElement.classList.add("tab-focus")},0)});var e=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},keys:{google:"AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c"},ads:{enabled:!0}});window.player=e;var t=document.querySelectorAll("[data-source]"),o={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},i=window.location.hash.replace("#",""),r=window.history&&window.history.pushState;function a(e,t,o){e&&e.classList[o?"add":"remove"](t)}function n(r,n){if(r in o&&(n||r!==i)&&(i.length||r!==o.video)){switch(r){case o.video:e.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"}],poster:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0},{kind:"captions",label:"French",srclang:"fr",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt"}]};break;case o.audio:e.source={type:"audio",title:"Kishi Bashi – “It All Began With A Burst”",sources:[{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]};break;case o.youtube:e.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]};break;case o.vimeo:e.source={type:"video",sources:[{src:"https://vimeo.com/76979871",provider:"vimeo"}]}}i=r,Array.from(t).forEach(function(e){return a(e.parentElement,"active",!1)}),a(document.querySelector('[data-source="'+r+'"]'),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach(function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+r).removeAttribute("hidden")}}if(Array.from(t).forEach(function(e){e.addEventListener("click",function(){var t=e.getAttribute("data-source");n(t),r&&window.history.pushState({type:t},"","#"+t)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&n(e.state.type)}),r){var s=!i.length;s&&(i=o.video),i in o&&window.history.replaceState({type:i},"",s?"":"#"+i),i!==o.video&&n(i,!0)}}),"plyr.io"===window.location.host&&(e=window,t=document,o="script",i="ga",e.GoogleAnalyticsObject=i,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,r=t.createElement(o),a=t.getElementsByTagName(o)[0],r.async=1,r.src="https://www.google-analytics.com/analytics.js",a.parentNode.insertBefore(r,a),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview"))}(); +!function(){"use strict";var e,t,o,i,r,a;document.addEventListener("DOMContentLoaded",function(){window.shr&&window.shr.setup({count:{classname:"button__count"}});document.addEventListener("focusout",function(e){e.target.classList.remove("tab-focus")}),document.addEventListener("keydown",function(e){9===e.keyCode&&setTimeout(function(){document.activeElement.classList.add("tab-focus")},0)});var e=new Plyr("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"../dist/plyr.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},keys:{google:"AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c"},ads:{enabled:!0,publisherId:"plyrio"}});window.player=e;var t=document.querySelectorAll("[data-source]"),o={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},i=window.location.hash.replace("#",""),r=window.history&&window.history.pushState;function a(e,t,o){e&&e.classList[o?"add":"remove"](t)}function n(r,n){if(r in o&&(n||r!==i)&&(i.length||r!==o.video)){switch(r){case o.video:e.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"}],poster:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0},{kind:"captions",label:"French",srclang:"fr",src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt"}]};break;case o.audio:e.source={type:"audio",title:"Kishi Bashi – “It All Began With A Burst”",sources:[{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]};break;case o.youtube:e.source={type:"video",title:"View From A Blue Moon",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]};break;case o.vimeo:e.source={type:"video",sources:[{src:"https://vimeo.com/76979871",provider:"vimeo"}]}}i=r,Array.from(t).forEach(function(e){return a(e.parentElement,"active",!1)}),a(document.querySelector('[data-source="'+r+'"]'),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach(function(e){e.setAttribute("hidden","")}),document.querySelector(".plyr__cite--"+r).removeAttribute("hidden")}}if(Array.from(t).forEach(function(e){e.addEventListener("click",function(){var t=e.getAttribute("data-source");n(t),r&&window.history.pushState({type:t},"","#"+t)})}),window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&n(e.state.type)}),r){var s=!i.length;s&&(i=o.video),i in o&&window.history.replaceState({type:i},"",s?"":"#"+i),i!==o.video&&n(i,!0)}}),"plyr.io"===window.location.host&&(e=window,t=document,o="script",i="ga",e.GoogleAnalyticsObject=i,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,r=t.createElement(o),a=t.getElementsByTagName(o)[0],r.async=1,r.src="https://www.google-analytics.com/analytics.js",a.parentNode.insertBefore(r,a),window.ga("create","UA-40881672-11","auto"),window.ga("send","pageview"))}(); //# sourceMappingURL=demo.min.js.map diff --git a/demo/dist/demo.min.js.map b/demo/dist/demo.min.js.map index 524632d3..bfded80e 100644 --- a/demo/dist/demo.min.js.map +++ b/demo/dist/demo.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["demo/src/js/demo.js"],"names":["i","s","o","r","a","m","document","addEventListener","window","shr","setup","event","target","classList","remove","keyCode","activeElement","add","player","Plyr","buttons","querySelectorAll","types","currentType","location","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","video","source","audio","youtube","vimeo","from","forEach","button","parentElement","querySelector","cite","setAttribute","removeAttribute","getAttribute","replaceState","host","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","ga"],"mappings":"6BAmOcA,EAAGC,EAAGC,EAAMC,EAAGC,EAAGC,EA7NhCC,SAASC,iBAAiB,mBAAoB,WACtCC,OAAOC,YACAA,IAAIC,wBAEQ,4BASdH,iBAAiB,WAAY,SAAAI,KAC5BC,OAAOC,UAAUC,OAJN,wBAQZP,iBAAiB,UAAW,SAAAI,GACX,IAAlBA,EAAMI,oBAMC,oBACEC,cAAcH,UAAUI,IAhBpB,cAiBd,SAIDC,EAAS,IAAIC,KAAK,kBACb,QACA,gCACE,qCAEG,uBAGE,qBAGF,gBAGA,yDAGC,YAKVD,OAASA,MAGVE,EAAUd,SAASe,iBAAiB,iBACpCC,SACK,cACA,gBACE,gBACF,SAEPC,EAAcf,OAAOgB,SAASC,KAAKC,QAAQ,IAAK,IAC9CC,EAAiBnB,OAAOoB,SAAWpB,OAAOoB,QAAQC,mBAG/CC,EAAYC,EAASC,EAAWC,GACjCF,KACQlB,UAAUoB,EAAQ,MAAQ,UAAUD,YAK3CE,EAAUC,EAAMC,MAEfD,KAAQb,IAAYc,GAAQD,IAASZ,KAAkBA,EAAYc,QAAUF,IAASb,EAAMgB,eAI1FH,QACCb,EAAMgB,QACAC,aACG,cACC,sCAEE,4EACC,qBAEF,qFAGM,iBACC,kBACE,SACJ,mFACI,SAGH,iBACC,iBACE,SACJ,wFAOhBjB,EAAMkB,QACAD,aACG,cACC,4EAGM,mFACC,kBAGD,mFACC,0BAOjBjB,EAAMmB,UACAF,aACG,cACC,sCAEE,mDACK,wBAMjBjB,EAAMoB,QACAH,aACG,sBAEG,sCACK,aAWZJ,QAGRQ,KAAKvB,GAASwB,QAAQ,SAAAC,UAAUf,EAAYe,EAAOC,cAAe,UAAU,OAGtExC,SAASyC,cAAT,iBAAwCZ,EAAxC,MAAmD,UAAU,SAGnEQ,KAAKrC,SAASe,iBAAiB,gBAAgBuB,QAAQ,SAAAI,KACpDC,aAAa,SAAU,eAEvBF,cAAT,gBAAuCZ,GAAQe,gBAAgB,oBAI7DP,KAAKvB,GAASwB,QAAQ,SAAAC,KACjBtC,iBAAiB,QAAS,eACvB4B,EAAOU,EAAOM,aAAa,iBAEvBhB,GAENR,UACOC,QAAQC,WAAYM,KAAAA,GAAQ,GAAnC,IAA2CA,cAMhD5B,iBAAiB,WAAY,SAAAI,GAC5BA,EAAMsB,OAAS,SAAUtB,EAAMsB,SACrBtB,EAAMsB,MAAME,QAK1BR,EAAgB,KACVW,GAASf,EAAYc,OAGvBC,MACchB,EAAMgB,OAIpBf,KAAeD,UACRM,QAAQwB,mBAED7B,GAEV,GACAe,EAAQ,GAAR,IAAiBf,GAKrBA,IAAgBD,EAAMgB,SACZf,GAAa,MAQN,YAAzBf,OAAOgB,SAAS6B,OACNrD,EAaPQ,OAbUP,EAaFK,SAbKJ,EAaK,SAbCC,EAa0D,OAZ1EmD,sBAAwBnD,IAC1B,GACIH,EAAA,IACA,YACKA,EAAA,GAAKuD,EAAIvD,EAAA,GAAKuD,OAASC,KAAKC,cAErC,GAAKC,EAAI,EAAI,IAAIC,OACb1D,EAAE2D,cAAc1D,KAChBD,EAAE4D,qBAAqB3D,GAAG,KAC5B4D,MAAQ,IACRC,IAEyB,kDADzBC,WAAWC,aAAa7D,EAAGC,UAE1B6D,GAAG,SAAU,iBAAkB,eAC/BA,GAAG,OAAQ","file":"demo.min.js","sourcesContent":["// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\ndocument.addEventListener('DOMContentLoaded', () => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4',\n type: 'video/mp4',\n }],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi – “It All Began With A Burst”',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n});\n\n// Google analytics\n// For demo site (https://plyr.io) only\n/* eslint-disable */\nif (window.location.host === 'plyr.io') {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n}\n/* eslint-enable */\n"]} \ No newline at end of file +{"version":3,"sources":["demo/src/js/demo.js"],"names":["i","s","o","r","a","m","document","addEventListener","window","shr","setup","event","target","classList","remove","keyCode","activeElement","add","player","Plyr","buttons","querySelectorAll","types","currentType","location","hash","replace","historySupport","history","pushState","toggleClass","element","className","state","newSource","type","init","length","video","source","audio","youtube","vimeo","from","forEach","button","parentElement","querySelector","cite","setAttribute","removeAttribute","getAttribute","replaceState","host","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","ga"],"mappings":"6BAoOcA,EAAGC,EAAGC,EAAMC,EAAGC,EAAGC,EA9NhCC,SAASC,iBAAiB,mBAAoB,WACtCC,OAAOC,YACAA,IAAIC,wBAEQ,4BASdH,iBAAiB,WAAY,SAAAI,KAC5BC,OAAOC,UAAUC,OAJN,wBAQZP,iBAAiB,UAAW,SAAAI,GACX,IAAlBA,EAAMI,oBAMC,oBACEC,cAAcH,UAAUI,IAhBpB,cAiBd,SAIDC,EAAS,IAAIC,KAAK,kBACb,QACA,gCACE,qCAEG,uBAGE,qBAGF,gBAGA,yDAGC,cACI,mBAKdD,OAASA,MAGVE,EAAUd,SAASe,iBAAiB,iBACpCC,SACK,cACA,gBACE,gBACF,SAEPC,EAAcf,OAAOgB,SAASC,KAAKC,QAAQ,IAAK,IAC9CC,EAAiBnB,OAAOoB,SAAWpB,OAAOoB,QAAQC,mBAG/CC,EAAYC,EAASC,EAAWC,GACjCF,KACQlB,UAAUoB,EAAQ,MAAQ,UAAUD,YAK3CE,EAAUC,EAAMC,MAEfD,KAAQb,IAAYc,GAAQD,IAASZ,KAAkBA,EAAYc,QAAUF,IAASb,EAAMgB,eAI1FH,QACCb,EAAMgB,QACAC,aACG,cACC,sCAEE,4EACC,qBAEF,qFAGM,iBACC,kBACE,SACJ,mFACI,SAGH,iBACC,iBACE,SACJ,wFAOhBjB,EAAMkB,QACAD,aACG,cACC,4EAGM,mFACC,kBAGD,mFACC,0BAOjBjB,EAAMmB,UACAF,aACG,cACC,sCAEE,mDACK,wBAMjBjB,EAAMoB,QACAH,aACG,sBAEG,sCACK,aAWZJ,QAGRQ,KAAKvB,GAASwB,QAAQ,SAAAC,UAAUf,EAAYe,EAAOC,cAAe,UAAU,OAGtExC,SAASyC,cAAT,iBAAwCZ,EAAxC,MAAmD,UAAU,SAGnEQ,KAAKrC,SAASe,iBAAiB,gBAAgBuB,QAAQ,SAAAI,KACpDC,aAAa,SAAU,eAEvBF,cAAT,gBAAuCZ,GAAQe,gBAAgB,oBAI7DP,KAAKvB,GAASwB,QAAQ,SAAAC,KACjBtC,iBAAiB,QAAS,eACvB4B,EAAOU,EAAOM,aAAa,iBAEvBhB,GAENR,UACOC,QAAQC,WAAYM,KAAAA,GAAQ,GAAnC,IAA2CA,cAMhD5B,iBAAiB,WAAY,SAAAI,GAC5BA,EAAMsB,OAAS,SAAUtB,EAAMsB,SACrBtB,EAAMsB,MAAME,QAK1BR,EAAgB,KACVW,GAASf,EAAYc,OAGvBC,MACchB,EAAMgB,OAIpBf,KAAeD,UACRM,QAAQwB,mBAED7B,GAEV,GACAe,EAAQ,GAAR,IAAiBf,GAKrBA,IAAgBD,EAAMgB,SACZf,GAAa,MAQN,YAAzBf,OAAOgB,SAAS6B,OACNrD,EAaPQ,OAbUP,EAaFK,SAbKJ,EAaK,SAbCC,EAa0D,OAZ1EmD,sBAAwBnD,IAC1B,GACIH,EAAA,IACA,YACKA,EAAA,GAAKuD,EAAIvD,EAAA,GAAKuD,OAASC,KAAKC,cAErC,GAAKC,EAAI,EAAI,IAAIC,OACb1D,EAAE2D,cAAc1D,KAChBD,EAAE4D,qBAAqB3D,GAAG,KAC5B4D,MAAQ,IACRC,IAEyB,kDADzBC,WAAWC,aAAa7D,EAAGC,UAE1B6D,GAAG,SAAU,iBAAkB,eAC/BA,GAAG,OAAQ","file":"demo.min.js","sourcesContent":["// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\ndocument.addEventListener('DOMContentLoaded', () => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: 'plyrio',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4',\n type: 'video/mp4',\n }],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi – “It All Began With A Burst”',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n});\n\n// Google analytics\n// For demo site (https://plyr.io) only\n/* eslint-disable */\nif (window.location.host === 'plyr.io') {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n}\n/* eslint-enable */\n"]} \ No newline at end of file diff --git a/demo/index.html b/demo/index.html index b3b57467..59fe08d0 100644 --- a/demo/index.html +++ b/demo/index.html @@ -66,7 +66,7 @@

Premium video monitization from - + ai.vi ai.vi diff --git a/demo/src/js/demo.js b/demo/src/js/demo.js index 035f8f6d..65d20ffd 100644 --- a/demo/src/js/demo.js +++ b/demo/src/js/demo.js @@ -53,6 +53,7 @@ document.addEventListener('DOMContentLoaded', () => { }, ads: { enabled: true, + publisherId: 'plyrio', }, }); diff --git a/dist/plyr.css b/dist/plyr.css index 0acea39f..c865b783 100644 --- a/dist/plyr.css +++ b/dist/plyr.css @@ -1 +1 @@ -@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transform:translateY(-40px);transition:transform .4s ease-in-out;width:100%}.plyr__captions span{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions span div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr--hide-controls .plyr__captions{transform:translateY(-15px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__control[aria-pressed=false] .icon--pressed,.plyr__control[aria-pressed=false] .label--pressed,.plyr__control[aria-pressed=true] .icon--not-pressed,.plyr__control[aria-pressed=true] .label--not-pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu:first-child,.plyr__controls .plyr__menu:first-child+[data-plyr=pause],.plyr__controls .plyr__progress:first-child,.plyr__controls .plyr__progress:first-child+[data-plyr=pause],.plyr__controls .plyr__time:first-child,.plyr__controls .plyr__time:first-child+[data-plyr=pause],.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0}.plyr__controls .plyr__volume{margin-left:5px}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:10px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:5px}}.plyr--video .plyr__controls{background:linear-gradient(transparent,rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:35px 10px 10px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:2}.plyr--video .plyr__controls .plyr__control svg{-webkit-filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15));filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__controls .plyr__control.plyr__tab-focus,.plyr--video .plyr__controls .plyr__control:hover,.plyr--video .plyr__controls .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__video-embed>div{padding-bottom:200%;position:relative;transform:translateY(-35.9375%)}.plyr--full-ui .plyr__video-embed iframe{pointer-events:none}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:1}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container ul{list-style:none;margin:0;overflow:hidden;padding:7px}.plyr__menu__container ul li{margin-top:2px}.plyr__menu__container ul li:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;padding:4px 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%);transition:border-color .2s ease}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container label.plyr__control{padding-left:7px}.plyr__menu__container label.plyr__control input[type=radio]+span{background:rgba(0,0,0,.1);border-radius:100%;display:block;flex-shrink:0;height:16px;margin-right:10px;position:relative;transition:all .3s ease;width:16px}.plyr__menu__container label.plyr__control input[type=radio]+span::after{background:#fff;border-radius:100%;content:'';height:6px;left:5px;opacity:0;position:absolute;top:5px;transform:scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container label.plyr__control input[type=radio]:checked+span{background:#1aafff}.plyr__menu__container label.plyr__control input[type=radio]:checked+span::after{opacity:1;transform:scale(1)}.plyr__menu__container label.plyr__control input[type=radio]:focus+span{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__menu__container label.plyr__control.plyr__tab-focus input[type=radio]+span,.plyr__menu__container label.plyr__control:hover input[type=radio]+span{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-7px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr__progress{display:flex;flex:1;position:relative}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress--buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin:-3px 0 0;padding:0;position:absolute;top:50%;width:100%}.plyr__progress--buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress--buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress--buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress--buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress--buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress--buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress--buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress--buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress--buffer{background-color:rgba(183,197,205,.66)}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value),transparent var(--value))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__volume{flex:1;position:relative}.plyr__volume input[type=range]{position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:50px}}@media (min-width:768px){.plyr__volume{max-width:80px}}.plyr--is-ios .plyr__volume,.plyr--is-ios [data-plyr=mute]{display:none!important}.plyr--has-error{pointer-events:none}.plyr--has-error::after{align-items:center;background:#000;color:#fff;content:attr(data-plyr-error);display:flex;font-size:16px;height:100%;justify-content:center;left:0;position:absolute;text-align:center;text-shadow:0 1px 1px #000;top:0;width:100%;z-index:10}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:3}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr--full-ui [hidden]{display:none}.plyr--full-ui [aria-hidden=true]{display:none}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important} \ No newline at end of file +@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transform:translateY(-40px);transition:transform .4s ease-in-out;width:100%}.plyr__captions span{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions span div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr--hide-controls .plyr__captions{transform:translateY(-15px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__control[aria-pressed=false] .icon--pressed,.plyr__control[aria-pressed=false] .label--pressed,.plyr__control[aria-pressed=true] .icon--not-pressed,.plyr__control[aria-pressed=true] .label--not-pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu:first-child,.plyr__controls .plyr__menu:first-child+[data-plyr=pause],.plyr__controls .plyr__progress:first-child,.plyr__controls .plyr__progress:first-child+[data-plyr=pause],.plyr__controls .plyr__time:first-child,.plyr__controls .plyr__time:first-child+[data-plyr=pause],.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0}.plyr__controls .plyr__volume{margin-left:5px}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:10px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:5px}}.plyr--video .plyr__controls{background:linear-gradient(transparent,rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:35px 10px 10px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:2}.plyr--video .plyr__controls .plyr__control svg{-webkit-filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15));filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__controls .plyr__control.plyr__tab-focus,.plyr--video .plyr__controls .plyr__control:hover,.plyr--video .plyr__controls .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__video-embed>div{padding-bottom:200%;position:relative;transform:translateY(-35.9375%)}.plyr--full-ui .plyr__video-embed iframe{pointer-events:none}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:1}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container ul{list-style:none;margin:0;overflow:hidden;padding:7px}.plyr__menu__container ul li{margin-top:2px}.plyr__menu__container ul li:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;padding:4px 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%);transition:border-color .2s ease}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container label.plyr__control{padding-left:7px}.plyr__menu__container label.plyr__control input[type=radio]+span{background:rgba(0,0,0,.1);border-radius:100%;display:block;flex-shrink:0;height:16px;margin-right:10px;position:relative;transition:all .3s ease;width:16px}.plyr__menu__container label.plyr__control input[type=radio]+span::after{background:#fff;border-radius:100%;content:'';height:6px;left:5px;opacity:0;position:absolute;top:5px;transform:scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container label.plyr__control input[type=radio]:checked+span{background:#1aafff}.plyr__menu__container label.plyr__control input[type=radio]:checked+span::after{opacity:1;transform:scale(1)}.plyr__menu__container label.plyr__control input[type=radio]:focus+span{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__menu__container label.plyr__control.plyr__tab-focus input[type=radio]+span,.plyr__menu__container label.plyr__control:hover input[type=radio]+span{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-7px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr__progress{display:flex;flex:1;position:relative}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress--buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin:-3px 0 0;padding:0;position:absolute;top:50%;width:100%}.plyr__progress--buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress--buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress--buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress--buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress--buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress--buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress--buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress--buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress--buffer{background-color:rgba(183,197,205,.66)}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value),transparent var(--value))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__volume{flex:1;position:relative}.plyr__volume input[type=range]{position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:50px}}@media (min-width:768px){.plyr__volume{max-width:80px}}.plyr--is-ios .plyr__volume,.plyr--is-ios [data-plyr=mute]{display:none!important}.plyr--has-error{pointer-events:none}.plyr--has-error::after{align-items:center;background:#000;color:#fff;content:attr(data-plyr-error);display:flex;font-size:16px;height:100%;justify-content:center;left:0;position:absolute;text-align:center;text-shadow:0 1px 1px #000;top:0;width:100%;z-index:10}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{position:absolute;width:100%;height:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr--full-ui [hidden]{display:none}.plyr--full-ui [aria-hidden=true]{display:none}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important} \ No newline at end of file diff --git a/dist/plyr.js b/dist/plyr.js index 71aa50d4..13286229 100644 --- a/dist/plyr.js +++ b/dist/plyr.js @@ -216,7 +216,7 @@ var defaults = { 'statechange', 'qualitychange', 'qualityrequested', // Ads - 'adsloaded', 'adscontentpause', 'adsconentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], + 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], // Selectors // Change these to match your template if using custom HTML @@ -323,9 +323,10 @@ var defaults = { }, // Advertisements plugin - // Tag is not required as publisher is determined by vi.ai using the domain + // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio ads: { - enabled: false + enabled: false, + publisherId: null } }; @@ -690,51 +691,51 @@ var utils = { // Load an external script - loadScript: function loadScript(url, callback, error) { - var current = document.querySelector('script[src="' + url + '"]'); + loadScript: function loadScript(url) { + return new Promise(function (resolve, reject) { + var current = document.querySelector('script[src="' + url + '"]'); - // Check script is not already referenced, if so wait for load - if (current !== null) { - current.callbacks = current.callbacks || []; - current.callbacks.push(callback); - return; - } + // Check script is not already referenced, if so wait for load + if (current !== null) { + current.callbacks = current.callbacks || []; + current.callbacks.push(resolve); + return; + } - // Build the element - var element = document.createElement('script'); + // Build the element + var element = document.createElement('script'); - // Callback queue - element.callbacks = element.callbacks || []; - element.callbacks.push(callback); + // Callback queue + element.callbacks = element.callbacks || []; + element.callbacks.push(resolve); - // Error queue - element.errors = element.errors || []; - element.errors.push(error); + // Error queue + element.errors = element.errors || []; + element.errors.push(reject); - // Bind callback - if (utils.is.function(callback)) { + // Bind callback element.addEventListener('load', function (event) { element.callbacks.forEach(function (cb) { return cb.call(null, event); }); element.callbacks = null; }, false); - } - // Bind error handling - element.addEventListener('error', function (event) { - element.errors.forEach(function (err) { - return err.call(null, event); - }); - element.errors = null; - }, false); + // Bind error handling + element.addEventListener('error', function (event) { + element.errors.forEach(function (err) { + return err.call(null, event); + }); + element.errors = null; + }, false); - // Set the URL after binding callback - element.src = url; + // Set the URL after binding callback + element.src = url; - // Inject - var first = document.getElementsByTagName('script')[0]; - first.parentNode.insertBefore(element, first); + // Inject + var first = document.getElementsByTagName('script')[0]; + first.parentNode.insertBefore(element, first); + }); }, @@ -1916,1300 +1917,236 @@ var Fullscreen = function () { }(); // ========================================================================== -// Plyr storage +// Plyr Captions +// TODO: Create as class // ========================================================================== -var Storage = function () { - function Storage(player) { - classCallCheck(this, Storage); - - this.enabled = player.config.storage.enabled; - this.key = player.config.storage.key; - } - - // Check for actual support (see if we can use it) - - - createClass(Storage, [{ - key: 'get', - value: function get$$1(key) { - var store = window.localStorage.getItem(this.key); - - if (!Storage.supported || utils.is.empty(store)) { - return null; - } - - var json = JSON.parse(store); - - return utils.is.string(key) && key.length ? json[key] : json; - } - }, { - key: 'set', - value: function set$$1(object) { - // Bail if we don't have localStorage support or it's disabled - if (!Storage.supported || !this.enabled) { - return; - } - - // Can only store objectst - if (!utils.is.object(object)) { - return; - } - - // Get current storage - var storage = this.get(); - - // Default to empty object - if (utils.is.empty(storage)) { - storage = {}; - } - - // Update the working copy of the values - utils.extend(storage, object); - - // Update storage - window.localStorage.setItem(this.key, JSON.stringify(storage)); - } - }], [{ - key: 'supported', - get: function get$$1() { - if (!('localStorage' in window)) { - return false; - } - - var test = '___test'; - - // Try to use it (it might be disabled, e.g. user is in private mode) - // see: https://github.com/sampotts/plyr/issues/131 - try { - window.localStorage.setItem(test, test); - window.localStorage.removeItem(test); - return true; - } catch (e) { - return false; - } - } - }]); - return Storage; -}(); - -// ========================================================================== -// Advertisement plugin using Google IMA HTML5 SDK -// Create an account with our ad partner, vi here: -// https://www.vi.ai/publisher-video-monetization/ -// ========================================================================== - -/* global google */ - -var getTagUrl = function getTagUrl() { - var params = { - AV_PUBLISHERID: '58c25bb0073ef448b1087ad6', - AV_CHANNELID: '5a0458dc28a06145e4519d21', - AV_URL: '127.0.0.1:3000', - cb: 1, - AV_WIDTH: 640, - AV_HEIGHT: 480 - }; - - var base = 'https://go.aniview.com/api/adserver6/vast/'; - - return base + '?' + utils.buildUrlParams(params); -}; - -var Ads = function () { - /** - * Ads constructor. - * @param {object} player - * @return {Ads} - */ - function Ads(player) { - var _this = this; - - classCallCheck(this, Ads); - - this.player = player; - this.enabled = player.config.ads.enabled; - this.playing = false; - this.initialized = false; - this.blocked = false; - this.enabled = utils.is.url(player.config.ads.tag); - - // Check if a tag URL is provided. - if (!this.enabled) { +var captions = { + // Setup captions + setup: function setup() { + // Requires UI support + if (!this.supported.ui) { return; } - // Check if the Google IMA3 SDK is loaded or load it ourselves - if (!utils.is.object(window.google)) { - utils.loadScript(player.config.urls.googleIMA.api, function () { - _this.ready(); - }, function () { - // Script failed to load or is blocked - _this.blocked = true; - _this.player.debug.log('Ads error: Google IMA SDK failed to load'); - }); - } else { - this.ready(); - } - } + // Set default language if not set + var stored = this.storage.get('language'); - /** - * Get the ads instance ready. - */ - - - createClass(Ads, [{ - key: 'ready', - value: function ready() { - var _this2 = this; - - this.elements = { - container: null, - displayContainer: null - }; - this.manager = null; - this.loader = null; - this.cuePoints = null; - this.events = {}; - this.safetyTimer = null; - this.countdownTimer = null; - - // Set listeners on the Plyr instance - this.listeners(); - - // Start ticking our safety timer. If the whole advertisement - // thing doesn't resolve within our set time; we bail - this.startSafetyTimer(12000, 'ready()'); - - // Setup a simple promise to resolve if the IMA loader is ready - this.loaderPromise = new Promise(function (resolve) { - _this2.on('ADS_LOADER_LOADED', function () { - return resolve(); - }); - }); - - // Setup a promise to resolve if the IMA manager is ready - this.managerPromise = new Promise(function (resolve) { - _this2.on('ADS_MANAGER_LOADED', function () { - return resolve(); - }); - }); - - // Clear the safety timer - this.managerPromise.then(function () { - _this2.clearSafetyTimer('onAdsManagerLoaded()'); - }); - - // Setup the IMA SDK - this.setupIMA(); + if (!utils.is.empty(stored)) { + this.captions.language = stored; } - /** - * In order for the SDK to display ads for our video, we need to tell it where to put them, - * so here we define our ad container. This div is set up to render on top of the video player. - * Using the code below, we tell the SDK to render ads within that div. We also provide a - * handle to the content video player - the SDK will poll the current time of our player to - * properly place mid-rolls. After we create the ad display container, we initialize it. On - * mobile devices, this initialization is done as the result of a user action. - */ - - }, { - key: 'setupIMA', - value: function setupIMA() { - // Create the container for our advertisements - this.elements.container = utils.createElement('div', { - class: this.player.config.classNames.ads, - hidden: '' - }); - this.player.elements.container.appendChild(this.elements.container); - - // So we can run VPAID2 - google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); - - // Set language - google.ima.settings.setLocale(this.player.config.ads.language); - - // We assume the adContainer is the video container of the plyr element - // that will house the ads - this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container); - - // Request video ads to be pre-loaded - this.requestAds(); + if (utils.is.empty(this.captions.language)) { + this.captions.language = this.config.captions.language.toLowerCase(); } - /** - * Request advertisements - */ + // Set captions enabled state if not set + if (!utils.is.boolean(this.captions.active)) { + var active = this.storage.get('captions'); - }, { - key: 'requestAds', - value: function requestAds() { - var _this3 = this; - - var container = this.player.elements.container; - - - try { - // Create ads loader - this.loader = new google.ima.AdsLoader(this.elements.displayContainer); - - // Listen and respond to ads loaded and error events - this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { - return _this3.onAdsManagerLoaded(event); - }, false); - this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { - return _this3.onAdError(error); - }, false); - - // Request video ads - var request = new google.ima.AdsRequest(); - request.adTagUrl = getTagUrl(); - - // Specify the linear and nonlinear slot sizes. This helps the SDK - // to select the correct creative if multiple are returned - request.linearAdSlotWidth = container.offsetWidth; - request.linearAdSlotHeight = container.offsetHeight; - request.nonLinearAdSlotWidth = container.offsetWidth; - request.nonLinearAdSlotHeight = container.offsetHeight; - - // We only overlay ads as we only support video. - request.forceNonLinearFullSlot = false; - - this.loader.requestAds(request); - - this.handleEventListeners('ADS_LOADER_LOADED'); - } catch (e) { - this.onAdError(e); + if (utils.is.boolean(active)) { + this.captions.active = active; + } else { + this.captions.active = this.config.captions.active; } } - /** - * Update the ad countdown - * @param {boolean} start - */ - - }, { - key: 'pollCountdown', - value: function pollCountdown() { - var _this4 = this; - - var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (!start) { - window.clearInterval(this.countdownTimer); - this.elements.container.removeAttribute('data-badge-text'); - return; + // Only Vimeo and HTML5 video supported at this point + if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) { + // Clear menu and hide + if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); } - var update = function update() { - var time = utils.formatTime(_this4.manager.getRemainingTime()); - var label = _this4.player.config.i18n.advertisement + ' - ' + time; - _this4.elements.container.setAttribute('data-badge-text', label); - }; + return; + } + // Inject the container + if (!utils.is.element(this.elements.captions)) { + this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions)); - this.countdownTimer = window.setInterval(update, 100); + utils.insertAfter(this.elements.captions, this.elements.wrapper); } - /** - * This method is called whenever the ads are ready inside the AdDisplayContainer - * @param {Event} adsManagerLoadedEvent - */ + // Set the class hook + utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(captions.getTracks.call(this))); - }, { - key: 'onAdsManagerLoaded', - value: function onAdsManagerLoaded(adsManagerLoadedEvent) { - var _this5 = this; + // Get tracks + var tracks = captions.getTracks.call(this); - // Get the ads manager - var settings = new google.ima.AdsRenderingSettings(); - - // Tell the SDK to save and restore content video state on our behalf - settings.restoreCustomPlaybackStateOnAdBreakComplete = true; - settings.enablePreloading = true; - - // The SDK is polling currentTime on the contentPlayback. And needs a duration - // so it can determine when to start the mid- and post-roll - this.manager = adsManagerLoadedEvent.getAdsManager(this.player, settings); - - // Get the cue points for any mid-rolls by filtering out the pre- and post-roll - this.cuePoints = this.manager.getCuePoints(); - - // Add advertisement cue's within the time line if available - this.cuePoints.forEach(function (cuePoint) { - if (cuePoint !== 0 && cuePoint !== -1) { - var seekElement = _this5.player.elements.progress; - - if (seekElement) { - var cuePercentage = 100 / _this5.player.duration * cuePoint; - var cue = utils.createElement('span', { - class: _this5.player.config.classNames.cues - }); - - cue.style.left = cuePercentage.toString() + '%'; - seekElement.appendChild(cue); - } - } - }); - - // Get skippable state - // TODO: Skip button - // this.manager.getAdSkippableState(); - - // Set volume to match player - this.manager.setVolume(this.player.volume); - - // Add listeners to the required events - // Advertisement error events - this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { - return _this5.onAdError(error); - }); - - // Advertisement regular events - Object.keys(google.ima.AdEvent.Type).forEach(function (type) { - _this5.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) { - return _this5.onAdEvent(event); - }); - }); - - // Resolve our adsManager - this.handleEventListeners('ADS_MANAGER_LOADED'); + // If no caption file exists, hide container for caption text + if (utils.is.empty(tracks)) { + return; } - /** - * This is where all the event handling takes place. Retrieve the ad from the event. Some - * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated - * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type - * @param {Event} event - */ - - }, { - key: 'onAdEvent', - value: function onAdEvent(event) { - var _this6 = this; - - var container = this.player.elements.container; - - // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) - // don't have ad object associated - - var ad = event.getAd(); - - // Proxy event - var dispatchEvent = function dispatchEvent(type) { - utils.dispatchEvent.call(_this6.player, _this6.player.media, 'ads' + type); - }; - - switch (event.type) { - case google.ima.AdEvent.Type.LOADED: - // This is the first event sent for an ad - it is possible to determine whether the - // ad is a video ad or an overlay - this.handleEventListeners('LOADED'); - - // Bubble event - dispatchEvent('loaded'); - - // Start countdown - this.pollCountdown(true); - - if (!ad.isLinear()) { - // Position AdDisplayContainer correctly for overlay - ad.width = container.offsetWidth; - ad.height = container.offsetHeight; - } - - // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex()); - // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset()); - break; - - case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: - // All ads for the current videos are done. We can now request new advertisements - // in case the video is re-played - this.handleEventListeners('ALL_ADS_COMPLETED'); - - // Fire event - dispatchEvent('allcomplete'); - - // TODO: Example for what happens when a next video in a playlist would be loaded. - // So here we load a new video when all ads are done. - // Then we load new ads within a new adsManager. When the video - // Is started - after - the ads are loaded, then we get ads. - // You can also easily test cancelling and reloading by running - // player.ads.cancel() and player.ads.play from the console I guess. - // this.player.source = { - // type: 'video', - // title: 'View From A Blue Moon', - // sources: [{ - // src: - // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type: - // 'video/mp4', }], poster: - // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks: - // [ { kind: 'captions', label: 'English', srclang: 'en', src: - // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt', - // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src: - // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ], - // }; - - // TODO: So there is still this thing where a video should only be allowed to start - // playing when the IMA SDK is ready or has failed - - this.loadAds(); - break; - - case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: - // This event indicates the ad has started - the video player can adjust the UI, - // for example display a pause button and remaining time. Fired when content should - // be paused. This usually happens right before an ad is about to cover the content - this.handleEventListeners('CONTENT_PAUSE_REQUESTED'); - - dispatchEvent('contentpause'); - - this.pauseContent(); - - break; - - case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED: - // This event indicates the ad has finished - the video player can perform - // appropriate UI actions, such as removing the timer for remaining time detection. - // Fired when content should be resumed. This usually happens when an ad finishes - // or collapses - this.handleEventListeners('CONTENT_RESUME_REQUESTED'); - - dispatchEvent('contentresume'); - - this.pollCountdown(); - - this.resumeContent(); - - break; - - case google.ima.AdEvent.Type.STARTED: - dispatchEvent('started'); - break; - - case google.ima.AdEvent.Type.MIDPOINT: - dispatchEvent('midpoint'); - break; - - case google.ima.AdEvent.Type.COMPLETE: - dispatchEvent('complete'); - break; - - case google.ima.AdEvent.Type.IMPRESSION: - dispatchEvent('impression'); - break; - - case google.ima.AdEvent.Type.CLICK: - dispatchEvent('click'); - break; - - default: - break; - } - } - - /** - * Any ad error handling comes through here - * @param {Event} event - */ - - }, { - key: 'onAdError', - value: function onAdError(event) { - this.cancel(); - this.player.debug.log('Ads error', event); - } - - /** - * Setup hooks for Plyr and window events. This ensures - * the mid- and post-roll launch at the correct time. And - * resize the advertisement when the player resizes - */ - - }, { - key: 'listeners', - value: function listeners() { - var _this7 = this; - - var container = this.player.elements.container; - - var time = void 0; - - // Add listeners to the required events - this.player.on('ended', function () { - _this7.loader.contentComplete(); - }); - - this.player.on('seeking', function () { - time = _this7.player.currentTime; - return time; - }); - - this.player.on('seeked', function () { - var seekedTime = _this7.player.currentTime; - - _this7.cuePoints.forEach(function (cuePoint, index) { - if (time < cuePoint && cuePoint < seekedTime) { - _this7.manager.discardAdBreak(); - _this7.cuePoints.splice(index, 1); - } - }); - }); - - // Listen to the resizing of the window. And resize ad accordingly - // TODO: eventually implement ResizeObserver - window.addEventListener('resize', function () { - _this7.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); - }); - } - - /** - * Initialize the adsManager and start playing advertisements - */ - - }, { - key: 'play', - value: function play() { - var _this8 = this; - - var container = this.player.elements.container; - - - if (!this.managerPromise) { - return; - } - - // Play the requested advertisement whenever the adsManager is ready - this.managerPromise.then(function () { - // Initialize the container. Must be done via a user action on mobile devices - _this8.elements.displayContainer.initialize(); - - try { - if (!_this8.initialized) { - // Initialize the ads manager. Ad rules playlist will start at this time - _this8.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); - - // Call play to start showing the ad. Single video and overlay ads will - // start at this time; the call will be ignored for ad rules - _this8.manager.start(); - } - - _this8.initialized = true; - } catch (adError) { - // An error may be thrown if there was a problem with the - // VAST response - _this8.onAdError(adError); - } - }); - } - - /** - * Resume our video. - */ - - }, { - key: 'resumeContent', - value: function resumeContent() { - // Hide our ad container - utils.toggleHidden(this.elements.container, true); - - // Ad is stopped - this.playing = false; - - // Play our video - if (this.player.currentTime < this.player.duration) { - this.player.play(); - } - } - - /** - * Pause our video - */ - - }, { - key: 'pauseContent', - value: function pauseContent() { - // Show our ad container. - utils.toggleHidden(this.elements.container, false); - - // Ad is playing. - this.playing = true; - - // Pause our video. - this.player.pause(); - } - - /** - * Destroy the adsManager so we can grab new ads after this. If we don't then we're not - * allowed to call new ads based on google policies, as they interpret this as an accidental - * video requests. https://developers.google.com/interactive- - * media-ads/docs/sdks/android/faq#8 - */ - - }, { - key: 'cancel', - value: function cancel() { - // Pause our video - if (this.initialized) { - this.resumeContent(); - } - - // Tell our instance that we're done for now - this.handleEventListeners('ERROR'); - - // Re-create our adsManager - this.loadAds(); - } - - /** - * Re-create our adsManager - */ - - }, { - key: 'loadAds', - value: function loadAds() { - var _this9 = this; - - // Tell our adsManager to go bye bye - this.managerPromise.then(function () { - // Destroy our adsManager - if (_this9.manager) { - _this9.manager.destroy(); - } - - // Re-set our adsManager promises - _this9.managerPromise = new Promise(function (resolve) { - _this9.on('ADS_MANAGER_LOADED', function () { - return resolve(); + // Get browser info + var browser = utils.getBrowser(); + + // Fix IE captions if CORS is used + // Fetch captions and inject as blobs instead (data URIs not supported!) + if (browser.isIE && window.URL) { + var elements = this.media.querySelectorAll('track'); + + Array.from(elements).forEach(function (track) { + var src = track.getAttribute('src'); + var href = utils.parseUrl(src); + + if (href.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(href.protocol)) { + utils.fetch(src, 'blob').then(function (blob) { + track.setAttribute('src', window.URL.createObjectURL(blob)); + }).catch(function () { + utils.removeElement(track); }); - _this9.player.debug.log(_this9.manager); - }); - - // Now request some new advertisements - _this9.requestAds(); + } }); } - /** - * Handles callbacks after an ad event was invoked - * @param {string} event - Event type - */ + // Set language + captions.setLanguage.call(this); - }, { - key: 'handleEventListeners', - value: function handleEventListeners(event) { - if (utils.is.function(this.events[event])) { - this.events[event].call(this); - } + // Enable UI + captions.show.call(this); + + // Set available languages in list + if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { + controls.setCaptionsMenu.call(this); } + }, - /** - * Add event listeners - * @param {string} event - Event type - * @param {function} callback - Callback for when event occurs - * @return {Ads} - */ - }, { - key: 'on', - value: function on(event, callback) { - this.events[event] = callback; - return this; - } - - /** - * Setup a safety timer for when the ad network doesn't respond for whatever reason. - * The advertisement has 12 seconds to get its things together. We stop this timer when the - * advertisement is playing, or when a user action is required to start, then we clear the - * timer on ad ready - * @param {number} time - * @param {string} from - */ - - }, { - key: 'startSafetyTimer', - value: function startSafetyTimer(time, from) { - var _this10 = this; - - this.player.debug.log('Safety timer invoked from: ' + from); - - this.safetyTimer = setTimeout(function () { - _this10.cancel(); - _this10.clearSafetyTimer('startSafetyTimer()'); - }, time); - } - - /** - * Clear our safety timer(s) - * @param {string} from - */ - - }, { - key: 'clearSafetyTimer', - value: function clearSafetyTimer(from) { - if (!utils.is.nullOrUndefined(this.safetyTimer)) { - this.player.debug.log('Safety timer cleared from: ' + from); - - clearTimeout(this.safetyTimer); - this.safetyTimer = null; - } - } - }]); - return Ads; -}(); - -// ========================================================================== -// Plyr Event Listeners -// ========================================================================== - -var browser$2 = utils.getBrowser(); - -var listeners = { - // Global listeners - global: function global() { + // Set the captions language + setLanguage: function setLanguage() { var _this = this; - var last = null; + // Setup HTML5 track rendering + if (this.isHTML5 && this.isVideo) { + captions.getTracks.call(this).forEach(function (track) { + // Show track + utils.on(track, 'cuechange', function (event) { + return captions.setCue.call(_this, event); + }); - // Get the key code for an event - var getKeyCode = function getKeyCode(event) { - return event.keyCode ? event.keyCode : event.which; - }; - - // Handle key press - var handleKey = function handleKey(event) { - var code = getKeyCode(event); - var pressed = event.type === 'keydown'; - var repeat = pressed && code === last; - - // Bail if a modifier key is set - if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { - return; - } - - // If the event is bubbled from the media element - // Firefox doesn't get the keycode for whatever reason - if (!utils.is.number(code)) { - return; - } - - // Seek by the number keys - var seekByKey = function seekByKey() { - // Divide the max duration into 10th's and times by the number value - _this.currentTime = _this.duration / 10 * (code - 48); - }; - - // Handle the key on keydown - // Reset on keyup - if (pressed) { - // Which keycodes should we prevent default - var preventDefault = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67, 73, 76, 79]; - - // Check focused element - // and if the focused element is not editable (e.g. text input) - // and any that accept key input http://webaim.org/techniques/keyboard/ - var focused = utils.getFocusElement(); - if (utils.is.element(focused) && utils.matches(focused, _this.config.selectors.editable)) { - return; - } - - // If the code is found prevent default (e.g. prevent scrolling for arrows) - if (preventDefault.includes(code)) { - event.preventDefault(); - event.stopPropagation(); - } - - switch (code) { - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - // 0-9 - if (!repeat) { - seekByKey(); - } - break; - - case 32: - case 75: - // Space and K key - if (!repeat) { - _this.togglePlay(); - } - break; - - case 38: - // Arrow up - _this.increaseVolume(0.1); - break; - - case 40: - // Arrow down - _this.decreaseVolume(0.1); - break; - - case 77: - // M key - if (!repeat) { - _this.muted = !_this.muted; - } - break; - - case 39: - // Arrow forward - _this.forward(); - break; - - case 37: - // Arrow back - _this.rewind(); - break; - - case 70: - // F key - _this.fullscreen.toggle(); - break; - - case 67: - // C key - if (!repeat) { - _this.toggleCaptions(); - } - break; - - case 76: - // L key - _this.loop = !_this.loop; - break; - - /* case 73: - this.setLoop('start'); - break; - case 76: - this.setLoop(); - break; - case 79: - this.setLoop('end'); - break; */ - - default: - break; - } - - // Escape is handle natively when in full screen - // So we only need to worry about non native - if (!_this.fullscreen.enabled && _this.fullscreen.active && code === 27) { - _this.fullscreen.toggle(); - } - - // Store last code for next cycle - last = code; - } else { - last = null; - } - }; - - // Keyboard shortcuts - if (this.config.keyboard.global) { - utils.on(window, 'keydown keyup', handleKey, false); - } else if (this.config.keyboard.focused) { - utils.on(this.elements.container, 'keydown keyup', handleKey, false); - } - - // Detect tab focus - // Remove class on blur/focusout - utils.on(this.elements.container, 'focusout', function (event) { - utils.toggleClass(event.target, _this.config.classNames.tabFocus, false); - }); - - // Add classname to tabbed elements - utils.on(this.elements.container, 'keydown', function (event) { - if (event.keyCode !== 9) { - return; - } - - // Delay the adding of classname until the focus has changed - // This event fires before the focusin event - setTimeout(function () { - utils.toggleClass(utils.getFocusElement(), _this.config.classNames.tabFocus, true); - }, 0); - }); - - // Toggle controls visibility based on mouse movement - if (this.config.hideControls) { - // Toggle controls on mouse events and entering fullscreen - utils.on(this.elements.container, 'mouseenter mouseleave mousemove touchstart touchend touchmove enterfullscreen exitfullscreen', function (event) { - _this.toggleControls(event); + // Turn off native caption rendering to avoid double captions + // eslint-disable-next-line + track.mode = 'hidden'; }); + + // Get current track + var currentTrack = captions.getCurrentTrack.call(this); + + // Check if suported kind + if (utils.is.track(currentTrack)) { + // If we change the active track while a cue is already displayed we need to update it + if (Array.from(currentTrack.activeCues || []).length) { + captions.setCue.call(this, currentTrack); + } + } + } else if (this.isVimeo && this.captions.active) { + this.embed.enableTextTrack(this.language); } }, - // Listen for media events - media: function media() { + // Get the tracks + getTracks: function getTracks() { + // Return empty array at least + if (utils.is.nullOrUndefined(this.media)) { + return []; + } + + // Only get accepted kinds + return Array.from(this.media.textTracks || []).filter(function (track) { + return ['captions', 'subtitles'].includes(track.kind); + }); + }, + + + // Get the current track for the current language + getCurrentTrack: function getCurrentTrack() { var _this2 = this; - // Time change on media - utils.on(this.media, 'timeupdate seeking', function (event) { - return ui.timeUpdate.call(_this2, event); - }); - - // Display duration - utils.on(this.media, 'durationchange loadedmetadata', function (event) { - return ui.durationUpdate.call(_this2, event); - }); - - // Check for audio tracks on load - // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point - utils.on(this.media, 'loadeddata', function () { - utils.toggleHidden(_this2.elements.volume, !_this2.hasAudio); - utils.toggleHidden(_this2.elements.buttons.mute, !_this2.hasAudio); - }); - - // Handle the media finishing - utils.on(this.media, 'ended', function () { - // Show poster on end - if (_this2.isHTML5 && _this2.isVideo && _this2.config.showPosterOnEnd) { - // Restart - _this2.restart(); - - // Re-load media - _this2.media.load(); - } - }); - - // Check for buffer progress - utils.on(this.media, 'progress playing', function (event) { - return ui.updateProgress.call(_this2, event); - }); - - // Handle native mute - utils.on(this.media, 'volumechange', function (event) { - return ui.updateVolume.call(_this2, event); - }); - - // Handle native play/pause - utils.on(this.media, 'playing play pause ended', function (event) { - return ui.checkPlaying.call(_this2, event); - }); - - // Loading - utils.on(this.media, 'waiting canplay seeked playing', function (event) { - return ui.checkLoading.call(_this2, event); - }); - - // Check if media failed to load - // utils.on(this.media, 'play', event => ui.checkFailed.call(this, event)); - - // Click video - if (this.supported.ui && this.config.clickToPlay && !this.isAudio) { - // Re-fetch the wrapper - var wrapper = utils.getElement.call(this, '.' + this.config.classNames.video); - - // Bail if there's no wrapper (this should never happen) - if (!utils.is.element(wrapper)) { - return; - } - - // On click play, pause ore restart - utils.on(wrapper, 'click', function () { - // Touch devices will just show controls (if we're hiding controls) - if (_this2.config.hideControls && support.touch && !_this2.paused) { - return; - } - - if (_this2.paused) { - _this2.play(); - } else if (_this2.ended) { - _this2.restart(); - _this2.play(); - } else { - _this2.pause(); - } - }); - } - - // Disable right click - if (this.supported.ui && this.config.disableContextMenu) { - utils.on(this.media, 'contextmenu', function (event) { - event.preventDefault(); - }, false); - } - - // Volume change - utils.on(this.media, 'volumechange', function () { - // Save to storage - _this2.storage.set({ volume: _this2.volume, muted: _this2.muted }); - }); - - // Speed change - utils.on(this.media, 'ratechange', function () { - // Update UI - controls.updateSetting.call(_this2, 'speed'); - - // Save to storage - _this2.storage.set({ speed: _this2.speed }); - }); - - // Quality change - utils.on(this.media, 'qualitychange', function () { - // Update UI - controls.updateSetting.call(_this2, 'quality'); - - // Save to storage - _this2.storage.set({ quality: _this2.quality }); - }); - - // Caption language change - utils.on(this.media, 'languagechange', function () { - // Update UI - controls.updateSetting.call(_this2, 'captions'); - - // Save to storage - _this2.storage.set({ language: _this2.language }); - }); - - // Captions toggle - utils.on(this.media, 'captionsenabled captionsdisabled', function () { - // Update UI - controls.updateSetting.call(_this2, 'captions'); - - // Save to storage - _this2.storage.set({ captions: _this2.captions.active }); - }); - - // Proxy events to container - // Bubble up key events for Edge - utils.on(this.media, this.config.events.concat(['keyup', 'keydown']).join(' '), function (event) { - var detail = {}; - - // Get error details from media - if (event.type === 'error') { - detail = _this2.media.error; - } - - utils.dispatchEvent.call(_this2, _this2.elements.container, event.type, true, detail); + return captions.getTracks.call(this).find(function (track) { + return track.language.toLowerCase() === _this2.language; }); }, - // Listen for control events - controls: function controls$$1() { - var _this3 = this; + // Display active caption if it contains text + setCue: function setCue(input) { + // Get the track from the event if needed + var track = utils.is.event(input) ? input.target : input; + var activeCues = track.activeCues; - // IE doesn't support input event, so we fallback to change - var inputEvent = browser$2.isIE ? 'change' : 'input'; + var active = activeCues.length && activeCues[0]; + var currentTrack = captions.getCurrentTrack.call(this); - // Trigger custom and default handlers - var proxy = function proxy(event, handlerKey, defaultHandler) { - var customHandler = _this3.config.listeners[handlerKey]; + // Only display current track + if (track !== currentTrack) { + return; + } - // Execute custom handler - if (utils.is.function(customHandler)) { - customHandler.call(_this3, event); - } + // Display a cue, if there is one + if (utils.is.cue(active)) { + captions.setText.call(this, active.getCueAsHTML()); + } else { + captions.setText.call(this, null); + } - // Only call default handler if not prevented in custom handler - if (!event.defaultPrevented && utils.is.function(defaultHandler)) { - defaultHandler.call(_this3, event); - } - }; + utils.dispatchEvent.call(this, this.media, 'cuechange'); + }, - // Play/pause toggle - utils.on(this.elements.buttons.play, 'click', function (event) { - return proxy(event, 'play', function () { - _this3.togglePlay(); - }); - }); - // Pause - utils.on(this.elements.buttons.restart, 'click', function (event) { - return proxy(event, 'restart', function () { - _this3.restart(); - }); - }); + // Set the current caption + setText: function setText(input) { + // Requires UI + if (!this.supported.ui) { + return; + } - // Rewind - utils.on(this.elements.buttons.rewind, 'click', function (event) { - return proxy(event, 'rewind', function () { - _this3.rewind(); - }); - }); + if (utils.is.element(this.elements.captions)) { + var content = utils.createElement('span'); - // Rewind - utils.on(this.elements.buttons.forward, 'click', function (event) { - return proxy(event, 'forward', function () { - _this3.forward(); - }); - }); + // Empty the container + utils.emptyElement(this.elements.captions); - // Mute toggle - utils.on(this.elements.buttons.mute, 'click', function (event) { - return proxy(event, 'mute', function () { - _this3.muted = !_this3.muted; - }); - }); + // Default to empty + var caption = !utils.is.nullOrUndefined(input) ? input : ''; - // Captions toggle - utils.on(this.elements.buttons.captions, 'click', function (event) { - return proxy(event, 'captions', function () { - _this3.toggleCaptions(); - }); - }); - - // Fullscreen toggle - utils.on(this.elements.buttons.fullscreen, 'click', function (event) { - return proxy(event, 'fullscreen', function () { - _this3.fullscreen.toggle(); - }); - }); - - // Picture-in-Picture - utils.on(this.elements.buttons.pip, 'click', function (event) { - return proxy(event, 'pip', function () { - _this3.pip = 'toggle'; - }); - }); - - // Airplay - utils.on(this.elements.buttons.airplay, 'click', function (event) { - return proxy(event, 'airplay', function () { - _this3.airplay(); - }); - }); - - // Settings menu - utils.on(this.elements.buttons.settings, 'click', function (event) { - controls.toggleMenu.call(_this3, event); - }); - - // Click anywhere closes menu - utils.on(document.documentElement, 'click', function (event) { - controls.toggleMenu.call(_this3, event); - }); - - // Settings menu - utils.on(this.elements.settings.form, 'click', function (event) { - event.stopPropagation(); - - // Settings menu items - use event delegation as items are added/removed - if (utils.matches(event.target, _this3.config.selectors.inputs.language)) { - proxy(event, 'language', function () { - _this3.language = event.target.value; - }); - } else if (utils.matches(event.target, _this3.config.selectors.inputs.quality)) { - proxy(event, 'quality', function () { - _this3.quality = event.target.value; - }); - } else if (utils.matches(event.target, _this3.config.selectors.inputs.speed)) { - proxy(event, 'speed', function () { - _this3.speed = parseFloat(event.target.value); - }); + // Set the span content + if (utils.is.string(caption)) { + content.textContent = caption.trim(); } else { - controls.showTab.call(_this3, event); + content.appendChild(caption); } - }); - // Seek - utils.on(this.elements.inputs.seek, inputEvent, function (event) { - return proxy(event, 'seek', function () { - _this3.currentTime = event.target.value / event.target.max * _this3.duration; - }); - }); + // Set new caption text + this.elements.captions.appendChild(content); + } else { + this.debug.warn('No captions element to render to'); + } + }, - // Current time invert - // Only if one time element is used for both currentTime and duration - if (this.config.toggleInvert && !utils.is.element(this.elements.display.duration)) { - utils.on(this.elements.display.currentTime, 'click', function () { - // Do nothing if we're at the start - if (_this3.currentTime === 0) { - return; - } - _this3.config.invertTime = !_this3.config.invertTime; - ui.timeUpdate.call(_this3); - }); + // Display captions container and button (for initialization) + show: function show() { + // If there's no caption toggle, bail + if (!utils.is.element(this.elements.buttons.captions)) { + return; } - // Volume - utils.on(this.elements.inputs.volume, inputEvent, function (event) { - return proxy(event, 'volume', function () { - _this3.volume = event.target.value; - }); - }); + // Try to load the value from storage + var active = this.storage.get('captions'); - // Polyfill for lower fill in for webkit - if (browser$2.isWebkit) { - utils.on(utils.getElements.call(this, 'input[type="range"]'), 'input', function (event) { - controls.updateRangeFill.call(_this3, event.target); - }); + // Otherwise fall back to the default config + if (!utils.is.boolean(active)) { + active = this.config.captions.active; + } else { + this.captions.active = active; } - // Seek tooltip - utils.on(this.elements.progress, 'mouseenter mouseleave mousemove', function (event) { - return controls.updateSeekTooltip.call(_this3, event); - }); - - // Toggle controls visibility based on mouse movement - if (this.config.hideControls) { - // Watch for cursor over controls so they don't hide when trying to interact - utils.on(this.elements.controls, 'mouseenter mouseleave', function (event) { - _this3.elements.controls.hover = event.type === 'mouseenter'; - }); - - // Watch for cursor over controls so they don't hide when trying to interact - utils.on(this.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { - _this3.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); - }); - - // Focus in/out on controls - utils.on(this.elements.controls, 'focusin focusout', function (event) { - _this3.toggleControls(event); - }); + if (active) { + utils.toggleClass(this.elements.container, this.config.classNames.captions.active, true); + utils.toggleState(this.elements.buttons.captions, true); } - - // Mouse wheel for volume - utils.on(this.elements.inputs.volume, 'wheel', function (event) { - return proxy(event, 'volume', function () { - // Detect "natural" scroll - suppored on OS X Safari only - // Other browsers on OS X will be inverted until support improves - var inverted = event.webkitDirectionInvertedFromDevice; - var step = 1 / 50; - var direction = 0; - - // Scroll down (or up on natural) to decrease - if (event.deltaY < 0 || event.deltaX > 0) { - if (inverted) { - _this3.decreaseVolume(step); - direction = -1; - } else { - _this3.increaseVolume(step); - direction = 1; - } - } - - // Scroll up (or down on natural) to increase - if (event.deltaY > 0 || event.deltaX < 0) { - if (inverted) { - _this3.increaseVolume(step); - direction = 1; - } else { - _this3.decreaseVolume(step); - direction = -1; - } - } - - // Don't break page scrolling at max and min - if (direction === 1 && _this3.media.volume < 1 || direction === -1 && _this3.media.volume > 0) { - event.preventDefault(); - } - }); - }, false); } }; @@ -3242,7 +2179,7 @@ var ui = { // Re-attach media element listeners // TODO: Use event bubbling - listeners.media.call(this); + this.listeners.media(); // Don't setup interface if no support if (!this.supported.ui) { @@ -3261,7 +2198,7 @@ var ui = { controls.inject.call(this); // Re-attach control listeners - listeners.controls.call(this); + this.listeners.controls(); } // If there's no controls, bail @@ -3576,14 +2513,13 @@ var ui = { // Plyr controls // ========================================================================== -// Sniff out the browser -var browser$1 = utils.getBrowser(); +var browser$2 = utils.getBrowser(); var controls = { // Webkit polyfill for lower fill range updateRangeFill: function updateRangeFill(target) { // WebKit only - if (!browser$1.isWebkit) { + if (!browser$2.isWebkit) { return; } @@ -3604,7 +2540,7 @@ var controls = { getIconUrl: function getIconUrl() { return { url: this.config.iconUrl, - absolute: this.config.iconUrl.indexOf('http') === 0 || browser$1.isIE && !window.svg4everybody + absolute: this.config.iconUrl.indexOf('http') === 0 || browser$2.isIE && !window.svg4everybody }; }, @@ -4289,6 +3225,12 @@ var controls = { var form = this.elements.settings.form; var button = this.elements.buttons.settings; + + // Menu and button are required + if (!utils.is.element(form) || !utils.is.element(button)) { + return; + } + var show = utils.is.boolean(event) ? event : utils.is.element(form) && form.getAttribute('aria-hidden') === 'true'; if (utils.is.event(event)) { @@ -4765,238 +3707,1341 @@ var controls = { }; // ========================================================================== -// Plyr Captions -// TODO: Create as class +// Plyr Event Listeners // ========================================================================== -var captions = { - // Setup captions - setup: function setup() { - // Requires UI support - if (!this.supported.ui) { - return; - } +// Sniff out the browser +var browser$1 = utils.getBrowser(); - // Set default language if not set - var stored = this.storage.get('language'); +var Listeners = function () { + function Listeners(player) { + classCallCheck(this, Listeners); - if (!utils.is.empty(stored)) { - this.captions.language = stored; - } + this.player = player; + this.lastKey = null; - if (utils.is.empty(this.captions.language)) { - this.captions.language = this.config.captions.language.toLowerCase(); - } + this.handleKey = this.handleKey.bind(this); + this.toggleMenu = this.toggleMenu.bind(this); + } - // Set captions enabled state if not set - if (!utils.is.boolean(this.captions.active)) { - var active = this.storage.get('captions'); + // Handle key presses - if (utils.is.boolean(active)) { - this.captions.active = active; - } else { - this.captions.active = this.config.captions.active; - } - } - // Only Vimeo and HTML5 video supported at this point - if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) { - // Clear menu and hide - if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { - controls.setCaptionsMenu.call(this); + createClass(Listeners, [{ + key: 'handleKey', + value: function handleKey(event) { + var _this = this; + + var code = event.keyCode ? event.keyCode : event.which; + var pressed = event.type === 'keydown'; + var repeat = pressed && code === this.lastKey; + + // Bail if a modifier key is set + if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { + return; } - return; - } - // Inject the container - if (!utils.is.element(this.elements.captions)) { - this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions)); + // If the event is bubbled from the media element + // Firefox doesn't get the keycode for whatever reason + if (!utils.is.number(code)) { + return; + } - utils.insertAfter(this.elements.captions, this.elements.wrapper); - } + // Seek by the number keys + var seekByKey = function seekByKey() { + // Divide the max duration into 10th's and times by the number value + _this.player.currentTime = _this.player.duration / 10 * (code - 48); + }; - // Set the class hook - utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(captions.getTracks.call(this))); + // Handle the key on keydown + // Reset on keyup + if (pressed) { + // Which keycodes should we prevent default + var preventDefault = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67, 73, 76, 79]; - // Get tracks - var tracks = captions.getTracks.call(this); - - // If no caption file exists, hide container for caption text - if (utils.is.empty(tracks)) { - return; - } - - // Get browser info - var browser = utils.getBrowser(); - - // Fix IE captions if CORS is used - // Fetch captions and inject as blobs instead (data URIs not supported!) - if (browser.isIE && window.URL) { - var elements = this.media.querySelectorAll('track'); - - Array.from(elements).forEach(function (track) { - var src = track.getAttribute('src'); - var href = utils.parseUrl(src); - - if (href.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(href.protocol)) { - utils.fetch(src, 'blob').then(function (blob) { - track.setAttribute('src', window.URL.createObjectURL(blob)); - }).catch(function () { - utils.removeElement(track); - }); + // Check focused element + // and if the focused element is not editable (e.g. text input) + // and any that accept key input http://webaim.org/techniques/keyboard/ + var focused = utils.getFocusElement(); + if (utils.is.element(focused) && utils.matches(focused, this.player.config.selectors.editable)) { + return; } + + // If the code is found prevent default (e.g. prevent scrolling for arrows) + if (preventDefault.includes(code)) { + event.preventDefault(); + event.stopPropagation(); + } + + switch (code) { + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + // 0-9 + if (!repeat) { + seekByKey(); + } + break; + + case 32: + case 75: + // Space and K key + if (!repeat) { + this.player.togglePlay(); + } + break; + + case 38: + // Arrow up + this.player.increaseVolume(0.1); + break; + + case 40: + // Arrow down + this.player.decreaseVolume(0.1); + break; + + case 77: + // M key + if (!repeat) { + this.player.muted = !this.player.muted; + } + break; + + case 39: + // Arrow forward + this.player.forward(); + break; + + case 37: + // Arrow back + this.player.rewind(); + break; + + case 70: + // F key + this.player.fullscreen.toggle(); + break; + + case 67: + // C key + if (!repeat) { + this.player.toggleCaptions(); + } + break; + + case 76: + // L key + this.player.loop = !this.player.loop; + break; + + /* case 73: + this.setLoop('start'); + break; + case 76: + this.setLoop(); + break; + case 79: + this.setLoop('end'); + break; */ + + default: + break; + } + + // Escape is handle natively when in full screen + // So we only need to worry about non native + if (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) { + this.player.fullscreen.toggle(); + } + + // Store last code for next cycle + this.lastKey = code; + } else { + this.lastKey = null; + } + } + + // Toggle menu + + }, { + key: 'toggleMenu', + value: function toggleMenu(event) { + controls.toggleMenu.call(this.player, event); + } + + // Global window & document listeners + + }, { + key: 'global', + value: function global(toggle) { + // Keyboard shortcuts + if (this.player.config.keyboard.global) { + utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false); + } + + // Click anywhere closes menu + utils.toggleListener(document.body, 'click', this.toggleMenu, toggle); + } + + // Container listeners + + }, { + key: 'container', + value: function container() { + var _this2 = this; + + // Keyboard shortcuts + if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) { + utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false); + } + + // Detect tab focus + // Remove class on blur/focusout + utils.on(this.player.elements.container, 'focusout', function (event) { + utils.toggleClass(event.target, _this2.player.config.classNames.tabFocus, false); + }); + + // Add classname to tabbed elements + utils.on(this.player.elements.container, 'keydown', function (event) { + if (event.keyCode !== 9) { + return; + } + + // Delay the adding of classname until the focus has changed + // This event fires before the focusin event + setTimeout(function () { + utils.toggleClass(utils.getFocusElement(), _this2.player.config.classNames.tabFocus, true); + }, 0); + }); + + // Toggle controls visibility based on mouse movement + if (this.player.config.hideControls) { + // Toggle controls on mouse events and entering fullscreen + utils.on(this.player.elements.container, 'mouseenter mouseleave mousemove touchstart touchend touchmove enterfullscreen exitfullscreen', function (event) { + _this2.player.toggleControls(event); + }); + } + } + + // Listen for media events + + }, { + key: 'media', + value: function media() { + var _this3 = this; + + // Time change on media + utils.on(this.player.media, 'timeupdate seeking', function (event) { + return ui.timeUpdate.call(_this3.player, event); + }); + + // Display duration + utils.on(this.player.media, 'durationchange loadedmetadata', function (event) { + return ui.durationUpdate.call(_this3.player, event); + }); + + // Check for audio tracks on load + // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point + utils.on(this.player.media, 'loadeddata', function () { + utils.toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio); + utils.toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio); + }); + + // Handle the media finishing + utils.on(this.player.media, 'ended', function () { + // Show poster on end + if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.showPosterOnEnd) { + // Restart + _this3.player.restart(); + + // Re-load media + _this3.player.media.load(); + } + }); + + // Check for buffer progress + utils.on(this.player.media, 'progress playing', function (event) { + return ui.updateProgress.call(_this3.player, event); + }); + + // Handle native mute + utils.on(this.player.media, 'volumechange', function (event) { + return ui.updateVolume.call(_this3.player, event); + }); + + // Handle native play/pause + utils.on(this.player.media, 'playing play pause ended', function (event) { + return ui.checkPlaying.call(_this3.player, event); + }); + + // Loading + utils.on(this.player.media, 'waiting canplay seeked playing', function (event) { + return ui.checkLoading.call(_this3.player, event); + }); + + // Check if media failed to load + // utils.on(this.player.media, 'play', event => ui.checkFailed.call(this.player, event)); + + // Click video + if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) { + // Re-fetch the wrapper + var wrapper = utils.getElement.call(this.player, '.' + this.player.config.classNames.video); + + // Bail if there's no wrapper (this should never happen) + if (!utils.is.element(wrapper)) { + return; + } + + // On click play, pause ore restart + utils.on(wrapper, 'click', function () { + // Touch devices will just show controls (if we're hiding controls) + if (_this3.player.config.hideControls && support.touch && !_this3.player.paused) { + return; + } + + if (_this3.player.paused) { + _this3.player.play(); + } else if (_this3.player.ended) { + _this3.player.restart(); + _this3.player.play(); + } else { + _this3.player.pause(); + } + }); + } + + // Disable right click + if (this.player.supported.ui && this.player.config.disableContextMenu) { + utils.on(this.player.media, 'contextmenu', function (event) { + event.preventDefault(); + }, false); + } + + // Volume change + utils.on(this.player.media, 'volumechange', function () { + // Save to storage + _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted }); + }); + + // Speed change + utils.on(this.player.media, 'ratechange', function () { + // Update UI + controls.updateSetting.call(_this3.player, 'speed'); + + // Save to storage + _this3.player.storage.set({ speed: _this3.player.speed }); + }); + + // Quality change + utils.on(this.player.media, 'qualitychange', function () { + // Update UI + controls.updateSetting.call(_this3.player, 'quality'); + + // Save to storage + _this3.player.storage.set({ quality: _this3.player.quality }); + }); + + // Caption language change + utils.on(this.player.media, 'languagechange', function () { + // Update UI + controls.updateSetting.call(_this3.player, 'captions'); + + // Save to storage + _this3.player.storage.set({ language: _this3.player.language }); + }); + + // Captions toggle + utils.on(this.player.media, 'captionsenabled captionsdisabled', function () { + // Update UI + controls.updateSetting.call(_this3.player, 'captions'); + + // Save to storage + _this3.player.storage.set({ captions: _this3.player.captions.active }); + }); + + // Proxy events to container + // Bubble up key events for Edge + utils.on(this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) { + var detail = {}; + + // Get error details from media + if (event.type === 'error') { + detail = _this3.player.media.error; + } + + utils.dispatchEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail); }); } - // Set language - captions.setLanguage.call(this); + // Listen for control events - // Enable UI - captions.show.call(this); + }, { + key: 'controls', + value: function controls$$1() { + var _this4 = this; - // Set available languages in list - if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { - controls.setCaptionsMenu.call(this); - } - }, + // IE doesn't support input event, so we fallback to change + var inputEvent = browser$1.isIE ? 'change' : 'input'; + // Trigger custom and default handlers + var proxy = function proxy(event, handlerKey, defaultHandler) { + var customHandler = _this4.player.config.listeners[handlerKey]; - // Set the captions language - setLanguage: function setLanguage() { - var _this = this; + // Execute custom handler + if (utils.is.function(customHandler)) { + customHandler.call(_this4.player, event); + } - // Setup HTML5 track rendering - if (this.isHTML5 && this.isVideo) { - captions.getTracks.call(this).forEach(function (track) { - // Show track - utils.on(track, 'cuechange', function (event) { - return captions.setCue.call(_this, event); + // Only call default handler if not prevented in custom handler + if (!event.defaultPrevented && utils.is.function(defaultHandler)) { + defaultHandler.call(_this4.player, event); + } + }; + + // Play/pause toggle + utils.on(this.player.elements.buttons.play, 'click', function (event) { + return proxy(event, 'play', function () { + _this4.player.togglePlay(); + }); + }); + + // Pause + utils.on(this.player.elements.buttons.restart, 'click', function (event) { + return proxy(event, 'restart', function () { + _this4.player.restart(); + }); + }); + + // Rewind + utils.on(this.player.elements.buttons.rewind, 'click', function (event) { + return proxy(event, 'rewind', function () { + _this4.player.rewind(); + }); + }); + + // Rewind + utils.on(this.player.elements.buttons.forward, 'click', function (event) { + return proxy(event, 'forward', function () { + _this4.player.forward(); + }); + }); + + // Mute toggle + utils.on(this.player.elements.buttons.mute, 'click', function (event) { + return proxy(event, 'mute', function () { + _this4.player.muted = !_this4.player.muted; + }); + }); + + // Captions toggle + utils.on(this.player.elements.buttons.captions, 'click', function (event) { + return proxy(event, 'captions', function () { + _this4.player.toggleCaptions(); + }); + }); + + // Fullscreen toggle + utils.on(this.player.elements.buttons.fullscreen, 'click', function (event) { + return proxy(event, 'fullscreen', function () { + _this4.player.fullscreen.toggle(); + }); + }); + + // Picture-in-Picture + utils.on(this.player.elements.buttons.pip, 'click', function (event) { + return proxy(event, 'pip', function () { + _this4.player.pip = 'toggle'; + }); + }); + + // Airplay + utils.on(this.player.elements.buttons.airplay, 'click', function (event) { + return proxy(event, 'airplay', function () { + _this4.player.airplay(); + }); + }); + + // Settings menu + utils.on(this.player.elements.buttons.settings, 'click', function (event) { + controls.toggleMenu.call(_this4.player, event); + }); + + // Settings menu + utils.on(this.player.elements.settings.form, 'click', function (event) { + event.stopPropagation(); + + // Settings menu items - use event delegation as items are added/removed + if (utils.matches(event.target, _this4.player.config.selectors.inputs.language)) { + proxy(event, 'language', function () { + _this4.player.language = event.target.value; + }); + } else if (utils.matches(event.target, _this4.player.config.selectors.inputs.quality)) { + proxy(event, 'quality', function () { + _this4.player.quality = event.target.value; + }); + } else if (utils.matches(event.target, _this4.player.config.selectors.inputs.speed)) { + proxy(event, 'speed', function () { + _this4.player.speed = parseFloat(event.target.value); + }); + } else { + controls.showTab.call(_this4.player, event); + } + }); + + // Seek + utils.on(this.player.elements.inputs.seek, inputEvent, function (event) { + return proxy(event, 'seek', function () { + _this4.player.currentTime = event.target.value / event.target.max * _this4.player.duration; + }); + }); + + // Current time invert + // Only if one time element is used for both currentTime and duration + if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) { + utils.on(this.player.elements.display.currentTime, 'click', function () { + // Do nothing if we're at the start + if (_this4.player.currentTime === 0) { + return; + } + + _this4.player.config.invertTime = !_this4.player.config.invertTime; + ui.timeUpdate.call(_this4.player); + }); + } + + // Volume + utils.on(this.player.elements.inputs.volume, inputEvent, function (event) { + return proxy(event, 'volume', function () { + _this4.player.volume = event.target.value; + }); + }); + + // Polyfill for lower fill in for webkit + if (browser$1.isWebkit) { + utils.on(utils.getElements.call(this.player, 'input[type="range"]'), 'input', function (event) { + controls.updateRangeFill.call(_this4.player, event.target); + }); + } + + // Seek tooltip + utils.on(this.player.elements.progress, 'mouseenter mouseleave mousemove', function (event) { + return controls.updateSeekTooltip.call(_this4.player, event); + }); + + // Toggle controls visibility based on mouse movement + if (this.player.config.hideControls) { + // Watch for cursor over controls so they don't hide when trying to interact + utils.on(this.player.elements.controls, 'mouseenter mouseleave', function (event) { + _this4.player.elements.controls.hover = event.type === 'mouseenter'; }); - // Turn off native caption rendering to avoid double captions - // eslint-disable-next-line - track.mode = 'hidden'; - }); + // Watch for cursor over controls so they don't hide when trying to interact + utils.on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { + _this4.player.elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); + }); - // Get current track - var currentTrack = captions.getCurrentTrack.call(this); - - // Check if suported kind - if (utils.is.track(currentTrack)) { - // If we change the active track while a cue is already displayed we need to update it - if (Array.from(currentTrack.activeCues || []).length) { - captions.setCue.call(this, currentTrack); - } + // Focus in/out on controls + utils.on(this.player.elements.controls, 'focusin focusout', function (event) { + _this4.player.toggleControls(event); + }); } - } else if (this.isVimeo && this.captions.active) { - this.embed.enableTextTrack(this.language); + + // Mouse wheel for volume + utils.on(this.player.elements.inputs.volume, 'wheel', function (event) { + return proxy(event, 'volume', function () { + // Detect "natural" scroll - suppored on OS X Safari only + // Other browsers on OS X will be inverted until support improves + var inverted = event.webkitDirectionInvertedFromDevice; + var step = 1 / 50; + var direction = 0; + + // Scroll down (or up on natural) to decrease + if (event.deltaY < 0 || event.deltaX > 0) { + if (inverted) { + _this4.player.decreaseVolume(step); + direction = -1; + } else { + _this4.player.increaseVolume(step); + direction = 1; + } + } + + // Scroll up (or down on natural) to increase + if (event.deltaY > 0 || event.deltaX < 0) { + if (inverted) { + _this4.player.increaseVolume(step); + direction = 1; + } else { + _this4.player.decreaseVolume(step); + direction = -1; + } + } + + // Don't break page scrolling at max and min + if (direction === 1 && _this4.player.media.volume < 1 || direction === -1 && _this4.player.media.volume > 0) { + event.preventDefault(); + } + }); + }, false); } - }, + }]); + return Listeners; +}(); + +// ========================================================================== +// Plyr storage +// ========================================================================== + +var Storage = function () { + function Storage(player) { + classCallCheck(this, Storage); + + this.enabled = player.config.storage.enabled; + this.key = player.config.storage.key; + } + + // Check for actual support (see if we can use it) - // Get the tracks - getTracks: function getTracks() { - // Return empty array at least - if (utils.is.nullOrUndefined(this.media)) { - return []; + createClass(Storage, [{ + key: 'get', + value: function get$$1(key) { + var store = window.localStorage.getItem(this.key); + + if (!Storage.supported || utils.is.empty(store)) { + return null; + } + + var json = JSON.parse(store); + + return utils.is.string(key) && key.length ? json[key] : json; } + }, { + key: 'set', + value: function set$$1(object) { + // Bail if we don't have localStorage support or it's disabled + if (!Storage.supported || !this.enabled) { + return; + } - // Only get accepted kinds - return Array.from(this.media.textTracks || []).filter(function (track) { - return ['captions', 'subtitles'].includes(track.kind); + // Can only store objectst + if (!utils.is.object(object)) { + return; + } + + // Get current storage + var storage = this.get(); + + // Default to empty object + if (utils.is.empty(storage)) { + storage = {}; + } + + // Update the working copy of the values + utils.extend(storage, object); + + // Update storage + window.localStorage.setItem(this.key, JSON.stringify(storage)); + } + }], [{ + key: 'supported', + get: function get$$1() { + if (!('localStorage' in window)) { + return false; + } + + var test = '___test'; + + // Try to use it (it might be disabled, e.g. user is in private mode) + // see: https://github.com/sampotts/plyr/issues/131 + try { + window.localStorage.setItem(test, test); + window.localStorage.removeItem(test); + return true; + } catch (e) { + return false; + } + } + }]); + return Storage; +}(); + +// ========================================================================== +// Advertisement plugin using Google IMA HTML5 SDK +// Create an account with our ad partner, vi here: +// https://www.vi.ai/publisher-video-monetization/ +// ========================================================================== + +/* global google */ + +var Ads = function () { + /** + * Ads constructor. + * @param {object} player + * @return {Ads} + */ + function Ads(player) { + var _this = this; + + classCallCheck(this, Ads); + + this.player = player; + this.publisherId = player.config.ads.publisherId; + this.enabled = player.isHTML5 && player.isVideo && player.config.ads.enabled && utils.is.string(this.publisherId) && this.publisherId.length; + this.playing = false; + this.initialized = false; + this.elements = { + container: null, + displayContainer: null + }; + this.manager = null; + this.loader = null; + this.cuePoints = null; + this.events = {}; + this.safetyTimer = null; + this.countdownTimer = null; + + // Setup a promise to resolve when the IMA manager is ready + this.managerPromise = new Promise(function (resolve, reject) { + // The ad is pre-loaded and ready + _this.on('ADS_MANAGER_LOADED', resolve); + + // Ads failed + _this.on('ERROR', reject); }); - }, - - // Get the current track for the current language - getCurrentTrack: function getCurrentTrack() { - var _this2 = this; - - return captions.getTracks.call(this).find(function (track) { - return track.language.toLowerCase() === _this2.language; - }); - }, - - - // Display active caption if it contains text - setCue: function setCue(input) { - // Get the track from the event if needed - var track = utils.is.event(input) ? input.target : input; - var activeCues = track.activeCues; - - var active = activeCues.length && activeCues[0]; - var currentTrack = captions.getCurrentTrack.call(this); - - // Only display current track - if (track !== currentTrack) { - return; - } - - // Display a cue, if there is one - if (utils.is.cue(active)) { - captions.setText.call(this, active.getCueAsHTML()); - } else { - captions.setText.call(this, null); - } - - utils.dispatchEvent.call(this, this.media, 'cuechange'); - }, - - - // Set the current caption - setText: function setText(input) { - // Requires UI - if (!this.supported.ui) { - return; - } - - if (utils.is.element(this.elements.captions)) { - var content = utils.createElement('span'); - - // Empty the container - utils.emptyElement(this.elements.captions); - - // Default to empty - var caption = !utils.is.nullOrUndefined(input) ? input : ''; - - // Set the span content - if (utils.is.string(caption)) { - content.textContent = caption.trim(); + if (this.enabled) { + // Check if the Google IMA3 SDK is loaded or load it ourselves + if (!utils.is.object(window.google)) { + utils.loadScript(player.config.urls.googleIMA.api).then(function () { + _this.ready(); + }).catch(function () { + // Script failed to load or is blocked + _this.trigger('ERROR'); + _this.player.debug.error('Google IMA SDK failed to load'); + }); } else { - content.appendChild(caption); + this.ready(); } - - // Set new caption text - this.elements.captions.appendChild(content); - } else { - this.debug.warn('No captions element to render to'); - } - }, - - - // Display captions container and button (for initialization) - show: function show() { - // If there's no caption toggle, bail - if (!utils.is.element(this.elements.buttons.captions)) { - return; - } - - // Try to load the value from storage - var active = this.storage.get('captions'); - - // Otherwise fall back to the default config - if (!utils.is.boolean(active)) { - active = this.config.captions.active; - } else { - this.captions.active = active; - } - - if (active) { - utils.toggleClass(this.elements.container, this.config.classNames.captions.active, true); - utils.toggleState(this.elements.buttons.captions, true); } } -}; + + /** + * Get the ads instance ready. + */ + + + createClass(Ads, [{ + key: 'ready', + value: function ready() { + var _this2 = this; + + // Start ticking our safety timer. If the whole advertisement + // thing doesn't resolve within our set time; we bail + this.startSafetyTimer(12000, 'ready()'); + + // Clear the safety timer + this.managerPromise.then(function () { + _this2.clearSafetyTimer('onAdsManagerLoaded()'); + }); + + // Set listeners on the Plyr instance + this.listeners(); + + // Setup the IMA SDK + this.setupIMA(); + } + + // Build the default tag URL + + }, { + key: 'setupIMA', + + + /** + * In order for the SDK to display ads for our video, we need to tell it where to put them, + * so here we define our ad container. This div is set up to render on top of the video player. + * Using the code below, we tell the SDK to render ads within that div. We also provide a + * handle to the content video player - the SDK will poll the current time of our player to + * properly place mid-rolls. After we create the ad display container, we initialize it. On + * mobile devices, this initialization is done as the result of a user action. + */ + value: function setupIMA() { + // Create the container for our advertisements + this.elements.container = utils.createElement('div', { + class: this.player.config.classNames.ads + }); + this.player.elements.container.appendChild(this.elements.container); + + // So we can run VPAID2 + google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); + + // Set language + google.ima.settings.setLocale(this.player.config.ads.language); + + // We assume the adContainer is the video container of the plyr element + // that will house the ads + this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container); + + // Request video ads to be pre-loaded + this.requestAds(); + } + + /** + * Request advertisements + */ + + }, { + key: 'requestAds', + value: function requestAds() { + var _this3 = this; + + var container = this.player.elements.container; + + + try { + // Create ads loader + this.loader = new google.ima.AdsLoader(this.elements.displayContainer); + + // Listen and respond to ads loaded and error events + this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { + return _this3.onAdsManagerLoaded(event); + }, false); + this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this3.onAdError(error); + }, false); + + // Request video ads + var request = new google.ima.AdsRequest(); + request.adTagUrl = this.tagUrl; + + // Specify the linear and nonlinear slot sizes. This helps the SDK + // to select the correct creative if multiple are returned + request.linearAdSlotWidth = container.offsetWidth; + request.linearAdSlotHeight = container.offsetHeight; + request.nonLinearAdSlotWidth = container.offsetWidth; + request.nonLinearAdSlotHeight = container.offsetHeight; + + // We only overlay ads as we only support video. + request.forceNonLinearFullSlot = false; + + this.loader.requestAds(request); + + this.trigger('ADS_LOADER_LOADED'); + } catch (e) { + this.onAdError(e); + } + } + + /** + * Update the ad countdown + * @param {boolean} start + */ + + }, { + key: 'pollCountdown', + value: function pollCountdown() { + var _this4 = this; + + var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (!start) { + window.clearInterval(this.countdownTimer); + this.elements.container.removeAttribute('data-badge-text'); + return; + } + + var update = function update() { + var time = utils.formatTime(Math.max(_this4.manager.getRemainingTime(), 0)); + var label = _this4.player.config.i18n.advertisement + ' - ' + time; + _this4.elements.container.setAttribute('data-badge-text', label); + }; + + this.countdownTimer = window.setInterval(update, 100); + } + + /** + * This method is called whenever the ads are ready inside the AdDisplayContainer + * @param {Event} adsManagerLoadedEvent + */ + + }, { + key: 'onAdsManagerLoaded', + value: function onAdsManagerLoaded(adsManagerLoadedEvent) { + var _this5 = this; + + // Get the ads manager + var settings = new google.ima.AdsRenderingSettings(); + + // Tell the SDK to save and restore content video state on our behalf + settings.restoreCustomPlaybackStateOnAdBreakComplete = true; + settings.enablePreloading = true; + + // The SDK is polling currentTime on the contentPlayback. And needs a duration + // so it can determine when to start the mid- and post-roll + this.manager = adsManagerLoadedEvent.getAdsManager(this.player, settings); + + // Get the cue points for any mid-rolls by filtering out the pre- and post-roll + this.cuePoints = this.manager.getCuePoints(); + + // Add advertisement cue's within the time line if available + this.cuePoints.forEach(function (cuePoint) { + if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this5.player.duration) { + var seekElement = _this5.player.elements.progress; + + if (seekElement) { + var cuePercentage = 100 / _this5.player.duration * cuePoint; + var cue = utils.createElement('span', { + class: _this5.player.config.classNames.cues + }); + + cue.style.left = cuePercentage.toString() + '%'; + seekElement.appendChild(cue); + } + } + }); + + // Get skippable state + // TODO: Skip button + // this.manager.getAdSkippableState(); + + // Set volume to match player + this.manager.setVolume(this.player.volume); + + // Add listeners to the required events + // Advertisement error events + this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this5.onAdError(error); + }); + + // Advertisement regular events + Object.keys(google.ima.AdEvent.Type).forEach(function (type) { + _this5.manager.addEventListener(google.ima.AdEvent.Type[type], function (event) { + return _this5.onAdEvent(event); + }); + }); + + // Resolve our adsManager + this.trigger('ADS_MANAGER_LOADED'); + } + + /** + * This is where all the event handling takes place. Retrieve the ad from the event. Some + * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated + * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type + * @param {Event} event + */ + + }, { + key: 'onAdEvent', + value: function onAdEvent(event) { + var _this6 = this; + + var container = this.player.elements.container; + + // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) + // don't have ad object associated + + var ad = event.getAd(); + + // Proxy event + var dispatchEvent = function dispatchEvent(type) { + utils.dispatchEvent.call(_this6.player, _this6.player.media, 'ads' + type); + }; + + switch (event.type) { + case google.ima.AdEvent.Type.LOADED: + // This is the first event sent for an ad - it is possible to determine whether the + // ad is a video ad or an overlay + this.trigger('LOADED'); + + // Bubble event + dispatchEvent('loaded'); + + // Start countdown + this.pollCountdown(true); + + if (!ad.isLinear()) { + // Position AdDisplayContainer correctly for overlay + ad.width = container.offsetWidth; + ad.height = container.offsetHeight; + } + + // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex()); + // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset()); + break; + + case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: + // All ads for the current videos are done. We can now request new advertisements + // in case the video is re-played + this.trigger('ALL_ADS_COMPLETED'); + + // Fire event + dispatchEvent('allcomplete'); + + // TODO: Example for what happens when a next video in a playlist would be loaded. + // So here we load a new video when all ads are done. + // Then we load new ads within a new adsManager. When the video + // Is started - after - the ads are loaded, then we get ads. + // You can also easily test cancelling and reloading by running + // player.ads.cancel() and player.ads.play from the console I guess. + // this.player.source = { + // type: 'video', + // title: 'View From A Blue Moon', + // sources: [{ + // src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type: + // 'video/mp4', }], poster: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks: + // [ { kind: 'captions', label: 'English', srclang: 'en', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt', + // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src: + // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ], + // }; + + // TODO: So there is still this thing where a video should only be allowed to start + // playing when the IMA SDK is ready or has failed + + this.loadAds(); + break; + + case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: + // This event indicates the ad has started - the video player can adjust the UI, + // for example display a pause button and remaining time. Fired when content should + // be paused. This usually happens right before an ad is about to cover the content + this.trigger('CONTENT_PAUSE_REQUESTED'); + + dispatchEvent('contentpause'); + + this.pauseContent(); + + break; + + case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED: + // This event indicates the ad has finished - the video player can perform + // appropriate UI actions, such as removing the timer for remaining time detection. + // Fired when content should be resumed. This usually happens when an ad finishes + // or collapses + this.trigger('CONTENT_RESUME_REQUESTED'); + + dispatchEvent('contentresume'); + + this.pollCountdown(); + + this.resumeContent(); + + break; + + case google.ima.AdEvent.Type.STARTED: + dispatchEvent('started'); + break; + + case google.ima.AdEvent.Type.MIDPOINT: + dispatchEvent('midpoint'); + break; + + case google.ima.AdEvent.Type.COMPLETE: + dispatchEvent('complete'); + break; + + case google.ima.AdEvent.Type.IMPRESSION: + dispatchEvent('impression'); + break; + + case google.ima.AdEvent.Type.CLICK: + dispatchEvent('click'); + break; + + default: + break; + } + } + + /** + * Any ad error handling comes through here + * @param {Event} event + */ + + }, { + key: 'onAdError', + value: function onAdError(event) { + this.cancel(); + this.player.debug.log('Ads error', event); + } + + /** + * Setup hooks for Plyr and window events. This ensures + * the mid- and post-roll launch at the correct time. And + * resize the advertisement when the player resizes + */ + + }, { + key: 'listeners', + value: function listeners() { + var _this7 = this; + + var container = this.player.elements.container; + + var time = void 0; + + // Add listeners to the required events + this.player.on('ended', function () { + _this7.loader.contentComplete(); + }); + + this.player.on('seeking', function () { + time = _this7.player.currentTime; + return time; + }); + + this.player.on('seeked', function () { + var seekedTime = _this7.player.currentTime; + + _this7.cuePoints.forEach(function (cuePoint, index) { + if (time < cuePoint && cuePoint < seekedTime) { + _this7.manager.discardAdBreak(); + _this7.cuePoints.splice(index, 1); + } + }); + }); + + // Listen to the resizing of the window. And resize ad accordingly + // TODO: eventually implement ResizeObserver + window.addEventListener('resize', function () { + _this7.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); + }); + } + + /** + * Initialize the adsManager and start playing advertisements + */ + + }, { + key: 'play', + value: function play() { + var _this8 = this; + + var container = this.player.elements.container; + + + if (!this.managerPromise) { + return; + } + + // Play the requested advertisement whenever the adsManager is ready + this.managerPromise.then(function () { + // Initialize the container. Must be done via a user action on mobile devices + _this8.elements.displayContainer.initialize(); + + try { + if (!_this8.initialized) { + // Initialize the ads manager. Ad rules playlist will start at this time + _this8.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); + + // Call play to start showing the ad. Single video and overlay ads will + // start at this time; the call will be ignored for ad rules + _this8.manager.start(); + } + + _this8.initialized = true; + } catch (adError) { + // An error may be thrown if there was a problem with the + // VAST response + _this8.onAdError(adError); + } + }); + } + + /** + * Resume our video. + */ + + }, { + key: 'resumeContent', + value: function resumeContent() { + // Hide the advertisement container + this.elements.container.style.zIndex = ''; + + // Ad is stopped + this.playing = false; + + // Play our video + if (this.player.currentTime < this.player.duration) { + this.player.play(); + } + } + + /** + * Pause our video + */ + + }, { + key: 'pauseContent', + value: function pauseContent() { + // Show the advertisement container + this.elements.container.style.zIndex = 3; + + // Ad is playing. + this.playing = true; + + // Pause our video. + this.player.pause(); + } + + /** + * Destroy the adsManager so we can grab new ads after this. If we don't then we're not + * allowed to call new ads based on google policies, as they interpret this as an accidental + * video requests. https://developers.google.com/interactive- + * media-ads/docs/sdks/android/faq#8 + */ + + }, { + key: 'cancel', + value: function cancel() { + // Pause our video + if (this.initialized) { + this.resumeContent(); + } + + // Tell our instance that we're done for now + this.trigger('ERROR'); + + // Re-create our adsManager + this.loadAds(); + } + + /** + * Re-create our adsManager + */ + + }, { + key: 'loadAds', + value: function loadAds() { + var _this9 = this; + + // Tell our adsManager to go bye bye + this.managerPromise.then(function () { + // Destroy our adsManager + if (_this9.manager) { + _this9.manager.destroy(); + } + + // Re-set our adsManager promises + _this9.managerPromise = new Promise(function (resolve) { + _this9.on('ADS_MANAGER_LOADED', resolve); + _this9.player.debug.log(_this9.manager); + }); + + // Now request some new advertisements + _this9.requestAds(); + }); + } + + /** + * Handles callbacks after an ad event was invoked + * @param {string} event - Event type + */ + + }, { + key: 'trigger', + value: function trigger(event) { + var _this10 = this; + + var handlers = this.events[event]; + + if (utils.is.array(handlers)) { + handlers.forEach(function (handler) { + if (utils.is.function(handler)) { + handler.call(_this10); + } + }); + } + } + + /** + * Add event listeners + * @param {string} event - Event type + * @param {function} callback - Callback for when event occurs + * @return {Ads} + */ + + }, { + key: 'on', + value: function on(event, callback) { + if (!utils.is.array(this.events[event])) { + this.events[event] = []; + } + + this.events[event].push(callback); + + return this; + } + + /** + * Setup a safety timer for when the ad network doesn't respond for whatever reason. + * The advertisement has 12 seconds to get its things together. We stop this timer when the + * advertisement is playing, or when a user action is required to start, then we clear the + * timer on ad ready + * @param {number} time + * @param {string} from + */ + + }, { + key: 'startSafetyTimer', + value: function startSafetyTimer(time, from) { + var _this11 = this; + + this.player.debug.log('Safety timer invoked from: ' + from); + + this.safetyTimer = setTimeout(function () { + _this11.cancel(); + _this11.clearSafetyTimer('startSafetyTimer()'); + }, time); + } + + /** + * Clear our safety timer(s) + * @param {string} from + */ + + }, { + key: 'clearSafetyTimer', + value: function clearSafetyTimer(from) { + if (!utils.is.nullOrUndefined(this.safetyTimer)) { + this.player.debug.log('Safety timer cleared from: ' + from); + + clearTimeout(this.safetyTimer); + this.safetyTimer = null; + } + } + }, { + key: 'tagUrl', + get: function get$$1() { + var params = { + AV_PUBLISHERID: '58c25bb0073ef448b1087ad6', + AV_CHANNELID: '5a0458dc28a06145e4519d21', + AV_URL: location.hostname, + cb: Date.now(), + AV_WIDTH: 640, + AV_HEIGHT: 480, + AV_CDIM2: this.publisherId + }; + + var base = 'https://go.aniview.com/api/adserver6/vast/'; + + return base + '?' + utils.buildUrlParams(params); + } + }]); + return Ads; +}(); // ========================================================================== // YouTube plugin @@ -5017,7 +5062,9 @@ var youtube = { youtube.ready.call(this); } else { // Load the API - utils.loadScript(this.config.urls.youtube.api); + utils.loadScript(this.config.urls.youtube.api).catch(function (error) { + _this.debug.warn('YouTube API failed to load', error); + }); // Setup callback for the API // YouTube has it's own system of course... @@ -5430,8 +5477,10 @@ var vimeo = { // Load the API if not already if (!utils.is.object(window.Vimeo)) { - utils.loadScript(this.config.urls.vimeo.api, function () { + utils.loadScript(this.config.urls.vimeo.api).then(function () { vimeo.ready.call(_this); + }).catch(function (error) { + _this.debug.warn('Vimeo API failed to load', error); }); } else { vimeo.ready.call(this); @@ -6189,6 +6238,9 @@ var Plyr = function () { return; } + // Create listeners + this.listeners = new Listeners(this); + // Setup local storage for user settings this.storage = new Storage(this); @@ -6204,9 +6256,6 @@ var Plyr = function () { // Allow focus to be captured this.elements.container.setAttribute('tabindex', 0); - // Global listeners - listeners.global.call(this); - // Add style hook ui.addStyleHook.call(this); @@ -6226,6 +6275,12 @@ var Plyr = function () { ui.build.call(this); } + // Container listeners + this.listeners.container(); + + // Global listeners + this.listeners.global(true); + // Setup fullscreen this.fullscreen = new Fullscreen(this); @@ -6250,10 +6305,15 @@ var Plyr = function () { * Play the media, or play the advertisement (if they are not blocked) */ value: function play() { - // TODO: Always return a promise? - if (this.ads.enabled && !this.ads.initialized && !this.ads.blocked) { - this.ads.play(); - return null; + var _this2 = this; + + // If ads are enabled, wait for them first + if (this.ads.enabled && !this.ads.initialized) { + return this.ads.managerPromise.then(function () { + return _this2.ads.play(); + }).catch(function () { + return _this2.media.play(); + }); } // Return the promise (for HTML5) @@ -6438,7 +6498,7 @@ var Plyr = function () { }, { key: 'toggleControls', value: function toggleControls(toggle) { - var _this2 = this; + var _this3 = this; // We need controls of course... if (!utils.is.element(this.elements.controls)) { @@ -6507,24 +6567,24 @@ var Plyr = function () { if (!show || this.playing) { this.timers.controls = setTimeout(function () { // If the mouse is over the controls (and not entering fullscreen), bail - if ((_this2.elements.controls.pressed || _this2.elements.controls.hover) && !isEnterFullscreen) { + if ((_this3.elements.controls.pressed || _this3.elements.controls.hover) && !isEnterFullscreen) { return; } // Restore transition behaviour - if (!utils.hasClass(_this2.elements.container, _this2.config.classNames.hideControls)) { - utils.toggleClass(_this2.elements.controls, _this2.config.classNames.noTransition, false); + if (!utils.hasClass(_this3.elements.container, _this3.config.classNames.hideControls)) { + utils.toggleClass(_this3.elements.controls, _this3.config.classNames.noTransition, false); } // Check if controls toggled - var toggled = utils.toggleClass(_this2.elements.container, _this2.config.classNames.hideControls, true); + var toggled = utils.toggleClass(_this3.elements.container, _this3.config.classNames.hideControls, true); // Trigger event and close menu if (toggled) { - utils.dispatchEvent.call(_this2, _this2.media, 'controlshidden'); + utils.dispatchEvent.call(_this3, _this3.media, 'controlshidden'); - if (_this2.config.controls.includes('settings') && !utils.is.empty(_this2.config.settings)) { - controls.toggleMenu.call(_this2, false); + if (_this3.config.controls.includes('settings') && !utils.is.empty(_this3.config.settings)) { + controls.toggleMenu.call(_this3, false); } } }, delay); @@ -6566,7 +6626,7 @@ var Plyr = function () { }, { key: 'destroy', value: function destroy(callback) { - var _this3 = this; + var _this4 = this; var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; @@ -6575,22 +6635,22 @@ var Plyr = function () { document.body.style.overflow = ''; // GC for embed - _this3.embed = null; + _this4.embed = null; // If it's a soft destroy, make minimal changes if (soft) { - if (Object.keys(_this3.elements).length) { + if (Object.keys(_this4.elements).length) { // Remove elements - utils.removeElement(_this3.elements.buttons.play); - utils.removeElement(_this3.elements.captions); - utils.removeElement(_this3.elements.controls); - utils.removeElement(_this3.elements.wrapper); + utils.removeElement(_this4.elements.buttons.play); + utils.removeElement(_this4.elements.captions); + utils.removeElement(_this4.elements.controls); + utils.removeElement(_this4.elements.wrapper); // Clear for GC - _this3.elements.buttons.play = null; - _this3.elements.captions = null; - _this3.elements.controls = null; - _this3.elements.wrapper = null; + _this4.elements.buttons.play = null; + _this4.elements.captions = null; + _this4.elements.controls = null; + _this4.elements.wrapper = null; } // Callback @@ -6599,18 +6659,21 @@ var Plyr = function () { } } else { // Replace the container with the original element provided - utils.replaceElement(_this3.elements.original, _this3.elements.container); + utils.replaceElement(_this4.elements.original, _this4.elements.container); + + // Unbind global listeners + _this4.listeners.global(false); // Event - utils.dispatchEvent.call(_this3, _this3.elements.original, 'destroyed', true); + utils.dispatchEvent.call(_this4, _this4.elements.original, 'destroyed', true); // Callback if (utils.is.function(callback)) { - callback.call(_this3.elements.original); + callback.call(_this4.elements.original); } // Clear for GC - _this3.elements = null; + _this4.elements = null; } }; diff --git a/dist/plyr.js.map b/dist/plyr.js.map index f10c2a24..3ef55460 100644 --- a/dist/plyr.js.map +++ b/dist/plyr.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/js/types.js","src/js/defaults.js","src/js/utils.js","src/js/support.js","src/js/console.js","src/js/fullscreen.js","src/js/storage.js","src/js/plugins/ads.js","src/js/listeners.js","src/js/ui.js","src/js/controls.js","src/js/captions.js","src/js/plugins/youtube.js","src/js/plugins/vimeo.js","src/js/media.js","src/js/source.js","src/js/plyr.js"],"names":["providers","types","defaults","window","navigator","language","split","utils","input","instanceof","Plyr","getConstructor","Object","Number","isNaN","String","Boolean","Function","nullOrUndefined","Array","isArray","WeakMap","NodeList","Element","Text","Event","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","constructor","document","documentMode","documentElement","style","userAgent","platform","url","responseType","Promise","resolve","reject","request","XMLHttpRequest","addEventListener","JSON","parse","responseText","e","response","Error","statusText","open","send","callback","error","current","querySelector","callbacks","push","element","createElement","errors","is","function","forEach","cb","call","event","err","src","first","getElementsByTagName","parentNode","insertBefore","id","prefix","hasId","isCached","updateSprite","data","innerHTML","body","childNodes","querySelectorAll","container","toggleHidden","setAttribute","support","storage","cached","localStorage","getItem","content","fetch","then","empty","result","setItem","stringify","catch","Math","floor","random","self","top","elements","wrapper","targets","from","reverse","index","child","cloneNode","parent","sibling","nextSibling","appendChild","type","attributes","text","setAttributes","textContent","target","removeElement","removeChild","lastChild","newChild","oldChild","replaceChild","key","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","value","start","charAt","class","toggle","contains","classList","removeAttribute","prototype","match","includes","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","controls","getElement","config","selectors","buttons","getElements","play","pause","restart","rewind","forward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","currentTime","seekTooltip","classNames","tooltip","debug","warn","toggleNativeControls","focused","activeElement","focusable","last","trap","keyCode","getFocusElement","shiftKey","focus","preventDefault","on","off","passive","capture","Node","toggleListener","events","options","boolean","passiveListeners","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","toggleState","pressed","getAttribute","state","max","toFixed","parseInt","time","displayHours","inverted","number","formatTime","format","slice","hours","getHours","mins","getMinutes","secs","getSeconds","sources","source","shift","extend","youtube","vimeo","regex","RegExp","$2","parser","href","search","startsWith","parseUrl","hashes","indexOf","reduce","params","hash","val","decodeURIComponent","map","encodeURIComponent","join","fragment","createDocumentFragment","firstChild","innerText","width","height","getRatio","w","h","ratio","transitionEndEvent","find","undefined","offsetHeight","provider","inline","api","ui","browser","getBrowser","playsInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","supported","defineProperty","range","matchMedia","noop","Console","enabled","console","log","bind","onChange","button","player","active","isIos","trapFocus","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","toggleClass","fallback","Fullscreen","stopPropagation","update","native","iosNative","playing","webkitEnterFullscreen","requestFullScreen","webkitExitFullscreen","cancelFullScreen","enter","exit","inFrame","hasClass","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","some","pre","msExitFullscreen","Storage","store","json","get","removeItem","getTagUrl","base","buildUrlParams","Ads","ads","initialized","blocked","tag","google","loadScript","urls","googleIMA","ready","manager","loader","cuePoints","safetyTimer","countdownTimer","listeners","startSafetyTimer","loaderPromise","managerPromise","clearSafetyTimer","setupIMA","ima","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","handleEventListeners","clearInterval","getRemainingTime","label","i18n","advertisement","setInterval","adsManagerLoadedEvent","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","cue","cues","left","toString","setVolume","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","destroy","setTimeout","getKeyCode","which","handleKey","code","repeat","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","muted","toggleCaptions","loop","keyboard","global","tabFocus","hideControls","toggleControls","timeUpdate","durationUpdate","hasAudio","showPosterOnEnd","load","updateProgress","updateVolume","checkPlaying","checkLoading","clickToPlay","touch","paused","ended","disableContextMenu","set","updateSetting","speed","quality","concat","inputEvent","isIE","proxy","handlerKey","defaultHandler","customHandler","defaultPrevented","toggleMenu","form","parseFloat","showTab","toggleInvert","invertTime","isWebkit","updateRangeFill","updateSeekTooltip","hover","webkitDirectionInvertedFromDevice","step","direction","deltaY","deltaX","uiSupported","inject","setup","setTitle","title","isEmbed","iframe","frameTitle","stopped","loading","timers","failed","networkState","setRange","nodeValue","getPercentage","buffered","end","setProgress","invert","updateTimeDisplay","seeking","hasDuration","displayDuration","setProperty","iconUrl","svg4everybody","namespace","getIconUrl","iconPath","absolute","iconPrefix","icon","createElementNS","use","path","setAttributeNS","attr","hidden","badge","menu","buttonType","labelPressed","iconPressed","control","createIcon","createLabel","getAttributesFromSelector","suffix","played","toLowerCase","list","checked","item","radio","faux","insertAdjacentHTML","tooltips","percent","clientRect","getBoundingClientRect","visible","pageX","setting","tab","tabs","pane","panes","filter","isYouTube","toggleTab","emptyElement","getBadge","createBadge","createMenuItem","getLabel","getLanguage","default","textTracks","getTracks","none","currentTrack","getCurrentTrack","track","disabled","hasTracks","tracks","toUpperCase","unshift","show","isMenuItem","isButton","clone","position","opacity","name","scrollWidth","scrollHeight","getElementById","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setSpeedMenu","loadSprite","seekTime","create","findElements","repaint","labels","stored","setCaptionsMenu","insertAfter","URL","hostname","location","protocol","createObjectURL","blob","setLanguage","setCue","mode","activeCues","isVimeo","embed","enableTextTrack","setText","getCueAsHTML","caption","setAspectRatio","YT","Player","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","items","snippet","paddingBottom","currentId","parseYouTubeId","generateId","replaceElement","autoplay","message","instance","getPlaybackQuality","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stop","stopVideo","getDuration","getCurrentTime","seekTo","setPlaybackRate","setPlaybackQuality","getVideoUrl","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","build","setQualityMenu","getAvailableQualityLevels","Vimeo","padding","offset","transform","parseVimeoId","setCurrentTime","selected","setLoop","currentSrc","all","getVideoWidth","getVideoHeight","getAspectRatio","dimensions","setAutopause","autopause","getVideoTitle","getTextTracks","stripHTML","frame","seconds","isTouch","wrap","blankVideo","insertElement","attribute","cancelRequests","html5","check","crossorigin","poster","addStyleHook","insertElements","jQuery","original","tagName","getProviderByUrl","getUrlParams","truthy","playsinline","hasAttribute","webkitShowPlaybackTargetPicker","delay","isEnterFullscreen","noTransition","clearTimeout","toggled","soft","done","unload","mime","readyState","targetTime","fauxDuration","realDuration","min","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","change","states","webkitPresentationMode"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\nexport default { providers, types };\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Revert to poster on finish (HTML5 - will cause reload)\n showPosterOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.0.0-beta.17/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 'default',\n options: [\n 'hd2160',\n 'hd1440',\n 'hd1080',\n 'hd720',\n 'large',\n 'medium',\n 'small',\n 'tiny',\n 'default',\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: window.navigator.language.split('-')[0],\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n 'play',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime} secs',\n play: 'Play',\n pause: 'Pause',\n forward: 'Forward {seektime} secs',\n seek: 'Seek',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n speed: 'Speed',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n none: 'None',\n disabled: 'Disabled',\n advertisement: 'Ad',\n },\n\n // URLs\n urls: {\n vimeo: {\n api: 'https://player.vimeo.com/api/player.js',\n },\n youtube: {\n api: 'https://www.youtube.com/iframe_api',\n },\n googleIMA: {\n api: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n forward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adsconentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n forward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress--buffer',\n played: '.plyr__progress--played',\n loop: '.plyr__progress--loop',\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n ads: 'plyr__ads',\n control: 'plyr__control',\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n stopped: 'plyr--stopped',\n playing: 'plyr--playing',\n loading: 'plyr--loading',\n error: 'plyr--has-error',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Tag is not required as publisher is determined by vi.ai using the domain\n ads: {\n enabled: false,\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr utils\n// ==========================================================================\n\nimport support from './support';\nimport { providers } from './types';\n\nconst utils = {\n // Check variable types\n is: {\n plyr(input) {\n return this.instanceof(input, window.Plyr);\n },\n object(input) {\n return this.getConstructor(input) === Object;\n },\n number(input) {\n return this.getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return this.getConstructor(input) === String;\n },\n boolean(input) {\n return this.getConstructor(input) === Boolean;\n },\n function(input) {\n return this.getConstructor(input) === Function;\n },\n array(input) {\n return !this.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return this.instanceof(input, window.WeakMap);\n },\n nodeList(input) {\n return this.instanceof(input, window.NodeList);\n },\n element(input) {\n return this.instanceof(input, window.Element);\n },\n textNode(input) {\n return this.getConstructor(input) === Text;\n },\n event(input) {\n return this.instanceof(input, window.Event);\n },\n cue(input) {\n return this.instanceof(input, window.TextTrackCue) || this.instanceof(input, window.VTTCue);\n },\n track(input) {\n return this.instanceof(input, TextTrack) || (!this.nullOrUndefined(input) && this.string(input.kind));\n },\n url(input) {\n return !this.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n this.nullOrUndefined(input) ||\n ((this.string(input) || this.array(input) || this.nodeList(input)) && !input.length) ||\n (this.object(input) && !Object.keys(input).length)\n );\n },\n instanceof(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n },\n getConstructor(input) {\n return !this.nullOrUndefined(input) ? input.constructor : null;\n },\n },\n\n // Unfortunately, due to mixed support, UA sniffing is required\n getBrowser() {\n return {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n };\n },\n\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch(e) {\n resolve(request.responseText);\n }\n }\n else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n },\n\n // Load an external script\n loadScript(url, callback, error) {\n const current = document.querySelector(`script[src=\"${url}\"]`);\n\n // Check script is not already referenced, if so wait for load\n if (current !== null) {\n current.callbacks = current.callbacks || [];\n current.callbacks.push(callback);\n return;\n }\n\n // Build the element\n const element = document.createElement('script');\n\n // Callback queue\n element.callbacks = element.callbacks || [];\n element.callbacks.push(callback);\n\n // Error queue\n element.errors = element.errors || [];\n element.errors.push(error);\n\n // Bind callback\n if (utils.is.function(callback)) {\n element.addEventListener(\n 'load',\n event => {\n element.callbacks.forEach(cb => cb.call(null, event));\n element.callbacks = null;\n },\n false,\n );\n }\n\n // Bind error handling\n element.addEventListener(\n 'error',\n event => {\n element.errors.forEach(err => err.call(null, event));\n element.errors = null;\n },\n false,\n );\n\n // Set the URL after binding callback\n element.src = url;\n\n // Inject\n const first = document.getElementsByTagName('script')[0];\n first.parentNode.insertBefore(element, first);\n },\n\n // Load an external SVG sprite\n loadSprite(url, id) {\n if (!utils.is.string(url)) {\n return;\n }\n\n const prefix = 'cache-';\n const hasId = utils.is.string(id);\n let isCached = false;\n\n function updateSprite(data) {\n // Inject content\n this.innerHTML = data;\n\n // Inject the SVG to the body\n document.body.insertBefore(this, document.body.childNodes[0]);\n }\n\n // Only load once\n if (!hasId || !document.querySelectorAll(`#${id}`).length) {\n // Create container\n const container = document.createElement('div');\n utils.toggleHidden(container, true);\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (support.storage) {\n const cached = window.localStorage.getItem(prefix + id);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n updateSprite.call(container, data.content);\n return;\n }\n }\n\n // Get the sprite\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.empty(result)) {\n return;\n }\n\n if (support.storage) {\n window.localStorage.setItem(\n prefix + id,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n updateSprite.call(container, result);\n })\n .catch(() => {});\n }\n },\n\n // Generate a random ID\n generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n },\n\n // Determine if we're in an iframe\n inFrame() {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n },\n\n // Wrap an element\n wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n },\n\n // Create a DocumentFragment\n createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (utils.is.object(attributes)) {\n utils.setAttributes(element, attributes);\n }\n\n // Add text node\n if (utils.is.string(text)) {\n element.textContent = text;\n }\n\n // Return built element\n return element;\n },\n\n // Inaert an element after another\n insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n },\n\n // Insert a DocumentFragment\n insertElement(type, parent, attributes, text) {\n // Inject the new \n parent.appendChild(utils.createElement(type, attributes, text));\n },\n\n // Remove an element\n removeElement(element) {\n if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {\n return;\n }\n\n if (utils.is.nodeList(element) || utils.is.array(element)) {\n Array.from(element).forEach(utils.removeElement);\n return;\n }\n\n element.parentNode.removeChild(element);\n },\n\n // Remove all child elements\n emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n },\n\n // Replace element\n replaceElement(newChild, oldChild) {\n if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n },\n\n // Set attributes\n setAttributes(element, attributes) {\n if (!utils.is.element(element) || utils.is.empty(attributes)) {\n return;\n }\n\n Object.keys(attributes).forEach(key => {\n element.setAttribute(key, attributes[key]);\n });\n },\n\n // Get an attribute object from a string selector\n getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!utils.is.string(sel) || utils.is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (utils.is.object(existing) && utils.is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n },\n\n // Toggle class on an element\n toggleClass(element, className, toggle) {\n if (utils.is.element(element)) {\n const contains = element.classList.contains(className);\n\n element.classList[toggle ? 'add' : 'remove'](className);\n\n return (toggle && !contains) || (!toggle && contains);\n }\n\n return null;\n },\n\n // Has class name\n hasClass(element, className) {\n return utils.is.element(element) && element.classList.contains(className);\n },\n\n // Toggle hidden attribute on an element\n toggleHidden(element, toggle) {\n if (!utils.is.element(element)) {\n return;\n }\n\n if (toggle) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n },\n\n // Element matches selector\n matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n },\n\n // Find all elements\n getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n },\n\n // Find a single element\n getElement(selector) {\n return this.elements.container.querySelector(selector);\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom controls\n findElements() {\n try {\n this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: utils.getElements.call(this, this.config.selectors.buttons.play),\n pause: utils.getElement.call(this, this.config.selectors.buttons.pause),\n restart: utils.getElement.call(this, this.config.selectors.buttons.restart),\n rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),\n forward: utils.getElement.call(this, this.config.selectors.buttons.forward),\n mute: utils.getElement.call(this, this.config.selectors.buttons.mute),\n pip: utils.getElement.call(this, this.config.selectors.buttons.pip),\n airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),\n settings: utils.getElement.call(this, this.config.selectors.buttons.settings),\n captions: utils.getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: utils.getElement.call(this, this.config.selectors.inputs.seek),\n volume: utils.getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: utils.getElement.call(this, this.config.selectors.display.buffer),\n duration: utils.getElement.call(this, this.config.selectors.display.duration),\n currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),\n };\n\n // Seek tooltip\n if (utils.is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Get the focused element\n getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n },\n\n // Trap focus inside container\n trapFocus(element = null, toggle = false) {\n if (!utils.is.element(element)) {\n return;\n }\n\n const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = utils.getFocusElement();\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n if (toggle) {\n utils.on(this.elements.container, 'keydown', trap, false);\n } else {\n utils.off(this.elements.container, 'keydown', trap, false);\n }\n },\n\n // Toggle event listener\n toggleListener(elements, event, callback, toggle, passive, capture) {\n // Bail if no elemetns, event, or callback\n if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (utils.is.nodeList(elements) || utils.is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just capture boolean\n let options = utils.is.boolean(capture) ? capture : false;\n\n // If passive events listeners are supported\n if (support.passiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: utils.is.boolean(passive) ? passive : true,\n // Whether the listener is a capturing listener or not\n capture: utils.is.boolean(capture) ? capture : false,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n },\n\n // Bind event handler\n on(element, events, callback, passive, capture) {\n utils.toggleListener(element, events, callback, true, passive, capture);\n },\n\n // Unbind event handler\n off(element, events, callback, passive, capture) {\n utils.toggleListener(element, events, callback, false, passive, capture);\n },\n\n // Trigger event\n dispatchEvent(element, type, bubbles, detail) {\n // Bail if no element\n if (!utils.is.element(element) || !utils.is.string(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles: utils.is.boolean(bubbles) ? bubbles : false,\n detail: Object.assign({}, detail, {\n plyr: utils.is.plyr(this) ? this : null,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n },\n\n // Toggle aria-pressed state on a toggle button\n // http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\n toggleState(element, input) {\n // If multiple elements passed\n if (utils.is.array(element) || utils.is.nodeList(element)) {\n Array.from(element).forEach(target => utils.toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!utils.is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = utils.is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n },\n\n // Get percentage\n getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n return (current / max * 100).toFixed(2);\n },\n\n // Time helpers\n getHours(value) {\n return parseInt((value / 60 / 60) % 60, 10);\n },\n getMinutes(value) {\n return parseInt((value / 60) % 60, 10);\n },\n getSeconds(value) {\n return parseInt(value % 60, 10);\n },\n\n // Format time to UI friendly string\n formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return this.formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = this.getHours(time);\n const mins = this.getMinutes(time);\n const secs = this.getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n },\n\n // Deep extend destination object with N more objects\n extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!utils.is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (utils.is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n utils.extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return utils.extend(target, ...sources);\n },\n\n // Get the provider for a given URL\n getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{8,}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n },\n\n // Parse YouTube ID from URL\n parseYouTubeId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Parse Vimeo ID from URL\n parseVimeoId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n if (utils.is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n },\n\n // Convert a URL to a location object\n parseUrl(url) {\n const parser = document.createElement('a');\n parser.href = url;\n return parser;\n },\n\n // Get URL query parameters\n getUrlParams(input) {\n let search = input;\n\n // Parse URL if needed\n if (input.startsWith('http://') || input.startsWith('https://')) {\n ({ search } = this.parseUrl(input));\n }\n\n if (this.is.empty(search)) {\n return null;\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n\n return hashes.reduce((params, hash) => {\n const [\n key,\n val,\n ] = hash.split('=');\n\n return Object.assign(params, { [key]: decodeURIComponent(val) });\n }, {});\n },\n\n // Convert object to URL parameters\n buildUrlParams(input) {\n if (!utils.is.object(input)) {\n return '';\n }\n\n return Object.keys(input)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)\n .join('&');\n },\n\n // Remove HTML from a string\n stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n },\n\n // Get aspect ratio for dimensions\n getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n },\n\n // Get the transition end event\n get transitionEndEvent() {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return utils.is.string(type) ? events[type] : false;\n },\n\n // Force repaint of element\n repaint(element) {\n setTimeout(() => {\n utils.toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n utils.toggleHidden(element, false);\n }, 0);\n },\n};\n\nexport default utils;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport utils from './utils';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, inline) {\n let api = false;\n let ui = false;\n const browser = utils.getBrowser();\n const playsInline = browser.isIPhone && inline && support.inline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || playsInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || playsInline);\n break;\n\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && !browser.isIPhone;\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => {\n const browser = utils.getBrowser();\n return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: utils.is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n inline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {\n return false;\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n passiveListeners: (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n } catch (e) {\n // Do nothing\n }\n\n return supported;\n })(),\n\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // Remember a device can be moust + touch enabled\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: utils.transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// ==========================================================================\n\nimport utils from './utils';\n\nconst browser = utils.getBrowser();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (utils.is.element(button)) {\n utils.toggleState(button, this.active);\n }\n\n // Trigger an event\n utils.dispatchEvent(this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n utils.trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n utils.on(this.player.elements.container, 'dblclick', () => {\n this.toggle();\n });\n\n // Prevent double click on controls bubbling up\n utils.on(this.player.elements.controls, 'dblclick', event => event.stopPropagation());\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (utils.is.function(document.cancelFullScreen)) {\n return false;\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (utils.is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n } else if (utils.is.function(document.msExitFullscreen)) {\n value = 'ms';\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n const fallback = this.player.config.fullscreen.fallback && !utils.inFrame();\n\n return (Fullscreen.native || fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}FullscreenElement`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullScreen();\n } else if (!utils.is.empty(this.prefix)) {\n this.target[`${this.prefix}${this.prefix === 'ms' ? 'RequestFullscreen' : 'RequestFullScreen'}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n document.cancelFullScreen();\n } else if (!utils.is.empty(this.prefix)) {\n document[`${this.prefix}${this.prefix === 'ms' ? 'ExitFullscreen' : 'CancelFullScreen'}`]();\n }\n }\n\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport utils from './utils';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n if (!('localStorage' in window)) {\n return false;\n }\n\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n try {\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n const store = window.localStorage.getItem(this.key);\n\n if (!Storage.supported || utils.is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return utils.is.string(key) && key.length ? json[key] : json;\n }\n\n set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!utils.is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (utils.is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n utils.extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport utils from '../utils';\n\n// Build the default tag URL\nconst getTagUrl = () => {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: '127.0.0.1:3000',\n cb: 1,\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${utils.buildUrlParams(params)}`;\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.enabled = player.config.ads.enabled;\n this.playing = false;\n this.initialized = false;\n this.blocked = false;\n this.enabled = utils.is.url(player.config.ads.tag);\n\n // Check if a tag URL is provided.\n if (!this.enabled) {\n return;\n }\n\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!utils.is.object(window.google)) {\n utils.loadScript(\n player.config.urls.googleIMA.api,\n () => {\n this.ready();\n },\n () => {\n // Script failed to load or is blocked\n this.blocked = true;\n this.player.debug.log('Ads error: Google IMA SDK failed to load');\n },\n );\n } else {\n this.ready();\n }\n }\n\n /**\n * Get the ads instance ready.\n */\n ready() {\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Setup a simple promise to resolve if the IMA loader is ready\n this.loaderPromise = new Promise(resolve => {\n this.on('ADS_LOADER_LOADED', () => resolve());\n });\n\n // Setup a promise to resolve if the IMA manager is ready\n this.managerPromise = new Promise(resolve => {\n this.on('ADS_MANAGER_LOADED', () => resolve());\n });\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = utils.createElement('div', {\n class: this.player.config.classNames.ads,\n hidden: '',\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = getTagUrl();\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n this.loader.requestAds(request);\n\n this.handleEventListeners('ADS_LOADER_LOADED');\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n window.clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = utils.formatTime(this.manager.getRemainingTime());\n const label = `${this.player.config.i18n.advertisement} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = window.setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(adsManagerLoadedEvent) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = adsManagerLoadedEvent.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1) {\n const seekElement = this.player.elements.progress;\n\n if (seekElement) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = utils.createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n\n // Get skippable state\n // TODO: Skip button\n // this.manager.getAdSkippableState();\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.handleEventListeners('ADS_MANAGER_LOADED');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n utils.dispatchEvent.call(this.player, this.player.media, `ads${type}`);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.handleEventListeners('LOADED');\n\n // Bubble event\n dispatchEvent('loaded');\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n this.handleEventListeners('ALL_ADS_COMPLETED');\n\n // Fire event\n dispatchEvent('allcomplete');\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n this.handleEventListeners('CONTENT_PAUSE_REQUESTED');\n\n dispatchEvent('contentpause');\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n this.handleEventListeners('CONTENT_RESUME_REQUESTED');\n\n dispatchEvent('contentresume');\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n dispatchEvent('started');\n break;\n\n case google.ima.AdEvent.Type.MIDPOINT:\n dispatchEvent('midpoint');\n break;\n\n case google.ima.AdEvent.Type.COMPLETE:\n dispatchEvent('complete');\n break;\n\n case google.ima.AdEvent.Type.IMPRESSION:\n dispatchEvent('impression');\n break;\n\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent('click');\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.log('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n return;\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise.then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n });\n }\n\n /**\n * Resume our video.\n */\n resumeContent() {\n // Hide our ad container\n utils.toggleHidden(this.elements.container, true);\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show our ad container.\n utils.toggleHidden(this.elements.container, false);\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.handleEventListeners('ERROR');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise.then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('ADS_MANAGER_LOADED', () => resolve());\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n });\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n handleEventListeners(event) {\n if (utils.is.function(this.events[event])) {\n this.events[event].call(this);\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n this.events[event] = callback;\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!utils.is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\nimport controls from './controls';\nimport ui from './ui';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst listeners = {\n // Global listeners\n global() {\n let last = null;\n\n // Get the key code for an event\n const getKeyCode = event => (event.keyCode ? event.keyCode : event.which);\n\n // Handle key press\n const handleKey = event => {\n const code = getKeyCode(event);\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === last;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!utils.is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.currentTime = this.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = utils.getFocusElement();\n if (utils.is.element(focused) && utils.matches(focused, this.config.selectors.editable)) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.muted = !this.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.forward();\n break;\n\n case 37:\n // Arrow back\n this.rewind();\n break;\n\n case 70:\n // F key\n this.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.loop = !this.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!this.fullscreen.enabled && this.fullscreen.active && code === 27) {\n this.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n last = code;\n } else {\n last = null;\n }\n };\n\n // Keyboard shortcuts\n if (this.config.keyboard.global) {\n utils.on(window, 'keydown keyup', handleKey, false);\n } else if (this.config.keyboard.focused) {\n utils.on(this.elements.container, 'keydown keyup', handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n utils.on(this.elements.container, 'focusout', event => {\n utils.toggleClass(event.target, this.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n utils.on(this.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n utils.toggleClass(utils.getFocusElement(), this.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls visibility based on mouse movement\n if (this.config.hideControls) {\n // Toggle controls on mouse events and entering fullscreen\n utils.on(this.elements.container, 'mouseenter mouseleave mousemove touchstart touchend touchmove enterfullscreen exitfullscreen', event => {\n this.toggleControls(event);\n });\n }\n },\n\n // Listen for media events\n media() {\n // Time change on media\n utils.on(this.media, 'timeupdate seeking', event => ui.timeUpdate.call(this, event));\n\n // Display duration\n utils.on(this.media, 'durationchange loadedmetadata', event => ui.durationUpdate.call(this, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n utils.on(this.media, 'loadeddata', () => {\n utils.toggleHidden(this.elements.volume, !this.hasAudio);\n utils.toggleHidden(this.elements.buttons.mute, !this.hasAudio);\n });\n\n // Handle the media finishing\n utils.on(this.media, 'ended', () => {\n // Show poster on end\n if (this.isHTML5 && this.isVideo && this.config.showPosterOnEnd) {\n // Restart\n this.restart();\n\n // Re-load media\n this.media.load();\n }\n });\n\n // Check for buffer progress\n utils.on(this.media, 'progress playing', event => ui.updateProgress.call(this, event));\n\n // Handle native mute\n utils.on(this.media, 'volumechange', event => ui.updateVolume.call(this, event));\n\n // Handle native play/pause\n utils.on(this.media, 'playing play pause ended', event => ui.checkPlaying.call(this, event));\n\n // Loading\n utils.on(this.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this, event));\n\n // Check if media failed to load\n // utils.on(this.media, 'play', event => ui.checkFailed.call(this, event));\n\n // Click video\n if (this.supported.ui && this.config.clickToPlay && !this.isAudio) {\n // Re-fetch the wrapper\n const wrapper = utils.getElement.call(this, `.${this.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!utils.is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n utils.on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.config.hideControls && support.touch && !this.paused) {\n return;\n }\n\n if (this.paused) {\n this.play();\n } else if (this.ended) {\n this.restart();\n this.play();\n } else {\n this.pause();\n }\n });\n }\n\n // Disable right click\n if (this.supported.ui && this.config.disableContextMenu) {\n utils.on(\n this.media,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n utils.on(this.media, 'volumechange', () => {\n // Save to storage\n this.storage.set({ volume: this.volume, muted: this.muted });\n });\n\n // Speed change\n utils.on(this.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this, 'speed');\n\n // Save to storage\n this.storage.set({ speed: this.speed });\n });\n\n // Quality change\n utils.on(this.media, 'qualitychange', () => {\n // Update UI\n controls.updateSetting.call(this, 'quality');\n\n // Save to storage\n this.storage.set({ quality: this.quality });\n });\n\n // Caption language change\n utils.on(this.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this, 'captions');\n\n // Save to storage\n this.storage.set({ language: this.language });\n });\n\n // Captions toggle\n utils.on(this.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this, 'captions');\n\n // Save to storage\n this.storage.set({ captions: this.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n utils.on(this.media, this.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let detail = {};\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.media.error;\n }\n\n utils.dispatchEvent.call(this, this.elements.container, event.type, true, detail);\n });\n },\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Trigger custom and default handlers\n const proxy = (event, handlerKey, defaultHandler) => {\n const customHandler = this.config.listeners[handlerKey];\n\n // Execute custom handler\n if (utils.is.function(customHandler)) {\n customHandler.call(this, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (!event.defaultPrevented && utils.is.function(defaultHandler)) {\n defaultHandler.call(this, event);\n }\n };\n\n // Play/pause toggle\n utils.on(this.elements.buttons.play, 'click', event =>\n proxy(event, 'play', () => {\n this.togglePlay();\n }),\n );\n\n // Pause\n utils.on(this.elements.buttons.restart, 'click', event =>\n proxy(event, 'restart', () => {\n this.restart();\n }),\n );\n\n // Rewind\n utils.on(this.elements.buttons.rewind, 'click', event =>\n proxy(event, 'rewind', () => {\n this.rewind();\n }),\n );\n\n // Rewind\n utils.on(this.elements.buttons.forward, 'click', event =>\n proxy(event, 'forward', () => {\n this.forward();\n }),\n );\n\n // Mute toggle\n utils.on(this.elements.buttons.mute, 'click', event =>\n proxy(event, 'mute', () => {\n this.muted = !this.muted;\n }),\n );\n\n // Captions toggle\n utils.on(this.elements.buttons.captions, 'click', event =>\n proxy(event, 'captions', () => {\n this.toggleCaptions();\n }),\n );\n\n // Fullscreen toggle\n utils.on(this.elements.buttons.fullscreen, 'click', event =>\n proxy(event, 'fullscreen', () => {\n this.fullscreen.toggle();\n }),\n );\n\n // Picture-in-Picture\n utils.on(this.elements.buttons.pip, 'click', event =>\n proxy(event, 'pip', () => {\n this.pip = 'toggle';\n }),\n );\n\n // Airplay\n utils.on(this.elements.buttons.airplay, 'click', event =>\n proxy(event, 'airplay', () => {\n this.airplay();\n }),\n );\n\n // Settings menu\n utils.on(this.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this, event);\n });\n\n // Click anywhere closes menu\n utils.on(document.documentElement, 'click', event => {\n controls.toggleMenu.call(this, event);\n });\n\n // Settings menu\n utils.on(this.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Settings menu items - use event delegation as items are added/removed\n if (utils.matches(event.target, this.config.selectors.inputs.language)) {\n proxy(event, 'language', () => {\n this.language = event.target.value;\n });\n } else if (utils.matches(event.target, this.config.selectors.inputs.quality)) {\n proxy(event, 'quality', () => {\n this.quality = event.target.value;\n });\n } else if (utils.matches(event.target, this.config.selectors.inputs.speed)) {\n proxy(event, 'speed', () => {\n this.speed = parseFloat(event.target.value);\n });\n } else {\n controls.showTab.call(this, event);\n }\n });\n\n // Seek\n utils.on(this.elements.inputs.seek, inputEvent, event =>\n proxy(event, 'seek', () => {\n this.currentTime = event.target.value / event.target.max * this.duration;\n }),\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.config.toggleInvert && !utils.is.element(this.elements.display.duration)) {\n utils.on(this.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.currentTime === 0) {\n return;\n }\n\n this.config.invertTime = !this.config.invertTime;\n ui.timeUpdate.call(this);\n });\n }\n\n // Volume\n utils.on(this.elements.inputs.volume, inputEvent, event =>\n proxy(event, 'volume', () => {\n this.volume = event.target.value;\n }),\n );\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebkit) {\n utils.on(utils.getElements.call(this, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this, event.target);\n });\n }\n\n // Seek tooltip\n utils.on(this.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this, event));\n\n // Toggle controls visibility based on mouse movement\n if (this.config.hideControls) {\n // Watch for cursor over controls so they don't hide when trying to interact\n utils.on(this.elements.controls, 'mouseenter mouseleave', event => {\n this.elements.controls.hover = event.type === 'mouseenter';\n });\n\n // Watch for cursor over controls so they don't hide when trying to interact\n utils.on(this.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n utils.on(this.elements.controls, 'focusin focusout', event => {\n this.toggleControls(event);\n });\n }\n\n // Mouse wheel for volume\n utils.on(\n this.elements.inputs.volume,\n 'wheel',\n event =>\n proxy(event, 'volume', () => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.decreaseVolume(step);\n direction = -1;\n } else {\n this.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.increaseVolume(step);\n direction = 1;\n } else {\n this.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.media.volume < 1) || (direction === -1 && this.media.volume > 0)) {\n event.preventDefault();\n }\n }),\n false,\n );\n },\n};\n\nexport default listeners;\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport utils from './utils';\nimport captions from './captions';\nimport controls from './controls';\nimport listeners from './listeners';\n\nconst ui = {\n addStyleHook() {\n utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n utils.toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling\n listeners.media.call(this);\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!utils.is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n listeners.controls.call(this);\n }\n\n // If there's no controls, bail\n if (!utils.is.element(this.elements.controls)) {\n return;\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Captions\n captions.setup.call(this);\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality options\n this.options.quality = [];\n\n // Reset time display\n ui.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n utils.dispatchEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = this.config.i18n.play;\n\n // If there's a media title set, use that for the label\n if (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n\n // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (utils.is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = utils.getElement.call(this, 'iframe');\n\n if (!utils.is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';\n\n iframe.setAttribute('title', this.config.i18n.frameTitle.replace('{title}', title));\n }\n },\n\n // Check playing state\n checkPlaying() {\n // Class hooks\n utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.paused);\n\n // Set ARIA state\n utils.toggleState(this.elements.buttons.play, this.playing);\n\n // Toggle controls\n this.toggleControls(!this.playing);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Toggle container class hook\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Show controls if loading, hide if done\n this.toggleControls(this.loading);\n }, this.loading ? 250 : 0);\n },\n\n // Check if media failed to load\n checkFailed() {\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/networkState\n this.failed = this.media.networkState === 3;\n\n if (this.failed) {\n utils.toggleClass(this.elements.container, this.config.classNames.loading, false);\n utils.toggleClass(this.elements.container, this.config.classNames.error, true);\n }\n\n // Clear timer\n clearTimeout(this.timers.failed);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Toggle container class hook\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Show controls if loading, hide if done\n this.toggleControls(this.loading);\n }, this.loading ? 250 : 0);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (utils.is.element(this.elements.inputs.volume)) {\n ui.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (utils.is.element(this.elements.buttons.mute)) {\n utils.toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!utils.is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Set value\n setProgress(target, input) {\n const value = utils.is.number(input) ? input : 0;\n const progress = utils.is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (utils.is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (utils.is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n },\n\n // Update elements\n updateProgress(event) {\n if (!this.supported.ui || !utils.is.event(event)) {\n return;\n }\n\n let value = 0;\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n value = utils.getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n ui.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n value = (() => {\n const { buffered } = this.media;\n\n if (buffered && buffered.length) {\n // HTML5\n return utils.getPercentage(buffered.end(0), this.duration);\n } else if (utils.is.number(buffered)) {\n // YouTube returns between 0 and 1\n return buffered * 100;\n }\n\n return 0;\n })();\n\n ui.setProgress.call(this, this.elements.display.buffer, value);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!utils.is.element(target) || !utils.is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const displayHours = utils.getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.textContent = utils.formatTime(time, displayHours, inverted);\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !utils.is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n ui.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n ui.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded\n durationUpdate() {\n if (!this.supported.ui) {\n return;\n }\n\n // If there's a spot to display duration\n const hasDuration = utils.is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n ui.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n ui.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\nimport ui from './ui';\nimport captions from './captions';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst controls = {\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Get range from event if event passed\n const range = utils.is.event(target) ? target.target : target;\n\n // Needs to be a valid \n if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Get icon URL\n getIconUrl() {\n return {\n url: this.config.iconUrl,\n absolute: this.config.iconUrl.indexOf('http') === 0 || (browser.isIE && !window.svg4everybody),\n };\n },\n\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.absolute ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n utils.setAttributes(\n icon,\n utils.extend(attributes, {\n role: 'presentation',\n }),\n );\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add to \n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = this.config.i18n[type];\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return utils.createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (utils.is.empty(text)) {\n return null;\n }\n\n const badge = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n utils.createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a

if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the