diff --git a/.replit b/.replit index 251889e..ffeb98a 100644 --- a/.replit +++ b/.replit @@ -18,10 +18,6 @@ externalPort = 80 localPort = 5555 externalPort = 3002 -[[ports]] -localPort = 33429 -externalPort = 3003 - [[ports]] localPort = 40537 externalPort = 3000 diff --git a/server/services/cloudinary.ts b/server/services/cloudinary.ts index 9e18d69..f415fb2 100644 --- a/server/services/cloudinary.ts +++ b/server/services/cloudinary.ts @@ -31,22 +31,13 @@ class CloudinaryService { const isVideo = mimeType.startsWith('video/'); - // Define eager transformations for images (generated during upload) - const eagerTransformations = !isVideo ? [ - { width: 1200, height: 630, crop: 'pad', gravity: 'center', background: 'black' }, // Facebook Feed - { width: 1080, height: 1080, crop: 'pad', gravity: 'center', background: 'black' }, // Instagram Feed - { width: 1080, height: 1920, crop: 'pad', gravity: 'center', background: 'black' } // Instagram Story - ] : undefined; - - // Upload to Cloudinary with eager transformations + // Upload to Cloudinary (without eager transformations) const uploadResult = await new Promise((resolve, reject) => { const uploadStream = cloudinary.uploader.upload_stream( { folder: 'social-flow', public_id: `${Date.now()}-${fileName.replace(/\.[^/.]+$/, '')}`, resource_type: isVideo ? 'video' : 'image', - eager: eagerTransformations, - eager_async: false, // Generate transformations immediately }, (error, result) => { if (error) reject(error); @@ -60,15 +51,39 @@ class CloudinaryService { const publicId = uploadResult.public_id; const originalUrl = uploadResult.secure_url; - // Extract eager transformation URLs (generated by Cloudinary during upload) + // Generate transformation URLs manually with lpad (limit pad) for images let facebookFeedUrl = null; let instagramFeedUrl = null; let instagramStoryUrl = null; - if (!isVideo && uploadResult.eager && uploadResult.eager.length === 3) { - facebookFeedUrl = uploadResult.eager[0].secure_url; // Facebook Feed (1200x630) - instagramFeedUrl = uploadResult.eager[1].secure_url; // Instagram Feed (1080x1080) - instagramStoryUrl = uploadResult.eager[2].secure_url; // Instagram Story (1080x1920) + if (!isVideo) { + // Use lpad (limit pad) - only scales down if needed, adds padding to fit dimensions + facebookFeedUrl = cloudinary.url(publicId, { + width: 1200, + height: 630, + crop: 'lpad', + background: 'black', + fetch_format: 'auto', + quality: 'auto' + }); + + instagramFeedUrl = cloudinary.url(publicId, { + width: 1080, + height: 1080, + crop: 'lpad', + background: 'black', + fetch_format: 'auto', + quality: 'auto' + }); + + instagramStoryUrl = cloudinary.url(publicId, { + width: 1080, + height: 1920, + crop: 'lpad', + background: 'black', + fetch_format: 'auto', + quality: 'auto' + }); } return {