2009年05月07日

ニコニコ動画の新プレイヤーからGetVariableで値が取れない件についての考察

ついに登場!新・動画プレイヤー‐ニコニコニュース
4/27から導入されたニコニコ動画の新プレイヤーですが、
flvplayerに対して GetVariable (SetVariableも?)が出来なくなりました。
var player = document.getElementById("flvplayer");
player.GetVariable("o");

>> null

このblogで公開しているスクリプトで影響を受けるのは以下の3つです。
Nico Filter
Prevent Spoiler
High Comment Nicouser
3つとも 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させて、旧プレイヤーから情報を取れないかなぁと思った。
けど、旧プレイヤーがそのうちなくなるかもしれないことを考えると、
これも良い方法ではないかぁ。
一応メモ程度に書いておく。
posted by favril at 07:23 | Comment(0) | TrackBack(0) | Greasemonkey
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/118782953

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。