/youtube-study-space

Youtube-based online study space! You can enter the study-room by using command in youtube live chat.

Primary LanguageTypeScriptMIT LicenseMIT

youtube-study-space

Youtubeで24時間365日ライブ配信し続ける、オンライン自習室! 視聴者はライブチャットからコマンドを打つことで自由に入退室できます。

Youtubeチャンネルへ

テスト環境と本番環境

環境分けについて

GCP

  • 本番環境:youtube-study-space
  • テスト環境:test-youtube-study-space

AWS

  • 本番環境:Tokyo (ap-northeast-1) リージョン
  • テスト環境:N. Virginia (us-east-1) リージョン

手順書

  • テスト環境:TEST_README.md
  • 本番環境:PRODUCTION_README.md

共通設定

Firestore

データ

  • ルームの入室状況
  • ライブ配信用youtubeチャンネルのAPIアクセス情報
  • Bot用youtubeチャンネルのAPIアクセス情報
  • ラインBotのアクセス情報
  • youtubeライブ配信の情報
  • オンライン作業部屋のユーザー情報
    • 入退室ログ
  • システムconfig
    • デフォルト入室時間
    • 設定可能な最大入室時間
    • 設定可能な最小入室時間
    • 席数
    • その他

データ構造

system/core/myfirestore/type_firestore_data.goを参照。

Lambda関数

youtube_organize_database

cloud schedulerにより毎分実行される。 入室中のユーザーから,自動退室予定時刻を過ぎているユーザーを発見して,退室処理をする。

環境変数:なし

rooms_state

monitorからAPIで呼ばれる。 ルームの状況および最大席数などの情報を返す。

環境変数:なし

reset_daily_total_study_time

cloud schedulerにより毎日0時0分に実行される。 全ユーザーのデイリー作業時間を0にリセットする。

環境変数:なし

check_live_stream_status

cloud schedulerにより毎分実行される。 ライブ配信の状態がactiveであるかどうかチェックする。 activeでない場合はLINEで通知する。

環境変数:なし

set_desired_max_seats

monitorにより必要な時にAPIで呼ばれる。 monitor側で席数を変更すべきと判断したときの、希望の席数をfirestoreに保存する。

環境変数:なし

DynamoDB

Lambda関数と同じregionのDyanamoDBテーブルであること!

データ

  • Firestoreのアクセス情報(サービスアカウント)のjson文字列

注意:json内で出てくるprivate keyの値の文字列内のエスケープは調整する必要があった気がする。

テーブル名:secrets

API Gateway

API名:youtube-study-space-rest-api

エンドポイント

各エンドポイントは、同じ名前のlambda関数と統合する。

  • GET /organize_database
  • GET /reset_daily_total_study_time
  • GET /rooms_state
  • GET /check_live_stream_status
  • POST /set_desired_max_seats

Cloud Scheduler

  • call_lambda_function_organize_database: * * * * *
  • call_lambda_function_reset_daily_total_study_time: 0 0 * * *
  • scheduledFirestoreExport: every 24 hours (Asia/Tokyo)
  • call_lambda_function_check_live_stream_status: * * * * *

Pub/Sub

このドキュメント を参考に、毎日1回firestoreのデータをcloud storageにバックアップする。

Topic name: projects/youtube-study-space/topics/initiateFirestoreExport

Cloud Functions

firestoreExport

cloud scheduler + Pub/Subにより毎日実行される。 Firestoreのデータをエクスポートする。

環境変数:なし

Youtubeモニター

  • ローカルでNext.jsのサーバーを立てる。
  • public/audio/lofigirl/に音声ファイルを入れておく。 フォルダ構成はyoutube-monitor/lib/bgm.tsの内容と合わせる。
  • youtube-monitor/.envを作成し、環境変数NEXT_PUBLIC_API_KEYを設定しておく。 値はAPI Gatewayで設定したAPIキー。

OBS Studio

設定など

  • OBS内蔵のブラウザを使用する
  • 「OBSを介して音声を制御する」を有効にする(じゃないとBGMが配信に流れない)
  • リンクに、ローカルで起動しているyoutube-monitorのサーバーのアドレスを入力する
  • マイクは必ずOFFにする
  • カメラをソースとして登録したシーンは絶対に登録しない。 OBSは配信専用として使う。 当たり前だけど、本番配信中にシーンいじるとそれが映像に反映される(一回やらかした)
  • 詳細設定 > 自動接続の遅延を1sに設定(デフォルトは10s)

Youtube Live配信

すぐに配信を始めると、少し映像ストリームが途切れただけで勝手にライブ配信が終了してしまい無限に配信できないので、「SCHEDULE STREAM」から配信予定を立てて、配信を開始する。 こうすることで途中何かのトラブルである程度の時間OBSからの映像送信が途切れてもライブ配信が勝手に終了することはない。