dist/ext/youtube.js

File

			//= require 'vendor/node_modules/@absolunet/kafe/dist/url'
			
			(function(global, undefined) { var kafe = global.kafe, $ = kafe.dependencies.jQuery; kafe.bonify({name:'ext.youtube', version:'1.1.0', obj:(function(){
			
				var
					// default params
					_params = {
						maxResults: 10,
						startIndex: 1,
						orderBy:    'relevance',
						q:          '',
						author:     '',
						category:   ''
					},
			
					// return query string
					_queryString = function(data) {
						var q = '';
						for (var i in data) {
							q += i+'='+data[i].toString()+'&';
						}
						return q.toString().substr(0,q.length-5);
					},
			
					// parses search results into clean and simple result objects.
					_simpleSearchResults = function(results) {
			
						var simpleResults = [];
						if (results !== undefined) {
							$.each(results, function(i, val) {
			
								var entry = {};
			
								entry.id = (val.id.$t).toString().split('/').pop();
								entry.title = val.title.$t;
								entry.author = val.author[0].name.$t;
								entry.publishedDate = new Date(val.published.$t);
			
								entry.thumbnail = {};
								entry.thumbnail.large = val.media$group.media$thumbnail[0].url;
								entry.thumbnail.small = val.media$group.media$thumbnail[1].url;
			
								entry.categories = [];
								$.each(val.category, function(ci, cval) {
									if (ci > 0)
										entry.categories.push(cval.term);
								});
			
								simpleResults.push(entry);
			
							});
						}
			
						return simpleResults;
					}
				;
			
			
				/**
				* ### Version 1.1.0
				* Extra methods for Youtube.
				*
				* @module kafe.ext
				* @class kafe.ext.youtube
				*/
				var youtube = {};
			
			
				/**
				* Set default Youtube params.
				*
				* @method setParams
				* @param {Object} options Options
				*	@param {Number} [options.maxResults=10] Number of results
				*	@param {Number} [options.startIndex=1] Start index (page)
				*	@param {String} [options.orderBy='relevance'] Order by choice
				*	@param {String} [options.q] Query string of search
				*	@param {String} [options.author] Author of videos
				*	@param {Array(String)} [options.category] Categories
				*/
				youtube.setParams = function() {
					$.extend(_params, arguments[0]);
				};
			
			
				/**
				* Get the default params with optional extra params.
				*
				* @method getParams
				* @param {Object} [options] Options
				* @return {Object} The default Youtube params.
				*/
				youtube.getParams = function() {
					return $.extend({}, _params, arguments[0]);
				};
			
			
				/**
				* Builds a youtube search url then returns the results as the first argument of the specified callback.
				*
				* @method search
				* @param {Object} [options] Options
				* @param {Function} callback Callback
				*/
				youtube.search = function(options, callback) {
					options = youtube.getParams(options);
			
					var
						path = 'https://gdata.youtube.com/feeds/api/videos?',
						query = 'alt=json-in-script&callback=?' +
								'&max-results=' + options.maxResults +
								'&start-index=' + options.startIndex +
								'&orderby=' + options.orderBy
					;
			
					if (options.query) {
						query += '&q=' + encodeURIComponent(options.query);
					}
			
					if (options.author) {
						query += '&author=' + encodeURIComponent(options.author);
					}
			
					if (options.category) {
						query += '&category=' + encodeURIComponent(options.category.join('|'));
					}
			
					$.ajax({
						url: path + query,
						dataType: 'json',
						success: function(data, textStatus, jqXHR) {
							var simpleResults = _simpleSearchResults(data.feed.entry);
							callback(simpleResults);
						},
						error: function(jqXHR, textStatus, errorThrown) {
							throw kafe.error(new Error(errorThrown));
						}
					});
			
				};
			
			
				/**
				* Builds a youtube search url then returns the results as the first argument of the specified callback.
				*
				* @method getPlaylistVideos
				* @param {String} playlistId Playlist id
				* @param {Function} callback Callback
				*/
				youtube.getPlaylistVideos = function (playlistId, callback) {
			
					if (!playlistId) {
						if (callback) callback(null);
						return;
					}
			
					if (playlistId.toString().substr(0, 2) == 'PL') {
						playlistId = playlistId.toString().substr(2, playlistId.length);
					}
			
					var
						playListURL = '//gdata.youtube.com/feeds/api/playlists/' + playlistId + '?v=2&alt=json&callback=?',
						videoURL = '//www.youtube.com/watch?v=',
						imageURL = '//img.youtube.com/vi/'
					;
			
					$.ajax({
						url: playListURL,
						dataType: 'json',
						success: function (data) {
							var videos = [];
							$.each(data.feed.entry, function (i, item) {
								$.each(item.link, function (y, subitem) {
									if (subitem.rel == 'alternate') {
										var
											qs      = kafe.url.parseSearchParams('?' + subitem.href.toString().split('?')[1]),
											videoId = qs.v,
											video   = {
												title: item.title.$t,
												id: videoId,
												url: videoURL + videoId,
												img_thumb: imageURL + videoId + '/default.jpg',
												img_large: imageURL + videoId + '/hqdefault.jpg'
											}
										;
										videos.push(video);
									}
								});
							});
							callback(videos);
						},
						error: function () {
							callback(null);
						}
					});
				};
			
				return youtube;
			
			})()}); })(typeof window !== 'undefined' ? window : this);