48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
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(); |