From 217e65df96d437b0d8c0e73d66453a97f9445b95 Mon Sep 17 00:00:00 2001 From: Scritches Date: Thu, 8 Mar 2018 16:11:12 -0500 Subject: [PATCH] Added necessary authentication for spotify API calls and fixed youtube link regex. --- modules/spotify/spotify.js | 128 ++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 51 deletions(-) diff --git a/modules/spotify/spotify.js b/modules/spotify/spotify.js index d28a335..d143a6c 100644 --- a/modules/spotify/spotify.js +++ b/modules/spotify/spotify.js @@ -17,57 +17,83 @@ var spotify = function(dbot) { this.spotifyRegex = /(\b(https?:\/\/open.spotify.com\/(artist|track|album)\/\w*|spotify:(artist|track|album):\w*)\b)/ig; this.spotifyLookup = 'http://ws.spotify.com/lookup/1/.json'; this.spotifySearch = 'https://api.spotify.com/v1/search'; - this.youtubeRegex = /^http:\/\/(?:www\.)?youtube.com\/watch\?v=\w+(&\S*)?$/; - this.youtubeMiniRegex = /^https?:\/\/youtu\.be\/\w+$/; + this.youtubeRegex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; this.spotifyText = '\u00039spotify\u000f'; + this.spotifyAuthUrl = 'https://accounts.spotify.com/api/token'; + + // ClientID and ClientSecret come from the spotify developer center; you will need to supply your own. + this.spotifyClientID = 'e2491c50879a4d7f900dcefcc74b7c90'; + this.spotifyClientSecret = 'b29da299612e4e659099ab3367ffa3f4'; + this.spotifyAuth = new Buffer(this.spotifyClientID + ":" + this.spotifyClientSecret).toString("base64"); + + this.authenticate = function(callback) { + request({ + url: this.spotifyAuthUrl, + method: "POST", + headers: { Authorization: "Basic " + this.spotifyAuth }, + form: { grant_type: "client_credentials" } + }, function(error, response, body) { + if (!error && response.statusCode == 200) { + body = JSON.parse(body); + var token = body.access_token; + callback(token); + } + }); + }; this.lookup = function(link, callback) { - request({ - 'url': this.spotifyLookup, - 'qs': { 'uri': link }, - 'json': true - }, function(error, response, body) { - if(!error && response.statusCode == 200) { - if(_.has(body, 'track')) { - callback(dbot.t('track', { - 'artist': _.map(body.track.artists, - function(a) { return a.name }).join(', '), - 'album': body.track.album.name, - 'track': body.track.name - })); - } else if(_.has(body, 'album')) { - callback(dbot.t('album', { - 'artist': body.album.artist, - 'album': body.album.name - })); - } else if(_.has(body, 'artist')) { - callback(dbot.t('artist', { - 'artist': body.artist.name - })); - } - } - }); + this.authenticate(function(token) { + request({ + 'url': this.spotifyLookup, + 'qs': { 'uri': link }, + 'json': true, + 'headers': { 'Authorization': "Bearer " + token } + }, function(error, response, body) { + if(!error && response.statusCode == 200) { + if(_.has(body, 'track')) { + callback(dbot.t('track', { + 'artist': _.map(body.track.artists, + function(a) { return a.name }).join(', '), + 'album': body.track.album.name, + 'track': body.track.name + })); + } else if(_.has(body, 'album')) { + callback(dbot.t('album', { + 'artist': body.album.artist, + 'album': body.album.name + })); + } else if(_.has(body, 'artist')) { + callback(dbot.t('artist', { + 'artist': body.artist.name + })); + } + } + }); + }.bind(this)); }; this.api = { 'spotifySearch': function(query, callback) { - request({ - 'url': this.spotifySearch, - 'qs': { 'q': query, 'type': 'track' }, - 'json': true - }, function(error, response, body) { - if(!error && response.statusCode == 200) { - if(_.has(body, 'tracks') && body.tracks.items[0] && _.has(body.tracks.items[0], 'href')) { - var t = body.tracks.items[0].href; - ///*t = t.replace(/:/g, '/'); - t = t.replace(/api.spotify.com\/v1\/tracks/, - 'open.spotify.com/track'); - callback(body, t); - } else { - callback(false); - } - } - }); + this.authenticate(function(token) { + request({ + 'url': this.spotifySearch, + 'qs': { 'q': query, 'type': 'track' }, + 'json': true, + 'headers': { 'Authorization': "Bearer " + token } + }, function(error, response, body) { + if(!error && response.statusCode == 200) { + if(_.has(body, 'tracks') && body.tracks.items[0] && _.has(body.tracks.items[0], 'href')) { + var t = body.tracks.items[0].href; + ///*t = t.replace(/:/g, '/'); + t = t.replace(/api.spotify.com\/v1\/tracks/, + 'open.spotify.com/track'); + callback(body, t); + } else { + callback(false); + } + } + }); + }.bind(this)); } }; @@ -95,16 +121,16 @@ var spotify = function(dbot) { lastLink = event.params[1]; } - if(lastLink.match(this.youtubeRegex) | lastLink.match(this.youtubeMiniRegex)) { + if(lastLink.match(this.youtubeRegex)) { dbot.api.link.getTitle(lastLink, function(title) { - name = title.replace(' - YouTube', ''); + name = title.replace(' - YouTube', ''); this.api.spotifySearch(name, function(body, t) { - if(body) { - event.reply(dbot.t('found', { - 'artist': _.map(body.tracks[0].artists, + if(body) { + event.reply(dbot.t('found', { + 'artist': _.map(body.tracks.items[0].artists, function(a) { return a.name }).join(', '), - 'album': body.tracks[0].album.name, - 'track': body.tracks[0].name, + 'album': body.tracks.items[0].album.name, + 'track': body.tracks.items[0].name, 'url': t })); } else {