← back to Costa Rica

scripts/cr-fix-fallback.js

43 lines

'use strict';
// Replace bad fallback region images (province locator-map SVGs + one wrong
// Mikulov/Czech photo) with a real scenic Wikipedia lead image per province.
// Curated pages: tourism-famous, real photos, attributable. Run on Kamatera.
const { Pool } = require('pg');
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const UA = { 'User-Agent': 'CR-Directory/1.0 (https://costarica.agentabrams.com; info@agentabrams.com)' };

const PROVINCE_SCENIC = {
  'San José':   'San_José,_Costa_Rica',
  'Alajuela':   'Arenal_Volcano',
  'Heredia':    'Barva_Volcano',
  'Cartago':    'Irazú_Volcano',
  'Limón':      'Cahuita_National_Park',
  'Puntarenas': 'Manuel_Antonio_National_Park',
  'Guanacaste': 'Rincón_de_la_Vieja_Volcano',
};

(async () => {
  for (const [prov, page] of Object.entries(PROVINCE_SCENIC)) {
    const r = await fetch(`https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(page)}`, { headers: UA });
    if (!r.ok) { console.log(`${prov}: summary HTTP ${r.status}`); continue; }
    const j = await r.json();
    const img = j.originalimage || j.thumbnail;
    if (!img || img.source.endsWith('.svg') || img.source.includes('.svg/')) {
      console.log(`${prov}: no usable photo on ${page}`); continue;
    }
    // Only rows still carrying a BAD remote image: locator-map SVG renders or
    // the known-wrong Mikulov photo. Already-localized and real photos untouched.
    const res = await pool.query(
      `UPDATE regions SET image_url=$1,
              image_credit=$2, image_license='CC via Wikimedia Commons',
              image_source_url=$3, image_fetched_at=NOW()
       WHERE province=$4 AND image_url LIKE 'http%'
         AND (image_url LIKE '%_in_Costa_Rica.svg%' OR image_url LIKE '%Mikulov%')`,
      [img.source, `Wikipedia: ${j.title}`,
       j.content_urls?.desktop?.page || `https://en.wikipedia.org/wiki/${page}`, prov]);
    console.log(`${prov}: ${res.rowCount} regions -> ${page}`);
    await new Promise(s => setTimeout(s, 500));
  }
  await pool.end();
})();