Scale the size band by episode runtime #209
Closed
opened 2026-08-24 21:43:03 +01:00 by naps62-yolo
·
2 comments
No Branch/Tag Specified
main
ui-mobile-first
codex/fix-action-button-reload
translation
qbit-2
docker
bugs
blitz/subtitles
fix/255-provider-reorder
blitz/feedback-3
subtitles/251-icon-vocab
subtitles/237-relocate-subs
fix/248-title-move-creates-root
blitz/feedback-2
issue/227-abandoned-pack-visible
issue/245-backoff-anchor
issue/240-design-coherence
issue/211-waived-rule
issue/232-plainer-words
issue/246-policy-reclassify
issue/244-root-slash-stored
issue/231-settings-rows
issue/241-reclassify-on-root-change
issue/239-failure-window
issue/230-icon-only
issue/243-root-path-edges
issue/238-attention-liveness
issue/229-back-button
issue/236-root-path-move
issue/226-attention-threshold
issue/228-root-move
blitz/size-bands
size-bands/209-runtime-scale
size-bands/210-size-waiver
size-bands/208-runtime-design
blitz/reliability
reliability/155-sqlx-migrations
reliability/176-refresh-on-add
removal-nav/175-removal-controls
removal-nav/174-season-file-removal
removal-nav/172-search-titles
removal-nav/173-homepage-library
removal-nav/171-untrack-clears
removal-nav/170-chip-align
removal-nav/169-design-amendment
feedback/167-deck-autosearch
feedback/165-chip-colour
feedback/166-header-rail
feedback/163-drop-cast
feedback/164-control-geometry
feedback/162-season-ordering
feedback/161-search-episodes
feedback/160-autotrack-seed
feedback/159-design-amend
blitz/rich-metadata
rich/151-grid
rich/148-search-rows
rich/150-series-meta
rich/149-movie-page
rich/147-search-art
rich/156-rating-null
rich/146-meta-api
rich/145-poster-cols
rich/144-trailer
rich/143-meta-detail
rich/142-design-amend
blitz/153-empty-episode-titles
blitz/152-deck-routes
blitz/141-season-vanished-api
blitz/129-series-detail-view
blitz/140-attention-episode-numbers
blitz/137-season-removals
blitz/133-attention-tv-lanes
blitz/139-movie-id-episode-guard
blitz/134-stale-attention-queue
blitz/124-rss-episode-matching
blitz/136-imdb-series-lookup
blitz/132-manual-commands
blitz/128-series-delete-files
blitz/131-status-seasons-input
blitz/138-plural-season-range
blitz/135-pack-name-parse
blitz/122-upstream-removals
blitz/130-add-series-search
blitz/121-series-refresh
blitz/127-unified-search-tv
blitz/123-episode-matching
blitz/126-tv-attention
blitz/119-tracked-rule
blitz/125-season-deck
blitz/120-tvdb-id
blitz/118-season-zero
blitz/117-design-amend
issue/115-avail-search
issue/112-name-truncate
issue/111-score-colors
No results found.
Labels
Clear labels
area/api
area/ci
area/compat
area/core
area/daemon
area/db
area/dl
area/indexer
area/infra
area/meta
area/parse
area/probe
area/subs
area/web
difficulty/easy
difficulty/hard
difficulty/moderate
difficulty/trivial
phase/1-skeleton
phase/2-logic
phase/3-sourcing
phase/4-movies
phase/5-ui
phase/6-tv
phase/7-people
phase/8-compat
phase/9-subtitles
type/bug
type/chore
type/feature
type/test
arr-api
CI and test harness
arr-compat
arr-core
arr-daemon
arr-db
arr-dl
arr-indexer
workspace and tooling
arr-meta
arr-parse
arr-probe
arr-subs crate: providers, extraction, translation, sync
web/
bounded, obvious approach, few files
subtle correctness or cross-cutting
multiple files, judgement, an interface to design
one file, mechanical, no design decisions
workspace, CI, config, database, empty API and SPA
parsing and policy engine, pure, no network
TMDB and Prowlarr, read-only
movies end to end
search, buckets, library views, queues
seasons, episodes, tracking, derived status
owner tags and notifications
Jellyseerr shim
build order: subtitles, DESIGN.md §15
Milestone
No items
No Milestone
Size bands and waivers
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Depends on
Reference: yolo/arr#209
Reference in New Issue
Block a user
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.
Depends on: #187
Implement the §5.5 amendment from #187: the per-episode size comparison scales
with the episode's runtime instead of assuming a fixed length.
scoreandis_below_flooralready takeepisode_count(#180). They now needthe runtime too, and the same rule applies as before:
arr-corehas no IO, sothe caller supplies it.
apply_auto_track(series, ever_refreshed, seasons)and #180's
episode_countare both precedent.Runtime comes from TMDB and is already persisted for series metadata; check what
crates/arr-metaand theseriestable hold before adding a column. If it isnot stored, storing it is in scope — a new migration, never an edit to an
applied one.
Missing or zero runtime falls back to the reference runtime, reproducing
today's behaviour.
Callers to update, the same set #180 touched:
crates/arr-api/src/series.rs(both rescore sites),
crates/arr-api/src/search.rs,crates/arr-api/src/movies.rs,crates/arr-daemon/src/grab.rs.Tests:
size term
movie scoring against pack normalisation
Correcting an acceptance criterion in this issue: "the Rick and Morty S09
packs stop being rejected below floor" is wrong and must not be implemented.
Checked against production after #208 settled the reference runtime at 45
minutes:
1 GiB × 22/45= 0.489 GiB/episodeAll three stay below the floor after scaling. They are genuinely low-bitrate —
0.32 GiB for a 22-minute episode is about 2.1 Mbps — and the floor is doing its
job. Do not tune the reference runtime, the scale formula, or anything else to
force those packs through; that would be fitting the model to one bad example.
Second, and more limiting:
GET /api/series/1/metadatareturns"runtime": nullfor Rick and Morty in production. TMDB'sepisode_run_timeis frequently empty for returning series. Under §5.5 as amended, a missing
runtime means a scale factor of 1, so for this series — and any other with no
runtime — this issue changes nothing at all.
That does not make the issue wrong. A 22-minute show whose runtime is known
should not be judged against 45-minute bands, and that is worth fixing. But it
does mean:
arr-meta, whether a per-episode runtime canbe recovered when
episode_run_timeis empty — TMDB exposes runtime on theepisode records themselves, and the season refresh already walks them. If
that is more than a small change, comment here and leave it; do not widen
this issue into a metadata project.
Replace the S09 criterion with: a series whose runtime is known and short is
judged against a proportionally scaled floor and target, proven by test at both
22 and 45 minutes.
Checked the episode-record fallback while in
arr-meta: it is more than a small change, so leaving it per the correction above.The refresh only fetches season detail for seasons the library has not seen — known seasons sync through the lighter per-season endpoint and the series row. Recovering a runtime when
episode_run_timeis empty would mean either fetching season detail on every refresh or adding a derivation rule (which episode's runtime, how to aggregate a range like 19–23 minutes) plus a second persistence path. That is a metadata project of its own; this issue lands with the series-levelepisode_run_timeonly, stored on add and on refresh, and a known value is never blanked by TMDB's empty spells.