feat: season-pack vs per-episode grab selection #94

Merged
naps62-yolo merged 1 commits from issue/38-season-pack into main 2026-08-23 01:40:53 +01:00
Owner

Closes #38.

Adds the TV grab and import path to the daemon:

  • arr-core::grabbing::season_grab_mode: a season takes one pack only when every known episode has aired, nothing is on disk, and no pack grab already hard-failed; otherwise per-episode. Undated episodes keep the season per-episode.
  • TvGrabAction: one season search feeds pack selection, falling back to per-episode from the same results; airing seasons search per due aired episode with the §6.2 backoff on the episode rows.
  • Season pack grabs land as grabs.target_kind = 'season' (migration 0010 rebuilds the CHECK).
  • TV import maps pack files to episodes by their own SxxEyy tags, hardlinks into the §7.4 TV layout, and skips episodes that already have a file — a partial-overlap pack never re-imports what exists.
  • A pack file that fails the policy hard blacklists only that release, fails the grab, and reopens the episodes; grab selection then fills them per-episode. The season is never blacklisted.

§14 is respected: a completed season with episodes on disk is not re-grabbed as a pack.

Note: the seeded 1080p size band (floor 3 GiB) hard-rejects typical single-episode releases; band numbers are §5.5 policy rows and out of scope here.

🤖 Generated with Claude Code

Closes #38. Adds the TV grab and import path to the daemon: - `arr-core::grabbing::season_grab_mode`: a season takes one pack only when every known episode has aired, nothing is on disk, and no pack grab already hard-failed; otherwise per-episode. Undated episodes keep the season per-episode. - `TvGrabAction`: one season search feeds pack selection, falling back to per-episode from the same results; airing seasons search per due aired episode with the §6.2 backoff on the episode rows. - Season pack grabs land as `grabs.target_kind = 'season'` (migration 0010 rebuilds the CHECK). - TV import maps pack files to episodes by their own `SxxEyy` tags, hardlinks into the §7.4 TV layout, and skips episodes that already have a file — a partial-overlap pack never re-imports what exists. - A pack file that fails the policy hard blacklists only that release, fails the grab, and reopens the episodes; grab selection then fills them per-episode. The season is never blacklisted. §14 is respected: a completed season with episodes on disk is not re-grabbed as a pack. Note: the seeded 1080p size band (floor 3 GiB) hard-rejects typical single-episode releases; band numbers are §5.5 policy rows and out of scope here. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
naps62-yolo added 1 commit 2026-08-23 01:34:49 +01:00
feat: season-pack vs per-episode grab selection
ci / web (pull_request) Successful in 27s
e2e / e2e (pull_request) Successful in 54s
ci / rust (pull_request) Successful in 2m13s
33fc975faa
Season packs only when the season is fully released and nothing is
on disk; airing seasons grab per episode. A pack that hard-fails
post-probe blacklists only that release and the season falls back
to per-episode. Pack import skips episodes already on disk.

Closes #38

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
naps62-yolo merged commit 9f812fac11 into main 2026-08-23 01:40:53 +01:00
naps62-yolo deleted branch issue/38-season-pack 2026-08-23 01:40:53 +01:00
Sign in to join this conversation.