btrtracks/src/lastfm.js

78 lines
1.8 KiB
JavaScript
Raw Normal View History

2019-01-25 15:00:35 +00:00
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) {
2019-01-25 21:11:58 +00:00
return crypto
.createHash('sha1')
.update(data.artist + data.name)
.digest('hex')
2019-01-25 15:00:35 +00:00
.substr(0, 8)
}
async function getTrackMetaReal (id) {
if (!id || !externalTracks[id]) return null
let trdata = externalTracks[id]
2019-01-25 21:11:58 +00:00
if (trdata.file) return Object.assign({}, trdata)
2019-01-25 15:00:35 +00:00
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
}
2019-01-25 21:11:58 +00:00
return Object.assign({}, externalTracks[id])
2019-01-25 15:00:35 +00:00
}
async function search (track, limit = 30) {
if (!values.lastfm) return []
2019-01-25 21:11:58 +00:00
2019-01-25 15:00:35 +00:00
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)
2019-01-25 21:11:58 +00:00
if (!data.results || !data.results.trackmatches || !data.results.trackmatches.track) {
throw new Error('No results')
}
2019-01-25 15:00:35 +00:00
} catch (e) {
return []
}
2019-01-25 21:11:58 +00:00
2019-01-25 15:00:35 +00:00
let final = []
for (let i in data.results.trackmatches.track) {
let res = data.results.trackmatches.track[i]
2019-01-25 21:11:58 +00:00
let clean = {
id: createHash(res),
artist: res.artist,
title: res.name,
external: true
2019-01-25 15:00:35 +00:00
}
2019-01-25 21:11:58 +00:00
if (externalTracks[clean.id]) {
// Copy object
clean = Object.assign({}, externalTracks[clean.id])
} else {
// Save in cache
externalTracks[clean.id] = clean
}
final.push(clean)
2019-01-25 15:00:35 +00:00
}
2019-01-25 21:11:58 +00:00
2019-01-25 15:00:35 +00:00
return final
}
export default {search, getTrackMetaReal}