diff --git a/apis/demo.js b/apis/demo.js new file mode 100644 index 0000000..ebc35b4 --- /dev/null +++ b/apis/demo.js @@ -0,0 +1,38 @@ +var async = require('async'); + +var t_utils = require('../workers/twitter_utils.js'); + +/* +* TODO: +*/ +var run = (req, res) => { + if (!req || !req.body) { + return res.status(400).send('Request body required'); + } + + var key = 'q'; + var q = req.body[key]; + if (q == undefined) { + return res.status(400).send(`Request JSON must contain "${key}" as a key`); + } + + t_utils.get_genres(q, (err, genre_res) => { + if (err) { + genre_res.status(500).send(`get_genres error ${err}`); + } else if (genre_res) { + t_utils.generate(genre_res, (err, gen_res) => { + if (err) { + res.status(500).send(`generate error ${err}`); + } else { + res_dict = {'samples': JSON.parse(gen_res), 'genres': genre_res, 'query': q}; + console.log(res_dict); + res.send(res_dict); + } + }); + } else { + res.status(200).send(`Sorry, no genres found on Spotify for "${q}"`); + } + }); +} + +module.exports = { run: run }; diff --git a/apis/index.js b/apis/index.js index cc10a5b..e242cce 100644 --- a/apis/index.js +++ b/apis/index.js @@ -5,6 +5,8 @@ var sheets = require('./sheets.js'); var spotify = require('./spotify.js'); var twitter = require('./twitter.js'); +var demo = require('./demo.js'); + var app = express(); app.use(express.json()); @@ -15,6 +17,8 @@ app.post('/get_genres', spotify.get_genres); app.post('/get_tweets', twitter.get_tweets); +app.post('/demo', demo.run); + port_num = process.env.PORT || 8888; console.log(`Listening on ${port_num}`); app.listen(port_num); diff --git a/workers/twitter.js b/workers/twitter.js index 8e8596c..2de4e7b 100644 --- a/workers/twitter.js +++ b/workers/twitter.js @@ -2,6 +2,8 @@ var request = require('request'); var async = require('async'); +var utils = require('./twitter_utils.js'); + var num_gens = 5; var get_last_gen = (step) => { @@ -32,6 +34,7 @@ var get_last_gen = (step) => { var process_tweet = (tweet, cb) => { // TODO: second regex with optional non-capturing group can miss artists // TODO: use user mention screen names + // TODO: remove 'feat.' in addition to the 'and' const regex = /["'](.*)["'] by ([^ http]*)|(?:.*, )?(.*)'s ["'](.*)["']/gm; r = regex.exec(tweet.full_text); if (!r) { @@ -89,32 +92,8 @@ var get_tweets = (step) => { }); } -var get_genres = (q, cb) => { - var get_spotify_opts = { - uri: `${process.env.DEEPHYPEBOT_API_BASEURL}/get_genres`, - json: { - 'q': q - } - }; - - request.post(get_spotify_opts, function (error, response, body) { - if (!error && response.statusCode == 200) { - genres = body; - console.log(`genres for '${q}': ${genres}`); - cb(false, genres); - } else { - if (!error) { - error = body; - } - - console.warn(`genres NOT received for '${q}': ${error}`); - cb(false, undefined); - } - }); -} - var get_genres_list = (step) => { - async.map(qs, get_genres, function(err, results) { + async.map(qs, utils.get_genres, function(err, results) { if (err) { step(true, err); } else { @@ -132,40 +111,8 @@ var get_genres_list = (step) => { }); } -var generate = (genres, cb) => { - var get_gen_opts = { - uri: `${process.env.DEEPHYPEBOT_MODEL_BASEURL}/generate`, - json: { - 'genres': genres, - 'num_sample': num_gens - } - }; - - request.post(get_gen_opts, function (error, response, body) { - if (!error && response.statusCode == 200) { - gens = body['gens']; - - gens.forEach((gen, i) => { - // remove 1) UNKs, 2) consecutive duplicated words - // TODO: replace artist and song_title ? - // TODO: replace UNKs with artist and song_title at random ? - gens[i] = gen.replace(/UNK/g, '').split(/\s+/).filter((value, i, arr) => { return value != arr[i+1]}).join(" "); - }); - - cb(false, JSON.stringify(gens)); - } else { - if (!error) { - error = body; - } - - console.warn(`generations NOT received for '${JSON.stringify(genres)}': ${error}`); - cb(false, undefined); - } - }); -} - var generate_multi = (step) => { - async.mapSeries(genres_list, generate, function(err, results) { + async.mapSeries(genres_list, utils.generate, function(err, results) { if (err) { step(true, err); } else { @@ -257,4 +204,4 @@ function loop(){ loop(); setInterval(function(){ loop(); -}, schedule_seconds*1000); \ No newline at end of file +}, schedule_seconds*1000); diff --git a/workers/twitter_utils.js b/workers/twitter_utils.js new file mode 100644 index 0000000..b5f3abd --- /dev/null +++ b/workers/twitter_utils.js @@ -0,0 +1,61 @@ +var request = require('request'); + +num_gens = 5; + +var generate = (genres, cb) => { + var get_gen_opts = { + uri: `${process.env.DEEPHYPEBOT_MODEL_BASEURL}/generate`, + json: { + 'genres': genres, + 'num_sample': num_gens + } + }; + + request.post(get_gen_opts, function (error, response, body) { + if (!error && response.statusCode == 200) { + gens = body['gens']; + + gens.forEach((gen, i) => { + // remove 1) UNKs, 2) consecutive duplicated words + // TODO: replace artist and song_title ? + // TODO: replace UNKs with artist and song_title at random ? + gens[i] = gen.replace(/UNK/g, '').split(/\s+/).filter((value, i, arr) => { return value != arr[i+1]}).join(" "); + }); + + cb(false, JSON.stringify(gens)); + } else { + if (!error) { + error = body; + } + + console.warn(`generations NOT received for '${JSON.stringify(genres)}': ${error}`); + cb(false, undefined); + } + }); +} + +var get_genres = (q, cb) => { + var get_spotify_opts = { + uri: `${process.env.DEEPHYPEBOT_API_BASEURL}/get_genres`, + json: { + 'q': q + } + }; + + request.post(get_spotify_opts, function (error, response, body) { + if (!error && response.statusCode == 200) { + genres = body; + console.log(`genres for '${q}': ${genres}`); + cb(false, genres); + } else { + if (!error) { + error = body; + } + + console.warn(`genres NOT received for '${q}': ${error}`); + cb(false, undefined); + } + }); +} + +module.exports = { get_genres: get_genres, generate: generate };