Mechanical, whole-tree `ruff format` pass — no behaviour change. Recorded in .git-blame-ignore-revs (next commit) so git blame skips it.
47 lines
2.1 KiB
Python
47 lines
2.1 KiB
Python
"""plex rich-detail item/show columns (E5 S5b)
|
|
|
|
On plex_items and plex_shows: the fields that were previously read LIVE from plex.metadata() on every
|
|
info-page view — `imdb_rating` (the IMDb-specific score, distinct from `rating` = audienceRating),
|
|
`imdb_id` (tt…), `tagline`, and `full_cast` (ordered [{name, role, thumb}]). Persisting them lets the
|
|
detail endpoints serve from the DB row instead of a live Plex call (outage-resilient, and the
|
|
precondition for S6's pure-DB language-aware serving).
|
|
|
|
These are filled by the same rich backfill that already fills the full cast (`_enrich_people_batch`),
|
|
so the data step below resets `people_enriched_at` to NULL on movie/show rows: the backfill re-fetches
|
|
each once (60/run, self-throttled) and stamps the new columns. ADD-only, all nullable → no table
|
|
rewrite, no generated column, no ACCESS EXCLUSIVE lock (unlike 0064).
|
|
"""
|
|
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
revision: str = "0065_plex_detail_fields"
|
|
down_revision: Union[str, None] = "0064_plex_hu_overlay_cols"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
_TABLES = ("plex_items", "plex_shows")
|
|
|
|
|
|
def upgrade() -> None:
|
|
for t in _TABLES:
|
|
op.add_column(t, sa.Column("imdb_rating", sa.Float(), nullable=True))
|
|
op.add_column(t, sa.Column("imdb_id", sa.String(16), nullable=True))
|
|
op.add_column(t, sa.Column("tagline", sa.Text(), nullable=True))
|
|
op.add_column(t, sa.Column("full_cast", postgresql.JSONB(), nullable=True))
|
|
# Force a one-time re-enrich so already-enriched rows gain the new columns (episodes are never
|
|
# enriched, so their NULL people_enriched_at is unaffected; they keep serving detail live).
|
|
op.execute("UPDATE plex_items SET people_enriched_at = NULL WHERE kind = 'movie'")
|
|
op.execute("UPDATE plex_shows SET people_enriched_at = NULL")
|
|
|
|
|
|
def downgrade() -> None:
|
|
for t in _TABLES:
|
|
op.drop_column(t, "full_cast")
|
|
op.drop_column(t, "tagline")
|
|
op.drop_column(t, "imdb_id")
|
|
op.drop_column(t, "imdb_rating")
|