61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
|
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 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 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)
|
||
|
} catch (e) {
|
||
|
console.warn(e.stack)
|
||
|
return []
|
||
|
}
|
||
|
if (!data.results || !data.results.trackmatches || !data.results.trackmatches.track) return
|
||
|
let final = []
|
||
|
for (let i in data.results.trackmatches.track) {
|
||
|
let res = data.results.trackmatches.track[i]
|
||
|
try {
|
||
|
let tr = { artist: res.artist, title: res.name, external: true, id: createHash(res) }
|
||
|
externalTracks[tr.id] = tr
|
||
|
final.push(tr)
|
||
|
} catch (e) {
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
return final
|
||
|
}
|
||
|
|
||
|
export default {search, getTrackMetaReal}
|