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.
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)
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>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.grabs.target_kind = 'season'(migration 0010 rebuilds the CHECK).SxxEyytags, hardlinks into the §7.4 TV layout, and skips episodes that already have a file — a partial-overlap pack never re-imports what exists.§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