feat/rich-card-metadata #11

Merged
aureus merged 6 commits from feat/rich-card-metadata into main 2026-05-25 19:56:01 +00:00
Owner
No description provided.
Adds content rating badge, director/creator, runtime, genre tags,
top-3 cast names, and overview synopsis to rec_card, rate_card,
discover_card, and partner_card.

Data source: new fetchItemDetails() in the TMDB adapter uses
append_to_response=credits,release_dates (movies) and
append_to_response=credits,content_ratings (TV) so all rich fields
are fetched in a single TMDB request per item. The rec engine
enrichment loop now checks genres IS NULL (replaces the old
number_of_seasons IS NULL TV-only check) and backfills both media
types on each cycle.

Migration 003 adds five nullable columns to media_metadata: genres,
runtime, content_rating, director, cast_names. rate_card and rec_card
prefer Jellyfin-sourced fields (already in library table) for in-library
items; discover_card and partner_card use TMDB enrichment. rec_card
omits director/cast (narrow w-40 strip); the other three show the full
metadata row. Browser baselines need regeneration after merge.
All card types now surface: content-rating badge, director/creator,
runtime (movies), genre tags, top-3 cast, and overview synopsis.

Migration 003 adds five nullable columns to media_metadata (genres,
runtime, content_rating, director, cast_names). The rec engine enriches
new rows via fetchItemDetails (append_to_response=credits + certs) using
genres IS NULL as the staleness proxy. The /rate/external route now also
calls fetchItemDetails in parallel with fetchMetadata so newly-seeded
external rows are immediately enriched.

Browser baselines regenerated to reflect the updated card layouts.
Replace two-block metadata layout with single _meta_strip.njk partial:
TV-MA │ 8 seasons │ ~12 eps/season │ ~65 min/ep │ Drama, Crime.
CSS adjacent-sibling combinator inserts │ dividers automatically.
Director credit added as 'Dir. <name>' to all four card types.

PartnerCard was missing numberOfSeasons/numberOfEpisodes/episodeRunTime
for TV shows — fixed in both the TypeScript interface and the SQL
SELECT so partner TV cards now show season/episode info in the strip.
All 162 tests pass.
Replace separate 'Dir. Name' paragraph with a flex row showing both
'Director: ...' and 'Starring: ...' on the same line using consistent
label/value styling. Wraps on narrow viewports via flex-wrap.

Update tests to assert 'Director:' label and name independently
since they're now in separate spans for colour styling.
z-curate-rating.test.ts correctly captures countBefore before clicking,
then waits for countBefore-1. z-settings-ratings computed countAfter
after the click, creating a race: if Firefox starts the DOM swap before
cards.count() runs, the target count could be one too low and then
never match. Fix: mirror z-curate-rating's pattern.
chore: update visual regression screenshots
All checks were successful
PR Checks / test (pull_request) Successful in 4m29s
c6bc7cf420
aureus merged commit aeb3cf5a9a into main 2026-05-25 19:56:01 +00:00
aureus referenced this pull request from a commit 2026-05-25 19:56:02 +00:00
aureus deleted branch feat/rich-card-metadata 2026-05-25 19:56:05 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aureus/watchcraft!11
No description provided.