Mechanical, whole-tree `ruff format` pass — no behaviour change. Recorded in .git-blame-ignore-revs (next commit) so git blame skips it.
54 lines
2.1 KiB
Python
54 lines
2.1 KiB
Python
"""plex TMDB enrichment columns (E5 S2)
|
|
|
|
Additive TMDB-sourced fields on plex_items + plex_shows — keywords, full crew, budget/revenue, TMDb
|
|
community score, production companies/countries, recommendations, and a backdrop-path pool — plus a
|
|
`tmdb_id` cache and a `tmdb_enriched_at` watermark. Filled by the new TMDB enrichment job (matched by
|
|
the stored canonical `guid`), SERVED FROM THE ROW (never a live TMDB call). Distinct from the existing
|
|
Plex-sourced `imdb_rating`/`rating`, which are left untouched. Plus `plex_people.tmdb_person_id` (the S2
|
|
foundation for S6's person bios). ADD-only, all nullable → no table rewrite, no ACCESS EXCLUSIVE lock.
|
|
No watermark reset needed: `tmdb_enriched_at` starts NULL, so every eligible row is picked up once.
|
|
"""
|
|
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
revision: str = "0071_plex_tmdb_fields"
|
|
down_revision: Union[str, None] = "0070_fold_maintenance_batch"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
_TABLES = ("plex_items", "plex_shows")
|
|
|
|
# (name, type) — same set on both movie/leaf rows and show rows. budget/revenue stay NULL for shows.
|
|
_COLS: tuple[tuple[str, sa.types.TypeEngine], ...] = (
|
|
("tmdb_id", sa.Integer()),
|
|
("tmdb_enriched_at", sa.DateTime(timezone=True)),
|
|
("tmdb_rating", sa.Float()),
|
|
("tmdb_vote_count", sa.Integer()),
|
|
("budget", sa.BigInteger()),
|
|
("revenue", sa.BigInteger()),
|
|
("keywords", postgresql.JSONB()),
|
|
("crew", postgresql.JSONB()),
|
|
("studios", postgresql.JSONB()),
|
|
("production_countries", postgresql.JSONB()),
|
|
("recommendations", postgresql.JSONB()),
|
|
("backdrops", postgresql.JSONB()),
|
|
)
|
|
|
|
|
|
def upgrade() -> None:
|
|
for t in _TABLES:
|
|
for name, type_ in _COLS:
|
|
op.add_column(t, sa.Column(name, type_, nullable=True))
|
|
op.add_column("plex_people", sa.Column("tmdb_person_id", sa.Integer(), nullable=True))
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("plex_people", "tmdb_person_id")
|
|
for t in _TABLES:
|
|
for name, _ in reversed(_COLS):
|
|
op.drop_column(t, name)
|