Files
postcast-engine/regen-covers.js
T
Ник (Claude) 5576665c02 feat: image rubrics with AI selection for cover variety
- channel_style.image_rubrics (JSONB): 6 рубрик для ZeroPost-блога
  (tech-photo, 3d-device, code-screen, data-flow, ai-neural, cinematic-tech)
- selectRubric(): haiku выбирает рубрику по заголовку+тегам статьи
- generateCover(): загружает rubrics из БД, вызывает selectRubric перед генерацией
- buildCoverPrompt(): принимает rubric — рубрика задаёт весь визуальный язык
- Убраны лишние ограничения (no circuit boards, no glowing nodes, no brains)
  из базового промпта — теперь только: no text, no logos, no real faces
2026-06-09 11:36:19 +03:00

33 lines
1.1 KiB
JavaScript

require('dotenv').config({ path: '/var/www/zeropost-engine/.env' });
process.chdir('/var/www/zeropost-engine');
const covers = require('./src/services/covers');
const config = require('./src/config');
const { query } = require('./src/config/db');
const DELAY_MS = 8000;
const sleep = ms => new Promise(r => setTimeout(r, ms));
(async () => {
await config.reloadAi();
const { rows } = await query('SELECT id, title, tags FROM articles WHERE cover_url IS NOT NULL ORDER BY id');
console.log(`Total articles: ${rows.length}`);
let ok = 0, fail = 0;
for (const a of rows) {
try {
console.log(`\n[${ok+fail+1}/${rows.length}] article=${a.id}: ${a.title.slice(0,60)}`);
const url = await covers.generateCover({ articleId: a.id, title: a.title, tags: a.tags||[], channelId: 1 });
console.log(`${url}`);
ok++;
} catch(e) {
console.log(` ✗ FAIL: ${e.message.slice(0,100)}`);
fail++;
}
if (ok + fail < rows.length) await sleep(DELAY_MS);
}
console.log(`\nDone: ${ok} OK, ${fail} failed`);
process.exit(0);
})().catch(e => { console.error(e); process.exit(1); });