Compare commits

..

50 Commits
v2.0.14 ... v2

Author SHA1 Message Date
e0562752ea Merge pull request #795 from frogg/patch-1
Added link that explains Webkit's autoplay blocker
2018-03-10 23:29:22 +11:00
e6db374a72 Added link that explains Webkit's autoplay blocker 2018-02-24 16:19:55 +01:00
ab7f277a1b Merge pull request #769 from redxtech/add-vue-plyr-to-readme
Add vue-plyr to readme
2018-02-06 10:51:42 +11:00
d5a1a7ca1c Add vue-plyr to readme 2018-01-28 23:03:05 -07:00
79a43120ae Merge pull request #740 from gurinderhans/master
double click player to toggle fullscreen
2018-01-07 22:40:20 +11:00
b79ffacd9c Merge pull request #726 from xDae/master
Added react port
2018-01-05 21:23:45 +11:00
888c6773d0 Merge pull request #743 from jwpage/patch-1
Fix `enabled` smartphone example in README
2018-01-03 11:45:33 +11:00
cfd653f02a Fix enabled smartphone example in README 2018-01-03 09:55:14 +11:00
838bd49a1d add comment about no fullscreen if player type is audio 2017-12-23 21:47:01 -08:00
800e0dedfb add double click to make full screen support 2017-12-23 21:41:08 -08:00
e6cc4ba1f5 Added react port 2017-12-04 17:05:14 +02:00
9c4b53d761 Fix for YouTube .getVideoData() issue (fixes #709) 2017-11-14 13:28:52 +01:00
0ec0addbda Update readme.md 2017-11-07 09:16:41 +11:00
d206b8ab34 Merge pull request #696 from yuriykuzin/enable-speed-controls-on-vimeo
Enable speed controls using Vimeo API
2017-11-06 19:37:47 +11:00
51c011b733 Merge branch 'master' into enable-speed-controls-on-vimeo 2017-11-06 19:37:02 +11:00
3c99357f06 Vimeo fixes + small bug fixes 2017-11-04 23:18:47 +11:00
a757acad15 Merge pull request #577 from brandon-pereira/master
fix for svg4everybody conflicting with plyr
2017-11-04 22:25:27 +11:00
7913cf837f Merge branch 'master' into master 2017-11-04 22:25:17 +11:00
e98d356ede Merge branch 'master' into master 2017-11-04 22:22:49 +11:00
c9c20345c0 Merge pull request #613 from vers-one/master
Fix for handling explicitly set duration of audio
2017-11-04 22:19:47 +11:00
aca06be7ac Merge branch 'master' into master 2017-11-04 22:19:39 +11:00
550cc6a19b Merge branch 'master' into master 2017-11-04 22:19:17 +11:00
e44e93c117 Merge pull request #617 from oemueller/patch-1
[bugfix] target is null exception
2017-11-04 22:17:00 +11:00
a06a8150ef Merge pull request #649 from waltercruz/master
Adding title to the player html template
2017-11-04 22:16:28 +11:00
e787934ee6 Merge branch 'master' into master 2017-11-04 22:16:16 +11:00
be4b5ef4db Merge branch 'master' into master 2017-11-04 22:14:55 +11:00
55c5b8b07e Typo 2017-11-04 21:32:19 +11:00
a924d40620 Merge pull request #654 from jjui/patch-1
Enable start/stop toggle on whole element
2017-11-04 21:29:25 +11:00
0074e77a7c Update plyr.scss 2017-11-04 21:28:38 +11:00
f3141690ee Update plyr.less 2017-11-04 21:28:17 +11:00
7ac5b0e18b Merge pull request #678 from StudyTube/use-url-as-input-for-vimeo-player
Add URL as a possible input option to Vimeo player
2017-11-04 21:24:55 +11:00
5abf7e9535 Merge pull request #703 from gurupras/early-listener-fix
Allow Plyr.setup event listeners to be set up as separate event listeners
2017-11-04 18:15:03 +11:00
650ee2c18f Merge pull request #700 from ashkanhosseini/master
fix #684 memory leaks issues after destroy.
2017-11-04 18:11:35 +11:00
95734cf7cc Allow setup event listeners to be set up as separate event listeners
rather than in-conjunction with defaultListener

This allows the setup listeners to do things like
preventDefault()/stopImmediatePropagation() and have them work
2017-11-01 04:15:03 -04:00
7234e2f5a3 fix #684 memory leaks issues after destroy. 2017-10-28 00:09:40 +03:00
e06b689f5c Enable speed controls using Vimeo API 2017-10-26 17:11:19 +03:00
1b3a6b340d Add URL as a possible input option to Vimeo player
This is reasonable to processing correctly private Vimeo links, like https://vimeo.com/25345658/fe46e209ac - that contain not only vimeo id, but also private key
2017-10-06 14:41:57 +03:00
b3759e966d Version bump 2017-10-05 22:47:27 +11:00
34172b9aee Fullscreen bug fix (fixes #664) 2017-10-05 22:46:48 +11:00
a21ffe983c Demo fixes 2017-10-02 14:52:31 +11:00
9fb79f29fd Readme fix 2017-10-02 14:25:14 +11:00
J
72412d26a5 Update plyr.less 2017-09-09 13:31:39 +02:00
J
bf02c69daa Enable start/stop toggle on whole element
Related to issue https://github.com/sampotts/plyr/issues/587
2017-09-09 13:25:22 +02:00
01f50f03f1 dding title to the player html template (build) 2017-08-28 10:32:56 -03:00
f50f0eb63d Adding title to the player html template 2017-08-28 10:19:29 -03:00
b114a6f42e [bugfix] target is null exception
when using 'play-large' without a 'play' button, the statement target = target[0]; caused an error. So it is necessary to check the value of target before accessing [0]
2017-07-12 22:17:25 +02:00
d0ceefe827 Gulp build 2017-07-06 23:41:34 -04:00
e756664750 Fix for https://github.com/sampotts/plyr/issues/601 2017-07-06 23:28:31 -04:00
d27a0b3855 updated to check for global namespace 2017-05-01 16:53:54 -06:00
a575aa25ac fix for svg4everybody conflicting with plyr 2017-05-01 15:50:54 -06:00
19 changed files with 5678 additions and 957 deletions

View File

2
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,2 @@
{
}

View File

@ -1,5 +1,22 @@
# Changelog # Changelog
## v2.0.18
- Fix for YouTube .getVideoData() issue (fixes #709)
## v2.0.17
- Vimeo controls fix (fixes #697)
- SVG4everybody compatibility fix
- Allow Plyr.setup event listeners to be set up as separate event listeners (https://github.com/sampotts/plyr/pull/703)
- Added title to the layer html template (for custom controls) (https://github.com/sampotts/plyr/pull/649)
- Target is null bug fix (https://github.com/sampotts/plyr/pull/617)
- fix #684 memory leaks issues after destroy (https://github.com/sampotts/plyr/pull/700)
## v2.0.16
- Fullscreen bug fix (fixes #664)
## v2.0.15
- Demo fix
## v2.0.14 ## v2.0.14
- CDN URL updates. Sorry, still working on V3 as hard as I can... - CDN URL updates. Sorry, still working on V3 as hard as I can...

View File

@ -37,6 +37,7 @@ You need to add several placeholders to your html template that are replaced whe
- `{id}` - the dynamically generated ID for the player (for form controls) - `{id}` - the dynamically generated ID for the player (for form controls)
- `{seektime}` - the seek time specified in options for fast forward and rewind - `{seektime}` - the seek time specified in options for fast forward and rewind
- `{title}` - the title of your media, if specified
You can include only the controls you need when specifying custom html. You can include only the controls you need when specifying custom html.

2
demo/dist/demo.css vendored

File diff suppressed because one or more lines are too long

2
demo/dist/demo.js vendored
View File

@ -1 +1 @@
"document"in self&&("classList"in document.createElement("_")?function(){"use strict";var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function(e){var t=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(e){var i,o=arguments.length;for(i=0;i<o;i++)e=arguments[i],t.call(this,e)}};t("add"),t("remove")}if(e.classList.toggle("c3",!1),e.classList.contains("c3")){var i=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,t){return 1 in arguments&&!this.contains(e)==!t?t:i.call(this,e)}}e=null}():function(e){"use strict";if("Element"in e){var t=e.Element.prototype,i=Object,o=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")},s=Array.prototype.indexOf||function(e){for(var t=0,i=this.length;t<i;t++)if(t in this&&this[t]===e)return t;return-1},n=function(e,t){this.name=e,this.code=DOMException[e],this.message=t},r=function(e,t){if(""===t)throw new n("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(t))throw new n("INVALID_CHARACTER_ERR","String contains an invalid character");return s.call(e,t)},a=function(e){for(var t=o.call(e.getAttribute("class")||""),i=t?t.split(/\s+/):[],s=0,n=i.length;s<n;s++)this.push(i[s]);this._updateClassName=function(){e.setAttribute("class",this.toString())}},c=a.prototype=[],l=function(){return new a(this)};if(n.prototype=Error.prototype,c.item=function(e){return this[e]||null},c.contains=function(e){return e+="",-1!==r(this,e)},c.add=function(){var e,t=arguments,i=0,o=t.length,s=!1;do{e=t[i]+"",-1===r(this,e)&&(this.push(e),s=!0)}while(++i<o);s&&this._updateClassName()},c.remove=function(){var e,t,i=arguments,o=0,s=i.length,n=!1;do{for(e=i[o]+"",t=r(this,e);-1!==t;)this.splice(t,1),n=!0,t=r(this,e)}while(++o<s);n&&this._updateClassName()},c.toggle=function(e,t){e+="";var i=this.contains(e),o=i?!0!==t&&"remove":!1!==t&&"add";return o&&this[o](e),!0===t||!1===t?t:!i},c.toString=function(){return this.join(" ")},i.defineProperty){var u={get:l,enumerable:!0,configurable:!0};try{i.defineProperty(t,"classList",u)}catch(e){-2146823252===e.number&&(u.enumerable=!1,i.defineProperty(t,"classList",u))}}else i.prototype.__defineGetter__&&t.__defineGetter__("classList",l)}}(self)),function(){function e(e,t,i){if(e)if(e.classList)e.classList[i?"add":"remove"](t);else{var o=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=o+(i?" "+t:"")}}function t(t,i){if(t in n&&(i||t!==r)&&(r.length||t!==n.video)){switch(t){case n.video:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"},{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.webm",type:"video/webm"}],poster:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.en.vtt",default:!0}]});break;case n.audio:o.source({type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",sources:[{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]});break;case n.youtube:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"bTqVqk7FSmY",type:"youtube"}]});break;case n.vimeo:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"147865858",type:"vimeo"}]})}r=t;for(var a=s.length-1;a>=0;a--)e(s[a].parentElement,"active",!1);e(document.querySelector('[data-source="'+t+'"]').parentElement,"active",!0)}}var i=plyr.setup({debug:!0,title:"Video demo",iconUrl:"../dist/plyr.svg",tooltips:{controls:!0},captions:{defaultActive:!0}});plyr.loadSprite("dist/demo.svg");for(var o=i[0],s=document.querySelectorAll("[data-source]"),n={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},r=window.location.hash.replace("#",""),a=window.history&&window.history.pushState,c=s.length-1;c>=0;c--)s[c].addEventListener("click",function(){var e=this.getAttribute("data-source");t(e),a&&history.pushState({type:e},"","#"+e)});if(window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&t(e.state.type)}),a){var l=!r.length;l&&(r=n.video),r in n&&history.replaceState({type:r},"",l?"":"#"+r),r!==n.video&&t(r,!0)}}(),document.domain.indexOf("plyr.io")>-1&&(!function(e,t,i,o,s,n,r){e.GoogleAnalyticsObject=s,e[s]=e[s]||function(){(e[s].q=e[s].q||[]).push(arguments)},e[s].l=1*new Date,n=t.createElement(i),r=t.getElementsByTagName(i)[0],n.async=1,n.src="//www.google-analytics.com/analytics.js",r.parentNode.insertBefore(n,r)}(window,document,"script",0,"ga"),ga("create","UA-40881672-11","auto"),ga("send","pageview")); "document"in self&&("classList"in document.createElement("_")?function(){"use strict";var t=document.createElement("_");if(t.classList.add("c1","c2"),!t.classList.contains("c2")){var e=function(t){var e=DOMTokenList.prototype[t];DOMTokenList.prototype[t]=function(t){var i,o=arguments.length;for(i=0;i<o;i++)t=arguments[i],e.call(this,t)}};e("add"),e("remove")}if(t.classList.toggle("c3",!1),t.classList.contains("c3")){var i=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return 1 in arguments&&!this.contains(t)==!e?e:i.call(this,t)}}t=null}():function(t){"use strict";if("Element"in t){var e=t.Element.prototype,i=Object,o=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")},s=Array.prototype.indexOf||function(t){for(var e=0,i=this.length;e<i;e++)if(e in this&&this[e]===t)return e;return-1},n=function(t,e){this.name=t,this.code=DOMException[t],this.message=e},r=function(t,e){if(""===e)throw new n("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(e))throw new n("INVALID_CHARACTER_ERR","String contains an invalid character");return s.call(t,e)},a=function(t){for(var e=o.call(t.getAttribute("class")||""),i=e?e.split(/\s+/):[],s=0,n=i.length;s<n;s++)this.push(i[s]);this._updateClassName=function(){t.setAttribute("class",this.toString())}},c=a.prototype=[],l=function(){return new a(this)};if(n.prototype=Error.prototype,c.item=function(t){return this[t]||null},c.contains=function(t){return t+="",-1!==r(this,t)},c.add=function(){var t,e=arguments,i=0,o=e.length,s=!1;do{t=e[i]+"",-1===r(this,t)&&(this.push(t),s=!0)}while(++i<o);s&&this._updateClassName()},c.remove=function(){var t,e,i=arguments,o=0,s=i.length,n=!1;do{for(t=i[o]+"",e=r(this,t);-1!==e;)this.splice(e,1),n=!0,e=r(this,t)}while(++o<s);n&&this._updateClassName()},c.toggle=function(t,e){t+="";var i=this.contains(t),o=i?!0!==e&&"remove":!1!==e&&"add";return o&&this[o](t),!0===e||!1===e?e:!i},c.toString=function(){return this.join(" ")},i.defineProperty){var u={get:l,enumerable:!0,configurable:!0};try{i.defineProperty(e,"classList",u)}catch(t){-2146823252===t.number&&(u.enumerable=!1,i.defineProperty(e,"classList",u))}}else i.prototype.__defineGetter__&&e.__defineGetter__("classList",l)}}(self)),function(){function t(t,e,i){if(t)if(t.classList)t.classList[i?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(/\s+/g," ").replace(" "+e+" ","");t.className=o+(i?" "+e:"")}}function e(e,i){if(e in n&&(i||e!==r)&&(r.length||e!==n.video)){switch(e){case n.video:o.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"},{src:"https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.webm",type:"video/webm"}],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}]});break;case n.audio:o.source({type:"audio",title:"Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",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 n.youtube:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"bTqVqk7FSmY",type:"youtube"}]});break;case n.vimeo:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"147865858",type:"vimeo"}]})}r=e;for(var a=s.length-1;a>=0;a--)t(s[a].parentElement,"active",!1);t(document.querySelector('[data-source="'+e+'"]').parentElement,"active",!0)}}var i=plyr.setup({debug:!0,title:"Video demo",iconUrl:"../dist/plyr.svg",tooltips:{controls:!0},captions:{defaultActive:!0}});plyr.loadSprite("dist/demo.svg");for(var o=i[0],s=document.querySelectorAll("[data-source]"),n={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},r=window.location.hash.replace("#",""),a=window.history&&window.history.pushState,c=s.length-1;c>=0;c--)s[c].addEventListener("click",function(){var t=this.getAttribute("data-source");e(t),a&&history.pushState({type:t},"","#"+t)});if(window.addEventListener("popstate",function(t){t.state&&"type"in t.state&&e(t.state.type)}),a){var l=!r.length;l&&(r=n.video),r in n&&history.replaceState({type:r},"",l?"":"#"+r),r!==n.video&&e(r,!0)}}(),document.domain.indexOf("plyr.io")>-1&&(!function(t,e,i,o,s,n,r){t.GoogleAnalyticsObject=s,t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=1*new Date,n=e.createElement(i),r=e.getElementsByTagName(i)[0],n.async=1,n.src="//www.google-analytics.com/analytics.js",r.parentNode.insertBefore(n,r)}(window,document,"script",0,"ga"),ga("create","UA-40881672-11","auto"),ga("send","pageview"));

View File

@ -1,18 +1,25 @@
<!doctype html> <!doctype html>
<html lang="en" class="error"> <html lang="en" class="error">
<head>
<meta charset="utf-8" />
<title>Doh. Looks like something went wrong.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Docs styles --> <head>
<link rel="stylesheet" href="dist/demo.css"> <meta charset="utf-8" />
</head> <title>Doh. Looks like something went wrong.</title>
<body> <meta name="viewport" content="width=device-width, initial-scale=1">
<main>
<h1>Doh.</h1> <!-- Docs styles -->
<p>Looks like something went wrong.</p> <link rel="stylesheet" href="dist/demo.css">
<a href="http://plyr.io" class="btn btn--primary">Back to plyr.io</a>
</main> <!-- Preload -->
</body> <link rel="preload" as="font" crossorigin type="font/woff2" href="https://cdn.plyr.io/static/fonts/avenir-medium.woff2">
</html> <link rel="preload" as="font" crossorigin type="font/woff2" href="https://cdn.plyr.io/static/fonts/avenir-bold.woff2">
</head>
<body>
<main>
<h1>Doh.</h1>
<p>Looks like something went wrong.</p>
<a href="http://plyr.io" class="btn btn--primary">Back to plyr.io</a>
</main>
</body>
</html>

View File

@ -13,6 +13,10 @@
<!-- Docs styles --> <!-- Docs styles -->
<link rel="stylesheet" href="dist/demo.css"> <link rel="stylesheet" href="dist/demo.css">
<!-- Preload -->
<link rel="preload" as="font" crossorigin type="font/woff2" href="https://cdn.plyr.io/static/fonts/avenir-medium.woff2">
<link rel="preload" as="font" crossorigin type="font/woff2" href="https://cdn.plyr.io/static/fonts/avenir-bold.woff2">
</head> </head>
<body> <body>

View File

@ -12,68 +12,68 @@
// Setup the player // Setup the player
var instances = plyr.setup({ var instances = plyr.setup({
debug: true, debug: true,
title: 'Video demo', title: "Video demo",
iconUrl: '../dist/plyr.svg', iconUrl: "../dist/plyr.svg",
tooltips: { tooltips: {
controls: true controls: true
}, },
captions: { captions: {
defaultActive: true defaultActive: true
} }
}); });
plyr.loadSprite('dist/demo.svg'); plyr.loadSprite("dist/demo.svg");
// Plyr returns an array regardless // Plyr returns an array regardless
var player = instances[0]; var player = instances[0];
// Setup type toggle // Setup type toggle
var buttons = document.querySelectorAll('[data-source]'), var buttons = document.querySelectorAll("[data-source]"),
types = { types = {
video: 'video', video: "video",
audio: 'audio', audio: "audio",
youtube: 'youtube', youtube: "youtube",
vimeo: 'vimeo' vimeo: "vimeo"
}, },
currentType = window.location.hash.replace('#', ''), currentType = window.location.hash.replace("#", ""),
historySupport = (window.history && window.history.pushState); historySupport = window.history && window.history.pushState;
// Bind to each button // Bind to each button
for (var i = buttons.length - 1; i >= 0; i--) { for (var i = buttons.length - 1; i >= 0; i--) {
buttons[i].addEventListener('click', function() { buttons[i].addEventListener("click", function() {
var type = this.getAttribute('data-source'); var type = this.getAttribute("data-source");
newSource(type); newSource(type);
if (historySupport) { if (historySupport) {
history.pushState({ 'type': type }, '', '#' + type); history.pushState({ type: type }, "", "#" + type);
} }
}); });
} }
// List for backwards/forwards // List for backwards/forwards
window.addEventListener('popstate', function(event) { window.addEventListener("popstate", function(event) {
if(event.state && 'type' in event.state) { if (event.state && "type" in event.state) {
newSource(event.state.type); newSource(event.state.type);
} }
}); });
// On load // On load
if(historySupport) { if (historySupport) {
var video = !currentType.length; var video = !currentType.length;
// If there's no current type set, assume video // If there's no current type set, assume video
if(video) { if (video) {
currentType = types.video; currentType = types.video;
} }
// Replace current history state // Replace current history state
if(currentType in types) { if (currentType in types) {
history.replaceState({ 'type': currentType }, '', (video ? '' : '#' + currentType)); history.replaceState({ type: currentType }, "", video ? "" : "#" + currentType);
} }
// If it's not video, load the source // If it's not video, load the source
if(currentType !== types.video) { if (currentType !== types.video) {
newSource(currentType, true); newSource(currentType, true);
} }
} }
@ -82,11 +82,10 @@
function toggleClass(element, className, state) { function toggleClass(element, className, state) {
if (element) { if (element) {
if (element.classList) { if (element.classList) {
element.classList[state ? 'add' : 'remove'](className); element.classList[state ? "add" : "remove"](className);
} } else {
else { var name = (" " + element.className + " ").replace(/\s+/g, " ").replace(" " + className + " ", "");
var name = (' ' + element.className + ' ').replace(/\s+/g, ' ').replace(' ' + className + ' ', ''); element.className = name + (state ? " " + className : "");
element.className = name + (state ? ' ' + className : '');
} }
} }
} }
@ -94,68 +93,78 @@
// Set a new source // Set a new source
function newSource(type, init) { function newSource(type, init) {
// 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 // 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
if(!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) { if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {
return; return;
} }
switch(type) { switch (type) {
case types.video: case types.video:
player.source({ player.source({
type: 'video', type: "video",
title: 'View From A Blue Moon', title: "View From A Blue Moon",
sources: [{ sources: [
src: 'https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4', {
type: 'video/mp4' src: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4",
}, type: "video/mp4"
{ },
src: 'https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.webm', {
type: 'video/webm' src: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.webm",
}], type: "video/webm"
poster: 'https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg', }
tracks: [{ ],
kind: 'captions', poster: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg",
label: 'English', tracks: [
srclang:'en', {
src: 'https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.en.vtt', kind: "captions",
default: true label: "English",
}] srclang: "en",
src: "https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt",
default: true
}
]
}); });
break; break;
case types.audio: case types.audio:
player.source({ player.source({
type: 'audio', type: "audio",
title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;', title: "Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;",
sources: [{ sources: [
src: 'https://cdn.selz.com/plyr/1.5/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.mp3",
}, type: "audio/mp3"
{ },
src: 'https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg', {
type: 'audio/ogg' src: "https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",
}] type: "audio/ogg"
}
]
}); });
break; break;
case types.youtube: case types.youtube:
player.source({ player.source({
type: 'video', type: "video",
title: 'View From A Blue Moon', title: "View From A Blue Moon",
sources: [{ sources: [
src: 'bTqVqk7FSmY', {
type: 'youtube' src: "bTqVqk7FSmY",
}] type: "youtube"
}
]
}); });
break; break;
case types.vimeo: case types.vimeo:
player.source({ player.source({
type: 'video', type: "video",
title: 'View From A Blue Moon', title: "View From A Blue Moon",
sources: [{ sources: [
src: '147865858', {
type: 'vimeo' src: "147865858",
}] type: "vimeo"
}
]
}); });
break; break;
} }
@ -165,21 +174,30 @@
// Remove active classes // Remove active classes
for (var x = buttons.length - 1; x >= 0; x--) { for (var x = buttons.length - 1; x >= 0; x--) {
toggleClass(buttons[x].parentElement, 'active', false); toggleClass(buttons[x].parentElement, "active", false);
} }
// Set active on parent // Set active on parent
toggleClass(document.querySelector('[data-source="'+ type +'"]').parentElement, 'active', true); toggleClass(document.querySelector('[data-source="' + type + '"]').parentElement, "active", true);
} }
})(); })();
// Google analytics // Google analytics
// For demo site (http://[www.]plyr.io) only // For demo site (http://[www.]plyr.io) only
if(document.domain.indexOf('plyr.io') > -1) { if (document.domain.indexOf("plyr.io") > -1) {
(function(i,s,o,g,r,a,m){i.GoogleAnalyticsObject=r;i[r]=i[r]||function(){ (function(i, s, o, g, r, a, m) {
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), i.GoogleAnalyticsObject = r;
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) (i[r] =
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); i[r] ||
ga('create', 'UA-40881672-11', 'auto'); function() {
ga('send', 'pageview'); (i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-40881672-11", "auto");
ga("send", "pageview");
} }

View File

@ -3,16 +3,16 @@
// ========================================================================== // ==========================================================================
@font-face { @font-face {
font-family: "Avenir"; font-family: 'Avenir';
src: url("//cdn.plyr.io/static/fonts/avenir-medium.woff2") format("woff2"), src: url('https://cdn.plyr.io/static/fonts/avenir-medium.woff2') format('woff2'), url('https://cdn.plyr.io/static/fonts/avenir-medium.woff') format('woff');
url("//cdn.plyr.io/static/fonts/avenir-medium.woff") format("woff");
font-style: normal; font-style: normal;
font-weight: @font-weight-base; font-weight: @font-weight-base;
font-display: swap;
} }
@font-face { @font-face {
font-family: "Avenir"; font-family: 'Avenir';
src: url("//cdn.plyr.io/static/fonts/avenir-bold.woff2") format("woff2"), src: url('https://cdn.plyr.io/static/fonts/avenir-bold.woff2') format('woff2'), url('https://cdn.plyr.io/static/fonts/avenir-bold.woff') format('woff');
url("//cdn.plyr.io/static/fonts/avenir-bold.woff") format("woff");
font-style: normal; font-style: normal;
font-weight: @font-weight-bold; font-weight: @font-weight-bold;
font-display: swap;
} }

2
dist/plyr.css vendored

File diff suppressed because one or more lines are too long

2
dist/plyr.js vendored

File diff suppressed because one or more lines are too long

View File

@ -4,72 +4,69 @@
/*global require, __dirname,Buffer*/ /*global require, __dirname,Buffer*/
/*jshint -W079 */ /*jshint -W079 */
var fs = require("fs"), var fs = require('fs'),
path = require("path"), path = require('path'),
gulp = require("gulp"), gulp = require('gulp'),
gutil = require("gulp-util"), gutil = require('gulp-util'),
concat = require("gulp-concat"), concat = require('gulp-concat'),
uglify = require("gulp-uglify"), uglify = require('gulp-uglify'),
less = require("gulp-less"), less = require('gulp-less'),
sass = require("gulp-sass"), sass = require('gulp-sass'),
cleanCSS = require("gulp-clean-css"), cleanCSS = require('gulp-clean-css'),
run = require("run-sequence"), run = require('run-sequence'),
prefix = require("gulp-autoprefixer"), prefix = require('gulp-autoprefixer'),
svgstore = require("gulp-svgstore"), svgstore = require('gulp-svgstore'),
svgmin = require("gulp-svgmin"), svgmin = require('gulp-svgmin'),
rename = require("gulp-rename"), rename = require('gulp-rename'),
s3 = require("gulp-s3"), s3 = require('gulp-s3'),
replace = require("gulp-replace"), replace = require('gulp-replace'),
open = require("gulp-open"), open = require('gulp-open'),
size = require("gulp-size"), size = require('gulp-size'),
through = require("through2"); through = require('through2');
var root = __dirname, var root = __dirname,
paths = { paths = {
plyr: { plyr: {
// Source paths // Source paths
src: { src: {
less: path.join(root, "src/less/**/*"), less: path.join(root, 'src/less/**/*'),
scss: path.join(root, "src/scss/**/*"), scss: path.join(root, 'src/scss/**/*'),
js: path.join(root, "src/js/**/*"), js: path.join(root, 'src/js/**/*'),
sprite: path.join(root, "src/sprite/*.svg") sprite: path.join(root, 'src/sprite/*.svg'),
},
// Output paths
output: path.join(root, 'dist/'),
}, },
// Output paths demo: {
output: path.join(root, "dist/") // Source paths
}, src: {
demo: { less: path.join(root, 'demo/src/less/**/*'),
// Source paths js: path.join(root, 'demo/src/js/**/*'),
src: { sprite: path.join(root, 'demo/src/sprite/**/*'),
less: path.join(root, "demo/src/less/**/*"), },
js: path.join(root, "demo/src/js/**/*"), // Output paths
sprite: path.join(root, "demo/src/sprite/**/*") output: path.join(root, 'demo/dist/'),
// Demo
root: path.join(root, 'demo/'),
}, },
// Output paths upload: [path.join(root, 'dist/**'), path.join(root, 'demo/dist/**')],
output: path.join(root, "demo/dist/"),
// Demo
root: path.join(root, "demo/")
}, },
upload: [path.join(root, "dist/**"), path.join(root, "demo/dist/**")] // Task arrays
}, tasks = {
less: [],
// Task arrays scss: [],
tasks = { js: [],
less: [], sprite: [],
scss: [], },
js: [], // Fetch bundles from JSON
sprite: [] bundles = loadJSON(path.join(root, 'bundles.json')),
}, package = loadJSON(path.join(root, 'package.json'));
// Fetch bundles from JSON
bundles = loadJSON(path.join(root, "bundles.json")),
package = loadJSON(path.join(root, "package.json"));
// Load json // Load json
function loadJSON(path) { function loadJSON(path) {
try { try {
return JSON.parse(fs.readFileSync(path)); return JSON.parse(fs.readFileSync(path));
} } catch (err) {
catch(err) {
return {}; return {};
} }
} }
@ -78,37 +75,39 @@ function loadJSON(path) {
// http://stackoverflow.com/questions/23230569/how-do-you-create-a-file-from-a-string-in-gulp // http://stackoverflow.com/questions/23230569/how-do-you-create-a-file-from-a-string-in-gulp
function createFile(filename, string) { function createFile(filename, string) {
var src = require('stream').Readable({ var src = require('stream').Readable({
objectMode: true objectMode: true,
}); });
src._read = function () { src._read = function() {
this.push(new gutil.File({ this.push(
cwd: "", new gutil.File({
base: "", cwd: '',
path: filename, base: '',
contents: new Buffer(string), path: filename,
// stats also required for some functions contents: new Buffer(string),
// https://nodejs.org/api/fs.html#fs_class_fs_stats // stats also required for some functions
stat: { // https://nodejs.org/api/fs.html#fs_class_fs_stats
size: string.length stat: {
} size: string.length,
})); },
}),
);
this.push(null); this.push(null);
} };
return src return src;
} }
var build = { var build = {
js: function (files, bundle) { js: function(files, bundle) {
for (var key in files) { for (var key in files) {
(function(key) { (function(key) {
var name = "js-" + key; var name = 'js-' + key;
tasks.js.push(name); tasks.js.push(name);
gulp.task(name, function () { gulp.task(name, function() {
return gulp return gulp
.src(bundles[bundle].js[key]) .src(bundles[bundle].js[key])
.pipe(concat(key)) .pipe(concat(key))
.pipe(uglify()) .pipe(uglify().on('error', gutil.log))
.pipe(gulp.dest(paths[bundle].output)); .pipe(gulp.dest(paths[bundle].output));
}); });
})(key); })(key);
@ -116,17 +115,17 @@ var build = {
}, },
less: function(files, bundle) { less: function(files, bundle) {
for (var key in files) { for (var key in files) {
(function (key) { (function(key) {
var name = "less-" + key; var name = 'less-' + key;
tasks.less.push(name); tasks.less.push(name);
gulp.task(name, function () { gulp.task(name, function() {
return gulp return gulp
.src(bundles[bundle].less[key]) .src(bundles[bundle].less[key])
.pipe(less()) .pipe(less())
.on("error", gutil.log) .on('error', gutil.log)
.pipe(concat(key)) .pipe(concat(key))
.pipe(prefix(["last 2 versions"], { cascade: true })) .pipe(prefix(['last 2 versions'], { cascade: true }))
.pipe(cleanCSS()) .pipe(cleanCSS())
.pipe(gulp.dest(paths[bundle].output)); .pipe(gulp.dest(paths[bundle].output));
}); });
@ -135,17 +134,17 @@ var build = {
}, },
scss: function(files, bundle) { scss: function(files, bundle) {
for (var key in files) { for (var key in files) {
(function (key) { (function(key) {
var name = "scss-" + key; var name = 'scss-' + key;
tasks.scss.push(name); tasks.scss.push(name);
gulp.task(name, function () { gulp.task(name, function() {
return gulp return gulp
.src(bundles[bundle].scss[key]) .src(bundles[bundle].scss[key])
.pipe(sass()) .pipe(sass())
.on("error", gutil.log) .on('error', gutil.log)
.pipe(concat(key)) .pipe(concat(key))
.pipe(prefix(["last 2 versions"], { cascade: true })) .pipe(prefix(['last 2 versions'], { cascade: true }))
.pipe(cleanCSS()) .pipe(cleanCSS())
.pipe(gulp.dest(paths[bundle].output)); .pipe(gulp.dest(paths[bundle].output));
}); });
@ -153,48 +152,52 @@ var build = {
} }
}, },
sprite: function(bundle) { sprite: function(bundle) {
var name = "sprite-" + bundle; var name = 'sprite-' + bundle;
tasks.sprite.push(name); tasks.sprite.push(name);
// Process Icons // Process Icons
gulp.task(name, function () { gulp.task(name, function() {
return gulp return gulp
.src(paths[bundle].src.sprite) .src(paths[bundle].src.sprite)
.pipe(svgmin({ .pipe(
plugins: [{ svgmin({
removeDesc: true plugins: [
}] {
})) removeDesc: true,
},
],
}),
)
.pipe(svgstore()) .pipe(svgstore())
.pipe(rename({ basename: bundle })) .pipe(rename({ basename: bundle }))
.pipe(gulp.dest(paths[bundle].output)); .pipe(gulp.dest(paths[bundle].output));
}); });
} },
}; };
// Plyr core files // Plyr core files
build.js(bundles.plyr.js, "plyr"); build.js(bundles.plyr.js, 'plyr');
build.less(bundles.plyr.less, "plyr"); build.less(bundles.plyr.less, 'plyr');
build.scss(bundles.plyr.scss, "plyr"); build.scss(bundles.plyr.scss, 'plyr');
build.sprite("plyr"); build.sprite('plyr');
// Demo files // Demo files
build.less(bundles.demo.less, "demo"); build.less(bundles.demo.less, 'demo');
build.js(bundles.demo.js, "demo"); build.js(bundles.demo.js, 'demo');
build.sprite("demo"); build.sprite('demo');
// Build all JS // Build all JS
gulp.task("js", function(){ gulp.task('js', function() {
run(tasks.js); run(tasks.js);
}); });
// Build SCSS (for testing, default is LESS) // Build SCSS (for testing, default is LESS)
gulp.task("scss", function(){ gulp.task('scss', function() {
run(tasks.scss); run(tasks.scss);
}); });
// Watch for file changes // Watch for file changes
gulp.task("watch", function () { gulp.task('watch', function() {
// Plyr core // Plyr core
gulp.watch(paths.plyr.src.js, tasks.js); gulp.watch(paths.plyr.src.js, tasks.js);
gulp.watch(paths.plyr.src.less, tasks.less); gulp.watch(paths.plyr.src.less, tasks.less);
@ -207,131 +210,144 @@ gulp.task("watch", function () {
}); });
// Default gulp task // Default gulp task
gulp.task("default", function(){ gulp.task('default', function() {
run(tasks.js, tasks.less, tasks.sprite, "watch"); run(tasks.js, tasks.less, tasks.sprite, 'watch');
}); });
// Publish a version to CDN and demo // Publish a version to CDN and demo
// -------------------------------------------- // --------------------------------------------
// Some options // Some options
var aws = loadJSON(path.join(root, "aws.json")), var aws = loadJSON(path.join(root, 'aws.json')),
version = package.version, version = package.version,
maxAge = 31536000, // seconds 1 year maxAge = 31536000, // seconds 1 year
options = { options = {
cdn: { cdn: {
headers: {
"Cache-Control": "max-age=" + maxAge,
"Vary": "Accept-Encoding"
}
},
demo: {
headers: {
"Cache-Control": "no-cache, no-store, must-revalidate, max-age=0",
"Vary": "Accept-Encoding"
}
},
symlinks: function(version, filename) {
return {
headers: { headers: {
// http://stackoverflow.com/questions/2272835/amazon-s3-object-redirect 'Cache-Control': 'max-age=' + maxAge,
"x-amz-website-redirect-location": "/" + version + "/" + filename, Vary: 'Accept-Encoding',
"Cache-Control": "no-cache, no-store, must-revalidate, max-age=0" },
} },
} demo: {
} headers: {
}; 'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0',
Vary: 'Accept-Encoding',
},
},
symlinks: function(version, filename) {
return {
headers: {
// http://stackoverflow.com/questions/2272835/amazon-s3-object-redirect
'x-amz-website-redirect-location': '/' + version + '/' + filename,
'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0',
},
};
},
};
// If aws is setup // If aws is setup
if("cdn" in aws) { if ('cdn' in aws) {
var regex = "(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-[\\da-z\\-]+(?:\.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:\.[\\da-z\\-]+)*)?", var regex = '(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*).(?:0|[1-9][0-9]*)(?:-[\\da-z\\-]+(?:.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:.[\\da-z\\-]+)*)?',
cdnpath = new RegExp(aws.cdn.domain + "\/" + regex, "gi"), cdnpath = new RegExp(aws.cdn.domain + '/' + regex, 'gi'),
semver = new RegExp("v" + regex, "gi"), semver = new RegExp('v' + regex, 'gi'),
localPath = new RegExp("(\.\.\/)?dist", "gi"), localPath = new RegExp('(../)?dist', 'gi'),
versionPath = "https://" + aws.cdn.domain + "/" + version; versionPath = 'https://' + aws.cdn.domain + '/' + version;
} }
// Publish version to CDN bucket // Publish version to CDN bucket
gulp.task("cdn", function () { gulp.task('cdn', function() {
console.log("Uploading " + version + " to " + aws.cdn.domain + "..."); console.log('Uploading ' + version + ' to ' + aws.cdn.domain + '...');
// Upload to CDN // Upload to CDN
return gulp.src(paths.upload) return gulp
.pipe(size({ .src(paths.upload)
showFiles: true, .pipe(
gzip: true size({
})) showFiles: true,
.pipe(rename(function (path) { gzip: true,
path.dirname = path.dirname.replace(".", version); }),
})) )
.pipe(
rename(function(path) {
path.dirname = path.dirname.replace('.', version);
}),
)
.pipe(replace(localPath, versionPath)) .pipe(replace(localPath, versionPath))
.pipe(s3(aws.cdn, options.cdn)); .pipe(s3(aws.cdn, options.cdn));
}); });
// Publish to demo bucket // Publish to demo bucket
gulp.task("demo", function () { gulp.task('demo', function() {
console.log("Uploading " + version + " demo to " + aws.demo.domain + "..."); console.log('Uploading ' + version + ' demo to ' + aws.demo.domain + '...');
// Replace versioned files in readme.md // Replace versioned files in readme.md
gulp.src([root + "/readme.md"]) gulp
.pipe(replace(cdnpath, aws.cdn.domain + "/" + version)) .src([root + '/readme.md'])
.pipe(replace(cdnpath, aws.cdn.domain + '/' + version))
.pipe(gulp.dest(root)); .pipe(gulp.dest(root));
// Replace versioned files in plyr.js // Replace versioned files in plyr.js
gulp.src(path.join(root, "src/js/plyr.js")) gulp
.pipe(replace(semver, "v" + version)) .src(path.join(root, 'src/js/plyr.js'))
.pipe(replace(cdnpath, aws.cdn.domain + "/" + version)) .pipe(replace(semver, 'v' + version))
.pipe(gulp.dest(path.join(root, "src/js/"))); .pipe(replace(cdnpath, aws.cdn.domain + '/' + version))
.pipe(gulp.dest(path.join(root, 'src/js/')));
// Replace local file paths with remote paths in demo HTML // Replace local file paths with remote paths in demo HTML
// e.g. "../dist/plyr.js" to "https://cdn.plyr.io/x.x.x/plyr.js" // e.g. "../dist/plyr.js" to "https://cdn.plyr.io/x.x.x/plyr.js"
gulp.src([paths.demo.root + "*.html"]) gulp
.src([paths.demo.root + '*.html'])
.pipe(replace(localPath, versionPath)) .pipe(replace(localPath, versionPath))
.pipe(s3(aws.demo, options.demo)); .pipe(s3(aws.demo, options.demo));
// Upload error.html to cdn (as well as demo site) // Upload error.html to cdn (as well as demo site)
return gulp.src([paths.demo.root + "error.html"]) return gulp
.src([paths.demo.root + 'error.html'])
.pipe(replace(localPath, versionPath)) .pipe(replace(localPath, versionPath))
.pipe(s3(aws.cdn, options.demo)); .pipe(s3(aws.cdn, options.demo));
}); });
// Open the demo site to check it's sweet // Open the demo site to check it's sweet
gulp.task("symlinks", function () { gulp.task('symlinks', function() {
console.log("Updating symlinks..."); console.log('Updating symlinks...');
return gulp.src(paths.upload) return gulp.src(paths.upload).pipe(
.pipe(through.obj(function (chunk, enc, callback) { through.obj(function(chunk, enc, callback) {
if (chunk.stat.isFile()) { if (chunk.stat.isFile()) {
// Get the filename // Get the filename
var filename = chunk.path.split("/").reverse()[0]; var filename = chunk.path.split('/').reverse()[0];
// Create the 0 byte redirect files to upload // Create the 0 byte redirect files to upload
createFile(filename, "") createFile(filename, '')
.pipe(rename(function (path) { .pipe(
path.dirname = path.dirname.replace(".", "latest"); rename(function(path) {
})) path.dirname = path.dirname.replace('.', 'latest');
}),
)
// Upload to S3 with correct headers // Upload to S3 with correct headers
.pipe(s3(aws.cdn, options.symlinks(version, filename))); .pipe(s3(aws.cdn, options.symlinks(version, filename)));
} }
callback(null, chunk); callback(null, chunk);
})); }),
);
}); });
// Open the demo site to check it's sweet // Open the demo site to check it's sweet
gulp.task("open", function () { gulp.task('open', function() {
console.log("Opening " + aws.demo.domain + "..."); console.log('Opening ' + aws.demo.domain + '...');
// A file must be specified or gulp will skip the task // A file must be specified or gulp will skip the task
// Doesn't matter which file since we set the URL above // Doesn't matter which file since we set the URL above
// Weird, I know... // Weird, I know...
return gulp.src([paths.demo.root + "index.html"]) return gulp.src([paths.demo.root + 'index.html']).pipe(
.pipe(open("", { open('', {
url: "http://" + aws.demo.domain url: 'http://' + aws.demo.domain,
})); }),
);
}); });
// Do everything // Do everything
gulp.task("publish", function () { gulp.task('publish', function() {
run(tasks.js, tasks.less, tasks.sprite, "cdn", "demo", "symlinks"); run(tasks.js, tasks.less, tasks.sprite, 'cdn', 'demo', 'symlinks');
}); });

4604
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +1,38 @@
{ {
"name": "plyr", "name": "plyr",
"version": "2.0.14", "version": "2.0.18",
"description": "A simple, accessible and customizable HTML5, YouTube and Vimeo media player", "description": "A simple, accessible and customizable HTML5, YouTube and Vimeo media player",
"homepage": "http://plyr.io", "homepage": "http://plyr.io",
"main": "src/js/plyr.js", "main": "src/js/plyr.js",
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {
"gulp": "^3.9.1", "gulp": "^3.9.1",
"gulp-autoprefixer": "^3.1.0", "gulp-autoprefixer": "^4.0.0",
"gulp-clean-css": "^2.0.6", "gulp-clean-css": "^3.9.0",
"gulp-concat": "^2.3.3", "gulp-concat": "^2.6.1",
"gulp-less": "^3.0.5", "gulp-less": "^3.3.2",
"gulp-open": "^2.0.0", "gulp-open": "^2.0.0",
"gulp-rename": "^1.2.0", "gulp-rename": "^1.2.2",
"gulp-replace": "^0.5.3", "gulp-replace": "^0.6.1",
"gulp-s3": "^0.3.0", "gulp-s3": "^0.11.0",
"gulp-sass": "^2.3.1", "gulp-sass": "^3.1.0",
"gulp-size": "^2.1.0", "gulp-size": "^2.1.0",
"gulp-svgmin": "^1.2.2", "gulp-svgmin": "^1.2.4",
"gulp-svgstore": "^5.0.5", "gulp-svgstore": "^6.1.0",
"gulp-uglify": "^1.5.3", "gulp-uglify": "^3.0.0",
"gulp-util": "^3.0.7", "gulp-util": "^3.0.8",
"run-sequence": "^1.1.5", "run-sequence": "^2.2.0",
"through2": "^2.0.1" "through2": "^2.0.3"
}, },
"keywords": ["HTML5 Video", "HTML5 Audio", "Media Player", "DASH", "Shaka", "WordPress", "HLS"], "keywords": [
"HTML5 Video",
"HTML5 Audio",
"Media Player",
"DASH",
"Shaka",
"WordPress",
"HLS"
],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/sampotts/plyr.git" "url": "git://github.com/sampotts/plyr.git"

View File

@ -5,7 +5,7 @@ A simple, accessible and customizable HTML5, YouTube and Vimeo media player.
[Checkout the demo](https://plyr.io) [Checkout the demo](https://plyr.io)
[![Image of Plyr](https://cdn.plyr.io/demo/screenshot.png)](https://plyr.io) [![Image of Plyr](https://cdn.plyr.io/static/demo/screenshot.png)](https://plyr.io)
## Why? ## Why?
We wanted a lightweight, accessible and customizable media player that supports [*modern*](#browser-support) browsers. Sure, there are many other players out there but we wanted to keep things simple, using the right elements for the job. We wanted a lightweight, accessible and customizable media player that supports [*modern*](#browser-support) browsers. Sure, there are many other players out there but we wanted to keep things simple, using the right elements for the job.
@ -63,6 +63,12 @@ Created and maintained by Jon Uhlmann ([@jonnitto](https://github.com/jonnitto))
### [Kirby](https://github.com/dpschen/kirby-plyrtag) ### [Kirby](https://github.com/dpschen/kirby-plyrtag)
Created and maintained by Dominik Pschenitschni ([@dpschen](https://github.com/dpschen)) Created and maintained by Dominik Pschenitschni ([@dpschen](https://github.com/dpschen))
### [React](https://github.com/xDae/react-plyr)
Created and maintained by Jose Miguel Bejarano ([@xDae](https://github.com/xDae))
### [Vue](https://github.com/redxtech/vue-plyr)
Created and maintained by Gabe Dunn ([@redxtech](https://github.com/redxtech))
## Using package managers ## Using package managers
You can grab the source using one of the following package managers. You can grab the source using one of the following package managers.
@ -137,7 +143,7 @@ Include the `plyr.js` script before the closing `</body>` tag and then call `ply
If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the JavaScript, you can use the following: If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the JavaScript, you can use the following:
```html ```html
<script src="https://cdn.plyr.io/2.0.14/plyr.js"></script> <script src="https://cdn.plyr.io/2.0.18/plyr.js"></script>
``` ```
### CSS ### CSS
@ -150,11 +156,11 @@ Include the `plyr.css` stylsheet into your `<head>`
If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the default CSS, you can use the following: If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the default CSS, you can use the following:
```html ```html
<link rel="stylesheet" href="https://cdn.plyr.io/2.0.14/plyr.css"> <link rel="stylesheet" href="https://cdn.plyr.io/2.0.18/plyr.css">
``` ```
### SVG Sprite ### SVG Sprite
The SVG sprite is loaded automatically from our CDN (provided by [Fastly](https://www.fastly.com/)). To change this, see the [options](#options) below. For reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/2.0.14/plyr.svg`. The SVG sprite is loaded automatically from our CDN (provided by [Fastly](https://www.fastly.com/)). To change this, see the [options](#options) below. For reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/2.0.18/plyr.svg`.
## Advanced ## Advanced
@ -229,7 +235,7 @@ Some touch browsers (particularly Mobile Safari on iOS) seem to have issues with
Options must be passed as an object to the `setup()` method as above or as JSON in `data-plyr` attribute on each of your target elements: Options must be passed as an object to the `setup()` method as above or as JSON in `data-plyr` attribute on each of your target elements:
```html ```html
<video data-plyr='{ title: "testing" }'></video> <video data-plyr='{ "title": "testing", "volume": 10 }'></video>
``` ```
Note the single quotes encapsulating the JSON and double quotes on the object keys. Note the single quotes encapsulating the JSON and double quotes on the object keys.
@ -302,7 +308,7 @@ Note the single quotes encapsulating the JSON and double quotes on the object ke
<td><code>autoplay</code></td> <td><code>autoplay</code></td>
<td>Boolean</td> <td>Boolean</td>
<td><code>false</code></td> <td><code>false</code></td>
<td>Autoplay the media on load. This is generally advised against on UX grounds. It is also disabled on iOS (an Apple limitation).</td> <td>Autoplay the media on load. This is generally advised against on UX grounds. It is also disabled on <a href="https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/">iOS and macOS</a> (an Apple limitation).</td>
</tr> </tr>
<tr> <tr>
<td><code>seekTime</code></td> <td><code>seekTime</code></td>
@ -1024,7 +1030,7 @@ Fullscreen in Plyr is supported by all browsers that [currently support it](http
The `enabled` option can be used to disable certain User Agents. For example, if you don't want to use Plyr for smartphones, you could use: The `enabled` option can be used to disable certain User Agents. For example, if you don't want to use Plyr for smartphones, you could use:
```javascript ```javascript
enabled: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) enabled: !/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)
``` ```
If a User Agent is disabled but supports `<video>` and `<audio>` natively, it will use the native player. If a User Agent is disabled but supports `<video>` and `<audio>` natively, it will use the native player.

File diff suppressed because it is too large Load Diff

View File

@ -3,13 +3,15 @@
// https://github.com/selz/plyr // https://github.com/selz/plyr
// ========================================================================== // ==========================================================================
@import "variables"; @import 'variables';
@import "mixins"; @import 'mixins';
// Animation // Animation
// --------------------------------------- // ---------------------------------------
@keyframes plyr-progress { @keyframes plyr-progress {
to { background-position: @plyr-progress-loading-size 0; } to {
background-position: @plyr-progress-loading-size 0;
}
} }
// Styles // Styles
@ -35,7 +37,10 @@
& when (@plyr-touch-action = true) { & when (@plyr-touch-action = true) {
// Fix 300ms delay // Fix 300ms delay
a, button, input, label { a,
button,
input,
label {
touch-action: manipulation; touch-action: manipulation;
} }
} }
@ -62,9 +67,9 @@
width: 100%; width: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
vertical-align: middle;
appearance: none; -webkit-appearance: none;
-moz-appearance: none;
cursor: pointer; cursor: pointer;
border: none; border: none;
background: transparent; background: transparent;
@ -221,7 +226,7 @@
width: 100%; width: 100%;
padding: (@plyr-control-spacing * 2); padding: (@plyr-control-spacing * 2);
transform: translateY(-(@plyr-control-spacing * 4)); transform: translateY(-(@plyr-control-spacing * 4));
transition: transform .3s ease; transition: transform 0.3s ease;
color: @plyr-captions-color; color: @plyr-captions-color;
font-size: @plyr-font-size-captions-base; font-size: @plyr-font-size-captions-base;
text-align: center; text-align: center;
@ -268,6 +273,11 @@
align-items: center; align-items: center;
line-height: 1; line-height: 1;
text-align: center; text-align: center;
pointer-events: none;
& > * {
pointer-events: all;
}
// Spacing // Spacing
> button, > button,
@ -282,7 +292,7 @@
.plyr__volume { .plyr__volume {
margin-left: (@plyr-control-spacing / 2); margin-left: (@plyr-control-spacing / 2);
} }
[data-plyr="pause"] { [data-plyr='pause'] {
margin-left: 0; margin-left: 0;
} }
@ -298,7 +308,7 @@
background: transparent; background: transparent;
border-radius: 3px; border-radius: 3px;
cursor: pointer; cursor: pointer;
transition: background .3s ease, color .3s ease, opacity .3s ease; transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease;
color: inherit; color: inherit;
svg { svg {
@ -347,7 +357,7 @@
border-bottom-left-radius: inherit; border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit; border-bottom-right-radius: inherit;
color: @plyr-video-control-color; color: @plyr-video-control-color;
transition: opacity .3s ease; transition: opacity 0.3s ease;
button { button {
// Hover and tab focus // Hover and tab focus
@ -391,7 +401,7 @@
border-radius: 100%; border-radius: 100%;
box-shadow: 0 1px 1px fade(#000, 15%); box-shadow: 0 1px 1px fade(#000, 15%);
color: @plyr-video-control-color; color: @plyr-video-control-color;
transition: all .3s ease; transition: all 0.3s ease;
svg { svg {
position: relative; position: relative;
@ -465,9 +475,9 @@
font-size: @plyr-font-size-small; font-size: @plyr-font-size-small;
line-height: 1.3; line-height: 1.3;
transform: translate(-50%, 10px) scale(.8); transform: translate(-50%, 10px) scale(0.8);
transform-origin: 50% 100%; transform-origin: 50% 100%;
transition: transform .2s .1s ease, opacity .2s .1s ease; transition: transform 0.2s 0.1s ease, opacity 0.2s 0.1s ease;
&::before { &::before {
// Arrows // Arrows
@ -499,7 +509,7 @@
// First tooltip // First tooltip
.plyr__controls button:first-child .plyr__tooltip { .plyr__controls button:first-child .plyr__tooltip {
left: 0; left: 0;
transform: translate(0, 10px) scale(.8); transform: translate(0, 10px) scale(0.8);
transform-origin: 0 100%; transform-origin: 0 100%;
&::before { &::before {
@ -510,7 +520,7 @@
// Last tooltip // Last tooltip
.plyr__controls button:last-child .plyr__tooltip { .plyr__controls button:last-child .plyr__tooltip {
right: 0; right: 0;
transform: translate(0, 10px) scale(.8); transform: translate(0, 10px) scale(0.8);
transform-origin: 100% 100%; transform-origin: 100% 100%;
&::before { &::before {
@ -529,7 +539,6 @@
} }
} }
// Playback progress // Playback progress
// -------------------------------------------------------------- // --------------------------------------------------------------
// <progress> element // <progress> element
@ -538,7 +547,7 @@
display: none; display: none;
flex: 1; flex: 1;
input[type="range"] { input[type='range'] {
position: relative; position: relative;
z-index: 2; z-index: 2;
@ -573,7 +582,8 @@
margin: -(@plyr-range-track-height / 2) 0 0; margin: -(@plyr-range-track-height / 2) 0 0;
padding: 0; padding: 0;
vertical-align: top; vertical-align: top;
appearance: none; -webkit-appearance: none;
-moz-appearance: none;
border: none; border: none;
border-radius: 100px; border-radius: 100px;
@ -621,13 +631,13 @@
} }
.plyr__progress--buffer { .plyr__progress--buffer {
&::-webkit-progress-value { &::-webkit-progress-value {
transition: width .2s ease; transition: width 0.2s ease;
} }
&::-moz-progress-bar { &::-moz-progress-bar {
transition: width .2s ease; transition: width 0.2s ease;
} }
&::-ms-fill { &::-ms-fill {
transition: width .2s ease; transition: width 0.2s ease;
} }
} }
.plyr--video .plyr__progress--buffer, .plyr--video .plyr__progress--buffer,
@ -658,7 +668,8 @@
@plyr-progress-loading-bg 50%, @plyr-progress-loading-bg 50%,
@plyr-progress-loading-bg 75%, @plyr-progress-loading-bg 75%,
transparent 75%, transparent 75%,
transparent); transparent
);
color: transparent; color: transparent;
} }
.plyr--video.plyr--loading .plyr__progress--buffer { .plyr--video.plyr--loading .plyr__progress--buffer {
@ -699,7 +710,7 @@
flex: 1; flex: 1;
position: relative; position: relative;
input[type="range"] { input[type='range'] {
position: relative; position: relative;
z-index: 2; z-index: 2;
} }
@ -723,14 +734,8 @@
// Fullscreen // Fullscreen
// -------------------------------------------------------------- // --------------------------------------------------------------
.plyr--fullscreen-active { .plyr--fullscreen-active {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 100%; height: 100%;
width: 100%; width: 100%;
z-index: 10000000;
background: #000; background: #000;
border-radius: 0 !important; border-radius: 0 !important;
@ -745,12 +750,6 @@
// Revert overflow change // Revert overflow change
overflow: visible; overflow: visible;
} }
.plyr__controls {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
// Vimeo requires some different styling // Vimeo requires some different styling
&.plyr--vimeo .plyr__video-wrapper { &.plyr--vimeo .plyr__video-wrapper {
@ -759,3 +758,13 @@
transform: translateY(-50%); transform: translateY(-50%);
} }
} }
// Fallback for unsupported browsers
.plyr--fullscreen-fallback.plyr--fullscreen-active {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10000000;
}

View File

@ -9,7 +9,9 @@
// Animation // Animation
// --------------------------------------- // ---------------------------------------
@keyframes plyr-progress { @keyframes plyr-progress {
to { background-position: $plyr-progress-loading-size 0; } to {
background-position: $plyr-progress-loading-size 0;
}
} }
// Styles // Styles
@ -34,10 +36,13 @@
} }
@if $plyr-touch-action == true { @if $plyr-touch-action == true {
// Fix 300ms delay // Fix 300ms delay
a, button, input, label { a,
touch-action: manipulation; button,
} input,
label {
touch-action: manipulation;
}
} }
// Focus // Focus
@ -56,7 +61,7 @@
// Range inputs // Range inputs
// Specificity is for bootstrap compatibility // Specificity is for bootstrap compatibility
input[type='range'] { input[type="range"] {
display: block; display: block;
height: ($plyr-range-thumb-height * $plyr-range-thumb-active-scale); height: ($plyr-range-thumb-height * $plyr-range-thumb-active-scale);
width: 100%; width: 100%;
@ -137,13 +142,13 @@
} }
// Video range inputs // Video range inputs
.plyr--video input[type='range'].tab-focus:focus { .plyr--video input[type="range"].tab-focus:focus {
outline: 1px dotted transparentize($plyr-video-control-color, .5); outline: 1px dotted transparentize($plyr-video-control-color, 0.5);
} }
// Audio range inputs // Audio range inputs
.plyr--audio input[type='range'].tab-focus:focus { .plyr--audio input[type="range"].tab-focus:focus {
outline: 1px dotted transparentize($plyr-audio-control-color, .5); outline: 1px dotted transparentize($plyr-audio-control-color, 0.5);
} }
// Screen reader only elements // Screen reader only elements
@ -220,7 +225,7 @@
width: 100%; width: 100%;
padding: ($plyr-control-spacing * 2); padding: ($plyr-control-spacing * 2);
transform: translateY(-($plyr-control-spacing * 6)); transform: translateY(-($plyr-control-spacing * 6));
transition: transform .3s ease; transition: transform 0.3s ease;
color: $plyr-captions-color; color: $plyr-captions-color;
font-size: $plyr-font-size-captions-base; font-size: $plyr-font-size-captions-base;
text-align: center; text-align: center;
@ -267,7 +272,12 @@
align-items: center; align-items: center;
line-height: 1; line-height: 1;
text-align: center; text-align: center;
pointer-events: none;
& > * {
pointer-events: all;
}
// Spacing // Spacing
> button, > button,
.plyr__progress, .plyr__progress,
@ -292,12 +302,12 @@
flex-shrink: 0; flex-shrink: 0;
overflow: visible; // IE11 overflow: visible; // IE11
vertical-align: middle; vertical-align: middle;
padding: ($plyr-control-spacing * .7); padding: ($plyr-control-spacing * 0.7);
border: 0; border: 0;
background: transparent; background: transparent;
border-radius: 3px; border-radius: 3px;
cursor: pointer; cursor: pointer;
transition: background .3s ease, color .3s ease, opacity .3s ease; transition: background 0.3s ease, color 0.3s ease, opacity 0.3s ease;
color: inherit; color: inherit;
svg { svg {
@ -341,11 +351,14 @@
right: 0; right: 0;
bottom: 0; bottom: 0;
padding: ($plyr-control-spacing * 5) $plyr-control-spacing $plyr-control-spacing; padding: ($plyr-control-spacing * 5) $plyr-control-spacing $plyr-control-spacing;
background: linear-gradient(transparentize($plyr-video-controls-bg, 1), transparentize($plyr-video-controls-bg, .5)); background: linear-gradient(
transparentize($plyr-video-controls-bg, 1),
transparentize($plyr-video-controls-bg, 0.5)
);
border-bottom-left-radius: inherit; border-bottom-left-radius: inherit;
border-bottom-right-radius: inherit; border-bottom-right-radius: inherit;
color: $plyr-video-control-color; color: $plyr-video-control-color;
transition: opacity .3s ease; transition: opacity 0.3s ease;
button { button {
// Hover and tab focus // Hover and tab focus
@ -387,9 +400,9 @@
background: $plyr-video-control-bg-hover; background: $plyr-video-control-bg-hover;
border: 4px solid currentColor; border: 4px solid currentColor;
border-radius: 100%; border-radius: 100%;
box-shadow: 0 1px 1px transparentize(#000, .85); box-shadow: 0 1px 1px transparentize(#000, 0.85);
color: $plyr-video-control-color; color: $plyr-video-control-color;
transition: all .3s ease; transition: all 0.3s ease;
svg { svg {
position: relative; position: relative;
@ -401,7 +414,7 @@
} }
&:focus { &:focus {
outline: 1px dotted transparentize($plyr-video-control-color, .5); outline: 1px dotted transparentize($plyr-video-control-color, 0.5);
} }
} }
.plyr .plyr__play-large { .plyr .plyr__play-large {
@ -416,11 +429,11 @@
} }
// States // States
.plyr__controls [data-plyr='pause'], .plyr__controls [data-plyr="pause"],
.plyr--playing .plyr__controls [data-plyr='play'] { .plyr--playing .plyr__controls [data-plyr="play"] {
display: none; display: none;
} }
.plyr--playing .plyr__controls [data-plyr='pause'] { .plyr--playing .plyr__controls [data-plyr="pause"] {
display: inline-block; display: inline-block;
} }
@ -436,12 +449,12 @@
} }
// Some options are hidden by default // Some options are hidden by default
.plyr [data-plyr='captions'], .plyr [data-plyr="captions"],
.plyr [data-plyr='fullscreen'] { .plyr [data-plyr="fullscreen"] {
display: none; display: none;
} }
.plyr--captions-enabled [data-plyr='captions'], .plyr--captions-enabled [data-plyr="captions"],
.plyr--fullscreen-enabled [data-plyr='fullscreen'] { .plyr--fullscreen-enabled [data-plyr="fullscreen"] {
display: inline-block; display: inline-block;
} }
@ -463,13 +476,13 @@
font-size: $plyr-font-size-small; font-size: $plyr-font-size-small;
line-height: 1.3; line-height: 1.3;
transform: translate(-50%, 10px) scale(.8); transform: translate(-50%, 10px) scale(0.8);
transform-origin: 50% 100%; transform-origin: 50% 100%;
transition: transform .2s .1s ease, opacity .2s .1s ease; transition: transform 0.2s 0.1s ease, opacity 0.2s 0.1s ease;
&::before { &::before {
// Arrows // Arrows
content: ''; content: "";
position: absolute; position: absolute;
width: 0; width: 0;
height: 0; height: 0;
@ -497,7 +510,7 @@
// First tooltip // First tooltip
.plyr__controls button:first-child .plyr__tooltip { .plyr__controls button:first-child .plyr__tooltip {
left: 0; left: 0;
transform: translate(0, 10px) scale(.8); transform: translate(0, 10px) scale(0.8);
transform-origin: 0 100%; transform-origin: 0 100%;
&::before { &::before {
@ -508,7 +521,7 @@
// Last tooltip // Last tooltip
.plyr__controls button:last-child .plyr__tooltip { .plyr__controls button:last-child .plyr__tooltip {
right: 0; right: 0;
transform: translate(0, 10px) scale(.8); transform: translate(0, 10px) scale(0.8);
transform-origin: 100% 100%; transform-origin: 100% 100%;
&::before { &::before {
@ -618,13 +631,13 @@
} }
.plyr__progress--buffer { .plyr__progress--buffer {
&::-webkit-progress-value { &::-webkit-progress-value {
transition: width .2s ease; transition: width 0.2s ease;
} }
&::-moz-progress-bar { &::-moz-progress-bar {
transition: width .2s ease; transition: width 0.2s ease;
} }
&::-ms-fill { &::-ms-fill {
transition: width .2s ease; transition: width 0.2s ease;
} }
} }
.plyr--video .plyr__progress--buffer, .plyr--video .plyr__progress--buffer,
@ -655,7 +668,8 @@
$plyr-progress-loading-bg 50%, $plyr-progress-loading-bg 50%,
$plyr-progress-loading-bg 75%, $plyr-progress-loading-bg 75%,
transparent 75%, transparent 75%,
transparent); transparent
);
color: transparent; color: transparent;
} }
.plyr--video.plyr--loading .plyr__progress--buffer { .plyr--video.plyr--loading .plyr__progress--buffer {
@ -682,7 +696,7 @@
// Add a slash in before // Add a slash in before
&::before { &::before {
content: '\2044'; content: "\2044";
margin-right: $plyr-control-spacing; margin-right: $plyr-control-spacing;
} }
} }
@ -713,21 +727,15 @@
// It's not supported to change volume using JavaScript: // It's not supported to change volume using JavaScript:
// https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html
.plyr--is-ios .plyr__volume, .plyr--is-ios .plyr__volume,
.plyr--is-ios [data-plyr='mute'] { .plyr--is-ios [data-plyr="mute"] {
display: none !important; display: none !important;
} }
// Fullscreen // Fullscreen
// -------------------------------------------------------------- // --------------------------------------------------------------
.plyr--fullscreen-active { .plyr--fullscreen-active {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 100%; height: 100%;
width: 100%; width: 100%;
z-index: 10000000;
background: #000; background: #000;
border-radius: 0 !important; border-radius: 0 !important;
@ -742,12 +750,6 @@
// Revert overflow change // Revert overflow change
overflow: visible; overflow: visible;
} }
.plyr__controls {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
// Vimeo requires some different styling // Vimeo requires some different styling
&.plyr--vimeo .plyr__video-wrapper { &.plyr--vimeo .plyr__video-wrapper {
@ -756,3 +758,13 @@
transform: translateY(-50%); transform: translateY(-50%);
} }
} }
// Fallback for unsupported browsers
.plyr--fullscreen-fallback.plyr--fullscreen-active {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10000000;
}