const Database = require("better-sqlite3"); const db = new Database("./data/worst-scan.db"); // ===== AUDITORIA LOLICON - borrar posts problematicos ===== // Caso 1: tags explĂ­citos lolicon/shotacon/loli/shota // Caso 2: posts conocidos dudosos (por gid) // Blacklist con match de palabra completa (no substring) para evitar falsos // positivos como "hololive" (VTubers adultas) que contienen "loli". const EXPLICIT = [ /\blolicon\b/i, /\bshotacon\b/i, /\bloli\b/i, /\bshota(?!live)\b/i, // "shota" pero no "hololive" /\bchild\b/i, /\bchildren\b/i, /\bkids\b/i, /\bminor\b/i, ]; const KNOWN_BAD_GIDS = ["669957"]; // Idol no Kimi no Tonari no Boku 3 let deleted = 0; // 1) Tags explĂ­citos const all = db.prepare("SELECT id, gid, title, tags FROM posts WHERE published=1").all(); for (const p of all) { let tags = []; try { tags = JSON.parse(p.tags || "[]"); } catch {} const hits = tags.filter(t => EXPLICIT.some(re => re.test(t))); if (hits.length > 0) { const r = db.prepare("DELETE FROM posts WHERE id = ?").run(p.id); console.log(`[borrado] ${p.title} | tags: ${hits.join(", ")}`); deleted += r.changes; } } // 2) Gids conocidos for (const gid of KNOWN_BAD_GIDS) { const r = db.prepare("DELETE FROM posts WHERE gid = ?").run(gid); if (r.changes > 0) { console.log(`[borrado por gid] ${gid}`); deleted += r.changes; } } console.log(`\nTotal borrados: ${deleted}`); console.log("Posts publicados restantes: " + db.prepare("SELECT COUNT(*) c FROM posts WHERE published=1").get().c); db.close();