const db = require('./database'); const storage = require('./storage'); const imageProcessor = require('./image-processor'); const fetch = require('node-fetch'); async function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function run() { console.log('🚀 Iniciando compressão EXTREMA de TODAS as miniaturas...'); await db.initDatabase(); await storage.loadConfigFromDb(); // Buscar todas as imagens que possuem miniatura const rows = await db.all(` SELECT id, filename, thumb_filename, clinic_name, client_name, patient_name FROM images WHERE thumb_filename IS NOT NULL AND enabled = 1 `); console.log(`🔍 Encontradas ${rows.length} imagens com miniatura para otimização.`); let successCount = 0; let failCount = 0; for (const row of rows) { console.log(`\n⚙️ Otimizando miniatura do ID ${row.id}: ${row.filename}`); try { // 1. Obter URL de download do Wasabi (baixar a ORIGINAL, não a miniatura pesada) const url = await storage.getDownloadPresignedUrl(row.filename, row.clinic_name, row.client_name, row.patient_name); if (!url) { console.error(`❌ Não foi possível gerar URL para a imagem original ${row.filename}`); failCount++; continue; } // 2. Baixar a imagem original do Wasabi const response = await fetch(url); if (!response.ok) { console.error(`❌ Erro ao baixar imagem original do Wasabi (${response.status})`); failCount++; continue; } const arrayBuffer = await response.arrayBuffer(); const imageBuffer = Buffer.from(arrayBuffer); // 3. Gerar miniatura (agora com JPEG super comprimido) const thumbBuffer = await imageProcessor.getThumbnail(imageBuffer, 400, 400); // 4. Salvar miniatura substituindo a antiga await storage.saveImage(row.thumb_filename, thumbBuffer, row.clinic_name, row.client_name, row.patient_name, false); console.log(`✅ Miniatura ultra-leve gerada e salva com sucesso para ID ${row.id} (${thumbBuffer.length} bytes)`); successCount++; // Aguardar 500ms await delay(500); } catch (err) { console.error(`❌ Erro ao processar ID ${row.id}:`, err.message); failCount++; } } console.log(`\n🎉 Processamento concluído!`); console.log(`✅ Sucessos: ${successCount}`); console.log(`❌ Falhas: ${failCount}`); process.exit(0); } run().catch(err => { console.error('❌ Erro crítico:', err); process.exit(1); });