import { Disc, Sparkles, CheckCircle, Shield, Zap, Tv, HardDrive } from 'lucide-react' import { RadialProgress } from './ui/RadialProgress' import { TypeBadge, StatusBadge } from './ui/Badge' import { Button } from './ui/Button' interface JobMeta { year?: number overview?: string poster_path?: string genres?: string[] runtime?: number type?: string source?: string } interface Job { id: string type: 'cd' | 'dvd' | 'bluray' | 'uhd' status: 'pending' | 'processing' | 'transcoding' | 'canceling' | 'completed' | 'failed' device: string startTime: string endTime?: string progress: number title?: string can_retry?: boolean meta?: JobMeta | null } function posterUrl(meta?: JobMeta | null): string | null { const p = meta?.poster_path if (!p) return null return p.startsWith('http') ? p : `https://image.tmdb.org/t/p/w500${p}` } interface HeroCinemaBannerProps { aktiverJob?: Job | null completedJobs?: Job[] onDetailClick?: (jobId: string) => void onCancelClick?: (jobId: string) => void } export function HeroCinemaBanner({ aktiverJob, completedJobs = [], onDetailClick, onCancelClick, }: HeroCinemaBannerProps) { // Fall 1: Aktiver Job (Rippt oder Komprimiert live) if (aktiverJob) { const isTranscoding = aktiverJob.status === 'transcoding' const statusText = isTranscoding ? 'HandBrake Kompression' : 'MakeMKV Extraktion' const poster = posterUrl(aktiverJob.meta) return (
{poster ? (
) : (
)}
NOW RIPPING

{aktiverJob.title || 'Aktiver Ripping-Prozess'}

Laufwerk: {aktiverJob.device} · {statusText}

) } // Fall 2: Kein aktiver Job -> 5-Panel Kachel-Galerie VOLLSTÄNDIG ausfüllen (Zero "Löcher"!) // Wir füllen freie Slots mit informativen Cinema-Engine-Showcase-Kacheln auf! const realMovieTiles = completedJobs.slice(0, 4) return (
{/* Top Subtle Amber Line */}
{/* Echte Medien-Kacheln aus der API */} {realMovieTiles.map((job) => { const poster = posterUrl(job.meta) return (
onDetailClick && onDetailClick(job.id)} className="relative rounded-2xl overflow-hidden group cursor-pointer border border-slate-800 hover:border-amber-500/50 transition-all bg-slate-900 flex flex-col justify-end p-3" > {poster ? ( {job.title ) : (
{job.type}
)}

{job.title || 'Unbekannt'}

) })} {/* Center / Showcase Feature Tile: 3D Spinning Optical Disc */} {realMovieTiles.length < 5 && (
DISC ENGINE
)} {/* Dynamic Engine Tile: Drive Status */} {realMovieTiles.length < 4 && (
DRIVE READY

Automatische Erkennung

Lege eine Disc ein — Rippy rippt sofort los.

4K UHD · BLU-RAY · DVD · CD
)} {/* Dynamic Engine Tile: Media-Server Sync */} {realMovieTiles.length < 3 && (
MEDIA SERVER

Auto-NFO & Poster

Jellyfin, Plex & Kodi kompatibel.

Auto-Scan nach Rip
)} {/* Dynamic Engine Tile: Lossless Assurance */} {realMovieTiles.length < 2 && (
MakeMKV

Lossless 1:1

Alle Tonspuren & Subtitles erhalten.

x265 HandBrake Kompression
)}
) }