ついに登場!新・動画プレイヤー‐ニコニコニュース4/27から導入されたニコニコ動画の新プレイヤーですが、
flvplayerに対して GetVariable (SetVariableも?)が出来なくなりました。
var player = document.getElementById("flvplayer");
player.GetVariable("o");
>> null
このblogで公開しているスクリプトで影響を受けるのは以下の3つです。
・
Nico Filter・
Prevent Spoiler・
High Comment Nicouser3つとも GetVariable("o") で動画の情報を取得していたので、
それが出来なくなった新プレイヤーではまったく動作しません。
(一応、以下に書く応急処置で動作させてはいますが・・。)
GetVariable("o") で取得していた情報は、以下のAPIを叩くことでも取得できます。
http://www.nicovideo.jp/api/getflv?v=sm****
しかし、このAPIは無制限にアクセスできるものではないので、
複数のスクリプトがAPIを叩いてしまうと、短時間での連続アクセスとして、
数分間アクセス制限されてしまうという問題があります。
しかし、現状で新プレイヤーに対応するには、
このAPIを叩くしかありません。
そこで、この問題を解決する1つの方法として、
「全スクリプトでAPIの結果を共有する」方法はどうかと思い、
ライブラリみたいなものを作ってみました。
APIを叩く必要のあるスクリプトの場合は、
以下のJSをrequireあるいは、同様のスクリプトを記述します。
http://favril.myspace.googlepages.com/nicoapiresult.jsたとえば、
// ==UserScript==
// @name Nico Filter
// @namespace http://script41self.seesaa.net/
// @description 設定されているフィルタを表示するスクリプト
// @include http://www.nicovideo.jp/watch/*
// @require http://favril.myspace.googlepages.com/nicoapiresult.js
// ==/UserScript==
で、このJSでは、NicoApiResultというオブジェクトを定義しています。
使用方法は以下のようになります。
var result = new NicoApiResult();
result.ready(function () {
alert(window.GM_NicoApiResult.ng_up);
});
あるいは、
var result = new NicoApiResult();
result.ready(myFunc);
function myFunc() {
alert(window.GM_NicoApiResult.ms);
alert(window.GM_NicoApiResult.thread_id);
alert(window.GM_NicoApiResult.l);
}
readyメソッドは、APIの結果が無ければ(他のスクリプトがAPIを叩いていなければ)、
APIを叩いて、結果を「window.GM_NicoApiResult」に格納してから引数の関数を実行し、
結果が既に存在していれば、すぐに引数の関数を実行します。
つまり、APIの結果を利用するスクリプトが複数あっても、
APIは1回しか叩かれませんので、アクセス制限されることはありません。
readyの引数の関数内では確実にAPIの結果である「window.GM_NicoApiResult」が存在しています。
これは、スクリプト間でもwindowオブジェクトが共有されていることを利用しています。
(名前は、公式のものとかぶったりするといけないので、GMとか付けちゃってます。)
これで一応、問題は解決しますが、
こんなブログを見てる人は少ないでしょうから、
全スクリプトにこのJSを利用させるのは無理です。
なので、どうがんばってもアクセス制限のリスクがあります。
結局、一番よいのは公式頼みになってしまうけど、以下のどれかを公式がやってくれることですね。
・APIのアクセス制限を無くす
・videoオブジェクトのように、html内にAPIの結果の情報を記述する
・新プレイヤーを、旧プレイヤーのようにGetVariableできるようにする
追記メモ.
記事を書いてる最中に、新プレイヤーのページでも、
旧プレイヤーをappendさせて、旧プレイヤーから情報を取れないかなぁと思った。
けど、旧プレイヤーがそのうちなくなるかもしれないことを考えると、
これも良い方法ではないかぁ。
一応メモ程度に書いておく。