Commit Graph

2 Commits

Author SHA1 Message Date
Panniantong 07c6efbc7e fix: 4 bugs found in full E2E usage testing
Bug 1: Reddit 403 due to short User-Agent in proxy test
  Root cause: configure proxy test used 'Mozilla/5.0' (too short, Reddit rejects)
  Fix: use full UA string matching the channel implementation

Bug 2: Reddit URL parsing broke on trailing slashes
  Root cause: url.rstrip('/') + '.json' mangled URLs with query params
  Fix: properly parse URL, clean path, reconstruct json URL

Bug 3: Reddit 403 without proxy showed raw HTTP error
  Root cause: no error handling for 403/429 responses
  Fix: friendly message suggesting proxy setup + Exa search alternative

Bug 4: XiaoHongShu without cookie showed Jina Reader 451 error
  Root cause: fallback to Jina Reader which can't access XHS (legal block)
  Fix: show clear message about needing cookies with setup instructions

Bug 5: Empty search query caused raw 422 API error
  Root cause: no input validation before API call
  Fix: check for empty query, show friendly message

All 36 unit tests passing.
2026-02-24 08:52:37 +01:00
Panniantong 74c3df5c3d v2.0.0 — Pure glue architecture: zero copied code, pluggable channels
BREAKING: Complete architectural rewrite.

Before: Copied x-reader's fetcher code into readers/ (1205 lines of borrowed code)
After: Pluggable channel system where each channel is a thin wrapper (~50 lines)
       around the best external tool for that platform. Zero copied code.

Architecture:
- channels/base.py — Universal Channel interface (read, search, check)
- channels/web.py — Jina Reader API (swappable)
- channels/github.py — GitHub API (swappable)
- channels/twitter.py — birdx + Jina fallback (swappable)
- channels/youtube.py — yt-dlp (swappable)
- channels/reddit.py — Reddit JSON API + proxy (swappable)
- channels/rss.py — feedparser (swappable)
- channels/bilibili.py — Bilibili API (swappable)
- channels/exa_search.py — Exa semantic search (swappable)

Key design: every backend can be swapped by changing ONE file.
YouTube dies? Change youtube.py. Exa sucks? Swap exa_search.py for Tavily.
Nothing else changes.

Removed: reader.py, schema.py, readers/, search/, utils/ (all x-reader code)
Tests: 36/36 passing
2026-02-24 05:38:21 +01:00