import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Download, FolderOpen, ImageDown, FileText } from "lucide-react"; import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { SearchAndSort } from "./SearchAndSort"; import { TrackList } from "./TrackList"; import { DownloadProgress } from "./DownloadProgress"; import type { TrackMetadata, TrackAvailability } from "@/types/api"; interface PlaylistInfoProps { playlistInfo: { owner: { name: string; display_name: string; images: string; }; tracks: { total: number; }; followers: { total: number; }; }; trackList: TrackMetadata[]; searchQuery: string; sortBy: string; selectedTracks: string[]; downloadedTracks: Set; failedTracks: Set; skippedTracks: Set; downloadingTrack: string | null; isDownloading: boolean; bulkDownloadType: "all" | "selected" | null; downloadProgress: number; currentDownloadInfo: { name: string; artists: string } | null; currentPage: number; itemsPerPage: number; // Lyrics props downloadedLyrics?: Set; failedLyrics?: Set; skippedLyrics?: Set; downloadingLyricsTrack?: string | null; // Availability props checkingAvailabilityTrack?: string | null; availabilityMap?: Map; // Cover props downloadedCovers?: Set; failedCovers?: Set; skippedCovers?: Set; downloadingCoverTrack?: string | null; isBulkDownloadingCovers?: boolean; isBulkDownloadingLyrics?: boolean; onSearchChange: (value: string) => void; onSortChange: (value: string) => void; onToggleTrack: (isrc: string) => void; onToggleSelectAll: (tracks: TrackMetadata[]) => void; onDownloadTrack: (isrc: string, name: string, artists: string, albumName: string, spotifyId?: string, folderName?: string, durationMs?: number, position?: number, albumArtist?: string, releaseDate?: string, coverUrl?: string, spotifyTrackNumber?: number, spotifyDiscNumber?: number, spotifyTotalTracks?: number) => void; onDownloadLyrics?: (spotifyId: string, name: string, artists: string, albumName: string, folderName?: string, isArtistDiscography?: boolean, position?: number) => void; onDownloadCover?: (coverUrl: string, trackName: string, artistName: string, albumName: string, folderName?: string, isArtistDiscography?: boolean, position?: number, trackId?: string) => void; onCheckAvailability?: (spotifyId: string) => void; onDownloadAllLyrics?: () => void; onDownloadAllCovers?: () => void; onDownloadAll: () => void; onDownloadSelected: () => void; onStopDownload: () => void; onOpenFolder: () => void; onPageChange: (page: number) => void; onAlbumClick: (album: { id: string; name: string; external_urls: string }) => void; onArtistClick: (artist: { id: string; name: string; external_urls: string }) => void; onTrackClick: (track: TrackMetadata) => void; } export function PlaylistInfo({ playlistInfo, trackList, searchQuery, sortBy, selectedTracks, downloadedTracks, failedTracks, skippedTracks, downloadingTrack, isDownloading, bulkDownloadType, downloadProgress, currentDownloadInfo, currentPage, itemsPerPage, downloadedLyrics, failedLyrics, skippedLyrics, downloadingLyricsTrack, checkingAvailabilityTrack, availabilityMap, downloadedCovers, failedCovers, skippedCovers, downloadingCoverTrack, isBulkDownloadingCovers, isBulkDownloadingLyrics, onSearchChange, onSortChange, onToggleTrack, onToggleSelectAll, onDownloadTrack, onDownloadLyrics, onDownloadCover, onCheckAvailability, onDownloadAllLyrics, onDownloadAllCovers, onDownloadAll, onDownloadSelected, onStopDownload, onOpenFolder, onPageChange, onAlbumClick, onArtistClick, onTrackClick, }: PlaylistInfoProps) { return (
{playlistInfo.owner.images && ( {playlistInfo.owner.name} )}

Playlist

{playlistInfo.owner.name}

{playlistInfo.owner.display_name} {playlistInfo.tracks.total} songs {playlistInfo.followers.total.toLocaleString()} followers
{selectedTracks.length > 0 && ( )} {onDownloadAllLyrics && (

Download All Lyrics

)} {onDownloadAllCovers && (

Download All Covers

)} {downloadedTracks.size > 0 && ( )}
{isDownloading && ( )}
); }