apradiobot/src/spotify.js
2019-12-23 07:22:36 -05:00

102 lines
3.5 KiB
JavaScript

const Spotify = require('node-spotify-api')
const chalk = require('chalk')
require('dotenv').config()
const { insertTrack } = require('./mpc-commands')
let request = ''
const handleSpam = require('./handleSpam')
const CLIENT_ID = process.env.CLIENT_ID
const CLIENT_SECRET = process.env.CLIENT_SECRET
const spotify = new Spotify({
id: CLIENT_ID,
secret: CLIENT_SECRET,
})
const parseTrackData = tracks => {
const { items } = tracks
//printTrackNames(items)
const { album, artists, uri, name } = items[0]
const artist = artists[0].name
const albumName = album.name
return { trackName: name, artistName: artist, albumName, uri }
}
const addToPlaylist = (nick, string) => {
require('fs').appendFileSync(`playlists/${nick}`, string)
}
const searchTrack = event => {
let pattern = /^!search "(.+?)"( artist "(.+?)")?/
let match = event.message.match(pattern)
if (!match)
return event.reply(
'Incorrect syntax. Use !search "track name" artist "artist name" (artist and artist name optional)'
)
let query = match[1]
if (match[3]) query += ` artist:${match[3]}`
//printQuery(query)
spotify.search({ type: 'track', query }).then(data => {
if (!data || !data.tracks) return event.reply('Something went wrong.')
if (data.tracks.total === 0) return event.reply('No results.')
const { trackName, artistName, albumName, uri } = parseTrackData(
data.tracks
)
printTrackData(trackName, artistName, albumName, uri)
event.reply(`'${trackName}' by ${artistName} on album ${albumName}`)
})
}
const requestTrack = event => {
if (event.message === request) return handleSpam(event)
request = event.message
let pattern = /^!request "(.+?)"( artist "(.+?)")?/
let match = event.message.match(pattern)
if (!match)
return event.reply(
'Incorrect syntax. Use !request "track name" artist "artist name" (artist and artist name optional)'
)
let query = match[1]
if (match[3]) query += ` artist:${match[3]}`
//printQuery(query)
spotify.search({ type: 'track', query }).then(data => {
if (!data || !data.tracks) return event.reply('Something went wrong.')
if (data.tracks.total === 0) return event.reply('No results.')
const { trackName, artistName, albumName, uri } = parseTrackData(
data.tracks
)
printTrackData(trackName, artistName, albumName, uri)
const { error } = insertTrack(uri)
if (error) return event.reply('Something went wrong.')
const request = `'${trackName}' by ${artistName}`
addToPlaylist(event.nick, `${uri} # ${request}`)
event.reply(`Requested ${request}`)
})
}
// const printQuery = query => {
// console.log(chalk.red('\n*******************************************\n'))
// console.log('Sending the following query to Spotify:')
// console.log(query)
// console.log(chalk.red('\n*******************************************\n'))
// }
// const printTrackNames = items => {
// console.log(chalk.yellow('\n*******************************************\n'))
// console.log('Search returned the following tracks:')
// items.map(i => console.log(`'${i.name}' by ${i.artists[0].name}`))
// console.log(chalk.yellow('\n*******************************************\n'))
// }
const printTrackData = (name, artist, albumName, uri) => {
console.log(chalk.blue('\n*******************************************\n'))
console.log('name:', name)
console.log('artist:', artist)
console.log('album:', albumName)
console.log('uri:', uri)
console.log(chalk.blue('\n*******************************************\n'))
}
module.exports = { searchTrack, requestTrack }