* feat(route): add EFE Noticias route
Add route for EFE (Agencia EFE) Spanish news agency with 10 categories:
mundo, espana, economia, cultura, ciencia-y-tecnologia, deportes,
salud, medio-ambiente, educacion, euro-efe.
Features:
- Article images via enclosure and inline in description
- Ad filtering (auto-banner, srr-main, promotional logos)
- Clean img attributes for RSS reader compatibility
- Configurable item limit via query parameter
* fix(route/efe): address review comments
- Remove `limit` from `parameters` (query param, not path param)
- Scope article link selector to `.elementor-loop-container` to avoid anti-pattern #1
- Remove unnecessary `.first()` on `.elementor-widget-theme-post-content`
- Remove `.srr-main` from cleanup (not inside content area), keep `decoding`/`loading` on images
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: address review comments for EFE route
- Fix parameters to structured object with only path params
- Scope selector to .elementor-post article links only
- Remove unnecessary .first() on title
- Stop stripping image attributes (decoding, loading, width, etc.)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: revert overly specific selector that broke all routes
.elementor-post class doesn't exist on EFE site, use attribute
selector to pre-filter article URLs instead.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: fetch articles sequentially to avoid 429 rate limiting
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: suppress no-await-in-loop lint for sequential rate-limited fetches
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: use specific selector for article title links only
Select only .elementor-widget-theme-post-title a inside .e-loop-item
to avoid matching image links, category links, or duplicate entries.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: use single quotes for static string (oxlint stylistic/quotes)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: use Promise.all and remove Set (selector matches once per article)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor: use Array.map instead of push for link collection
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(efe): use pMap to limit concurrency and avoid 429 rate limiting
---------
Co-authored-by: mlkgrnt <mlkgrnt@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>