feat: RSS sync worker #91

Merged
naps62-yolo merged 1 commits from issue/27-rss-sync into main 2026-08-23 01:04:15 +01:00
Owner

Adds the RSS lane: one empty-query Torznab call per indexer every ten minutes, matched against the whole wanted list locally (DESIGN.md §6.2). No backoff, no attempt counter, no release-date gate — those belong to targeted search, which pays per title. blocked titles keep matching RSS (§6.3).

Matching lives in arr-core::matching, pure and tested:

  • a TMDB id the tracker attached to the item wins outright, and an id that matches nothing wanted ends the comparison instead of falling back to the title;
  • a title match compares on a folded key (accents, &, punctuation) and requires the years to agree;
  • an episode tag is never a movie, and anything matching two wanted titles matches neither.

Two refactors came with it: indexer discovery moved to IndexerDirectory and the send-to-Transmission path to Grabber, both shared with the grab lane rather than duplicated.

imdbid is the id trackers supply most often, but movies has no IMDb column, so only tmdbid is used. Filed as #92.

Closes #27.

Verification

just ci green locally: 260 tests, fmt, clippy, machete, web-check.

Acceptance test rss::tests::exactly_the_intended_titles_match runs a recorded six-item feed against a three-title wanted list: the 2160p Dune: Part Two, the Spanish-titled release identified only by tmdbid, and Dune 2021 each grab once; the TV item and the unwanted film are stored nowhere. a_near_miss_is_not_grabbed seeds "Dune: Part Three" and grabs nothing.

Adds the RSS lane: one empty-query Torznab call per indexer every ten minutes, matched against the whole wanted list locally (DESIGN.md §6.2). No backoff, no attempt counter, no release-date gate — those belong to targeted search, which pays per title. `blocked` titles keep matching RSS (§6.3). Matching lives in `arr-core::matching`, pure and tested: - a TMDB id the tracker attached to the item wins outright, and an id that matches nothing wanted ends the comparison instead of falling back to the title; - a title match compares on a folded key (accents, `&`, punctuation) and requires the years to agree; - an episode tag is never a movie, and anything matching two wanted titles matches neither. Two refactors came with it: indexer discovery moved to `IndexerDirectory` and the send-to-Transmission path to `Grabber`, both shared with the grab lane rather than duplicated. `imdbid` is the id trackers supply most often, but `movies` has no IMDb column, so only `tmdbid` is used. Filed as #92. Closes #27. <details> <summary>Verification</summary> `just ci` green locally: 260 tests, fmt, clippy, machete, web-check. Acceptance test `rss::tests::exactly_the_intended_titles_match` runs a recorded six-item feed against a three-title wanted list: the 2160p Dune: Part Two, the Spanish-titled release identified only by `tmdbid`, and Dune 2021 each grab once; the TV item and the unwanted film are stored nowhere. `a_near_miss_is_not_grabbed` seeds "Dune: Part Three" and grabs nothing. </details>
naps62-yolo added 1 commit 2026-08-23 00:55:54 +01:00
feat: RSS sync worker
ci / web (pull_request) Successful in 25s
e2e / e2e (pull_request) Successful in 55s
ci / rust (pull_request) Successful in 2m12s
fd4d409c8d
One empty-query Torznab call per indexer every ten minutes, matched
against the whole wanted list locally (DESIGN.md §6.2). Matching is
conservative: a TMDB id the tracker supplied wins outright, a title needs
its year, and an ambiguity is not a match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
naps62-yolo merged commit 225be33b55 into main 2026-08-23 01:04:15 +01:00
naps62-yolo deleted branch issue/27-rss-sync 2026-08-23 01:04:15 +01:00
Sign in to join this conversation.