muse/covers/covers.js

54 lines
1.4 KiB
JavaScript

const fetch = require('node-fetch');
const allSettled = require('promise.allsettled');
const lastfm = 'http://ws.audioscrobbler.com/2.0/'
const quality = 3;
allSettled.shim();
async function asklastfm(apikey, query) {
try {
let url = `${lastfm}?format=json&api_key=${apikey}&${query}`;
let res = await fetch(url);
return res.json();
} catch(e) {
console.log(query);
throw e;
}
}
async function getalbum(apikey, elem) {
let query, info = undefined;
if (elem['album'] !== undefined) {
query =`method=album.getinfo&artist=${encodeURIComponent(elem['artist'])}&album=${encodeURIComponent(elem['album'])}`;
info = await asklastfm(apikey, query);
} else if (elem['track'] !== undefined) {
query =`method=track.getinfo&artist=${encodeURIComponent(elem['artist'])}&track=${encodeURIComponent(elem['track'])}`;
info = (await asklastfm(apikey, query))['track']
}
if (info !== undefined) {
return info['album'];
} else {
return undefined;
}
}
exports.updatecovers = async function (apikey, list) {
let promises = list.map(async elem => {
if (!elem.cover) {
let info = await getalbum(apikey, elem);
if (typeof info === 'object' && info['image'] instanceof Array) {
let count = info['image'].length;
let index = count > quality ? quality : count;
let image = info['image'][index]['#text'];
if (image) {
elem['cover'] = image;
}
}
}
return elem;
});
return Promise.allSettled(promises);
}