番組表アーキテクチャ

番組表 / EPG システムの設計。核心は 「多数ソースから集めた編成・配信データを、canonical ID に名寄せして、読み込み主体(read-heavy)で配る」 こと。放送EPG型と配信ガイド型でデータの“主役”が違い、それが設計全体を分ける。

全体構成

flowchart LR
    subgraph SRC["ソース"]
      G["Gracenote API"]
      X["XMLTV グラバー"]
      P["配信プロバイダ カタログ"]
    end
    SRC --> I["取込・正規化・名寄せ<br/>(canonical ID: TMSId / TMDB / EIDR)"]
    I --> DB[("スケジュール / Offer ストア<br/>時系列・地域別")]
    DB --> API["配信API (REST/GraphQL, JSON)<br/>grid / now-next / availability"]
    API --> CDN["CDN / エッジキャッシュ"]
    CDN --> W["Web"]
    CDN --> M["ネイティブ / TV 端末"]
    DB --> J["バッチ: now-next 事前計算 / リマインダ通知"]

データモデル(正規形)

エンティティ中身主役になる型
Channel / Station局・サービス(prgSvcId)、ロゴ、地域放送EPG
Program / Title作品。シリーズは Episode を持つ両方
Airing / Scheduleチャンネル × 開始時刻 × 長さ(時系列の核)放送EPG
Offer / Availability作品 × プロバイダ × 地域 × 種別(sub/rent/buy) × deeplink配信ガイド
Identity上記を束ねる正規ID(TMSId / IMDb / TMDB / EIDR)両方
Metadataジャンル、レーティング、画像、人物両方

取込パイプライン(ETL)

  1. 収集 — Gracenote API / XMLTV グラバー(tv_grab_*) / プロバイダカタログを取得
  2. 正規化 — フォーマット差を吸収(XML/JSON → 内部スキーマ)
  3. 名寄せ(entity resolution) — 別ソースの同一作品を 1つの canonical ID に統合・重複排除。ここが最難関。JustWatch は IMDb/TMDB/EIDR へマッチ
  4. 検証 — 欠損・矛盾・時刻重複のチェック(自動 + 手動補正。JustWatch は AI + 人手のクロス確認)
  5. 冪等 upsert で蓄積 — 編成変更や可用性変動を上書き反映

更新頻度: 放送は高頻度、配信可用性は日次(JustWatch は最低24h ごと、140+ 国・600+ サービス・40万+ 作品)。

蓄積とクエリ

配信 API

フロント(グリッド UI)

横断的関心事

勘所

関連

Graph