Torznab search and RSS client #16

Closed
opened 2026-08-22 18:22:38 +01:00 by naps62-yolo · 1 comment
Owner

DESIGN.md §6.1. Per-indexer Torznab, not Prowlarr's aggregate search API —
the reasoning is in that section and should not be revisited without changing
the design document.

Four call shapes: t=caps, t=search, t=movie with imdbid, t=tvsearch
with tvdbid/season/ep. An empty-query search is the RSS feed; it is the
same endpoint, and that equivalence is what makes §6.2's cost model work.

Torznab XML is Newznab-derived and inconsistent between trackers: optional
attributes, missing sizes, varying seeder fields, occasional invalid XML.
Malformed responses from one indexer must not fail the whole search.

Acceptance: wiremock fixtures recorded from at least three real indexers,
including one with a deliberately broken response.


Depends on: #15

Labels: phase/3-sourcing, area/indexer, difficulty/hard, type/feature

`DESIGN.md` §6.1. Per-indexer Torznab, not Prowlarr's aggregate search API — the reasoning is in that section and should not be revisited without changing the design document. Four call shapes: `t=caps`, `t=search`, `t=movie` with `imdbid`, `t=tvsearch` with `tvdbid`/`season`/`ep`. An empty-query search is the RSS feed; it is the same endpoint, and that equivalence is what makes §6.2's cost model work. Torznab XML is Newznab-derived and inconsistent between trackers: optional attributes, missing sizes, varying seeder fields, occasional invalid XML. Malformed responses from one indexer must not fail the whole search. Acceptance: `wiremock` fixtures recorded from at least three real indexers, including one with a deliberately broken response. --- **Depends on:** #15 Labels: `phase/3-sourcing`, `area/indexer`, `difficulty/hard`, `type/feature`
naps62-yolo added the area/indexerdifficulty/hardphase/3-sourcingtype/feature labels 2026-08-22 18:22:38 +01:00
naps62-yolo self-assigned this 2026-08-22 20:20:58 +01:00
Author
Owner

Implement the four per-indexer Torznab request shapes behind one typed search request, preserving indexer identity in every result. Parse RSS/Newznab items defensively so optional size, date, download URL, and tracker-specific seeder fields remain optional. Batch searches will return one outcome per indexer so a bad HTTP or XML response stays isolated. Add wiremock coverage using sanitized recordings from three tracker response shapes plus a deliberately malformed response, then run the full just ci gate.

Implement the four per-indexer Torznab request shapes behind one typed search request, preserving indexer identity in every result. Parse RSS/Newznab items defensively so optional size, date, download URL, and tracker-specific seeder fields remain optional. Batch searches will return one outcome per indexer so a bad HTTP or XML response stays isolated. Add wiremock coverage using sanitized recordings from three tracker response shapes plus a deliberately malformed response, then run the full `just ci` gate. <!-- agent-meta: {"model":"gpt-5.6-terra","session":"01a02ae9"} -->
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yolo/arr#16