diff options
Diffstat (limited to 'src/js')
-rw-r--r-- | src/js/controls.js | 9 | ||||
-rw-r--r-- | src/js/listeners.js | 9 | ||||
-rw-r--r-- | src/js/plugins/vimeo.js | 59 | ||||
-rw-r--r-- | src/js/plugins/youtube.js | 43 | ||||
-rw-r--r-- | src/js/utils.js | 4 |
5 files changed, 91 insertions, 33 deletions
diff --git a/src/js/controls.js b/src/js/controls.js index 748d848c..022fab0d 100644 --- a/src/js/controls.js +++ b/src/js/controls.js @@ -75,14 +75,11 @@ const controls = { const use = document.createElementNS(namespace, 'use'); const path = `${iconPath}-${type}`; - // If the new `href` attribute is supported, use that + // Set `href` attributes // https://github.com/sampotts/plyr/issues/460 // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href - if ('href' in use) { - use.setAttribute('href', path); - } else { - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); - } + use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path); + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg> icon.appendChild(use); diff --git a/src/js/listeners.js b/src/js/listeners.js index a4b5d81d..5c366803 100644 --- a/src/js/listeners.js +++ b/src/js/listeners.js @@ -341,7 +341,14 @@ const listeners = { // Proxy events to container // Bubble up key events for Edge utils.on(this.media, this.config.events.concat(['keyup', 'keydown']).join(' '), event => { - utils.dispatchEvent.call(this, this.elements.container, event.type, true); + let detail = {}; + + // Get error details from media + if (event.type === 'error') { + detail = this.media.error; + } + + utils.dispatchEvent.call(this, this.elements.container, event.type, true, detail); }); }, diff --git a/src/js/plugins/vimeo.js b/src/js/plugins/vimeo.js index 18ef1d38..f567bc32 100644 --- a/src/js/plugins/vimeo.js +++ b/src/js/plugins/vimeo.js @@ -37,7 +37,8 @@ const vimeo = { setAspectRatio(input) { const ratio = utils.is.string(input) ? input.split(':') : this.config.ratio.split(':'); const padding = 100 / ratio[0] * ratio[1]; - const offset = (300 - padding) / 6; + const height = 200; + const offset = (height - padding) / (height / 50); this.elements.wrapper.style.paddingBottom = `${padding}%`; this.media.style.transform = `translateY(-${offset}%)`; }, @@ -70,23 +71,27 @@ const vimeo = { // https://github.com/vimeo/player.js player.embed = new window.Vimeo.Player(iframe); + player.media.paused = true; + player.media.currentTime = 0; + // Create a faux HTML5 API using the Vimeo API player.media.play = () => { - player.embed.play(); - player.media.paused = false; + player.embed.play().then(() => { + player.media.paused = false; + }); }; player.media.pause = () => { - player.embed.pause(); - player.media.paused = true; + player.embed.pause().then(() => { + player.media.paused = true; + }); }; player.media.stop = () => { - player.embed.stop(); - player.media.paused = true; + player.embed.stop().then(() => { + player.media.paused = true; + player.currentTime = 0; + }); }; - player.media.paused = true; - player.media.currentTime = 0; - // Seeking let { currentTime } = player.media; Object.defineProperty(player.media, 'currentTime', { @@ -121,9 +126,10 @@ const vimeo = { return speed; }, set(input) { - speed = input; - player.embed.setPlaybackRate(input); - utils.dispatchEvent.call(player, player.media, 'ratechange'); + player.embed.setPlaybackRate(input).then(() => { + speed = input; + utils.dispatchEvent.call(player, player.media, 'ratechange'); + }); }, }); @@ -134,9 +140,10 @@ const vimeo = { return volume; }, set(input) { - volume = input; - player.embed.setVolume(input); - utils.dispatchEvent.call(player, player.media, 'volumechange'); + player.embed.setVolume(input).then(() => { + volume = input; + utils.dispatchEvent.call(player, player.media, 'volumechange'); + }); }, }); @@ -148,9 +155,11 @@ const vimeo = { }, set(input) { const toggle = utils.is.boolean(input) ? input : false; - muted = toggle; - player.embed.setVolume(toggle ? 0 : player.config.volume); - utils.dispatchEvent.call(player, player.media, 'volumechange'); + + player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => { + muted = toggle; + utils.dispatchEvent.call(player, player.media, 'volumechange'); + }); }, }); @@ -161,8 +170,11 @@ const vimeo = { return loop; }, set(input) { - loop = utils.is.boolean(input) ? input : player.config.loop.active; - player.embed.setLoop(loop); + const toggle = utils.is.boolean(input) ? input : player.config.loop.active; + + player.embed.setLoop(toggle).then(() => { + loop = toggle; + }); }, }); @@ -269,6 +281,11 @@ const vimeo = { utils.dispatchEvent.call(player, player.media, 'ended'); }); + player.embed.on('error', detail => { + player.media.error = detail; + utils.dispatchEvent.call(player, player.media, 'error'); + }); + // Rebuild UI window.setTimeout(() => ui.build.call(player), 0); }, diff --git a/src/js/plugins/youtube.js b/src/js/plugins/youtube.js index 9cd567fe..aa943740 100644 --- a/src/js/plugins/youtube.js +++ b/src/js/plugins/youtube.js @@ -81,10 +81,47 @@ const youtube = { }, events: { onError(event) { - utils.dispatchEvent.call(player, player.media, 'error', true, { + // If we've already fired an error, don't do it again + // YouTube fires onError twice + if (utils.is.object(player.media.error)) { + return; + } + + const detail = { code: event.data, - embed: event.target, - }); + }; + + // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError + switch (event.data) { + case 2: + detail.message = + 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.'; + break; + + case 5: + detail.message = + 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.'; + break; + + case 100: + detail.message = + 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.'; + break; + + case 101: + case 150: + detail.message = + 'The owner of the requested video does not allow it to be played in embedded players.'; + break; + + default: + detail.message = 'An unknown error occured'; + break; + } + + player.media.error = detail; + + utils.dispatchEvent.call(player, player.media, 'error'); }, onPlaybackQualityChange(event) { // Get the instance diff --git a/src/js/utils.js b/src/js/utils.js index a635e021..6a576ded 100644 --- a/src/js/utils.js +++ b/src/js/utils.js @@ -525,7 +525,7 @@ const utils = { }, // Trigger event - dispatchEvent(element, type, bubbles, properties) { + dispatchEvent(element, type, bubbles, detail) { // Bail if no element if (!element || !type) { return; @@ -534,7 +534,7 @@ const utils = { // Create and dispatch the event const event = new CustomEvent(type, { bubbles: utils.is.boolean(bubbles) ? bubbles : false, - detail: Object.assign({}, properties, { + detail: Object.assign({}, detail, { plyr: this instanceof Plyr ? this : null, }), }); |