実験放送の構成 - コメント編

本ページの内容

本ページでは、実験放送のコメント周りの構成について解説します。

主に、以下のような方を対象としています。

  • ニコニコ生放送で利用されるコメビュ等のツール制作者の方々
  • 実験放送で立ち見が無くなっているという噂を確かめたい技術者の方々

立ち見のない構成

これまでのニコニコ生放送では、生放送には500人ごとのスペースが存在し、アリーナと呼ばれるスペースや、立ち見と呼ばれるスペースに分かれる構成をとっていました。

ニコニコ大百科等にも色々と記述があります。

大ざっぱに図説すると、以下のようにスペース分けをされる事になります。

部屋割り

生放送上のコメントには、大きく二つの問題があります。

  1. 多くの視聴者が同じコメントを参照するとサーバ負荷が高くなりすぎる
  2. コメント流量が多すぎると、通信並びに画面上のコメントが多くなりすぎる

スペースを分ける事でコメント流量を保ち、サーバ負荷を抑え、かつそれぞれのスペースのコメントを共有する機構を入れることで放送の一体感も保ち続ける、ニコニコ生放送を長く支えた構成でした。

一方で、アリーナ以外のユーザは放送者にコメントを届ける事ができない(放送者がコメビュ等を使えば回避可能)等の問題もありました。

実験放送では、試験的に本構成の変更に取り組んでいます。

コメントを管理する主体としてスレッドというものを利用しているのですが、ニコニコ生放送ではスペースを分けた場合はこのスレッドが分かれるのに対して、実験放送では放送者も視聴者もスペースを分けず、参照するスレッドを単一にしています。

部屋割り無し

しかしこの変更をそのまま適用してしまうと、これまでユーザの皆さんが培ってきた文化であるコメビュ等との互換性が崩れてしまいます。

そこで、アリーナ(より正確にはアリーナ最前列のスレッド)を生かしつつ、アリーナのコメントを新しいコメントサーバのスレッドにimportする形で運用しています。

部屋割りが無くimportがある

これにより、放送を見ている全てのユーザに同じコメントが届けられ、また、どの視聴者からのコメントも放送者に届くようになっています。

問題の一つ目、サーバ負荷の問題については、コメントサーバを新しいものにすることで問題を解決しています。このコメントサーバについての詳しい情報は本記事では割愛します。

問題の二つ目、コメント流量の問題の解決については次項で書いていきます。

API経由でのコメント投稿

既存のニコニコ生放送では、コメント投稿はスペースを管理するコメントサーバに対して直接行われていました。

ニコ生のコメント投稿

実験放送では、一層APIを挟む構成にしています。

実験放送のコメント投稿

少し登場人物が増えて遅そうに見えますが、これらが比較的高速に実行されるように実装されています(図面上は簡略化していますが、実際にはアリーナから新しいスレッドへのimport処理がもう一つ入っています)。

全てのユーザはAPI経由でコメント投稿のリクエストを行い、APIはQueueに積み込んで処理を終えます。

Queueに積み込まれたコメントを高速に処理するバッチが番組ごとに動作しており、それがスレッドへの反映処理を担っています。

この構成によって、直接投稿されては難しい前項で触れたコメント流量問題の解決を実現しています。

しかし流量を制御してしまうだけだと、後で全コメントのダウンロードなどが難しくなるため、実験放送ではもう一工夫を加えています。

流量制御されるコメント

Queueを管理するミドルウェアが、Queueに積み込まれたコメントの内、閾値以上のコメントを別のQueueに移動させる処理を担っています。

別のQueueに移されたコメントは別のバッチによってゆっくりと別のスレッドへ流し込まれます。この別のスレッドを、実験放送ではstoreスレッドと呼称しています。

コメント以外のメッセージ

コメントとは直接関係がないのですが、実験放送のスレッドは通常のスレッド、storeスレッド以外にもう一つ、xというサフィックスを持つスレッドがあります。

xというサフィックスを持つスレッドにはコメントとは異なる書式で、以下のような特殊なメッセージが流れます。

  • テロップ
  • 運営コメント
  • 番組情報変更通知

これらのメッセージについての詳しい情報は、また別の機会に解説させていただきます。

開発者向けの情報

ニコニコは、いわゆるコメビュをはじめとした、数多くの周辺ツールに支えられてきました。

周辺ツールはニコニコ生放送の仕組みに影響を受けるため、実験放送ではなるべく影響が出ないようアリーナスレッドを維持する等の注意を払っていますが、それでも完全な対応のためには新しい構成の情報が必要です。

