68 lines
1.3 KiB
JavaScript
68 lines
1.3 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()
|
|
}, 3000)
|
|
|
|
return () => clearInterval(interval)
|
|
|
|
},[])
|
|
|
|
return {status,song}
|
|
}
|
|
|
|
export default useLastFM |