cdf
Version:
A library for creating oldschool demo-like animations with JavaScript
114 lines (89 loc) • 3.16 kB
JavaScript
(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);