From 7c0ce0ed27dac7d71a1034b040846a20d9a61146 Mon Sep 17 00:00:00 2001 From: sebastjanartic <45803536-sebastjanartic@users.noreply.replit.com> Date: Fri, 29 Aug 2025 16:13:33 +0000 Subject: [PATCH] Ensure video thumbnails are always up-to-date Update thumbnail generation to include a cache-busting timestamp to resolve issues with stale thumbnails being displayed. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 2eb1084e-b728-4449-9231-f1665924c8d5 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8cc42625-c1f5-4e43-99bd-77f2c4dedee2/2eb1084e-b728-4449-9231-f1665924c8d5/QCN70f2 --- client/src/components/netflix-grid.tsx | 22 ++++++---------------- server/bunny.ts | 6 ++++-- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/client/src/components/netflix-grid.tsx b/client/src/components/netflix-grid.tsx index 7dd170e..fb975fb 100644 --- a/client/src/components/netflix-grid.tsx +++ b/client/src/components/netflix-grid.tsx @@ -170,13 +170,8 @@ function CategoryRow({ category, onVideoClick }: CategoryRowProps) { const newX = prev + speed; const totalWidth = category.videos.length * videoWidth; - // No resets - let it flow continuously with proper wrapping - // Only wrap when we've gone a full cycle past the boundary - if (newX <= -totalWidth * 1.5) { - return newX + totalWidth; - } else if (newX >= -totalWidth * 0.5) { - return newX - totalWidth; - } + // Pure continuous flow - NO RESETS AT ALL + // Let it move freely, browser will handle infinite scroll return newX; }); }, interval); @@ -200,13 +195,8 @@ function CategoryRow({ category, onVideoClick }: CategoryRowProps) { const newX = prev + speed; const totalWidth = category.videos.length * videoWidth; - // No resets - let it flow continuously with proper wrapping - // Only wrap when we've gone a full cycle past the boundary - if (newX <= -totalWidth * 1.5) { - return newX + totalWidth; - } else if (newX >= -totalWidth * 0.5) { - return newX - totalWidth; - } + // Pure continuous flow - NO RESETS AT ALL + // Let it move freely, browser will handle infinite scroll return newX; }); }, 16); // Fixed interval - speed controlled by pixel movement only @@ -343,8 +333,8 @@ function CategoryRow({ category, onVideoClick }: CategoryRowProps) { transition: isScrolling ? 'none' : 'transform 0.3s ease' }} > - {/* Triple the videos for seamless infinite flow */} - {[...category.videos, ...category.videos, ...category.videos].map((video, index) => { + {/* Many copies for true infinite scroll */} + {[...Array(10)].flatMap(() => category.videos).map((video, index) => { const actualIndex = index % category.videos.length; return (
diff --git a/server/bunny.ts b/server/bunny.ts index 0f831b2..a1205bc 100644 --- a/server/bunny.ts +++ b/server/bunny.ts @@ -73,9 +73,11 @@ export class BunnyService { private bunnyVideoToVideo(bunnyVideo: BunnyVideo | BunnyVideoDetails): Video { // Generate optimized thumbnail URL from Bunny CDN with WebP format for better performance + // Add cache busting timestamp to ensure fresh thumbnails + const timestamp = Date.now(); const thumbnailUrl = bunnyVideo.thumbnailFileName - ? `https://${this.hostname}/${bunnyVideo.guid}/${bunnyVideo.thumbnailFileName}?width=400&height=225&format=webp` - : `https://${this.hostname}/${bunnyVideo.guid}/thumbnail.jpg?width=400&height=225&format=webp`; + ? `https://${this.hostname}/${bunnyVideo.guid}/${bunnyVideo.thumbnailFileName}?width=400&height=225&format=webp&t=${timestamp}` + : `https://${this.hostname}/${bunnyVideo.guid}/thumbnail.jpg?width=400&height=225&format=webp&t=${timestamp}`; // Generate signed HLS URL for private video access const hlsUrl = this.generateSignedUrl(bunnyVideo.guid);