- 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
- New standalone script `bsky_post.py` to post text + optional image
or video to a Bluesky PDS instance. Supports --image, --video (mutually
exclusive), --alt, --lang, --service, --username, --password flags.
Reuses the same login-with-backoff pattern as rss2bsky and the Twitter bot.
- New Jenkinsfile that triggers every Thursday at 07:15 (cron: 15 7 * * 4),
reads credentials from Jenkins secret text entries, and runs bsky_post.py
with the configured image and Catalan language tag.
- Changed `post_lang: str` to `post_langs: List[str]` in `run_once`
and `try_send_post_with_variants` to support multiple BCP-47 language
tags passed to Bluesky's `langs=` field.
- Updated `--lang` CLI argument to accept comma-separated language codes
(e.g. `--lang ca,es`), parsed into a list at startup. Defaults to `["ca"]`.
- Added startup log line reporting the configured language(s) per run.