feat(dmm-tv): DMM TV 対応 — 抽象基底モデル + 共通 consumer + dmm_* テーブル#191
Open
Uno-Takashi wants to merge 4 commits into
Open
feat(dmm-tv): DMM TV 対応 — 抽象基底モデル + 共通 consumer + dmm_* テーブル#191Uno-Takashi wants to merge 4 commits into
Uno-Takashi wants to merge 4 commits into
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.pyBaseRoom/BaseUser/BaseReaction/BaseSetting/BaseRoomHistory/BaseReactionStat)へ切り出し。Anime*はフィールド完全同一のまま基底を継承。→ 既存テーブルは無改変(
makemigrations --checkで "No changes detected" を確認済み)。Dmm*具象モデルを新設。DMM の長い content id 用にDmmRoom.part_idはmax_length=128へ拡張。streamer/migrations/0006_*streamer/consumers.pyAnimePartyConsumerをBasePartyConsumerへ一般化し、扱うモデル一式をクラス属性で差し替える方式に変更。
Anime/Dmmの薄いサブクラスで同期本体(create/join/leave/video_operation/sync/reaction/spectate/update_setting …)を完全共有。
_pending_room_deletes周辺)を、モデルと fold 関数を引数で受けるようパラメータ化。streamer/cron.pyfold_room_reactionsをreaction_model/stat_model差し替え可能に(既定は従来どおり Anime →既存呼び出し・テストは後方互換)。
streamer/routing.pydmm-tv/party/の WebSocket ルートを追加(anime-store/party/は不変)。api/views.py/api/urls.pyDmmTvLobbyResolveAPI+GET /api/v1/dmm-tv/lobby/<uuid>を追加。DmmRoom.part_idは"season/content"を保持し、これを分解して再生ページ URL(
/vod/playback/on-demand/?season=..&content=..&party=join&room_id=..)を組み立てて返す。ROOM_MODELS/USER_MODELS/REACTION_SOURCESを導入し、per-day・累計・alive・リアクション集計・shields バッジを全サービス合算に更新。→ フロントの統計ダッシュボードは無改修で両サービス合計を表示できる。
streamer/admin.py/streamer/factories.pyapi/tests.py/streamer/test_dmm_consumer.pydmm_*に永続化・リアクションのルーム終了時 fold)と lobby 解決(season/content 分解)のテストを追加。
検証
pytest: 41 passed(conftestの InMemoryChannelLayer 使用、DB は PostgreSQL)。ruff format/ruff check: clean。makemigrations --check --dry-run: No changes detected(既存 anime テーブルの無改変を保証)。後方互換
streamer/format.py)・anime-store/party/ルート・lobby 契約はすべて不変。公開済みの Chrome 拡張は無改修で従来どおり動作します。
SerializeAsAnyによる直列化互換も維持。依存関係
/dmm-tv/party/プロキシルート。/dmm-tv/lobby/[roomId]がGET /api/v1/dmm-tv/lobby/{room_id}を呼ぶ。ws://.../dmm-tv/party/へ接続、part_idにseason/contentを載せる。