Dramacin is a streaming platform for Chinese and Korean dramas and films. The hard part isn't the player — it's the catalog. 24,000+ titles, 1M+ episodes, pulled from 31 providers, each with its own naming conventions, episode numbering, subtitle availability, and update cadence. Left raw, it's unusable.
The problem is fragmentation
Provider A calls a show "The Untamed"; Provider B calls it "Chen Qing Ling"; Provider C has it under a romanized variant. Episode counts disagree. Subtitles exist for some providers, not others. A user searching "untamed" should hit all of them, merged, with the best available sources listed underneath.
One normalized schema
Every provider feeds through an adapter into one canonical schema:
slug— deterministic, keyword-rich, deduped against title aliases.title,altTitles[]— canonical + all known variants for search.providers[]— which sources carry it, with their per-source episode lists.metadata— TMDB-enriched (poster, backdrop, genres, rating, synopsis).
TMDB is the spine. Once a title resolves to a TMDB ID, all providers that carry it collapse onto one row. The adapter's job is to find that TMDB match (fuzzy title + year), not to invent metadata.
Trending and freshness
"Trending" across 31 providers can't be a cron that re-ranks everything. It's a weighted blend of recent cross-provider velocity, regional demand, and manual featuring — recomputed on a short interval and cached. Users feel "live"; the cost is bounded.
Per-provider and per-genre filters ride on the normalized schema, so they work uniformly regardless of which source originally held the title.
PWA install
A streaming app that isn't installable loses returning users. Dramacin is a PWA — installable, offline-aware shell, cached assets, and a player that survives flaky networks. The install prompt is the cheapest retention lever there is.
What I learned
- The catalog is the product. A great player over a messy catalog is a bad app; a decent player over a clean catalog is a good one.
- Normalization at ingest beats cleanup at read time, every time.
- A single spine (TMDB) to merge onto beats inventing your own canonical IDs.
24,000 titles isn't impressive because of the number — it's impressive because 31 providers agreed on nothing and the user never has to know.