import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Download, FolderOpen, CheckCircle, XCircle, FileText, FileCheck, Globe, ImageDown } from "lucide-react"; import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import type { TrackMetadata, TrackAvailability } from "@/types/api"; import { TidalIcon, QobuzIcon, AmazonIcon } from "./PlatformIcons"; interface TrackInfoProps { track: TrackMetadata & { album_name: string; release_date: string; }; isDownloading: boolean; downloadingTrack: string | null; isDownloaded: boolean; isFailed: boolean; isSkipped: boolean; downloadingLyricsTrack?: string | null; downloadedLyrics?: boolean; failedLyrics?: boolean; skippedLyrics?: boolean; checkingAvailability?: boolean; availability?: TrackAvailability; downloadingCover?: boolean; downloadedCover?: boolean; failedCover?: boolean; skippedCover?: boolean; onDownload: (isrc: string, name: string, artists: string, albumName?: string, spotifyId?: string, playlistName?: string, durationMs?: number, position?: number, albumArtist?: string, releaseDate?: string, coverUrl?: string, spotifyTrackNumber?: number, spotifyDiscNumber?: number, spotifyTotalTracks?: number, spotifyTotalDiscs?: number, copyright?: string, publisher?: string) => void; onDownloadLyrics?: (spotifyId: string, name: string, artists: string, albumName?: string, albumArtist?: string, releaseDate?: string, discNumber?: number) => void; onCheckAvailability?: (spotifyId: string, isrc?: string) => void; onDownloadCover?: (coverUrl: string, trackName: string, artistName: string, albumName?: string, playlistName?: string, position?: number, trackId?: string, albumArtist?: string, releaseDate?: string, discNumber?: number) => void; onOpenFolder: () => void; } export function TrackInfo({ track, isDownloading, downloadingTrack, isDownloaded, isFailed, isSkipped, downloadingLyricsTrack, downloadedLyrics, failedLyrics, skippedLyrics, checkingAvailability, availability, downloadingCover, downloadedCover, failedCover, skippedCover, onDownload, onDownloadLyrics, onCheckAvailability, onDownloadCover, onOpenFolder, }: TrackInfoProps) { const formatDuration = (ms: number) => { const minutes = Math.floor(ms / 60000); const seconds = Math.floor((ms % 60000) / 1000); return `${minutes}:${seconds.toString().padStart(2, "0")}`; }; const formatPlays = (plays: string) => { const num = parseInt(plays, 10); if (isNaN(num)) return plays; return num.toLocaleString(); }; return (
{track.images && (
{track.name}
{formatDuration(track.duration_ms)}
)}

{track.name}

{isSkipped ? () : isDownloaded ? () : isFailed ? () : null}

{track.artists}

Album

{track.album_name}

{track.plays && (

Total Plays

{formatPlays(track.plays)}

)}

Release Date

{track.release_date}

{track.copyright && (

Copyright

{track.copyright}

)}
{track.isrc && (
{track.spotify_id && onDownloadLyrics && (

Download Lyric

)} {track.images && onDownloadCover && (

Download Cover

)} {track.spotify_id && onCheckAvailability && ( {availability ? (
) : (

Check Availability

)}
)} {isDownloaded && ()}
)}
); }