UNPKG

cdf

Version:

A library for creating oldschool demo-like animations with JavaScript

114 lines (89 loc) 3.16 kB
(function(global){ var lib = global.cdf || {}; var script_id = 'c0deff_youtube_player_api'; var player_id = 'c0deff_youtube_player'; var deferredScripts = []; lib.youtube = {}; var getIDFromURL = lib.youtube.getIDFromURL = function(url){ if(!url.match || !url.length) return false; if(url.length === 11 && url.match(/[^#\&\?]*/)) return url; player = null; var match = url.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/); return (match&&match[7].length===11)? match[7] : false; }; var Music = lib.youtube.Music = lib.youtube.music = function (videoIDorURL, autoplay) { if(!(this instanceof Music))return new Music(videoIDorURL, autoplay); var yt_id = this.youtube_id = getIDFromURL(videoIDorURL); var instance = this; var isReady = false; if(autoplay || autoplay===undefined)this.play(); addHTML(); runYTscript(function (YT) { instance.player = buildPlayer(YT, yt_id, function (e) { instance.isReady = true; instance.trigger('ready',[instance.player],instance); }, function (event) { instance.trigger('stateChange',[event.data, event], YT); }) }) }; Music.prototype = { play:function () { if(this.isReady) this.player.playVideo(); else this.on('ready', function(){this.play();}); return this; }, seekTo: function( seconds ){ if(this.isReady) this.player.seekTo(seconds); else this.on('ready', function(){this.seekTo(seconds);}); }, pause: function () { if(this.isReady) this.player.pauseVideo(); else this.on('ready', function(){this.pause();}); return this; } }; lib.utils.eventer(Music.prototype); var YT_API = null; var runYTscript = function(callback){ if(YT_API){ callback.call(lib,YT_API); } else{ deferredScripts.push(callback); } }; var buildPlayer = function (YT, id, onReady, onStateChange) { return new YT.Player(player_id, { videoId: id, suggestedQuality: 'small', events: { onReady: onReady, onStateChange: onStateChange } }); }; var addHTML = function () { if(document.getElementById(script_id))return; var script = document.createElement('script'); script.id=script_id; var protocol = window.location.protocol; if(protocol !== 'http:' && protocol !== 'https:') protocol = 'https:'; script.src = protocol + '//www.youtube.com/player_api'; document.head.appendChild(script); var player = document.createElement('div'); player.setAttribute('style','position: absolute; top: 0; left: 0; width:0 !important; height:0 !important; overflow:hidden !important;'); player.id = player_id; window.onYouTubePlayerAPIReady = function() { YT_API = window.YT; if(deferredScripts.length>0){ deferredScripts.forEach(function (fn) { fn.call(lib,YT_API); }) } }; document.body.appendChild(player); }; if(typeof module!=='undefined'&& module.exports){module.exports=lib;}else{global.cdf=lib;} })(window);