Skip to content

feat(dmm-tv): DMM TV 対応 — 抽象基底モデル + 共通 consumer + dmm_* テーブル#191

Open
Uno-Takashi wants to merge 4 commits into
mainfrom
feature/dmm-tv-support
Open

feat(dmm-tv): DMM TV 対応 — 抽象基底モデル + 共通 consumer + dmm_* テーブル#191
Uno-Takashi wants to merge 4 commits into
mainfrom
feature/dmm-tv-support

Conversation

@Uno-Takashi

Copy link
Copy Markdown
Member

feat(dmm-tv): DMM TV 対応 — 抽象基底モデル + 共通 consumer + dmm_* テーブル

概要

dアニメストアに加えて DMM TV の「同時視聴」をバックエンドで提供するための第一歩です。
同時視聴の同期コア(WebSocket プロトコル・consumer の同期処理・stats・grace 削除)を
サービス非依存に共通化し、DMM 専用の dmm_* テーブル・WS ルート・lobby 解決を追加します。

設計方針: dアニメ(anime_*)と DMM(dmm_*)でデータは分離しつつ、抽象基底モデル +
パラメータ化した consumer でロジックを共有します。既存の anime_* テーブルは無改変です。

変更点(ファイル別・変更理由)

streamer/models.py

  • 共通スキーマを抽象基底BaseRoom / BaseUser / BaseReaction / BaseSetting /
    BaseRoomHistory / BaseReactionStat)へ切り出し。
  • 既存の Anime*フィールド完全同一のまま基底を継承。→ 既存テーブルは無改変
    makemigrations --check で "No changes detected" を確認済み)。
  • Dmm* 具象モデルを新設。DMM の長い content id 用に DmmRoom.part_idmax_length=128 へ拡張。

streamer/migrations/0006_*

  • DMM テーブルの追加のみ(Anime テーブルへの Alter は含まない)。追加マイグレーション 1 本。

streamer/consumers.py

  • AnimePartyConsumerBasePartyConsumer へ一般化し、扱うモデル一式をクラス属性で差し替え
    る方式に変更。Anime / Dmm の薄いサブクラスで同期本体(create/join/leave/video_operation/
    sync/reaction/spectate/update_setting …)を完全共有
  • grace 削除ヘルパ(_pending_room_deletes 周辺)を、モデルと fold 関数を引数で受けるようパラメータ化

streamer/cron.py

  • fold_room_reactionsreaction_model / stat_model 差し替え可能に(既定は従来どおり Anime →
    既存呼び出し・テストは後方互換)。

streamer/routing.py

  • dmm-tv/party/ の WebSocket ルートを追加(anime-store/party/ は不変)。

api/views.py / api/urls.py

  • DmmTvLobbyResolveAPI + GET /api/v1/dmm-tv/lobby/<uuid> を追加。DmmRoom.part_id
    "season/content" を保持し、これを分解して再生ページ URL
    /vod/playback/on-demand/?season=..&content=..&party=join&room_id=..)を組み立てて返す。
  • 統計をサービス横断(dアニメ + DMM)の合算へ変更。ROOM_MODELS / USER_MODELS /
    REACTION_SOURCES を導入し、per-day・累計・alive・リアクション集計・shields バッジを全サービス合算に
    更新。→ フロントの統計ダッシュボードは無改修で両サービス合計を表示できる。

streamer/admin.py / streamer/factories.py

  • DMM 版の admin 登録・factory を追加。

api/tests.py / streamer/test_dmm_consumer.py

  • DMM consumer(create で dmm_* に永続化・リアクションのルーム終了時 fold)と lobby 解決
    (season/content 分解)のテストを追加。

検証

  • pytest: 41 passedconftest の InMemoryChannelLayer 使用、DB は PostgreSQL)。
  • ruff format / ruff check: clean。
  • makemigrations --check --dry-run: No changes detected(既存 anime テーブルの無改変を保証)。

後方互換

  • WS メッセージプロトコルstreamer/format.py)・anime-store/party/ ルートlobby 契約
    すべて不変。公開済みの Chrome 拡張は無改修で従来どおり動作します。
  • pydantic v2 の SerializeAsAny による直列化互換も維持。

依存関係

  • 本 PR は単独でマージ可能(他リポジトリに依存しない)。
  • 一方、以下がこの PR の API/ルートを利用します(別リポジトリ側 PR):
    • root(orchestration): nginx の /dmm-tv/party/ プロキシルート。
    • frontend: /dmm-tv/lobby/[roomId]GET /api/v1/dmm-tv/lobby/{room_id} を呼ぶ。
    • chrome-extension: ws://.../dmm-tv/party/ へ接続、part_idseason/content を載せる。

このブランチは複数コミットに分かれています(24fab77 共通化+dmm_* 実装、05266a5
season 対応の lobby + 全サービス合算 stats)。

Uno-Takashi and others added 4 commits July 5, 2026 10:31
…dels)

DMM TV 対応の第一歩として、同時視聴の同期ロジックをサービス非依存の共通実装へ
抽象化し、DMM 専用の dmm_* テーブル・WS ルート・lobby 解決を追加する。

- models: 共通スキーマを抽象基底(BaseRoom/BaseUser/BaseReaction/BaseSetting/
  BaseRoomHistory/BaseReactionStat)へ切り出し、既存 Anime* はフィールド同一の
  まま継承(既存テーブルは無改変・マイグレーション不要)。Dmm* 具象を新設
  (追加マイグレーション 0006 のみ)。DMM の長い content id 用に DmmRoom.part_id
  は max_length=128 へ拡張。
- consumers: AnimePartyConsumer を BasePartyConsumer へ一般化し、扱うモデル一式を
  クラス属性で差し替える方式に。Anime/Dmm の薄いサブクラスで同期本体を共有。
  grace 削除ヘルパはモデルを引数で受けるようパラメータ化。
- cron: fold_room_reactions を reaction_model/stat_model 差し替え可能に(既定は
  従来どおり Anime)。
- routing: dmm-tv/party/ を追加(anime-store/party/ は不変)。
- api: DmmTvLobbyResolveAPI + /v1/dmm-tv/lobby/<uuid> を追加。
- admin/factories/tests: DMM 版を追加。40 tests green。

後方互換: WS プロトコル・anime-store ルート・lobby 契約は不変のため、公開済み
拡張は無改修で従来どおり動作する。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- lobby: DmmRoom.part_id は "season/content"。DmmTvLobbyResolveAPI がこれを分解し、
  再生ページ /vod/playback/on-demand/?season=..&content=..&party=join へリダイレクト
  する URL を返す(スラッシュ無しは content のみ扱い)。
- stats: 統計をサービス横断(dアニメ + DMM)の合算にする。ROOM_MODELS/USER_MODELS/
  REACTION_SOURCES を導入し、per-day・累計・alive・リアクション集計・shields を
  全サービス合算に更新(フロントの stats ダッシュボードは無改修で DMM を反映)。
- tests: lobby の season/content 分解、_clear_reaction_tables に DMM 反映。41 passed。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant