import { Play } from "lucide-react"; import { type Video } from "@shared/schema"; import HLSPreviewThumbnail from "./hls-preview-thumbnail"; interface VideoCardProps { video: Video; onClick: (video: Video) => void; className?: string; } function formatDuration(seconds: number): string { const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; } function formatViews(views: number): string { if (views >= 1000000) { return `${(views / 1000000).toFixed(1)}M views`; } else if (views >= 1000) { return `${(views / 1000).toFixed(1)}K views`; } return `${views} views`; } function formatDate(date: Date | string): string { const now = new Date(); const createdDate = typeof date === 'string' ? new Date(date) : date; if (!createdDate || isNaN(createdDate.getTime())) { return "Unknown"; } const diffTime = Math.abs(now.getTime() - createdDate.getTime()); const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); if (diffDays === 0) return "Today"; if (diffDays === 1) return "1 day ago"; if (diffDays < 7) return `${diffDays} days ago`; if (diffDays < 30) return `${Math.floor(diffDays / 7)} week${Math.floor(diffDays / 7) > 1 ? 's' : ''} ago`; return `${Math.floor(diffDays / 30)} month${Math.floor(diffDays / 30) > 1 ? 's' : ''} ago`; } export default function VideoCard({ video, onClick, className = "" }: VideoCardProps) { return (
{/* Simple thumbnail with fallback - no HLS loading until needed */}
onClick?.(video)} > {video.title} { const target = e.target as HTMLImageElement; console.log('Thumbnail failed to load:', target.src); // Show placeholder immediately instead of trying multiple URLs target.style.display = 'none'; if (target.parentElement && !target.parentElement.querySelector('.thumbnail-placeholder')) { target.parentElement.style.background = 'linear-gradient(135deg, #1f2937, #374151)'; const placeholder = document.createElement('div'); placeholder.className = 'thumbnail-placeholder absolute inset-0 flex flex-col items-center justify-center text-white'; placeholder.innerHTML = '
🎬
Video
'; target.parentElement.appendChild(placeholder); } }} /> {/* Duration badge */}
{formatDuration(video.duration)}
{/* Play button overlay */}

onClick?.(video)} data-testid={`text-title-${video.id}`} > {video.title}

{formatViews(video.views)} {formatDate(video.createdAt)}
); }