diff options
Diffstat (limited to 'src/js/plyr.js')
-rw-r--r-- | src/js/plyr.js | 122 |
1 files changed, 71 insertions, 51 deletions
diff --git a/src/js/plyr.js b/src/js/plyr.js index d3fc3648..957276aa 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -448,14 +448,22 @@ } // Trigger event - function _triggerEvent(element, eventName, properties) { + function _triggerEvent(element, eventName, bubbles, properties) { // Bail if no element if (!element || !eventName) { return; } - // create and dispatch the event - var event = new CustomEvent(eventName, properties); + // Default bubbles to false + if (typeof bubbles !== 'boolean') { + bubbles = false; + } + + // Create and dispatch the event + var event = new CustomEvent(eventName, { + bubbles: bubbles, + detail: properties + }); // Dispatch the event element.dispatchEvent(event); @@ -974,6 +982,7 @@ // Set the current caption function _setCaption(caption) { + /* jshint unused:false */ var container = _getElement(config.selectors.captions), content = document.createElement('span'); @@ -996,7 +1005,7 @@ // Set new caption text container.appendChild(content); - // Force redraw + // Force redraw (for Safari) var redraw = container.offsetHeight; } @@ -1347,7 +1356,7 @@ // Setup YouTube/Vimeo function _setupEmbed() { var container = document.createElement('div'), - videoId = plyr.embedId, + mediaId = plyr.embedId, id = plyr.type + '-' + Math.floor(Math.random() * (10000)); // Remove old containers @@ -1370,7 +1379,7 @@ // Setup API if (typeof YT === 'object') { - _youTubeReady(videoId, container); + _youTubeReady(mediaId, container); } else { // Load the API @@ -1380,7 +1389,7 @@ window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || []; // Add to queue - window.onYouTubeReadyCallbacks.push(function() { _youTubeReady(videoId, container) }); + window.onYouTubeReadyCallbacks.push(function() { _youTubeReady(mediaId, container) }); // Set callback to process queue window.onYouTubeIframeAPIReady = function () { @@ -1391,14 +1400,14 @@ // Vimeo else if (plyr.type === 'vimeo') { // Inject the iframe - var iframe = document.createElement('iframe'); + var vimeo = document.createElement('iframe'); // Watch for iframe load - iframe.loaded = false; - _on(iframe, 'load', function() { iframe.loaded = true; }); + vimeo.loaded = false; + _on(vimeo, 'load', function() { vimeo.loaded = true; }); - _setAttributes(iframe, { - 'src': 'https://player.vimeo.com/video/' + videoId + '?player_id=' + id + '&api=1&badge=0&byline=0&portrait=0&title=0', + _setAttributes(vimeo, { + 'src': 'https://player.vimeo.com/video/' + mediaId + '?player_id=' + id + '&api=1&badge=0&byline=0&portrait=0&title=0', 'id': id, 'webkitallowfullscreen': '', 'mozallowfullscreen': '', @@ -1408,52 +1417,53 @@ // If full support, we can use custom controls (hiding Vimeos), if not, use Vimeo if (plyr.supported.full) { - container.appendChild(iframe); + container.appendChild(vimeo); plyr.media.appendChild(container); } else { - plyr.media.appendChild(iframe); + plyr.media.appendChild(vimeo); } - // Load the API + // Load the API if not already if (!('$f' in window)) { _injectScript(config.urls.vimeo.api); } // Wait for fragaloop load - var timer = window.setInterval(function() { - if ('$f' in window && iframe.loaded) { - window.clearInterval(timer); - _vimeoReady.call(iframe); + var vimeoTimer = window.setInterval(function() { + if ('$f' in window && vimeo.loaded) { + window.clearInterval(vimeoTimer); + _vimeoReady.call(vimeo); } }, 50); } // Soundcloud else if (plyr.type === 'soundcloud') { // Inject the iframe - var iframe = document.createElement('iframe'); + var soundCloud = document.createElement('iframe'); // Watch for iframe load - iframe.loaded = false; - _on(iframe, 'load', function() { iframe.loaded = true; }); + soundCloud.loaded = false; + _on(soundCloud, 'load', function() { soundCloud.loaded = true; }); - _setAttributes(iframe, { - 'src': 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + videoId, + _setAttributes(soundCloud, { + 'src': 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + mediaId, 'id': id }); - container.appendChild(iframe); + container.appendChild(soundCloud); plyr.media.appendChild(container); + // Load the API if not already if (!window.SC) { _injectScript(config.urls.soundcloud.api); } // Wait for SC load - var timer = window.setInterval(function() { - if (window.SC && iframe.loaded) { - window.clearInterval(timer); - _soundcloudReady.call(iframe); + var soundCloudTimer = window.setInterval(function() { + if (window.SC && soundCloud.loaded) { + window.clearInterval(soundCloudTimer); + _soundcloudReady.call(soundCloud); } }, 50); } @@ -1484,19 +1494,25 @@ plyr.embed = new YT.Player(container.id, { videoId: videoId, playerVars: { - autoplay: (config.autoplay ? 1 : 0), - controls: (plyr.supported.full ? 0 : 1), - rel: 0, - showinfo: 0, + autoplay: (config.autoplay ? 1 : 0), + controls: (plyr.supported.full ? 0 : 1), + rel: 0, + showinfo: 0, iv_load_policy: 3, cc_load_policy: (config.captions.defaultActive ? 1 : 0), - cc_lang_pref: 'en', - wmode: 'transparent', + cc_lang_pref: 'en', + wmode: 'transparent', modestbranding: 1, - disablekb: 1, - origin: '*' // https://code.google.com/p/gdata-issues/issues/detail?id=5788#c45 + disablekb: 1, + origin: '*' // https://code.google.com/p/gdata-issues/issues/detail?id=5788#c45 }, events: { + 'onError': function(event) { + _triggerEvent(plyr.container, 'error', true, { + code: event.data, + embed: event.target + }); + }, 'onReady': function(event) { // Get the instance var instance = event.target; @@ -1683,10 +1699,11 @@ // Soundcloud ready function _soundcloudReady() { - plyr.embed = SC.Widget(this); + /* jshint validthis: true */ + plyr.embed = window.SC.Widget(this); // Setup on ready - plyr.embed.bind(SC.Widget.Events.READY, function() { + plyr.embed.bind(window.SC.Widget.Events.READY, function() { // Create a faux HTML5 API using the Soundcloud API plyr.media.play = function() { plyr.embed.play(); @@ -1720,24 +1737,24 @@ _displayDuration(); }); - plyr.embed.bind(SC.Widget.Events.PLAY, function() { + plyr.embed.bind(window.SC.Widget.Events.PLAY, function() { plyr.media.paused = false; _triggerEvent(plyr.media, 'play'); _triggerEvent(plyr.media, 'playing'); }); - plyr.embed.bind(SC.Widget.Events.PAUSE, function() { + plyr.embed.bind(window.SC.Widget.Events.PAUSE, function() { plyr.media.paused = true; _triggerEvent(plyr.media, 'pause'); }); - plyr.embed.bind(SC.Widget.Events.PLAY_PROGRESS, function(data) { + plyr.embed.bind(window.SC.Widget.Events.PLAY_PROGRESS, function(data) { plyr.media.seeking = false; plyr.media.currentTime = data.currentPosition/1000; _triggerEvent(plyr.media, 'timeupdate'); }); - plyr.embed.bind(SC.Widget.Events.LOAD_PROGRESS, function(data) { + plyr.embed.bind(window.SC.Widget.Events.LOAD_PROGRESS, function(data) { plyr.media.buffered = data.loadProgress; _triggerEvent(plyr.media, 'progress'); @@ -1747,7 +1764,7 @@ } }); - plyr.embed.bind(SC.Widget.Events.FINISH, function() { + plyr.embed.bind(window.SC.Widget.Events.FINISH, function() { plyr.media.paused = true; _triggerEvent(plyr.media, 'ended'); }); @@ -2414,6 +2431,9 @@ plyr.progress.played.value = 0; } + // Cancel current network requests + _cancelRequests(); + // Clean up YouTube stuff if (plyr.type === 'youtube') { // Destroy the embed instance @@ -2423,6 +2443,7 @@ window.clearInterval(plyr.timer.buffering); window.clearInterval(plyr.timer.playing); } + // HTML5 Video else if (plyr.type === 'video' && plyr.videoContainer) { // Remove video wrapper _remove(plyr.videoContainer); @@ -2431,9 +2452,6 @@ // Remove embed object plyr.embed = null; - // Cancel current network requests - _cancelRequests(); - // Remove the old media _remove(plyr.media); @@ -2748,7 +2766,7 @@ // Proxy events to container _on(plyr.media, config.events.join(' '), function(event) { - _triggerEvent(plyr.container, event.type); + _triggerEvent(plyr.container, event.type, true); }); } @@ -2759,15 +2777,17 @@ return; } - // Set empty src attribute - plyr.media.setAttribute('src', ''); - // Remove child sources var sources = plyr.media.querySelectorAll('source'); for (var i = 0; i < sources.length; i++) { _remove(sources[i]); } + // Set blank video src attribute + // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error + // Credit: https://github.com/mathiasbynens/small/blob/master/mp4.mp4 + plyr.media.setAttribute('src', 'data:video/mp4;base64,AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAAAGm1kYXQAAAGzABAHAAABthBgUYI9t+8AAAMNbW9vdgAAAGxtdmhkAAAAAMXMvvrFzL76AAAD6AAAACoAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABhpb2RzAAAAABCAgIAHAE/////+/wAAAiF0cmFrAAAAXHRraGQAAAAPxcy++sXMvvoAAAABAAAAAAAAACoAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAgAAAAIAAAAAAG9bWRpYQAAACBtZGhkAAAAAMXMvvrFzL76AAAAGAAAAAEVxwAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAABaG1pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAShzdGJsAAAAxHN0c2QAAAAAAAAAAQAAALRtcDR2AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAgACABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAXmVzZHMAAAAAA4CAgE0AAQAEgICAPyARAAAAAAMNQAAAAAAFgICALQAAAbABAAABtYkTAAABAAAAASAAxI2IAMUARAEUQwAAAbJMYXZjNTMuMzUuMAaAgIABAgAAABhzdHRzAAAAAAAAAAEAAAABAAAAAQAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAASAAAAAQAAABRzdGNvAAAAAAAAAAEAAAAsAAAAYHVkdGEAAABYbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAraWxzdAAAACOpdG9vAAAAG2RhdGEAAAABAAAAAExhdmY1My4yMS4x'); + // Load the new empty source // This will cancel existing requests // See https://github.com/Selz/plyr/issues/174 |