wonderfulfrog.com/src/_data/lastfm.js

98 lines
2.2 KiB
JavaScript

import "dotenv/config";
import EleventyFetch from "@11ty/eleventy-fetch";
import dayjs from "dayjs";
import utc from "dayjs/plugin/utc.js";
import relativeTime from "dayjs/plugin/relativeTime.js";
dayjs.extend(utc);
dayjs.extend(relativeTime);
const lastFmApiKey = process.env.LAST_FM_API_KEY;
const baseUrl = "http://ws.audioscrobbler.com";
const username = "wonderfulfrog";
const fetchLastFm = async (method, duration, extraArgs) => {
try {
const path = `/2.0/?method=${method}&user=${username}&api_key=${lastFmApiKey}&format=json`;
let url = `${baseUrl}${path}`;
if (extraArgs) {
url = `${url}&${extraArgs}`;
}
const response = await EleventyFetch(url, { duration, type: "json" });
return response;
} catch (e) {
console.error(`Error fetching last.fm data for method=${method}`, e);
return undefined;
}
};
const fetchRecentAlbums = async (period = "7day") => {
const response = await fetchLastFm(
"user.gettopalbums",
"7d",
`period=${period}`,
);
if (!response) {
return [];
}
const albums = response.topalbums.album.slice(0, 8);
const recentAlbums = albums.map((album) => {
const extraLargeImage = album.image.find(
(img) => img.size === "extralarge",
);
const imageUrl = extraLargeImage ? extraLargeImage["#text"] : "";
return {
artist: album.artist.name,
artistMbid: album.artist.mbid,
album: album.name,
albumMbid: album.mbid,
playcount: album.playcount,
url: album.url,
imageUrl,
};
});
return recentAlbums;
};
const fetchRecentTracks = async () => {
const response = await fetchLastFm("user.getrecenttracks", "5m");
if (!response) {
return [];
}
const tracks = response.recenttracks.track.slice(0, 5);
const recentTracks = tracks.map((track) => {
const timestamp = track.date
? dayjs(track.date["#text"]).utc(true).fromNow()
: dayjs().fromNow();
return {
artist: track.artist["#text"],
track: track.name,
url: track.url,
timestamp,
};
});
return recentTracks;
};
export default async function () {
const recentTracks = await fetchRecentTracks();
const recentAlbums = await fetchRecentAlbums();
return {
recentTracks,
recentAlbums,
};
}