bravo68web-portfolio-nextjs/hooks/useLastFM.js

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