My personal site hosted @ https://indexx.dev

feat: change API for last.fm recent track display

Index 26474b94 87cdce2c

Changed files
+84 -20
src
types
-2
robots.txt
···
-
User-agent: *
-
Disallow:
+8 -16
src/components/NowPlaying.jsx
···
const fetchNowPlaying = async () => {
try {
const res = await fetch(
-
"https://lastfm-last-played.biancarosa.com.br/Index_Card/latest-song",
+
"https://indexx.dev/api/misc/now-playing",
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const json = await res.json();
-
const track = json.track;
-
const isNowPlaying = track["@attr"]?.nowplaying === "true";
-
const status = {
-
song: track.name,
-
artist: track.artist["#text"],
-
album: track.album["#text"],
-
createdAt: track.date
-
? new Date(track.date.uts * 1000).toISOString()
-
: null,
-
link: track.url,
-
nowPlaying: isNowPlaying,
-
albumArt: track.image.find((img) =>
-
img.size === "medium"
-
)["#text"],
+
song: json.track,
+
artist: json.artist,
+
albumArt: json.cover,
+
createdAt: json.createdAt,
+
link: json.url,
+
nowPlaying: !json.createdAt,
};
setData(status);
} catch (err) {
···
}, []);
if (error) return <span>Error: {error}</span>;
-
if (!data) return <span>Loading now playing...</span>;
+
if (!data) return null;
let timeAgo = "";
let oldStatusClasses = "";
+4
src/components/SocialLinks.astro
···
{
name: 'GitHub',
href: 'https://github.com/indexxing/'
+
},
+
{
+
name: 'last.fm',
+
href: 'https://last.fm/user/Index_Card'
}
];
---
+20 -2
src/components/Status.jsx
···
fetchStatus();
}, [actorDid]);
-
if (error) return <span>Error: {error}</span>;
-
if (!data) return <span>Loading status...</span>;
+
if (error) {
+
return (
+
<span
+
className="badge bg-dark"
+
style={{ color: "#595959 !important" }}
+
>
+
Error: {error}
+
</span>
+
);
+
}
+
if (!data) {
+
return (
+
<span
+
className="badge bg-dark"
+
style={{ color: "#595959 !important" }}
+
>
+
Loading status...
+
</span>
+
);
+
}
const date = new Date(data.createdAt);
const now = new Date();
+52
types/lastfm.d.ts
···
+
interface LastFmImage {
+
size: "small" | "medium" | "large" | "extralarge";
+
"#text": string;
+
}
+
+
interface LastFmArtist {
+
mbid: string;
+
"#text": string;
+
}
+
+
interface LastFmAlbum {
+
mbid: string;
+
"#text": string;
+
}
+
+
interface LastFmDate {
+
uts: string;
+
"#text": string;
+
}
+
+
interface LastFmTrackAttr {
+
nowplaying?: boolean;
+
}
+
+
interface LastFmTrack {
+
artist: LastFmArtist;
+
streamable: boolean;
+
image: LastFmImage[];
+
mbid: string;
+
album: LastFmAlbum;
+
name: string;
+
url: string;
+
date: LastFmDate;
+
"@attr"?: LastFmTrackAttr;
+
}
+
+
interface LastFmRecentTracksAttr {
+
user: string;
+
totalPages: string;
+
page: string;
+
perPage: string;
+
total: string;
+
}
+
+
interface LastFmRecentTracks {
+
track: LastFmTrack[];
+
"@attr": LastFmRecentTracksAttr;
+
}
+
+
interface LastFmApiResponse {
+
recenttracks: LastFmRecentTracks;
+
}