61 lines
1.1 KiB
JavaScript
61 lines
1.1 KiB
JavaScript
import { useEffect, useState } from "react";
|
|
import axios from "../handlers/axios";
|
|
|
|
const parseSong = (body, imageSize) => {
|
|
if (!body) {
|
|
return {
|
|
status: "connecting",
|
|
song: null,
|
|
};
|
|
}
|
|
|
|
const lastSong = body.recenttracks.track?.[0];
|
|
|
|
if (!lastSong || !lastSong["@attr"]?.nowplaying) {
|
|
return {
|
|
status: "idle",
|
|
song: null,
|
|
};
|
|
}
|
|
|
|
const image = lastSong.image.find((i) => {
|
|
return i.size === imageSize;
|
|
});
|
|
|
|
return {
|
|
status: "playing",
|
|
song: {
|
|
name: lastSong.name,
|
|
artist: lastSong.artist["#text"],
|
|
art: image?.["#text"] ?? lastSong.image[0]["#text"],
|
|
url: lastSong.url,
|
|
album: lastSong.album["#text"],
|
|
},
|
|
};
|
|
};
|
|
|
|
const useLastFM = () => {
|
|
const [status, setStatus] = useState("idle");
|
|
const [song, setSong] = useState();
|
|
|
|
const getStatus = async () => {
|
|
axios.get("/me/lastfm/current").then((res) => {
|
|
const { status, song } = parseSong(res.data, "extralarge");
|
|
setSong(song);
|
|
setStatus(status);
|
|
});
|
|
};
|
|
|
|
useEffect(() => {
|
|
const interval = setInterval(() => {
|
|
getStatus();
|
|
}, 15000);
|
|
|
|
return () => clearInterval(interval);
|
|
}, []);
|
|
|
|
return { status, song };
|
|
};
|
|
|
|
export default useLastFM;
|