Add trending movies/series, refreshed on a schedule
CI / lint (push) Canceled after 0s
CI / typecheck (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / integration-tests (push) Canceled after 0s
CI / container-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / lint (push) Canceled after 0s
CI / typecheck (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / integration-tests (push) Canceled after 0s
CI / container-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
Mirrors TMDb's own /trending/{movie|tv}/{day|week} ranking rather than
Aurora computing trending itself from popularity deltas -- that would
require re-syncing the entire catalog on a schedule, infeasible at any
real scale, whereas TMDb already computes this well from signals (real
view/search velocity) Aurora has no access to.
New: TrendingEntry model + migration 0003, MetadataProvider.get_trending
(concrete/optional, like aclose(), so existing test fakes don't all need
updating), refresh_trending() which actually ingests each trending item
(only ~20 per window, cheap enough to fully ingest rather than apply the
never-fabricate-a-stub rule recommendations uses), a twice-daily arq cron
job (WorkerSettings.cron_jobs, new to this codebase), a manual admin
trigger for right after a deploy, and GET /movies/trending + GET
/series/trending.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
6c95e18aad
commit
4403305da6
@@ -24,6 +24,7 @@ from app.models.movie import (
|
||||
)
|
||||
from app.models.person import Person
|
||||
from app.models.provider import IngestionJob, Provider, ProviderRecord
|
||||
from app.models.trending import TrendingEntry
|
||||
from app.models.tv import (
|
||||
Episode,
|
||||
Season,
|
||||
@@ -75,4 +76,5 @@ __all__ = [
|
||||
"Video",
|
||||
"WatchProvider",
|
||||
"WatchProviderOffering",
|
||||
"TrendingEntry",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
"""Aurora's mirror of TMDb's own trending lists (section 17, additive).
|
||||
|
||||
TMDb already computes trending using signals Aurora has no access to
|
||||
(real view/search velocity across their whole audience) — reinventing
|
||||
that from Aurora's own popularity snapshots would require re-syncing the
|
||||
entire catalog on a schedule, which isn't feasible at any real scale.
|
||||
Instead Aurora asks TMDb what's trending right now and mirrors that
|
||||
ranked list (see app/services/ingestion/trending_ingestion.py)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import uuid
|
||||
|
||||
from sqlalchemy import Index, Integer, String
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from app.models.base import Base, TimestampMixin, UUIDPrimaryKeyMixin
|
||||
|
||||
|
||||
class TrendingEntry(Base, UUIDPrimaryKeyMixin, TimestampMixin):
|
||||
"""One row per (entity, time_window) currently on Aurora's trending
|
||||
list -- replaced wholesale on each refresh, same as ReleaseDate/
|
||||
WatchProviderOffering. `updated_at` doubles as "when this window was
|
||||
last refreshed"."""
|
||||
|
||||
__tablename__ = "trending_entries"
|
||||
__table_args__ = (Index("ix_trending_entries_window", "entity_type", "time_window"),)
|
||||
|
||||
entity_type: Mapped[str] = mapped_column(String(30), nullable=False) # "movie" | "series"
|
||||
entity_id: Mapped[uuid.UUID] = mapped_column(nullable=False, index=True)
|
||||
time_window: Mapped[str] = mapped_column(String(10), nullable=False) # "day" | "week"
|
||||
rank: Mapped[int] = mapped_column(Integer, nullable=False)
|
||||
|
||||
|
||||
__all__ = ["TrendingEntry"]
|
||||
Reference in New Issue
Block a user