feat: delay post if SVG cover, retry up to 3×15min

scheduled_posts.cover_regen_attempts: счётчик попыток регенерации.
Если обложка SVG и рег. не удалась:
  - попытки < 3: откладываем scheduled_at на +15 мин, не публикуем
  - попытки >= 3: публикуем с Zero fallback (не держим пост вечно)
Максимальная задержка = 45 минут после плановой публикации.
This commit is contained in:
Ник (Claude)
2026-06-10 13:32:47 +03:00
parent e79693c29a
commit be2735ea5e
+15 -1
View File
@@ -229,10 +229,24 @@ async function publishOne(scheduledPost) {
: `https://zeropost.ru${article.cover_url}`; : `https://zeropost.ru${article.cover_url}`;
console.log(`[scheduled-runner] cover=${article.cover_url.split('/').pop()} article=${article.id}`); console.log(`[scheduled-runner] cover=${article.cover_url.split('/').pop()} article=${article.id}`);
} else { } else {
const attempts = scheduledPost.cover_regen_attempts || 0;
const MAX_REGEN_ATTEMPTS = 3; // 3 × 15 мин = 45 мин максимум ждём
if (attempts < MAX_REGEN_ATTEMPTS) {
// Откладываем пост на 15 минут, не публикуем
const retryAt = new Date(Date.now() + 15 * 60_000);
await query(
`UPDATE scheduled_posts SET scheduled_at=$1, cover_regen_attempts=$2 WHERE id=$3`,
[retryAt, attempts + 1, scheduledPost.id]
);
console.log(`[scheduled-runner] SVG stub — delayed 15min (attempt ${attempts+1}/${MAX_REGEN_ATTEMPTS}) post=${scheduledPost.id} article=${article.id}`);
return; // не публикуем сейчас
}
// Исчерпали попытки — публикуем с Зеро чтобы пост не завис навсегда
console.log(`[scheduled-runner] SVG stub max attempts reached, using Zero article=${article.id}`);
const picked = zeroChar.pickPose({ title: article.title, excerpt: article.excerpt, category: article.category }); const picked = zeroChar.pickPose({ title: article.title, excerpt: article.excerpt, category: article.category });
if (picked.exists) { if (picked.exists) {
photoUrl = `/uploads/zero-${picked.pose}.webp`; photoUrl = `/uploads/zero-${picked.pose}.webp`;
console.log(`[scheduled-runner] SVG fallback → Zero pose=${picked.pose} article=${article.id}`); console.log(`[scheduled-runner] Zero fallback pose=${picked.pose} article=${article.id}`);
} }
} }
} else { } else {