OPENRECのチャット取得

コメントビューア用。
OAuthが要るようなAPIは使わず、未登録で取得できるコメントを取得。
あくまで執筆時点の情報です。仕様が変わる可能性もあるのであしからず。

## ユーザのチャンネルURL
  - `https://www.openrec.tv/live/{ユーザID}`
    - 例: `https://www.openrec.tv/live/pasta04`

## 手順

1. ユーザIDを元に、動画IDを取得
  - GET `https://public.openrec.tv/external/api/v5/movies?channel_ids={ユーザID}&sort=onair_status&is_upload=false`
  - レスポンス 

      ```
      {
        /** 動画ID(文字列) */
        "id": string,
        /** 動画ID(数値) */        
        "movie_id": number,
        /** 配信タイトル */
        "title": string,
        /** 配信詳細 */
        "introduction": string,
        /** 配信中ならtrue */
        "is_live": boolean,
        // 残りは省略
      }[]
      ```

    新しいものが配列の先頭に来るので、先頭の要素をチェックし、is_liveをチェック。

2. 動画IDを元に、コメント受信

  - 以下で受信
    `wss://chat.openrec.tv/socket.io/?movieId={動画ID(数値)}&EIO=3&transport=websocket`
    EIOの意味は不明。
    メッセージは、以下の形式で送られてくる。

    ```
    [数値][JSON]
    ```

    - 例

      ```
      0{"sid":"hogehogehoge","upgrades":[],"pingInterval":25000,"pingTimeout":60000}
      ```



    数値の正確な意味は不明だが、以下のように思われる。

    | 数値  |   意味  |
    |----- | -----|
    | 0     | サーバから送られてくる初期データ。|
    | 2    | クライアントからのping |
    | 3    | サーバからのpong |
    | 40   | 0の直後に送られてくる。<br>この時はJSON部分が無いので切れ目の意図だろうか。
    | 42  | コメント
    
  - 0
    
    ```
      {
        "sid": string,
        "upgrades": [],
        /** クライアントから投げるpingの間隔のミリ秒表記。25秒とか。 */
        "pingInterval": number,
        /** タイムアウト判定される時間のミリ秒表記。60秒とか。 */
        "pingTimeout": number
      }
      ```
  - 42

    ```
    ["message", 以下のJSONを文字列化したもの]
    ```

    ```
    {
        /** 
          * メッセージタイプ
          * - 0: コメント
          * - 1: 現在の視聴者数
          * - 10: refreshが必要かとか
          */
        "type": 0 | 1 | 10,
        /** 動画ID(数値)と同じ */
        "room": string,
        /** 以下はtype0の時のもの */
        "data": {
            /** 動画ID(数値)と同じ */
            "movie_id": number,
            "live_type": number,
            "onair_status": number,
            "user_id": number,
            "openrec_user_id": number,
            /** ユーザ表示名 */
            "user_name": string,
            /** コメント */
            "message": string,
            /** アイコン画像のURL */
            "user_icon": string,
           // 省略
        }
    }
    ```

    コメント受信をざっくり書くと以下になる。
    - WebSocketで受信
    - メッセージの数値部分が42なら処理続行
    - JSON部分をパースして、typeを確認し、0なら処理続行
    - dataから、コメントメッセージ、ユーザ名、アイコンURLを抽出  


また、定期的にpingメッセージを送信する必要がある。


### 初期コメント

- GET `https://public.openrec.tv/external/api/v5/movies/{動画ID(文字列)}/chats?to_created_at={時刻 ISO 8601}&is_including_system_message=false
`
- レスポンス

    ```
    {
        "id": number,
        "chat_type": number,
        /** コメント */
        "message": string,
        /** 配信者は2。一般ユーザが0？ */
        "quality_type": 0 | 2,
        /** 投稿時刻。ISO 8601 */
        "posted_at": string,
        /** 表示時刻？ISO 8601 */
        "messaged_at": string,
        /** ユーザ情報 */
        "user": {
            /** ユーザID */
            "id": string,
            /** OpenREC内部でのユーザID */
            "openrec_user_id": number,
            /** 表示名 */
            "nickname": string,
            /** アイコン画像のURL  */
            "icon_image_url": string,
            /** アイコン画像のURL。Lサイズ  */
            "l_icon_image_url": string,
            // 省略
        },
        // 省略
    }[]
    ```