Web Player Controller
Web Player Controller(旧 VGコントローラー)は、お客様のウェブサイトに iframe で埋め込まれた Kollus プレイヤーと通信して、
再生状態を制御したりリアルタイムイベントを受信したりすることができる JavaScript ライブラリです。
主な特徴
- 統合制御: プレイヤーの種類に関わらず、単一の仕様で制御可能です。
- 独立動作: 外部ライブラリへの依存なしに独立して動作します。
- イベント駆動アーキテクチャ: メソッド呼び出しおよびリアルタイムイベントリスナー構造をサポートします。
用語定義
このドキュメントで使用する主要な技術用語とプレイヤー表記についての定義です。(詳細情報: Kollus プレイヤーの種類)
| 用語 | 説明 |
|---|---|
| VideoGateway | ユーザーのリクエストに応じて再生データおよび認証情報を提供するサーバー |
| プレイヤー ID | Kollus プレイヤーの固有 ID |
| ハードウェア ID | Windows 環境など識別可能な値が存在する場合に提供されるハードウェア固有 ID |
| HLS Fragment | HLS(HTTP Live Streaming)プロトコルベースの再生時に、映像全体を分割した最小単位のメディアセグメントファイル |
| v3 | HTML5 Player for PC (Hybrid): Microsoft Edge または Chrome 45 以上で暗号化コンテンツを再生する際に適用されるハイブリッド HTML5 プレイヤー |
| v4 | HTML5 Player for All: 非暗号化コンテンツ専用のプラグインレス HTML5 プレイヤー |
| v5 | Web Player: インストール型とプラグインレス型の利点を組み合わせた次世代統合 Web プレイヤー |
ライブラリのインストールと初期化
クライアントスクリプトを読み込んだ後、制御対象(iframe)を指定してインスタンスを生成します。
基本実装例
<script src="https://file.kollus.com/wpcontroller/web-player-controller-client.latest.min.js"></script>
<script>
window.onload = function () {
try {
var controller = new WebPlayerControllerClient({
target_window: document.getElementById('child').contentWindow,
});
// Register event listeners and call methods
} catch (e) {
console.error(e);
}
};
</script>
<body>
<iframe id="child" src="https://v.jp.kollus.com/{MEDIA_CONTENT_KEY}..."></iframe>
</body>
注意事項
- 対象の指定:
target_windowプロパティには、必ずiframe要素のcontentWindowオブジェクトを渡してください。 - ブラウザ互換性: このライブラリは
window.postMessageAPI を使用して通信します。この API をサポートしていないブラウザでは動作が制限されます。 - 複数プレイヤーの制御: ページ内に複数のプレイヤー(
iframe)が存在する場合、各iframeID ごとに個別のインスタンスを生成する必要があります。
例外コード
初期化および通信中に発生する可能性があるエラーコードです。
| コード | メッセージ | 説明 |
|---|---|---|
-99 | This browser does not support postMessage API | postMessage APIをサポートしていないブラウザ |
-98 | Player type must be one of v2, v3, v4 and v5 | 無効なプレイヤータイプ(v2, v3, v4, v5のみサポート) |
-97 | Event listener is not callable | 呼び出し不可能なイベントリスナー(有効な関数ではない) |
-96 | Target window is not found | 対象の Window オブジェクトが見つかりません |
-95 | Custom skin is not supported | カスタムスキン非対応 |
-1 | * | その他の postMessage API 例外 |
CDN パス
Web Player Controller は CDN を通じて提供されます。
従来の「VG Controller」の名称が「Web Player Controller」に変更されました。既存のパスも引き続きご利用いただけますが、新規機能のアップデートが制限される ため、継続的な最新機能サポートを受けるには新しいパスのご利用を推奨いたします。
- 既存パス:
https://file.kollus.com/vgcontroller/vg-controller-client.{version}.min.js - 新規パス:
https://file.kollus.com/wpcontroller/web-player-controller-client.{version}.min.js
最新バージョンの自動適用
<script src="https://file.kollus.com/wpcontroller/web-player-controller-client.latest.min.js"></script>
特定バージョンの固定
<script src="https://file.kollus.com/wpcontroller/web-player-controller-client.{version}.min.js"></script>
セキュリティ強化(SRI 適用)
ライブラリの改ざん防止のため、SRI(Subresource Integrity)属性の使用を推奨します。
<script src="https://file.kollus.com/wpcontroller/web-player-controller-client.{version}.min.js"
integrity="sha256-esUCCL4RPYMS8AR+Sl3lNrFa5M+zgpt4Gb77qtz66OY="
crossorigin="anonymous">
</script>
バージョン別 Integrity Code
| バージョン | Integrity Code |
|---|---|
| 3.0.7 | sha384-s4QrCGcyFWEQmJsr0iK1A3HSjah8VE8Zq48k0jxHHUFOCsshRFRT1kNgj/xY/QPO |
| 3.0.6 | sha384-GdgPx9dCVTR5LL/T/CRoUPK1Af8Ss0uuHrG9m8A9ZjfwvgOBP2Hn0FpJOpbKxc2y |
| 3.0.5 | sha384-r4w31weNrojq8zcLil+4GUls/WL09DTxjgrTyBNz1D8lctVLId2QGiTrh1jq3AuK |
| 3.0.4 | sha384-XReEw9S0i2G9sfZyY3GOzLxC4XVfupJ3coBxfyT6rW7uowVbox9jddVW3e4HPdfI |
| 3.0.3 | sha384-vmOxuvAuxL9FhXfuWUtWy8+Bza8yMfKzM2YZd9nl+IBfO402BQqv7r9L7rzyCg3J |
| 3.0.2 | sha384-JSsUl7m8gxMpuk9IhIoILT6hHINhUzOK1/fKQmMLczpK8ad0iAlz53sTVJxG4ZEQ |
| 3.0.1 | sha384-TfZVDcnfT4uqCCeXU1MAM3L+8QhlduK94+2ukm5/TU8SmFfJusmzSFr+eW1nNzx5 |
| 3.0.0 | sha384-Zu3WwunWVyaqnMrkKBjhgXL5dYyHK4U6XrtUvRVkLdXBSBOJrOw6/EGrsB9Yaw57 |
| 2.0.2 | sha384-rD/iy3kIQHyXISy6nUBDw+m9ITNCXEiCNVO+6xGTuAKhSBRaCloGhKRJU9F14PhW |
| 2.0.1 | sha384-90u5dxpIgg4TvsndT8r1j54hjn302/IRkwzAeEQDq3zeWezi1VVjHGXyS4MBLbuC |
| 2.0.0 | sha384-aifzvq3KnpoCh/8DaG5t/PreNEXgAUUOsSuOsL0MHO6ZYvKSPkWpfRXbM3mB62Qx |
| 1.6.2 | sha256-0PBHq7Y0DcK/F1PGmAybxZh1NLL5AP89//qiSsTaR84= |
| 1.6.1 | sha256-CyKubDJ/UhR0QZbNpapLJ+eb3cxgS1Q9xUe0YUu3Yzs= |
| 1.6.0 | sha256-D+uxBOAbz5FeHAlzHxIb6pZm0OH2POTSJM8q7lVIAvw= |
| 1.5.1 | sha256-8X2N8jt72DqHSjlXad5eiArLfGXP8Br6W2CukrzzT/o= |
| 1.5.0 | sha256-bP2RqUMWigIFnYO5jpgwS9i+yrXRqsyMKOT34TEQSgc= |
| 1.4.2 | sha256-0jaAeov9h/kDevNySYTfIs3gd3uwqdR5KGF05kEtN30= |
| 1.4.1 | sha256-VVBBfWTrTqxPWkhAdCqrfkmawZyX0pmVEN5Ao1fK6yI= |
| 1.4.0 | sha256-aVGw8cCTLjL4ommgpWzXY/ZdNoxnIVkQOpyFkBF9hvg= |
| 1.3.0 | sha256-KEzr9IDpxMYIPheF9clyiVrwfXCOrahMu9ZRAS1nyTc= |
| 1.2.8 | sha256-QsoI2nF9ArX728ZciKU5W58AAqm3tTJs2qPVVq1rw2k= |
| 1.2.7 | sha256-GrSA/4PPdqMAlJ1+yU6kNyLUKSkI/yao8qB/CdpgHLg= |
| 1.2.6 | sha256-p7sZuwAm+snPLJcKXhM19bcJAFblc/N7FIr+KbLOyiM= |
| 1.2.5 | sha256-8H84AFVTk2ecP6BvSwDZwKdb+wax7eCODMabRjtYFG4= |
| 1.2.4 | sha256-byGt/vmYwvCJ5JSUTUKYSM3NJvTCAkwAcQjRPYA7OfU= |
| 1.2.3 | sha256-gELbkblxei35tOlrZxsBGTxjErybUM8dd7ToRpw9AH4= |
| 1.2.2 | sha256-ZqrlMRldpWxcvsbTmjJ0EbUnpvRPBOY2Y26lGrF8p5g= |
| 1.2.1 | sha256-QDMKykvp9W0VqeIcE8Z66aDga51Bil4dbKyu+xhVYU8= |
| 1.1.19 | sha256-a0JNjidB76X3hqapRctQlBEYT7UplG6rSTYdeORsoo4= |
| 1.1.18 | sha256-dQ+ubgLE/ZCuAF3gsq4aiEuXwIPtmMgFKho0VfMg618= |
| 1.1.17 | sha256-7BYchZl3hCp8pAmQWyvtrddOiSq6jiEV/3rigiHh2Hc= |
| 1.1.16 | sha256-sSwregT7/iEaiS3SWkUw2n+ifhAJaC9z1SUhxM4iA6A= |
| 1.1.15 | sha256-rXuiAt3HjeCdCoTPCdNnud6tXyM0QnFoG4wVohJX/vo= |
| 1.1.14 | sha256-gWFSHnUUnRrD9uI+jupozk4UaYI+rTNrutx2DoICd9Q= |
| 1.1.13 | sha256-5O+p4Fj23xbBoe1uiVqYWaLo7m423e8E3eJPLs7ZXac= |
| 1.1.12 | sha256-xeXyA4xBrv11fpQ4OooLjlh/wA+lMW7fv8LQ3InbZt0= |
| 1.1.11 | sha256-cqT+zCkG9IrFD5YBYgW/2uryxmX9xfjBArGvE7XxEGU= |
| 1.1.10 | sha256-ArDmq7qhhyH1jPcmp9AceymlnmdzL/fcLuj+7Cd9qGA= |
| 1.1.9 | sha256-gWFSHnUUnRrD9uI+jupozk4UaYI+rTNrutx2DoICd9Q= |
| 1.1.8 | sha256-1qLSiIaxaFInegLeM4YYFvNjkfS1ljnTkeLIVB4N9yA= |
| 1.1.7 | sha256-h3FJeZn9qzc36yGdCexZWCR00PYain1kA8YxOo1RYdE= |
| 1.1.6 | sha256-V6e7g4znlH2R6mS4iZG+ICEEqUuzT2I0WQebNKZapIs= |
| 1.1.5 | sha256-ylu1Lig3obBjhaxhPGokQ218NYrOMtGTSF98cC3wuJM= |
| 1.1.4 | sha256-YjHHosJQBjbhyZR0+3fDAc5YAU0f6fOcOzK5fWuh/vM= |
| 1.1.3 | sha256-imuCUkIbY1leNcPL4k9Jj06Nsl5zeG7qG7A2qsxNzY8= |
| 1.1.2 | sha256-OyniGO0Qw8YtUR1Lc1jquxyzd2E2W8XlhwWV2lSkD9w= |
| 1.1.1 | sha256-KYhE+CIgE9hl1e+AO7wVv25P3ZHjkhfw1u+UxOmcu8w= |
| 1.1.0 | sha256-U9z4sQc8f3gU3EU8z17mib/XsZNAQTPJfNiv1ZSy708= |
| 1.0.6 | sha256-Lraa1NkO1eo0APSSCyEkHtfhK7PP8U4mG8JTgcOpdkg= |
| 1.0.5 | sha256-8pO9uPazQtQ5RmZuzI053S3siu1Zi73nLPHbN0yCUso= |
| 1.0.4 | sha256-ki4kmvmPXsvtI8VKngskOtm9rxOlTKHxD8NJQjnYJzI= |
| 1.0.3 | sha256-M27rCu4/1FrzE9IabhMXQB3+bL5lzgBDg7gt6SZo1OI= |
| 1.0.2 | sha256-AAMmt+wOnoGhdBmrvEQP/TRRv40zYfxtvx9M3BrATZA= |
イベントリスニング
controller.on() メソッドを活用して、プレイヤーの状態変化および再生イベントをリアルタイムで受信します。
リスナー登録方法
単一リスナー
controller.on('event_name', function(param) {
// Register event listener
});
複数リスナー
controller.on('event_name', function(param) {
// First listener
});
controller.on('event_name', function(param) {
// Second listener
});
// Execute all listeners when the event is fired
メソッドチェーン(Method Chaining)
連続したイベント登録を簡潔なコードで実装できます。
controller.on('event_name_1', function(param) {
// First listener
}).on('event_name_2', function(param) {
// Second listener
});
JavaScript の非同期環境の特性上、同一イベントに登録された複数のリスナー間の実行順序は保証されません。
- 推奨事項: 厳密な実行順序が必要なロジックは、1 つのリスナー内部で順番に記述してください。
イベント一覧
再生状態イベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
loaded | プレイヤーコンポーネントの読み込みが完了した時点で発生 | v3, v4, v5 |
ready | サーバーから再生データを受信し、再生準備が完了した時点で発生 | v3, v4, v5 |
play | 初回再生開始または一時停止後の再生再開時に発生 | v3, v4, v5 |
pause | 一時停止時に発生 | v3, v4, v5 |
done | 再生位置が全体の長さ(duration)の末尾に達したときに発生 | v3, v4, v5 |
waiting | ネットワーク環境の影響で追加バッファリングが必要な場合、正常化するまで 1 秒周期で発生 | v4, v5 |
進行率(Progress)イベント
HTML5 ブラウザのパフォーマンスおよびネットワーク環境によって、progress イベントは正確に 1 秒間隔ではなく、約 0.1〜0.5 秒の誤差が生じる場合があります。
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
progress | 再生中に約 1 秒間隔で発生し、現在の再生位置情報を提供 | v3, v4, v5 |
progress パラメーター詳細
| パラメーター | タイプ | 説明 |
|---|---|---|
percent | integer | 現在の再生進行率(0〜100) |
position | number | 現在の再生位置(sec) |
duration | number | コンテンツの全体の長さ(sec) |
controller.on('progress', function(percent, position, duration) {
console.log(percent + '%', position + 'sec');
});
シーク(Seek)イベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
seeking | ユーザーが再生位置の移動を開始した時点で発生 | v4, v5 |
seeked | 再生位置の移動操作が完了した時点で発生 | v4, v5 |
seek_start | 再生位置の移動が検出された最初の時点で発生 | v4, v5 |
jumpstepchange | スキップ間隔設定(早送り/巻き戻し)の時間単位変更時に発生 | v3, v4, v5 |
音響イベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
muted | ミュート状態(On/Off)の変更時に発生 | v3, v4, v5 |
volumechange | 音量の変更時に発生 | v3, v4, v5 |
muted パラメーター詳細
| パラメーター | タイプ | 説明 |
|---|---|---|
is_muted | boolean |
|
volumechange パラメーター詳細
| パラメーター | タイプ | 説明 |
|---|---|---|
volume | integer | 変更後の音量(0〜100) |
再生速度イベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
speedchange | 再生速度の変更時に発生 | v3, v4, v5 |
playbackrateschange | 利用可能な再生速度グループの変更時に発生 | v3, v4, v5 |
speedchange パラメーター詳細
| パラメーター | タイプ | 説明 |
|---|---|---|
speed | string | 変更後の再生速度(0.5〜4) |
画面・UIイベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
screenchange | フルスクリーンモードと通常モード間の切り替え時に発生 | v3, v4, v5 |
picture_in_picture_entered | PIP(Picture-in-Picture)モードへの移行時に発生 | v3, v4, v5 |
picture_in_picture_leaved | PIP モードの終了時に発生 | v3, v4, v5 |
device_orientation_changed | モバイル画面の向き(横/縦)の変更時に発生 | v4, v5 |
user_active_changed | ユーザーのインタラクションによるコントロールバーの有効化/無効化状態の変更時に発生 | v4, v5 |
custom_skin_changed | コンストラクタースキンの変更時に発生 | v4, v5 |
screenchange パラメーター詳細
| パラメーター | タイプ | 説明 |
|---|---|---|
screen | string |
|
device_orientation_changed パラメーター詳細
| パラメーター | タイプ | 説明 |
|---|---|---|
orientation | string |
|
字幕イベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
subtitle_load_done | 字幕ファイルの読み込み完了時に発生 | v3, v4, v5 |
subtitle_list_change | メイン字幕リスト変更時に発生 | v5 |
subtitle_sub_list_change | サブ字幕リスト変更時に発生 | v5 |
subtitle_cue_data_change | 字幕 Cue データ変更時に発生 | v5 |
subtitlevisibilitychange | メイン字幕の表示状態(On/Off)変更時に発生 | v3, v4, v5 |
subtitle_sub_visibilitychange | サブ字幕の表示状態(On/Off)変更時に発生 | v3, v4, v5 |
subtitle_sizechange | メイン字幕のフォントサイズ変更時に発生 | v3, v4, v5 |
subtitle_sub_sizechange | サブ字幕のフォントサイズ変更時に発生 | v3, v4, v5 |
subtitle_shadow_rect_change | メイン字幕の背景スタイル変更時に発生 | v3, v4, v5 |
subtitle_sub_shadow_rect_change | サブ字幕の背景スタイル変更時に発生 | v3, v4, v5 |
ストリーミングイベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
streaming_manifest_loaded | HLS または DASH Manifest ファイルの読み込み完了時に発生 | v5 |
hls_manifest_loaded | HLS Manifest ファイルの読み込み完了時に発生(streaming_manifest_loadedの使用を推奨) | v4, v5 |
dash_manifest_loaded | DASH Manifest ファイルの読み込み完了時に発生(streaming_manifest_loadedの使用を推奨) | v4, v5 |
streaming_frag_changed | ストリーミング Fragment 変更時に発生 | v5 |
hlsfragchange | HLS Fragment 変更時に発生(streaming_frag_changedの使用を推奨) | v4, v5 |
bitrate_data_loaded | ビットレートデータの読み込み完了時に発生(昇順ソート) | v4, v5 |
bitrate_data 形式の例
controller.on('bitrate_data_loaded', function(bitrate_data) {
// bitrate_data format: [{ width: <int>, height: <int>, bitrate: <int> }]
});
その他のイベント
| イベント | 説明 | 対応プレイヤー |
|---|---|---|
error | 再生中にシステムエラーが発生した際に呼び出し | v3, v4, v5 |
html5_video_supported | ブラウザの HTML5 Video 機能のサポート確認時に呼び出し | v3, v4, v5 |
repeat_stat_change | 区間リピート状態の変更時に発生 | v3, v4, v5 |
bookmark_change | ブックマークの追加および変更時に発生 (v3は削除時にも発生) | v3, v4, v5 |
next_episode_auto_change | 次のエピソードの自動再生設定の変更時に発生 | v3, v4, v5 |
next_episode_requested | 次のエピソードのコールバックがリクエストされた時点で発生 | v3, v4, v5 |
chapter_data_change | チャプターデータの変更時に発生 | v5 |
repeat_stat_change 例
controller.on('repeat_stat_change', function (data) {
// - end: 区間リピート終了時点 (sec)
// - start: 区間リピート開始時点 (sec)
// - status: 区間リピート状態
});
メソッドの使い方
Controller インスタンスを通じて生成されたオブジェクトで、プレイヤーの動作を直接制御できます。
基本的な呼び出し方法
個別の引数が不要な制御コマンドは、メソッドを直接呼び出します。
controller.play();
パラメーター渡し方法
設定値が必要な制御コマンドは、メソッドの引数としてパラメーターを渡します。
controller.set_volume(90);