Lazy enrichment only covers viewed titles, so an actor's count/results were partial. Add a background backfill: each plex_sync rich-fetches a bounded batch (60) of not-yet-enriched movies/shows and persists their FULL cast, stamping people_enriched_at so each is fetched once — the whole library is covered over successive runs (migration 0057 adds the marker). Extracted the enrichment into a shared app/plex/people.py (cast_from_meta / enrich_row_people / prune_orphan_people + the person-image host/proxy) so the info-page lazy path and the batch share ONE implementation — no duplication; the info page also stamps the marker so the batch skips it. Verified: an 8-item batch grows those movies' cast_names 3->24 and fills plex_people (32->224); the info-page cast is intact after the _rich_meta refactor. (Plex cast-explore S1b)
26 lines
740 B
Python
26 lines
740 B
Python
"""plex_items/plex_shows.people_enriched_at: full-cast backfill marker
|
|
|
|
Revision ID: 0057_plex_ppl_enriched
|
|
Revises: 0056_plex_people
|
|
Create Date: 2026-07-19
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
revision: str = "0057_plex_ppl_enriched"
|
|
down_revision: Union[str, None] = "0056_plex_people"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
for tbl in ("plex_items", "plex_shows"):
|
|
op.add_column(tbl, sa.Column("people_enriched_at", sa.DateTime(timezone=True), nullable=True))
|
|
|
|
|
|
def downgrade() -> None:
|
|
for tbl in ("plex_items", "plex_shows"):
|
|
op.drop_column(tbl, "people_enriched_at")
|