import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import sharp from 'sharp'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const uploadsDir = path.join(__dirname, '..', '..', 'uploads'); async function main() { const files = fs.readdirSync(uploadsDir); const candidates = files.filter( f => f.endsWith('.jpg') && !f.endsWith('_thumb.jpg') ); console.log(`Found ${candidates.length} images to process`); let created = 0; let skipped = 0; for (const filename of candidates) { const thumbFilename = filename.replace(/\.jpg$/, '_thumb.jpg'); const thumbPath = path.join(uploadsDir, thumbFilename); if (fs.existsSync(thumbPath)) { skipped++; continue; } try { await sharp(path.join(uploadsDir, filename)) .resize({ width: 600, withoutEnlargement: true }) .jpeg({ quality: 80 }) .toFile(thumbPath); created++; console.log(` ✓ ${thumbFilename}`); } catch (err) { console.error(` ✗ ${filename}: ${err}`); } } console.log(`\nDone: ${created} created, ${skipped} already existed`); } main().catch(console.error);