特に、以下の3つが必要になります。

  • スレッド情報を取得するAPIの情報
  • コメントを投稿するAPIの情報
  • 実験放送であることを識別するための方法

スレッド情報を取得するAPI

実験放送のコメントはアリーナに流れるため、特に対応をしなくても実験放送のコメントをツールで取得することはできます。

これに加えて、storeスレッドにアクセスすることができれば、全コメントを取得することもできるようになります。

本項では、storeスレッドを含む実験放送のスレッド情報を取得するAPIの情報を記します。

項目 内容 備考
URL https://api.cas.nicovideo.jp/v1/services/live/programs/{programId}/threads
メソッド GET
Cookie user_session ニコニコのログイン情報を指定。コミュニティ限定番組のコメントを見る場合に必須

programId の部分に lvXXXXX の情報を入れれば、スレッド情報を取得することが出来ます。

以下が本APIで得られる値のサンプルです。

{
  "meta": {
    "status": 200
  },
  "data": {
    "messageServer": {
      "wss": "wss://example.nmsg.jp:1234/websocket",
      "ws": "ws://example.nmsg.jp:5678/websocket",
      "https": "https://example.nmsg.jp:2345/api",
      "http": "http://example.nmsg.jp:6789/api",
      "version": 20061206,
      "service": "LIVE",
      "url": "xmlsocket://example.nmsg.jp:2525",
      "protocolVersion": 20061206
    },
    "threads": {
      "chat": "NXlv12345",
      "control": "NXlv12345x",
      "store": "NXlv12345store",
      "keys": {
        "chatThreadKey": "1584332150.~1~h7Gc1VE1uNEP5bc_Btk_019Y-ABCDEFG123456",
        "controlThreadKey": "1584332150.~1~h7Gc1VE1uNEP5bc_Btk_019Y-ABCDEFG123456",
        "storeThreadKey": "1584332150.~1~h7Gc1VE1uNEP5bc_Btk_019Y-ABCDEFG123456"
      }
    }
  }
}

messageServer には、接続のための基本情報が格納されています。

threads 以下に、そのスレッドの名称と、そのスレッドに接続するための threadKey という情報が格納されています。コメントを取る場合には chat スレッドに、一定流量以上のコメントを取る場合には store スレッドに接続する必要があります。

control というスレッドにはコメント以外のメッセージが格納されています。

コメントサーバは、ニコニコ生放送で現在利用されているアプリケーションと互換性のある内容になっているので、従来同様にXMLSocketで接続することで、実際のコメントデータ等を取得することができます。

XMLSocketはFlashで広く採用されたプロトコルですが、2018年08月現在ではWebSocketの方を推奨していますので、WebSocketに接続するとより安定した動作が期待できます。接続のための技術文書公開については検討中で、進展があればこちらの文書も更新してリンクを記載する予定です。

コメントを投稿するAPI

コメント投稿の機能を持っているツールもあります。

アリーナに投稿すれば問題なく実験放送上に反映されますが、正しい経路でのコメント投稿処理を実装するためにはAPIの情報が必要です。

本項では、実験放送のコメント投稿APIについて記します。

項目 内容 備考
URL https://api.cas.nicovideo.jp/v1/services/live/programs/{programId}/comments
メソッド POST
Cookie user_session ニコニコのログイン情報を指定。コミュニティ限定番組にコメント投稿する場合に必須
Content-Type application/json

リクエストBODYには、JSONで以下のような内容を入力する必要があります。

{
  "message": "あいうえお",
  "command": "184 ue red",
  "vpos": "0"
}

message にはコメント本文を格納し、 command には各種コマンドを格納してください。

vpos はそのコメントの位置です。これも従来のものと同様の仕様になっています。

なお、本APIを利用して投稿する場合には、アプリやWebで実際に映像を見ている必要がある点にご注意ください。ツールのみを起動してコメント投稿をする場合には、投稿に失敗する可能性があります。

実験放送であることの識別

実験放送であるかどうかは、タグに実験放送が含まれているかどうかで識別できますが、以下のAPIを利用することもできます。

項目 内容 備考
URL https://api.cas.nicovideo.jp/v1/services/live/programs/{programId}
メソッド GET

こちらのAPIから取得できる programType という情報が cas であれば、実験放送の番組という形になります。

基本的にはタグのままで問題ないのですが、実験放送というタグが将来に渡ってつく保証はないため、正式なAPIから判別できるようにする場合にはこちらをご利用ください。