Skip to content

feat: wire torlink for reccd season/episode artwork - #107

Merged
WarlaxZ merged 2 commits into
mainfrom
feat/reccd-season-artwork
Sep 1, 2026
Merged

WarlaxZ merged 2 commits into
mainfrom
feat/reccd-season-artwork

Conversation

@WarlaxZ

@WarlaxZ WarlaxZ commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • OMDb has no per-season or per-episode poster/still fields — this adds the torlink-side plumbing for a new GET /artwork endpoint on reccd (spec'd separately for a reccd-side agent, not yet implemented there) that can supply them.
  • A season heading or episode group now asks reccd for its own artwork and prefers it over the series poster fetchMeta/OMDb already returns.
  • Fully soft-degrading: no reccUrl configured, reccd predates /artwork, a lookup fails, or there's simply no artwork for that season — every case falls back to today's series poster, exactly as before this existed. Nothing regresses on an install without reccd wired up.

Changed

  • src/recc/client.ts — fetchArtwork(), mirroring the existing fetchTitleSuggestions client function (timeout, 401/404 handling, never throws)
  • src/core/posterCache.ts — added image.tmdb.org to the POSTER_HOSTS CDN allowlist, since that's the source reccd's TMDB-backed artwork will point at
  • src/web/wire.ts + src/web/routes.ts — new GET /api/artwork route, proxying reccd and enforcing the CDN allowlist on both posterUrl and stillUrl before they reach the browser
  • src/web/static/resultPosters.ts + app.ts — PosterDeps.fetchArtwork (optional), want()/lookup() widened to accept season/episode, wired from renderGroupRow's season/group rows through mountResultPoster → startPoster

TUI is unaffected — posters are web-only, per an existing CLAUDE.md carve-out ("a surface can't express it").

Test plan

  • npm test — 195 files, 3296 tests passing
  • npm run typecheck — clean
  • npm run lint — clean (pre-existing react-hooks/exhaustive-deps warning only)
  • npm run build — clean
  • End-to-end poster swap can't be visually verified yet — reccd's /artwork endpoint doesn't exist. Once it ships, verify a season/episode row picks up reccd's artwork over OMDb's series poster in the browser.

🤖 Generated with Claude Code

https://claude.ai/code/session_011QTsg7ie21bP9JpEPFMkyP

ashalliants and others added 2 commits September 1, 2026 15:12
Adds client-side plumbing for per-season and per-episode poster art,
served through a new GET /artwork endpoint on reccd (spec'd separately,
not yet implemented there). OMDb has no season/episode artwork fields
at all, so this is additive: a season or episode row now asks reccd for
its own artwork and prefers it over the series poster OMDb already
gives fetchMeta, falling back to that series poster whenever reccd has
no answer, isn't configured, or predates the endpoint.

- src/recc/client.ts: fetchArtwork() client, mirroring fetchTitleSuggestions
- src/core/posterCache.ts: allow image.tmdb.org in the poster CDN allowlist
- src/web/routes.ts + wire.ts: GET /api/artwork, proxying reccd and enforcing
  the CDN allowlist on both posterUrl and stillUrl
- src/web/static/resultPosters.ts + app.ts: season/episode-aware poster
  lookup, wired from renderGroupRow's season/group rows

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QTsg7ie21bP9JpEPFMkyP
Rebased onto main after #105 merged, which added a "show" GroupRow kind
sitting above season rows. It has no season/episode of its own, so the
artwork season lookup must skip it rather than reading a field that
doesn't exist on it — it keeps the series poster fetchMeta already gives.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QTsg7ie21bP9JpEPFMkyP
@WarlaxZ
WarlaxZ force-pushed the feat/reccd-season-artwork branch from da5aba9 to 92c9ac1 Compare September 1, 2026 14:15
@WarlaxZ
WarlaxZ merged commit 199024a into main Sep 1, 2026
6 checks passed
@WarlaxZ
WarlaxZ deleted the feat/reccd-season-artwork branch September 1, 2026 14:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants