import path from 'path' import as from './common/async' import dl from './common/download' import crypto from 'crypto' const values = require(path.join(process.cwd(), 'values.json')) let externalTracks = {} function createHash (data) { return crypto .createHash('sha1') .update(data.artist + data.name) .digest('hex') .substr(0, 8) } async function getTrackMetaReal (id) { if (!id || !externalTracks[id]) return null let trdata = externalTracks[id] if (trdata.file) return Object.assign({}, trdata) let trsrch = 'ytsearch1:' + trdata.artist + ' - ' + trdata.title let dldata = await dl.getVideoInfo(trsrch) externalTracks[id] = { id: trdata.id, title: trdata.title, artist: trdata.artist, file: dldata.url, duration: dldata.duration, external: true } return Object.assign({}, externalTracks[id]) } async function search (track, limit = 30) { if (!values.lastfm) return [] let data try { data = await as.GET(`http://ws.audioscrobbler.com/2.0/?method=track.search&track=${track}&api_key=${values.lastfm}&format=json&limit=${limit}`) data = JSON.parse(data) if (!data.results || !data.results.trackmatches || !data.results.trackmatches.track) { throw new Error('No results') } } catch (e) { return [] } let final = [] for (let i in data.results.trackmatches.track) { let res = data.results.trackmatches.track[i] let clean = { id: createHash(res), artist: res.artist, title: res.name, external: true } if (externalTracks[clean.id]) { // Copy object clean = Object.assign({}, externalTracks[clean.id]) } else { // Save in cache externalTracks[clean.id] = clean } final.push(clean) } return final } export default {search, getTrackMetaReal}