"use client" import type React from "react" import { useEffect, useState, useCallback, useRef } from "react" import Image from "next/image" import { Music, ExternalLink, Disc, User, Loader2 } from "lucide-react" import Marquee from "react-fast-marquee" interface Track { track_name: string artist_name: string release_name?: string mbid?: string } const ScrollableText: React.FC<{ text: string; className?: string }> = ({ text, className = "" }) => { const containerRef = useRef(null) const [shouldScroll, setShouldScroll] = useState(false) useEffect(() => { if (containerRef.current) { setShouldScroll(containerRef.current.scrollWidth > containerRef.current.clientWidth) console.log("[i] text width checked: ", containerRef.current.scrollWidth, containerRef.current.clientWidth) } }, [containerRef]) if (shouldScroll) { console.log("✅ scrolling is active") return (
{text}
) } return (
{text}
) } const NowPlaying: React.FC = () => { const [track, setTrack] = useState(null) const [coverArt, setCoverArt] = useState(null) const [loading, setLoading] = useState(true) const [loadingStatus, setLoadingStatus] = useState("Initializing") const [error, setError] = useState(null) const fetchAlbumArt = useCallback(async (artist: string, album?: string) => { if (!album) { console.log("[i] no album found") setCoverArt(null) setLoading(false) return } try { console.log("[i] fetching album art: ", artist, album) const response = await fetch( `https://musicbrainz.org/ws/2/release/?query=artist:${encodeURIComponent( artist )}%20AND%20release:${encodeURIComponent(album)}&fmt=json` ) if (!response.ok) { console.log("[!] album art fetch error:", response.status) throw new Error(`HTTP error! status: ${response.status}`) } const data = await response.json() if (data.releases && data.releases.length > 0) { const mbid = data.releases[0].id console.log("✅ mbid found:", mbid) setTrack(prev => prev ? { ...prev, mbid: `${mbid || null}` } : { track_name: "", artist_name: "", release_name: undefined, mbid: `${mbid || null}` }) const coverArtResponse = await fetch(`https://coverartarchive.org/release/${mbid}/front-250`) if (coverArtResponse.ok) { console.log("✅ cover art found") setCoverArt(coverArtResponse.url) } else { console.log("[i] cover art not found!") setCoverArt(null) } } else { console.log("[i] no releases in data!") setCoverArt(null) } } catch (error) { console.log("[!] album art error", error) setCoverArt(null) } finally { setLoading(false) console.log("[i] album art done") } }, []) const fetchNowPlaying = useCallback(async () => { setLoadingStatus("Fetching now playing") console.log("[i] fetching now playing...") try { const response = await fetch("https://api.listenbrainz.org/1/user/p0ntus/playing-now", { headers: { Authorization: `Token ${process.env.NEXT_PUBLIC_LISTENBRAINZ_TOKEN}`, }, }) if (!response.ok) { console.log("[!] now playing error:", response.status) throw new Error(`HTTP error! Status: ${response.status}`) } const data = await response.json() if (data.payload.count > 0 && data.payload.listens[0].track_metadata) { const trackMetadata = data.payload.listens[0].track_metadata console.log("✅ track found: ", trackMetadata.track_name) console.log("[i] song details: ", trackMetadata.track_name, "-", trackMetadata.artist_name, "/", trackMetadata.release_name) setTrack({ track_name: trackMetadata.track_name, artist_name: trackMetadata.artist_name, release_name: trackMetadata.release_name, mbid: trackMetadata.mbid, }) setLoadingStatus("Fetching album art") await fetchAlbumArt(trackMetadata.artist_name, trackMetadata.release_name) } else { console.log("[i] no track playing") setLoadingStatus("No track playing") setLoading(false) } } catch (error) { console.log("[!] now playing error:", error) setError("Error fetching now playing data") setLoading(false) } }, [fetchAlbumArt]) useEffect(() => { fetchNowPlaying() }, [fetchNowPlaying]) if (loading) { return (

Now Playing

{loadingStatus}

) } if (error) { return (

Now Playing

{error}

) } if (!track) { return (

Now Playing

No track playing

) } return (

Now Playing

{coverArt ? (
{track.track_name}
) : (
)}
{track.release_name && (
)}
View on MusicBrainz
) } export default NowPlaying