1
0
Fork 0
taevas.xyz/backend/api/infos/media/lastfm.ts
Taevas d781f7138f
Make backend/frontend distinction clearer
Helps with eventually adding other pages
Also makes it clear it's the backend that decides what data to send to the frontend
2025-07-08 14:40:35 +02:00

56 linhas
1,5 KiB
TypeScript

import { headers, parseJson, type Handler } from "../..";
export type Info = {
artist: string;
name: string;
album: string;
image: string;
listening: boolean;
url: string;
date: string;
} | undefined;
const username = "TTTaevas";
export const lastfm: Handler = async () => {
/** https://www.last.fm/api/show/user.getRecentTracks */
const url = `https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=${username}&api_key=${process.env["API_LASTFM"]}&format=json&limit=1`;
const lastfm = await parseJson(await fetch(url, {headers})) as {
recenttracks: {
track: {
artist: {
"#text": string;
};
image: {
size: string;
"#text": string;
}[];
album: {
"#text": string;
};
name: string;
"@attr"?: {
nowplaying?: string;
};
url: string;
date?: {
uts: string;
"#text": string;
};
}[];
};
};
const image = lastfm.recenttracks.track[0].image.find((i) => i.size == "large");
const track: Info = {
artist: lastfm.recenttracks.track[0].artist["#text"],
name: lastfm.recenttracks.track[0].name,
album: lastfm.recenttracks.track[0].album["#text"],
image: image ? image["#text"] : "",
listening: Boolean(lastfm.recenttracks.track[0]["@attr"]?.nowplaying),
url: lastfm.recenttracks.track[0].url,
date: lastfm.recenttracks.track[0].date?.uts ?? String(Date.now()),
};
return Response.json(track, {status: 200});
};