"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, AlertCircle } from "lucide-react" import Marquee from "react-fast-marquee" import { Progress } from "@/components/ui/progress" 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 [progress, setProgress] = useState(0) const [steps, setSteps] = useState(0) const updateProgress = useCallback((current: number, total: number, status: string) => { setProgress(current) setSteps(total) setLoadingStatus(status) console.log(`[${current}/${total}] ${status}`) }, []) const fetchAlbumArt = useCallback(async (artist: string, album?: string) => { if (!album) { updateProgress(0, 0, "No album found") setCoverArt(null) setLoading(false) return } try { updateProgress(2, 3, `Searching for album: ${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) { updateProgress(0, 0, `Album art fetch error: ${response.status}`) setError("Error fetching album art (see console for details)") setLoading(false) return } const data = await response.json() if (data.releases && data.releases.length > 0) { const mbid = data.releases[0].id updateProgress(3, 3, "Fetching cover art...") 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) { setCoverArt(coverArtResponse.url) setLoading(false) } else { updateProgress(0, 0, "Cover art not found") setCoverArt(null) setLoading(false) } } else { updateProgress(0, 0, "No releases found") setCoverArt(null) setLoading(false) } } catch (error) { updateProgress(0, 0, `Error: ${error}`) setCoverArt(null) setLoading(false) } }, [updateProgress]) const fetchNowPlaying = useCallback(async () => { updateProgress(1, 3, "Fetching current listen...") try { const response = await fetch("https://api.listenbrainz.org/1/user/p0ntus/playing-now") 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 METADATA =") if (trackMetadata.track_name) { console.log("🎵", trackMetadata.track_name) } if (trackMetadata.artist_name) { console.log("🎤", trackMetadata.artist_name) } if (trackMetadata.release_name) { console.log("💿", trackMetadata.release_name) } setTrack({ track_name: trackMetadata.track_name, artist_name: trackMetadata.artist_name, release_name: trackMetadata.release_name, mbid: trackMetadata.mbid, }) updateProgress(2, 3, "Finding album art...") await fetchAlbumArt(trackMetadata.artist_name, trackMetadata.release_name) } else { updateProgress(0, 0, "No track playing") setLoading(false) } } catch (error) { updateProgress(0, 0, `Error: ${error}`) setError("Error fetching now playing data") setLoading(false) } }, [fetchAlbumArt, updateProgress]) useEffect(() => { fetchNowPlaying() }, [fetchNowPlaying]) if (loading) { console.log("[LastPlayed] Loading state rendered") return (

Now Playing

0 ? (progress * 100) / steps : 0} className="mb-4" />

{loadingStatus} {steps > 0 && `(${progress}/${steps})`}

) } if (error) { console.log("[LastPlayed] Error state rendered") return (

Now Playing

{error}

) } if (!track) { console.log("[LastPlayed] Hidden due to no track data") return null } console.log("[LastPlayed] Rendered track:", track.track_name) return (

Now Playing

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