- Pass --state-path and --cooldown-path per feed so a rate limit on one
feed no longer triggers a global cooldown that blocks all other feeds
- Add --max-posts 5 cap to prevent burst posting (e.g. 22 posts in one
run) that was causing HTTP 429 errors on eurosky.social
- Add 15s sleep between batches to reduce cumulative API pressure
- Increase MAX_PARALLEL_FEEDS from 4 to 6 now that cooldowns are isolated
- Add MAX_POSTS_PER_FEED env var for central control of the post cap
- Fix missing line continuation backslash on --service argument
Fixes: batch 2-7 feeds being skipped due to shared cooldown state
Previously, photo uploads were nested inside the `else` branch of
`if not video_embed`, meaning photos were only processed when a video
embed succeeded. This caused photo-only tweets to be posted as
text-only because `has_video` was never set, `video_embed` remained
None, and the photo loop was never reached.
Decouple photo collection from video outcome: warn if video failed,
then unconditionally iterate over media items to upload any photos
present. External link card logic is unchanged and still only triggers
when both video and image embeds are absent.