backfill-screenshots.js
1 /** 2 * Backfill Screenshots Script 3 * Recapture screenshots for sites with missing data 4 */ 5 6 import { createDatabaseConnection } from '../src/utils/db.js'; 7 import { join, dirname } from 'path'; 8 import { fileURLToPath } from 'url'; 9 import { backfillScreenshots } from '../src/utils/backfill-screenshots.js'; 10 import Logger from '../src/utils/logger.js'; 11 12 const __filename = fileURLToPath(import.meta.url); 13 const __dirname = dirname(__filename); 14 const projectRoot = join(__dirname, '..'); 15 16 const logger = new Logger('BackfillScreenshotsScript'); 17 18 async function main() { 19 // Get limit from command line args, default to 100 20 const limit = parseInt(process.argv[2]) || 100; 21 22 const dbPath = join(projectRoot, 'db/sites.db'); 23 const db = createDatabaseConnection(dbPath); 24 db.pragma('foreign_keys = ON'); // Enforce foreign key constraints 25 26 try { 27 logger.info(`Starting screenshot backfill (limit: ${limit})...`); 28 const results = await backfillScreenshots(db, limit); 29 30 logger.info('Backfill Results:'); 31 logger.info(` Total sites processed: ${results.total}`); 32 logger.info(` Successful: ${results.success}`); 33 logger.info(` Failed: ${results.failed}`); 34 35 if (results.failed > 0) { 36 logger.warn('Failed sites:'); 37 results.sites 38 .filter(s => s.status === 'failed') 39 .forEach(s => { 40 logger.warn(` - ${s.domain} (ID: ${s.id}): ${s.error}`); 41 }); 42 } 43 44 if (results.success === 0 && results.total > 0) { 45 process.exit(1); 46 } 47 } catch (error) { 48 logger.error('Screenshot backfill failed', error); 49 process.exit(1); 50 } finally { 51 db.close(); 52 } 53 } 54 55 main();