/ scripts / backfill-screenshots.js
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();