fix: check cover size before Telegram publish, regen SVG stubs

scheduledPostsRunner.js: перед отправкой обложки в TG проверяем
размер файла. Если < 30KB (SVG-заглушка) — пробуем перегенерировать
через covers.generateCover(). Если регенерация успешна — публикуем
реальную обложку. Если нет — fallback на позу Зеро вместо SVG.
This commit is contained in:
Ник (Claude)
2026-06-10 13:07:15 +03:00
parent d1e6e2ef4a
commit e79693c29a
+33 -4
View File
@@ -202,10 +202,39 @@ async function publishOne(scheduledPost) {
} }
} else if (useCover && channel.auto_publish_with_cover) { } else if (useCover && channel.auto_publish_with_cover) {
if (article.cover_url) { if (article.cover_url) {
photoUrl = article.cover_url.startsWith('http') // Проверяем что обложка реальная, а не SVG-заглушка (< 30KB)
? article.cover_url const localCoverPath = path.join(UPLOADS_DIR, article.cover_url.replace(/^\/uploads\//, ''));
: `https://zeropost.ru${article.cover_url}`; let coverIsReal = true;
console.log(`[scheduled-runner] cover=${article.cover_url.split('/').pop()} article=${article.id}`); try {
const stat = fs.statSync(localCoverPath);
if (stat.size < 30 * 1024) {
coverIsReal = false;
console.log(`[scheduled-runner] SVG stub (${Math.round(stat.size/1024)}KB), regen article=${article.id}`);
try {
const covers = require('./covers');
await covers.generateCover({ articleId: article.id, title: article.title, tags: article.tags || [], channelId: channel.id });
const { rows: refreshed } = await query('SELECT cover_url FROM articles WHERE id=$1', [article.id]);
if (refreshed[0]?.cover_url) article.cover_url = refreshed[0].cover_url;
coverIsReal = true;
console.log(`[scheduled-runner] regen OK article=${article.id}`);
} catch(regenErr) {
console.warn(`[scheduled-runner] regen failed, using Zero: ${regenErr.message.slice(0,80)}`);
}
}
} catch(_) { /* внешний URL или файл не найден — считаем реальным */ }
if (coverIsReal) {
photoUrl = article.cover_url.startsWith('http')
? article.cover_url
: `https://zeropost.ru${article.cover_url}`;
console.log(`[scheduled-runner] cover=${article.cover_url.split('/').pop()} article=${article.id}`);
} else {
const picked = zeroChar.pickPose({ title: article.title, excerpt: article.excerpt, category: article.category });
if (picked.exists) {
photoUrl = `/uploads/zero-${picked.pose}.webp`;
console.log(`[scheduled-runner] SVG fallback → Zero pose=${picked.pose} article=${article.id}`);
}
}
} else { } else {
// Обложки нет (ещё генерируется) — fallback на Зеро // Обложки нет (ещё генерируется) — fallback на Зеро
const picked = zeroChar.pickPose({ const picked = zeroChar.pickPose({