Compare commits

..

9 Commits

Author SHA1 Message Date
a9bb8afca4 v2.0.11 2016-11-27 20:18:30 +11:00
28cd92b708 Merge branch 'master' of https://github.com/Selz/plyr 2016-11-27 20:15:19 +11:00
a44c7ecc3a Fix for iPad and YouTube issues 2016-11-27 20:15:15 +11:00
5214c5d55d Merge pull request #425 from sebastiancarlsson/cleanup-called-twice-bug
fixes bug where cleanUp would be called twice
2016-11-18 09:40:34 +11:00
3e6ed7b69b fixes bug where cleanUp would be called twice 2016-11-17 15:43:26 +01:00
7d2a8d343a Update 2016-11-16 09:41:06 +11:00
03aacf483f Update readme.md 2016-11-16 09:40:09 +11:00
73a1391f2f Update readme.md 2016-11-02 18:45:37 +11:00
660ff0434d Cache bust 2016-11-02 18:29:38 +11:00
10 changed files with 155 additions and 116 deletions

View File

@ -1,5 +1,9 @@
# Changelog # Changelog
## v2.0.11
- Fix for `cleanUp` being called twice (thanks to @sebastiancarlsson)
- Fix for YouTube controls on iPad (fixes #391)
## v2.0.10 ## v2.0.10
- Added seek event fixes for Vimeo and YouTube (fixes #409) - Added seek event fixes for Vimeo and YouTube (fixes #409)
- Added support for embed URLs rather than ID only (fixes #345) - Added support for embed URLs rather than ID only (fixes #345)
@ -21,10 +25,10 @@
## v2.0.6 ## v2.0.6
- Fixed merge issue with `Updated define to work with AMD imports #326` PR - Fixed merge issue with `Updated define to work with AMD imports #326` PR
- Code formatting - Code formatting
## v2.0.5 ## v2.0.5
- Fix for Vimeo in IE9 & IE10 - Fix for Vimeo in IE9 & IE10
- Fix for HTML5 elements not firing `ready` event - Fix for HTML5 elements not firing `ready` event
## v2.0.4 ## v2.0.4
@ -44,8 +48,8 @@ This version contains several potential ***breaking changes***:
- `setup()` has been reverted to pre v1.8.0 behaviour; meaning it will return the *instance* rather than the *element*. This is because the reference to the instance is no longer added to the original element (see below). - `setup()` has been reverted to pre v1.8.0 behaviour; meaning it will return the *instance* rather than the *element*. This is because the reference to the instance is no longer added to the original element (see below).
- The reference to the `plyr` instance is now added to the media element rather than original container. This is because if a container with multiple children was passed to `setup()` the references to all instances would have been added to the container, creating issues. I would recommend using the return value from `setup()` or the new `get()` method to access the instance. - The reference to the `plyr` instance is now added to the media element rather than original container. This is because if a container with multiple children was passed to `setup()` the references to all instances would have been added to the container, creating issues. I would recommend using the return value from `setup()` or the new `get()` method to access the instance.
- Players will always be wrapped in their own div now - this makes `setup()` and `destroy()` cleaner. This *may* break any custom styling based on DOM position. - Players will always be wrapped in their own div now - this makes `setup()` and `destroy()` cleaner. This *may* break any custom styling based on DOM position.
- Players no longer seek to 0 on 'ended' - this is to fix a bug with Microsoft Edge as it triggers 'ended' on media change for whatever reason. They'll never change ;-) - Players no longer seek to 0 on 'ended' - this is to fix a bug with Microsoft Edge as it triggers 'ended' on media change for whatever reason. They'll never change ;-)
And some other changes and bug fixes: And some other changes and bug fixes:
@ -75,7 +79,7 @@ And some other changes and bug fixes:
## v1.8.11 ## v1.8.11
- Fix for keyboard navigation on Vimeo (Fixes #317) - Fix for keyboard navigation on Vimeo (Fixes #317)
- Fix for bug introduced in v1.8.9 related to additional controls - Fix for bug introduced in v1.8.9 related to additional controls
- Vimeo API upgrade - Vimeo API upgrade
- Fix for YouTube bug introduced in v1.8.9 - Fix for YouTube bug introduced in v1.8.9
- Added support for passing array to .setup() (Fixes #319) - Added support for passing array to .setup() (Fixes #319)
@ -115,20 +119,20 @@ And some other changes and bug fixes:
- Improvements for controls hiding and showing on touch devices - Improvements for controls hiding and showing on touch devices
## v1.8.2 ## v1.8.2
- Fixed event bubbling - Fixed event bubbling
## v1.8.1 ## v1.8.1
- Fixed inaccurate log message - Fixed inaccurate log message
# v1.8.0 # v1.8.0
- ***(Important)*** `setup()` now returns the element Plyr was setup on rather than the `plyr` object. This means `var player = plyr.setup()[0];` would now be `var player = plyr.setup()[0].plyr;`. This improves support for React and other virtual dom frameworks as mentioned in #254 - ***(Important)*** `setup()` now returns the element Plyr was setup on rather than the `plyr` object. This means `var player = plyr.setup()[0];` would now be `var player = plyr.setup()[0].plyr;`. This improves support for React and other virtual dom frameworks as mentioned in #254
- Fixed using a relative URL for `iconUrl` in IE (fixes #269) - Fixed using a relative URL for `iconUrl` in IE (fixes #269)
# v1.7.0 # v1.7.0
- SASS cleanup (fixes #265) - SASS cleanup (fixes #265)
- Docs tidy up to help quick start (fixes #253) - Docs tidy up to help quick start (fixes #253)
- Fix for issues with data attribute options passing (fixes #257) - Fix for issues with data attribute options passing (fixes #257)
- ***(Important)*** Removed the requirement for a wrapper div to setup Plyr and removed the dependency on the `plyr` classname as a JS hook. By default it will now look for `<video>`, `<audio>` and `[data-type]` elements. If you are just calling `setup()` with a `<div class="plyr">` you may want to give it a good test after upgrading. You can probably remove the wrapper div. The reason behind this is to make setup easier for newcomers and prevent the styling being used on unsupported players (because the plyr classname was used as a CSS and JS hook - which isn't ideal) - ***(Important)*** Removed the requirement for a wrapper div to setup Plyr and removed the dependency on the `plyr` classname as a JS hook. By default it will now look for `<video>`, `<audio>` and `[data-type]` elements. If you are just calling `setup()` with a `<div class="plyr">` you may want to give it a good test after upgrading. You can probably remove the wrapper div. The reason behind this is to make setup easier for newcomers and prevent the styling being used on unsupported players (because the plyr classname was used as a CSS and JS hook - which isn't ideal)
- Renamed the 'docs' folder to `demo` to avoid confusion - the readme is the docs after all - Renamed the 'docs' folder to `demo` to avoid confusion - the readme is the docs after all
## v1.6.20 ## v1.6.20
@ -158,7 +162,7 @@ And some other changes and bug fixes:
- Decreased sensitivity and inverted scroll on volume slider (scroll up to increase, down to decrease) - Decreased sensitivity and inverted scroll on volume slider (scroll up to increase, down to decrease)
## v1.6.12 ## v1.6.12
- Fix for undefined buffer error - Fix for undefined buffer error
- Add scroll listener on volume slider (PR #227 bty @igoradamenko) - Add scroll listener on volume slider (PR #227 bty @igoradamenko)
## v1.6.11 ## v1.6.11
@ -200,13 +204,13 @@ And some other changes and bug fixes:
- Other minor bug fixes - Other minor bug fixes
## v1.6.1 ## v1.6.1
- Tooltip changes for accessibility - Tooltip changes for accessibility
## v1.6.0 ## v1.6.0
- New, cleaner, UI: - New, cleaner, UI:
- Controls are now overlaid, maintaining the video's ratio and making sizing easier - Controls are now overlaid, maintaining the video's ratio and making sizing easier
- A large play button can now be overlaid over videos - A large play button can now be overlaid over videos
- Default number of control buttons reduced - Default number of control buttons reduced
- New play, pause, rewind and fast forward icons - New play, pause, rewind and fast forward icons
- Flexbox all the things! - Flexbox all the things!
- Tidied up the LESS (and SCSS) as part of the above, variables and mixins in seprate files amking customization and upgrades easier - Tidied up the LESS (and SCSS) as part of the above, variables and mixins in seprate files amking customization and upgrades easier

View File

@ -51,7 +51,7 @@
</ul> </ul>
</nav> </nav>
<section> <section>
<video poster="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg" controls crossorigin> <video poster="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg?v1" controls crossorigin>
<!-- Video files --> <!-- Video files -->
<source src="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4" type="video/mp4"> <source src="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4" type="video/mp4">
<source src="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.webm" type="video/webm"> <source src="https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.webm" type="video/webm">

View File

@ -9,7 +9,7 @@
// General functions // General functions
;(function() { ;(function() {
//document.body.addEventListener('ready', function(event) { console.log(event); }); //document.body.addEventListener('ready', function(event) { console.log(event); });
// Setup the player // Setup the player
var instances = plyr.setup({ var instances = plyr.setup({
debug: true, debug: true,

2
dist/plyr.css vendored

File diff suppressed because one or more lines are too long

4
dist/plyr.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{ {
"name": "plyr", "name": "plyr",
"version": "2.0.10", "version": "2.0.11",
"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",

View File

@ -31,11 +31,12 @@ Oh and yes, it works with Bootstrap.
Check out the [changelog](changelog.md) to see what's new with Plyr. Check out the [changelog](changelog.md) to see what's new with Plyr.
## Features currently being developed ## Features currently being developed
- Playback speed (#53) - Playback speed selection
- Quality selection (#218) - Quality selection
- Caption language selection (#385) - Caption language selection
- AirPlay - AirPlay
- Picture in Picture (MacOS Sierra + Safari) (#366) - Picture in Picture (MacOS Sierra + Safari)
[more info](https://github.com/Selz/plyr/issues?q=is%3Aissue+is%3Aopen+label%3A%22In+Development%22) [more info](https://github.com/Selz/plyr/issues?q=is%3Aissue+is%3Aopen+label%3A%22In+Development%22)
## Planned features ## Planned features
@ -131,10 +132,10 @@ Include the `plyr.js` script before the closing `</body>` tag and then call `ply
<script>plyr.setup();</script> <script>plyr.setup();</script>
``` ```
If you want to use our CDN 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.10/plyr.js"></script> <script src="https://cdn.plyr.io/2.0.11/plyr.js"></script>
``` ```
### CSS ### CSS
@ -144,14 +145,14 @@ Include the `plyr.css` stylsheet into your `<head>`
<link rel="stylesheet" href="path/to/plyr.css"> <link rel="stylesheet" href="path/to/plyr.css">
``` ```
If you want to use our CDN 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.10/plyr.css"> <link rel="stylesheet" href="https://cdn.plyr.io/2.0.11/plyr.css">
``` ```
### SVG Sprite ### SVG Sprite
The SVG sprite is loaded automatically from our CDN. To change this, see the [options](#Options) below. For reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/2.0.10/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.11/plyr.svg`.
## Advanced ## Advanced
@ -1066,5 +1067,7 @@ Also these links helped created Plyr:
- [Media Events - W3.org](http://www.w3.org/2010/05/video/mediaevents.html) - [Media Events - W3.org](http://www.w3.org/2010/05/video/mediaevents.html)
- [Styling the `<progress>` element - hongkiat.com](http://www.hongkiat.com/blog/html5-progress-bar/) - [Styling the `<progress>` element - hongkiat.com](http://www.hongkiat.com/blog/html5-progress-bar/)
Thanks to [Fastly](https://www.fastly.com/) for providing the CDN services.
## Copyright and License ## Copyright and License
[The MIT license](license.md). [The MIT license](license.md).

View File

@ -1,6 +1,6 @@
// ========================================================================== // ==========================================================================
// Plyr // Plyr
// plyr.js v2.0.10 // plyr.js v2.0.11
// https://github.com/selz/plyr // https://github.com/selz/plyr
// License: The MIT License (MIT) // License: The MIT License (MIT)
// ========================================================================== // ==========================================================================
@ -25,7 +25,7 @@
'use strict'; 'use strict';
// Globals // Globals
var fullscreen, var fullscreen,
scroll = { x: 0, y: 0 }, scroll = { x: 0, y: 0 },
// Default config // Default config
@ -36,14 +36,14 @@
loop: false, loop: false,
seekTime: 10, seekTime: 10,
volume: 10, volume: 10,
volumeMin: 0, volumeMin: 0,
volumeMax: 10, volumeMax: 10,
volumeStep: 1, volumeStep: 1,
duration: null, duration: null,
displayDuration: true, displayDuration: true,
loadSprite: true, loadSprite: true,
iconPrefix: 'plyr', iconPrefix: 'plyr',
iconUrl: 'https://cdn.plyr.io/2.0.10/plyr.svg', iconUrl: 'https://cdn.plyr.io/2.0.11/plyr.svg',
clickToPlay: true, clickToPlay: true,
hideControls: true, hideControls: true,
showPosterOnEnd: false, showPosterOnEnd: false,
@ -257,6 +257,7 @@
isChrome: isChrome, isChrome: isChrome,
isSafari: isSafari, isSafari: isSafari,
isIos: /(iPad|iPhone|iPod)/g.test(navigator.platform), isIos: /(iPad|iPhone|iPod)/g.test(navigator.platform),
isIphone: /(iPhone|iPod)/g.test(navigator.userAgent),
isTouch: 'ontouchstart' in document.documentElement isTouch: 'ontouchstart' in document.documentElement
}; };
} }
@ -493,9 +494,9 @@
} }
// Create and dispatch the event // Create and dispatch the event
var event = new CustomEvent(type, { var event = new CustomEvent(type, {
bubbles: bubbles, bubbles: bubbles,
detail: properties detail: properties
}); });
// Dispatch the event // Dispatch the event
@ -568,7 +569,7 @@
// Check variable types // Check variable types
var _is = { var _is = {
object: function(input) { object: function(input) {
return input !== null && typeof(input) === 'object'; return input !== null && typeof(input) === 'object';
}, },
array: function(input) { array: function(input) {
return input !== null && (typeof(input) === 'object' && input.constructor === Array); return input !== null && (typeof(input) === 'object' && input.constructor === Array);
@ -713,7 +714,7 @@
timers = {}, timers = {},
api; api;
// Set media // Set media
plyr.media = media; plyr.media = media;
var original = media.cloneNode(true); var original = media.cloneNode(true);
@ -732,7 +733,7 @@
if (_is.string(config.logPrefix) && config.logPrefix.length) { if (_is.string(config.logPrefix) && config.logPrefix.length) {
args.unshift(config.logPrefix); args.unshift(config.logPrefix);
} }
console[type].apply(console, args); console[type].apply(console, args);
} }
} }
@ -1037,7 +1038,7 @@
var captions = [], var captions = [],
caption, caption,
req = xhr.responseText; req = xhr.responseText;
//According to webvtt spec, line terminator consists of one of the following //According to webvtt spec, line terminator consists of one of the following
// CRLF (U+000D U+000A), LF (U+000A) or CR (U+000D) // CRLF (U+000D U+000A), LF (U+000A) or CR (U+000D)
var lineSeparator = '\r\n'; var lineSeparator = '\r\n';
@ -1048,7 +1049,7 @@
lineSeparator = '\n'; lineSeparator = '\n';
} }
} }
captions = req.split(lineSeparator+lineSeparator); captions = req.split(lineSeparator+lineSeparator);
for (var r = 0; r < captions.length; r++) { for (var r = 0; r < captions.length; r++) {
@ -1530,7 +1531,7 @@
mediaId = _parseVimeoId(plyr.embedId); mediaId = _parseVimeoId(plyr.embedId);
break; break;
default: default:
mediaId = plyr.embedId; mediaId = plyr.embedId;
} }
@ -1819,7 +1820,7 @@
plyr.embed.stop(); plyr.embed.stop();
plyr.media.paused = true; plyr.media.paused = true;
}; };
plyr.media.paused = true; plyr.media.paused = true;
plyr.media.currentTime = 0; plyr.media.currentTime = 0;
@ -1835,7 +1836,7 @@
plyr.embed.getDuration().then(function(value) { plyr.embed.getDuration().then(function(value) {
plyr.media.duration = value; plyr.media.duration = value;
// Trigger timeupdate // Trigger timeupdate
_triggerEvent(plyr.media, 'durationchange'); _triggerEvent(plyr.media, 'durationchange');
}); });
@ -1898,7 +1899,7 @@
plyr.embed = window.SC.Widget(this); plyr.embed = window.SC.Widget(this);
// Setup on ready // Setup on ready
plyr.embed.bind(window.SC.Widget.Events.READY, function() { plyr.embed.bind(window.SC.Widget.Events.READY, function() {
// Create a faux HTML5 API using the Soundcloud API // Create a faux HTML5 API using the Soundcloud API
plyr.media.play = function() { plyr.media.play = function() {
plyr.embed.play(); plyr.embed.play();
@ -2035,7 +2036,7 @@
targetTime = duration; targetTime = duration;
} }
// Update seek range and progress // Update seek range and progress
_updateSeekDisplay(targetTime); _updateSeekDisplay(targetTime);
// Set the current time // Set the current time
@ -2126,7 +2127,7 @@
function _toggleFullscreen(event) { function _toggleFullscreen(event) {
// Check for native support // Check for native support
var nativeSupport = fullscreen.supportsFullScreen; var nativeSupport = fullscreen.supportsFullScreen;
if (nativeSupport) { if (nativeSupport) {
// If it's a fullscreen change event, update the UI // If it's a fullscreen change event, update the UI
if (event && event.type === fullscreen.fullScreenEventName) { if (event && event.type === fullscreen.fullScreenEventName) {
@ -2424,7 +2425,7 @@
if (!plyr.supported.full) { if (!plyr.supported.full) {
return; return;
} }
// Default to 0 // Default to 0
if (_is.undefined(value)) { if (_is.undefined(value)) {
value = 0; value = 0;
@ -2516,7 +2517,7 @@
_updateProgress(event); _updateProgress(event);
} }
// Update seek range and progress // Update seek range and progress
function _updateSeekDisplay(time) { function _updateSeekDisplay(time) {
// Default to 0 // Default to 0
if (!_is.number(time)) { if (!_is.number(time)) {
@ -2526,7 +2527,7 @@
var duration = _getDuration(), var duration = _getDuration(),
value = _getPercentage(time, duration); value = _getPercentage(time, duration);
// Update progress // Update progress
if (plyr.progress && plyr.progress.played) { if (plyr.progress && plyr.progress.played) {
plyr.progress.played.value = value; plyr.progress.played.value = value;
} }
@ -2635,15 +2636,15 @@
} }
} }
// If toggle is false or if we're playing (regardless of toggle), // If toggle is false or if we're playing (regardless of toggle),
// then set the timer to hide the controls // then set the timer to hide the controls
if (!show || !plyr.media.paused) { if (!show || !plyr.media.paused) {
timers.hover = window.setTimeout(function() { timers.hover = window.setTimeout(function() {
// If the mouse is over the controls (and not entering fullscreen), bail // If the mouse is over the controls (and not entering fullscreen), bail
if ((plyr.controls.pressed || plyr.controls.hover) && !isEnterFullscreen) { if ((plyr.controls.pressed || plyr.controls.hover) && !isEnterFullscreen) {
return; return;
} }
_toggleClass(plyr.container, config.classes.hideControls, true); _toggleClass(plyr.container, config.classes.hideControls, true);
}, delay); }, delay);
} }
@ -2720,7 +2721,7 @@
_remove(plyr.videoContainer); _remove(plyr.videoContainer);
} }
// Reset class name // Reset class name
if (plyr.container) { if (plyr.container) {
plyr.container.removeAttribute('class'); plyr.container.removeAttribute('class');
} }
@ -2915,7 +2916,7 @@
count = get().length; count = get().length;
// Only handle global key press if there's only one player // Only handle global key press if there's only one player
// and the key is in the allowed keys // and the key is in the allowed keys
// and if the focused element is not editable (e.g. text input) // and if the focused element is not editable (e.g. text input)
// and any that accept key input http://webaim.org/techniques/keyboard/ // and any that accept key input http://webaim.org/techniques/keyboard/
if (count === 1 && _inArray(allowed, code) && (!_is.htmlElement(focused) || !_matches(focused, config.selectors.editable))) { if (count === 1 && _inArray(allowed, code) && (!_is.htmlElement(focused) || !_matches(focused, config.selectors.editable))) {
@ -2949,7 +2950,7 @@
return; return;
} }
// Divide the max duration into 10th's and times by the number value // Divide the max duration into 10th's and times by the number value
_seek((duration / 10) * (code - 48)); _seek((duration / 10) * (code - 48));
} }
@ -2967,18 +2968,18 @@
switch(code) { switch(code) {
// 0-9 // 0-9
case 48: case 48:
case 49: case 49:
case 50: case 50:
case 51: case 51:
case 52: case 52:
case 53: case 53:
case 54: case 54:
case 55: case 55:
case 56: case 56:
case 57: if (!held) { seekByKey(); } break; case 57: if (!held) { seekByKey(); } break;
// Space and K key // Space and K key
case 32: case 32:
case 75: if (!held) { _togglePlay(); } break; case 75: if (!held) { _togglePlay(); } break;
// Arrow up // Arrow up
case 38: _increaseVolume(); break; case 38: _increaseVolume(); break;
@ -2996,7 +2997,7 @@
case 67: if (!held) { _toggleCaptions(); } break; case 67: if (!held) { _toggleCaptions(); } break;
} }
// Escape is handle natively when in full screen // Escape is handle natively when in full screen
// So we only need to worry about non native // So we only need to worry about non native
if (!fullscreen.supportsFullScreen && plyr.isFullscreen && code === 27) { if (!fullscreen.supportsFullScreen && plyr.isFullscreen && code === 27) {
_toggleFullscreen(); _toggleFullscreen();
@ -3075,12 +3076,12 @@
_on(plyr.container, 'mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen', _toggleControls); _on(plyr.container, 'mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen', _toggleControls);
// Watch for cursor over controls so they don't hide when trying to interact // Watch for cursor over controls so they don't hide when trying to interact
_on(plyr.controls, 'mouseenter mouseleave', function(event) { _on(plyr.controls, 'mouseenter mouseleave', function(event) {
plyr.controls.hover = event.type === 'mouseenter'; plyr.controls.hover = event.type === 'mouseenter';
}); });
// Watch for cursor over controls so they don't hide when trying to interact // Watch for cursor over controls so they don't hide when trying to interact
_on(plyr.controls, 'mousedown mouseup touchstart touchend touchcancel', function(event) { _on(plyr.controls, 'mousedown mouseup touchstart touchend touchcancel', function(event) {
plyr.controls.pressed = _inArray(['mousedown', 'touchstart'], event.type); plyr.controls.pressed = _inArray(['mousedown', 'touchstart'], event.type);
}); });
@ -3136,7 +3137,7 @@
if (plyr.type === 'video') { if (plyr.type === 'video') {
_setCaption(); _setCaption();
} }
// Restart // Restart
_seek(); _seek();
@ -3238,7 +3239,7 @@
// Type specific stuff // Type specific stuff
switch (plyr.type) { switch (plyr.type) {
case 'youtube': case 'youtube':
// Clear timers // Clear timers
window.clearInterval(timers.buffering); window.clearInterval(timers.buffering);
window.clearInterval(timers.playing); window.clearInterval(timers.playing);
@ -3248,16 +3249,16 @@
// Clean up // Clean up
cleanUp(); cleanUp();
break; break;
case 'vimeo': case 'vimeo':
// Destroy Vimeo API // Destroy Vimeo API
// then clean up (wait, to prevent postmessage errors) // then clean up (wait, to prevent postmessage errors)
plyr.embed.unload().then(cleanUp); plyr.embed.unload().then(cleanUp);
// Vimeo does not always return // Vimeo does not always return
window.setTimeout(cleanUp, 200); timers.cleanUp = window.setTimeout(cleanUp, 200);
break; break;
@ -3273,6 +3274,8 @@
} }
function cleanUp() { function cleanUp() {
clearTimeout(timers.cleanUp);
// Default to restore original element // Default to restore original element
if (!_is.boolean(restore)) { if (!_is.boolean(restore)) {
restore = true; restore = true;
@ -3294,6 +3297,9 @@
// Replace the container with the original element provided // Replace the container with the original element provided
plyr.container.parentNode.replaceChild(original, plyr.container); plyr.container.parentNode.replaceChild(original, plyr.container);
// Allow overflow (set on fullscreen)
document.body.style.overflow = '';
// Event // Event
_triggerEvent(original, 'destroyed', true); _triggerEvent(original, 'destroyed', true);
} }
@ -3448,7 +3454,7 @@
isMuted: function() { return plyr.media.muted; }, isMuted: function() { return plyr.media.muted; },
isReady: function() { return _hasClass(plyr.container, config.classes.ready); }, isReady: function() { return _hasClass(plyr.container, config.classes.ready); },
isLoading: function() { return _hasClass(plyr.container, config.classes.loading); }, isLoading: function() { return _hasClass(plyr.container, config.classes.loading); },
isPaused: function() { return plyr.media.paused; }, isPaused: function() { return plyr.media.paused; },
on: function(event, callback) { _on(plyr.container, event, callback); return this; }, on: function(event, callback) { _on(plyr.container, event, callback); return this; },
play: _play, play: _play,
pause: _pause, pause: _pause,
@ -3473,7 +3479,7 @@
// Everything done // Everything done
function _ready() { function _ready() {
// Ready event at end of execution stack // Ready event at end of execution stack
window.setTimeout(function() { window.setTimeout(function() {
_triggerEvent(plyr.media, 'ready'); _triggerEvent(plyr.media, 'ready');
}, 0); }, 0);
@ -3540,31 +3546,48 @@
var browser = _browserSniff(), var browser = _browserSniff(),
isOldIE = (browser.isIE && browser.version <= 9), isOldIE = (browser.isIE && browser.version <= 9),
isIos = browser.isIos, isIos = browser.isIos,
isIphone = /iPhone|iPod/i.test(navigator.userAgent), isIphone = browser.isIphone,
audio = !!document.createElement('audio').canPlayType, audioSupport = !!document.createElement('audio').canPlayType,
video = !!document.createElement('video').canPlayType, videoSupport = !!document.createElement('video').canPlayType,
basic, full; basic = false,
full = false;
switch (type) { switch (type) {
case 'video': case 'video':
basic = video; basic = videoSupport;
full = (basic && (!isOldIE && !isIphone)); full = (basic && (!isOldIE && !isIphone));
break; break;
case 'audio': case 'audio':
basic = audio; basic = audioSupport;
full = (basic && !isOldIE); full = (basic && !isOldIE);
break; break;
// Vimeo does not seem to be supported on iOS via API
// Issue raised https://github.com/vimeo/player.js/issues/87
case 'vimeo': case 'vimeo':
basic = true;
full = (!isOldIE && !isIos);
break;
case 'youtube': case 'youtube':
basic = true;
full = (!isOldIE && !isIos);
// YouTube seems to work on iOS 10+ on iPad
if (isIos && !isIphone && browser.version >= 10) {
full = true;
}
break;
case 'soundcloud': case 'soundcloud':
basic = true; basic = true;
full = (!isOldIE && !isIos); full = (!isOldIE && !isIphone);
break; break;
default: default:
basic = (audio && video); basic = (audioSupport && videoSupport);
full = (basic && !isOldIE); full = (basic && !isOldIE);
} }
@ -3679,15 +3702,15 @@
// Listen for events if debugging // Listen for events if debugging
if (config.debug) { if (config.debug) {
var events = config.events.concat(['setup', 'statechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled']); var events = config.events.concat(['setup', 'statechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled']);
_on(instance.getContainer(), events.join(' '), function(event) { _on(instance.getContainer(), events.join(' '), function(event) {
console.log([config.logPrefix, 'event:', event.type].join(' '), event.detail.plyr); console.log([config.logPrefix, 'event:', event.type].join(' '), event.detail.plyr);
}); });
} }
// Callback // Callback
_event(instance.getContainer(), 'setup', true, { _event(instance.getContainer(), 'setup', true, {
plyr: instance plyr: instance
}); });
// Add to return array even if it's already setup // Add to return array even if it's already setup
@ -3718,7 +3741,7 @@
} }
}); });
return instances; return instances;
} }
return []; return [];

View File

@ -61,14 +61,14 @@
height: (@plyr-range-thumb-height * @plyr-range-thumb-active-scale); height: (@plyr-range-thumb-height * @plyr-range-thumb-active-scale);
width: 100%; width: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
vertical-align: middle; vertical-align: middle;
appearance: none; appearance: none;
cursor: pointer; cursor: pointer;
border: none; border: none;
background: transparent; background: transparent;
// WebKit // WebKit
&::-webkit-slider-runnable-track { &::-webkit-slider-runnable-track {
.plyr-range-track(); .plyr-range-track();
@ -86,7 +86,7 @@
&::-moz-range-thumb { &::-moz-range-thumb {
.plyr-range-thumb(); .plyr-range-thumb();
} }
// Microsoft // Microsoft
&::-ms-track { &::-ms-track {
height: @plyr-range-track-height; height: @plyr-range-track-height;
@ -104,7 +104,7 @@
&::-ms-thumb { &::-ms-thumb {
.plyr-range-thumb(); .plyr-range-thumb();
// For some reason, Edge uses the -webkit margin above // For some reason, Edge uses the -webkit margin above
margin-top: 0; margin-top: 0;
} }
&::-ms-tooltip { &::-ms-tooltip {
display: none; display: none;
@ -116,11 +116,11 @@
} }
&::-moz-focus-outer { &::-moz-focus-outer {
border: 0; border: 0;
} }
&.tab-focus:focus { &.tab-focus:focus {
outline-offset: 3px; outline-offset: 3px;
} }
// Pressed styles // Pressed styles
&:active { &:active {
&::-webkit-slider-thumb { &::-webkit-slider-thumb {
@ -179,9 +179,10 @@
.plyr__video-embed { .plyr__video-embed {
padding-bottom: 56.25%; /* 16:9 */ padding-bottom: 56.25%; /* 16:9 */
height: 0; height: 0;
overflow: hidden; border-radius: inherit;
// Require z-index to force border-radius // Require overflow and z-index to force border-radius
overflow: hidden;
z-index: 0; z-index: 0;
iframe { iframe {
@ -192,7 +193,6 @@
height: 100%; height: 100%;
border: 0; border: 0;
user-select: none; user-select: none;
z-index: 1;
} }
// Vimeo hack // Vimeo hack
@ -265,7 +265,7 @@
// Playback controls // Playback controls
.plyr__controls { .plyr__controls {
display: flex; display: flex;
align-items: center; align-items: center;
line-height: 1; line-height: 1;
text-align: center; text-align: center;
@ -329,7 +329,7 @@
} }
} }
} }
// Hide controls // Hide controls
.plyr--hide-controls .plyr__controls { .plyr--hide-controls .plyr__controls {
opacity: 0; opacity: 0;
pointer-events: none; pointer-events: none;
@ -341,6 +341,7 @@
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
z-index: 2;
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(fade(@plyr-video-controls-bg, 0%), fade(@plyr-video-controls-bg, 50%)); background: linear-gradient(fade(@plyr-video-controls-bg, 0%), fade(@plyr-video-controls-bg, 50%));
border-bottom-left-radius: inherit; border-bottom-left-radius: inherit;
@ -476,7 +477,7 @@
height: 0; height: 0;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
// The background triangle // The background triangle
bottom: -@plyr-tooltip-arrow-size; bottom: -@plyr-tooltip-arrow-size;
border-right: @plyr-tooltip-arrow-size solid transparent; border-right: @plyr-tooltip-arrow-size solid transparent;
@ -624,16 +625,16 @@
} }
&::-moz-progress-bar { &::-moz-progress-bar {
transition: width .2s ease; transition: width .2s ease;
} }
&::-ms-fill { &::-ms-fill {
transition: width .2s ease; transition: width .2s ease;
} }
} }
.plyr--video .plyr__progress--buffer, .plyr--video .plyr__progress--buffer,
.plyr--video .plyr__volume--display { .plyr--video .plyr__volume--display {
background: @plyr-video-range-track-bg; background: @plyr-video-range-track-bg;
} }
.plyr--video .plyr__progress--buffer { .plyr--video .plyr__progress--buffer {
color: @plyr-video-progress-buffered-bg; color: @plyr-video-progress-buffered-bg;
} }
.plyr--audio .plyr__progress--buffer, .plyr--audio .plyr__progress--buffer,
@ -740,6 +741,10 @@
height: 100%; height: 100%;
width: 100%; width: 100%;
} }
.plyr__video-embed {
// Revert overflow change
overflow: visible;
}
.plyr__controls { .plyr__controls {
position: absolute; position: absolute;
bottom: 0; bottom: 0;

View File

@ -61,14 +61,14 @@
height: ($plyr-range-thumb-height * $plyr-range-thumb-active-scale); height: ($plyr-range-thumb-height * $plyr-range-thumb-active-scale);
width: 100%; width: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
vertical-align: middle; vertical-align: middle;
appearance: none; appearance: none;
cursor: pointer; cursor: pointer;
border: none; border: none;
background: transparent; background: transparent;
// WebKit // WebKit
&::-webkit-slider-runnable-track { &::-webkit-slider-runnable-track {
@include plyr-range-track(); @include plyr-range-track();
@ -86,7 +86,7 @@
&::-moz-range-thumb { &::-moz-range-thumb {
@include plyr-range-thumb(); @include plyr-range-thumb();
} }
// Microsoft // Microsoft
&::-ms-track { &::-ms-track {
height: $plyr-range-track-height; height: $plyr-range-track-height;
@ -104,7 +104,7 @@
&::-ms-thumb { &::-ms-thumb {
@include plyr-range-thumb(); @include plyr-range-thumb();
// For some reason, Edge uses the -webkit margin above // For some reason, Edge uses the -webkit margin above
margin-top: 0; margin-top: 0;
} }
&::-ms-tooltip { &::-ms-tooltip {
display: none; display: none;
@ -116,11 +116,11 @@
} }
&::-moz-focus-outer { &::-moz-focus-outer {
border: 0; border: 0;
} }
&.tab-focus:focus { &.tab-focus:focus {
outline-offset: 3px; outline-offset: 3px;
} }
// Pressed styles // Pressed styles
&:active { &:active {
&::-webkit-slider-thumb { &::-webkit-slider-thumb {
@ -178,10 +178,10 @@
.plyr__video-embed { .plyr__video-embed {
padding-bottom: 56.25%; /* 16:9 */ padding-bottom: 56.25%; /* 16:9 */
height: 0; height: 0;
overflow: hidden;
border-radius: inherit; border-radius: inherit;
// Require z-index to force border-radius // Require overflow and z-index to force border-radius
overflow: hidden;
z-index: 0; z-index: 0;
iframe { iframe {
@ -264,7 +264,7 @@
// Playback controls // Playback controls
.plyr__controls { .plyr__controls {
display: flex; display: flex;
align-items: center; align-items: center;
line-height: 1; line-height: 1;
text-align: center; text-align: center;
@ -328,7 +328,7 @@
} }
} }
} }
// Hide controls // Hide controls
.plyr--hide-controls .plyr__controls { .plyr--hide-controls .plyr__controls {
opacity: 0; opacity: 0;
pointer-events: none; pointer-events: none;
@ -475,7 +475,7 @@
height: 0; height: 0;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
// The background triangle // The background triangle
bottom: -$plyr-tooltip-arrow-size; bottom: -$plyr-tooltip-arrow-size;
border-right: $plyr-tooltip-arrow-size solid transparent; border-right: $plyr-tooltip-arrow-size solid transparent;
@ -622,16 +622,16 @@
} }
&::-moz-progress-bar { &::-moz-progress-bar {
transition: width .2s ease; transition: width .2s ease;
} }
&::-ms-fill { &::-ms-fill {
transition: width .2s ease; transition: width .2s ease;
} }
} }
.plyr--video .plyr__progress--buffer, .plyr--video .plyr__progress--buffer,
.plyr--video .plyr__volume--display { .plyr--video .plyr__volume--display {
background: $plyr-video-range-track-bg; background: $plyr-video-range-track-bg;
} }
.plyr--video .plyr__progress--buffer { .plyr--video .plyr__progress--buffer {
color: $plyr-video-progress-buffered-bg; color: $plyr-video-progress-buffered-bg;
} }
.plyr--audio .plyr__progress--buffer, .plyr--audio .plyr__progress--buffer,
@ -738,6 +738,10 @@
height: 100%; height: 100%;
width: 100%; width: 100%;
} }
.plyr__video-embed {
// Revert overflow change
overflow: visible;
}
.plyr__controls { .plyr__controls {
position: absolute; position: absolute;
bottom: 0; bottom: 0;