aqualink
Version:
An Lavalink wrapper, focused in speed, performance, and features, Based in Riffy!
47 lines (43 loc) • 1.61 kB
JavaScript
const { request } = require("undici");
const sourceHandlers = new Map([
['spotify', uri => fetchThumbnail(`https://open.spotify.com/oembed?url=${uri}`)],
['youtube', identifier => fetchYouTubeThumbnail(identifier)]
]);
const YOUTUBE_URL_TEMPLATE = quality => id => `https://img.youtube.com/vi/${id}/${quality}.jpg`;
const YOUTUBE_QUALITIES = ['maxresdefault', 'hqdefault', 'mqdefault', 'default'].map(YOUTUBE_URL_TEMPLATE);
async function getImageUrl(info) {
if (!info?.sourceName || !info?.uri) return null;
const handler = sourceHandlers.get(info.sourceName.toLowerCase());
if (!handler) return null;
try {
return await handler(info.uri);
} catch (error) {
console.error('Error fetching image URL:', error);
return null;
}
}
async function fetchThumbnail(url) {
try {
const { body } = await request(url, {
method: "GET",
headers: { 'Accept': 'application/json' }
});
const json = await body.json();
return json.thumbnail_url || null;
} catch (error) {
console.error(`Error fetching thumbnail from ${url}:`, error);
return null;
}
}
async function fetchYouTubeThumbnail(identifier) {
try {
const thumbnail = await Promise.race(
YOUTUBE_QUALITIES.map(urlFunc => fetchThumbnail(urlFunc(identifier)))
);
return thumbnail || null;
} catch (error) {
console.error('No valid YouTube thumbnail found:', error);
return null;
}
}
module.exports = { getImageUrl };