機能 #182
完了機能 #162: OBS連携機能
【OBS連携】OBS側のHTMLファイル
説明
親: #162
担当範囲¶
OBS 連携のうち OBS 側のオーバーレイ HTML。本体(#181)が配信する /state.json を消費して表示する。
設計¶
取得方法¶
- 本体のローカル HTTP サーバ(#181)から配信される
/state.jsonを 約1秒間隔でポーリング し、差分を DOM に反映する。 - OBS ブラウザソースには
http://localhost:<port>/<template>.htmlを指定するだけで使える。
テンプレート構成¶
3用途を1枚に詰めず、用途別に分割する(OBS はソースを複数配置できるため配置自由度が高い)。
-
now-playing.html— 選曲〜プレイ中の曲情報 -
result.html— 直近リザルト(ランプ/ランク/スコア/自己ベスト更新の演出) -
session.html— セッション統計
方針¶
- 判定・整形は本体側(#181)に寄せ、HTML 側は
/state.jsonの表記済み文字列を流し込むだけにする。 - スタイル(CSS)を差し替えるだけでテーマ変更できる構造にし、ユーザーが自作テーマを作りやすくする。
-
/state.jsonのスキーマは #181 を参照。
依存¶
- #181 の HTTP サーバ・/state.json スキーマ確定後に着手するのが望ましい。
ファイル
エージェント ちゃん さんが24日前に更新
- 説明 を更新 (差分)
エージェント ちゃん さんが23日前に更新
追加仕様 詳細設計(2026-06-13)OBS/HTML側¶
親 #162 の追加表示要素のうち、HTML オーバーレイ側の設計。整形は本体(#181)に寄せ、HTML は /state.json の表記済み文字列を流し込むだけ、の方針を維持する。スキーマ拡張は #181 を参照。
now-playing.html への追加¶
-
プレイオプション表示ブロックを追加し、
nowPlaying.playOptionを表示する。- ランダム:
playOption.random(DP/バトル時はrandom2も併記)。 - ゲージ:
playOption.gauge。1秒ポーリングのたびに最新値へ更新するため、GAS による種別切替が自動的に反映される(DOM 差分更新で十分)。 - GAS バッジ:
playOption.gaugeAutoShiftが true のとき「GAS」表示。gaugeAutoShiftModeをツールチップ/サブ表記に。 - レーンパターン行:
playOption.laneが非 null のときのみ表示(RANDOM/R-RANDOM 時)。null のときは行ごと非表示。
- ランダム:
- ゲージ値変化時に軽いハイライト演出を入れると配信上わかりやすい(CSS のみで実現、任意)。
プロフィール表示(名前・取得段位・一言)¶
-
profile(name/dan/comment)は phase 非依存・常時表示要素のため、専用テンプレートprofile.htmlを新設し、OBS で独立配置できるようにする(now-playing/session とは別ソースに置きたい需要が高い)。 - 併せて now-playing.html のヘッダにも名前/段位を小さく出せるよう、
profile参照を共通 JS に集約。 -
comment空文字時は枠ごと非表示にし、レイアウト崩れを防ぐ。
方針(既存踏襲)¶
- CSS 差し替えだけでテーマ変更できる構造を維持。
playOptionブロックとprofileブロックそれぞれにクラスを付与し、自作テーマで個別に装飾可能にする。 - 約1秒ポーリング・差分 DOM 反映は既存設計のまま。ゲージのライブ更新も同じポーリングで賄える(push 不要)。
依存¶
- #181 の
/state.jsonスキーマ拡張(profile/nowPlaying.playOption)確定後に着手。
本コメントは詳細設計であり実装着手前。
エージェント ちゃん さんが23日前に更新
方針変更(2026-06-13):単一HTMLへ集約¶
OBS で複数 HTML を読み込み個別配置する手間を避けるため、用途別3枚分割(now-playing / result / session / profile)を取りやめ、1枚の overlay.html に集約する。先行コメントの「profile.html 新設」「用途別分割」は本コメントで置き換える。
集約方針:フル画面オーバーレイ+URLでブロック選択¶
- 既定(
overlay.html)= 全ブロックを1ソースで表示。OBS ブラウザソースの追加は1回だけで済む。- ブラウザソースはキャンバスと同解像度・背景透過。各ブロックは CSS で絶対配置。
- 同一ファイルを再利用して一部だけ表示したい場合に備え、URL クエリでブロックを絞れるようにする。
- 例:
overlay.html?blocks=nowplaying,session(指定ブロックのみ表示)。未指定は全表示。 - 表示/非表示は CSS クラスのトグルのみで実現し、デザイン作業に干渉させない。
- 例:
- ブロックは class/id で分割(
#profile#nowplaying#playoption#result#session)。CSS 差し替えでテーマ変更可能、の方針は維持。
/state.json 消費¶
-
/state.jsonは元から全ブロック分を1本で返すため、単一 HTML が 1回のポーリングで全ブロックを更新できて自然。3枚分割時に同じ JSON を重複取得していた分のポーリング負荷も解消。 - 約1秒ポーリング・差分 DOM 反映は維持。ゲージ(GAS)のライブ更新も同じポーリングで賄う(push 不要)。
- スキーマ(
profile/nowPlaying.playOption)は #181 のまま変更なし。profileブロックもoverlay.html内に内包する。
デザイン(別タスク)への引き継ぎ前提¶
- 「キャンバス全面・背景透過・要素は絶対配置」「ブロック単位の class/id + URL クエリによる表示トグル」までを土台として確定。
- 各ブロックの位置・装飾・演出は別タスクで決定する。
本コメントは方針確定であり実装着手前。
エージェント ちゃん さんが23日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装着手。#181 本体側を先行実装・レビュー完了(作業ブランチ codex/162-obs-integration にコミット済み)。/state.json スキーマが確定したため HTML オーバーレイを ./obs/ 配下に実装する。単一 overlay.html に集約・背景透過・絶対配置・ブロック別 class/id・URL クエリ表示トグル・約1秒ポーリング。今回は見た目(CSS/演出)も作り込む。
エージェント ちゃん さんが23日前に更新
実装完了・MR !24 にて develop へ。https://gitlab.izu-san.com/games/beatoraja/-/merge_requests/24
オーバーレイ:単一 obs/overlay.html(背景透過・全画面絶対配置・約1秒ポーリング・DOM 差分更新・?blocks= で表示選別)。レイアウトは design.jpg 準拠:ゲーム画面フレーム(#stage 16:9 透過クリックスルー)・右レール(時刻/セッション/プロフィール/心拍予約)・下部フル幅の曲情報バー(1行・フォント自動フィット)・プレイオプション・中央リザルト・右下選曲履歴。ビジュアルは Claude 製 HUDデザイン(ライム×インク、Chakra Petch + Zen Kaku Gothic New)。テーマは :root の CSS 変数で差し替え可。心拍数は #185 の予約枠のみ。
いづ さん さんが23日前に更新
- ファイル design.jpg design.jpg を追加
エージェント ちゃん さんが23日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
MR !24 承認・ develop へマージ完了につき完了。
実装サマリ(オーバーレイ)¶
- 単一
obs/overlay.html(背景透過・全画面絶対配置・約1秒ポーリング・DOM 差分更新・?blocks=で表示選別)。 - レイアウト(design.jpg 準拠):#stage(16:9 透過クリックスルーのゲーム画面フレーム)・右レール(時刻/セッション/プロフィール/心拍予約、均一間隔)・下部フル幅の曲情報バー(1行・フォント自動フィット)・プレイオプション帯・中央リザルト・右下選曲履歴。
- ビジュアル:Claude 製「control deck」HUD(ライム×インク、Chakra Petch + Zen Kaku Gothic New)。テーマは :root の CSS 変数で差し替え可。README は日本語。
- 心拍数 #heartrate は #185(将来要望)の予約枠のみ。
- 検証:node --check / CSS ブレース整合 / DOM シムで data-field・phase・隠蔽・fit-to-width・clock・history の契約を実証。