Helps with eventually adding other pages Also makes it clear it's the backend that decides what data to send to the frontend
56 linhas
1,5 KiB
TypeScript
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});
|
|
};
|