diff --git a/server/routes.ts b/server/routes.ts index eabe22b..56d5e08 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -15,6 +15,7 @@ import path from "path"; import fs from "fs"; import session from "express-session"; import sharp from "sharp"; +import fetch from "node-fetch"; // Extend express session declare module "express-session" { @@ -766,7 +767,49 @@ export async function registerRoutes(app: Express): Promise { return res.status(404).send('Video not found'); } - // Ustvarimo social media thumbnail sliko z video informacijami + // Najprej poskušamo uporabiti dejanski video thumbnail iz Bunny.net + if (video.thumbnailUrl) { + try { + // Prenesemo dejanski thumbnail iz Bunny.net + const response = await fetch(video.thumbnailUrl); + if (response.ok) { + const thumbnailBuffer = await response.arrayBuffer(); + + // Povečamo thumbnail na social media velikost (1200x630) z dodano go4.video branding overlay + const overlayedBuffer = await sharp(Buffer.from(thumbnailBuffer)) + .resize(1200, 630, { fit: 'cover', position: 'center' }) + .composite([ + // Dodamo temno overlay za boljši kontrast teksta + { + input: Buffer.from( + ` + + + + go4.video + Professional Video Platform + + + ${Math.floor(video.duration / 60)}:${(video.duration % 60).toString().padStart(2, '0')} + ` + ), + top: 0, + left: 0, + } + ]) + .png({ quality: 90, compressionLevel: 6 }) + .toBuffer(); + + res.setHeader('Content-Type', 'image/png'); + res.setHeader('Cache-Control', 'public, max-age=3600'); // Cache za 1 uro + return res.send(overlayedBuffer); + } + } catch (fetchError) { + console.log('Failed to fetch real thumbnail, falling back to generated:', fetchError); + } + } + + // Fallback: ustvarimo generirani thumbnail z video informacijami const width = 1200; const height = 630; // Facebook/Twitter optimalne dimenzije