見知らぬ人と匿名でYouTubeを一緒に視聴 — 1人が去ると部屋が消える1:1同時視聴
(momentbrand.site)アルゴリズムのおすすめではなく、「誰かが自分で選んで流した動画」に出会うコンセプトで作りました。以前の帆船コンセプトです。
匿名ユーザーが YouTube リンクと一言の手紙を「帆船」に乗せて流すと、別の匿名ユーザーがそれをクリックして 1:1 の視聴ルームが開きます。2人の YouTube プレイヤーは同じ場面に同期され、匿名チャットをしながら一緒に見ます。どちらか1人が去った瞬間、部屋とチャットはすべて消えます。
最初は動画が終わると3分のカウントダウン後に部屋が爆破されるコンセプトでしたが、実際に使ってみると相性のいい相手に会ったときは「もう1本」が自然だったので、動画が終わっても部屋は維持され、ルームオーナーが動画を差し替えて続けて見る形に変えました。
作りながら面白かった点/苦労した点:
- 同期: サーバーが基準時刻を取り(RTT 補正)、drift が 0.5 秒以内なら無視、2 秒以内なら再生速度 0.95〜1.05x でユーザーに気づかれないよう追いつき、それ以上は
seekToで強制補正します。広告再生中は補正を止めます。 - 本当に苦労したのはライブ配信でした。ライブでは
seekToが DVR ウィンドウ内でしか動作しないうえ、2人の視聴者の DVR ウィンドウが互いに異なるため、「ルームオーナーがライブエッジにいる」という意図を相手側のウィンドウ基準に翻訳する必要がありました。loading→play→loadingの無限エコーループまで発生し、コミットログを見るとライブ同期修正だけで7件ありました。 - マッチングの race: 同じ帆船に同時に複数人が乗り込むのを Redis Lua スクリプトの原子的ロックで防ぎました(5人同時 join テストで 1人だけが勝つことを確認)。
- 埋め込み禁止動画(エラー 153)は IFrame API が
onErrorを発火してくれず画面だけ真っ黒のままになるため、8秒再生 watchdog で検知して「再生不可」の案内を出すようにしました。 - 匿名 1:1 なので安全装置を多めに入れました: チャット全体をサーバーで sanitize、外部連絡先を自動マスキング、AI モデレーション + 通報累積による遮断、危機キーワード検知時の相談電話案内。
スタック: Next.js 15 / Fastify 5 / Socket.io / Redis 7 / Postgres 16、モバイルは Expo(RN)
登録なしですぐ体験できます。今週 iOS アプリも App Store に公開されました: https://apps.apple.com/kr/app/float/id6777661839
フィードバック歓迎です。
まだコメントはありません。