| 
					
				 | 
			
			
				@@ -75,7 +75,7 @@ const quotas = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // ]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const quotaExceeded = apiCalls => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const isQuotaExceeded = apiCalls => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	const reversedApiCalls = apiCalls.slice().reverse(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	const sortedQuotas = quotas.sort((a, b) => a.limit > b.limit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,7 +111,7 @@ const quotaExceeded = apiCalls => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return quotaExceeded; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const quotaStatus = apiCalls => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const getQuotaStatus = apiCalls => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	const reversedApiCalls = apiCalls.slice().reverse(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	const sortedQuotas = quotas.sort((a, b) => a.limit > b.limit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	const status = {}; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -285,6 +285,46 @@ class _YouTubeModule extends CoreClass { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * Gets the id of the channel upload playlist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 *  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {object} payload - object that contains the payload 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param {string} payload.channelId - the id of the YouTube channel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @returns {Promise} - returns promise (reject, resolve) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	GET_CHANNEL_UPLOADS_PLAYLIST_ID(payload) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				part: "contentDetails", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				id: payload.channelId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			YouTubeModule.runJob( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"API_GET_CHANNELS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					params 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.then(({ response }) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					const { data } = response; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (data.items.length === 0) return reject(new Error("Channel not found.")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					const playlistId = data.items[0].contentDetails.relatedPlaylists.uploads; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return resolve({ playlistId }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.catch(err => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					YouTubeModule.log("ERROR", "GET_CHANNEL_UPLOADS_PLAYLIST_ID", `${err.message}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (err.message === "Request failed with status code 404") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						return reject(new Error("Channel not found. Is the channel public/unlisted?")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return reject(new Error("An error has occured. Please try again later.")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 * Returns an array of songs taken from a YouTube playlist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -513,6 +553,31 @@ class _YouTubeModule extends CoreClass { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	API_GET_CHANNELS(payload) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			const { params } = payload; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			YouTubeModule.runJob( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"API_CALL", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					url: "https://www.googleapis.com/youtube/v3/channels", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					params: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						key: config.get("apis.youtube.key"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						...params 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					quotaCost: 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					resolve(response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.catch(err => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					reject(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	API_SEARCH(payload) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			const { params } = payload; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -542,7 +607,7 @@ class _YouTubeModule extends CoreClass { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return new Promise((resolve, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			const { url, params, quotaCost } = payload; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			const quotaExceeded = quotaExceeded(YouTubeModule.apiCalls); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			const quotaExceeded = isQuotaExceeded(YouTubeModule.apiCalls); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (quotaExceeded) reject(new Error("Quota has been exceeded. Please wait a while.")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			else { 
			 |