From 65a86b9f652108274a2984990a841740ef9858eb Mon Sep 17 00:00:00 2001 From: sebastjanartic <45803536-sebastjanartic@users.noreply.replit.com> Date: Thu, 28 Aug 2025 17:29:30 +0000 Subject: [PATCH] Add secure video playback links using CDN signed URLs Update database storage to use Bunny.net CDN and generate signed URLs for video playback, ensuring secure and time-limited access. Replit-Commit-Author: Agent Replit-Commit-Session-Id: d7424866-83d1-4486-a212-ac12b4c7becf Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8cc42625-c1f5-4e43-99bd-77f2c4dedee2/d7424866-83d1-4486-a212-ac12b4c7becf/nodk9hG --- server/storage.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server/storage.ts b/server/storage.ts index 7e306cc..6cf0873 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -73,13 +73,16 @@ export class DatabaseStorage implements IStorage { const result = await db.execute(sqlQuery); console.log(`📊 DatabaseStorage: Found ${result.rows.length} videos (search: "${search || 'none'}")`); - // Transform database rows to Video objects + // Import Bunny service for signed URLs + const { bunnyService } = await import('./bunny'); + + // Transform database rows to Video objects with signed URLs return result.rows.map((row: any) => ({ id: row.id, title: row.title, description: row.description, thumbnailUrl: row.thumbnail_url, - videoUrl: row.video_url, + videoUrl: bunnyService.generateSignedUrl(row.id, 7200), // 2 hour expiration duration: row.duration, views: row.views, category: row.category, @@ -104,13 +107,16 @@ export class DatabaseStorage implements IStorage { if (result.rows.length === 0) return undefined; + // Import Bunny service for signed URLs + const { bunnyService } = await import('./bunny'); + const row = result.rows[0] as any; return { id: row.id, title: row.title, description: row.description, thumbnailUrl: row.thumbnail_url, - videoUrl: row.video_url, + videoUrl: bunnyService.generateSignedUrl(row.id, 7200), // 2 hour expiration duration: row.duration, views: row.views, category: row.category,