NicoNicoDownloader

先週は休みなかったので、久々の週末でしたが、一昨日と昨日でちょっとしたアプリケーションを作りました。

コメントダウンローダ

この前試作した、ニコニコ動画のコメントをダウンロードし、保存するアプリケーションをちゃんと作ってみました。この前試作したものは、自分でコード中にリクエストを埋め込まなくてはいけなかったので、本当にダウンロードできるかどうか、を試すようなものでした。そんなわけで、今回は動画のURLを指定して、その動画のコメントをダウンロードし、デスクトップ上に保存するものを作りました。

ざっとプログラムの流れを説明すると…

1. URLの中のsm以下の番号の部分、動画のIDを抽出

2. “http://www.nicovideo.jp/getflv?v=sm%d”(%dは動画のID)のURLから、動画情報を取得

3. 取得した動画情報から、”thread_id=”以下の、メッセージのスレッドIDと、”msg”以下の、メッセージサーバーのIDを取得

4. “http://msg%d.nicovideo.jp/api/”(%dはメッセージサーバーのID)に、HTTPでPOSTリクエストをする。HTTP Message bodyには、以下のXMLを付加します。
<thread thread=”%d” version=”20061206″ res_from=”-1000″ /> (%dはメッセージのスレッドID)

5. ダウンロードされたデータをデスクトップに保存

ちなみに、今のところコメントは最大最新の1000件までしかダウンロードできないようになっているみたいです。明日でニコニコ動画(RC)になり、コメントの状態を保存するような機能もあるようです。これでおそらく、1000件より前のコメントにアクセスできるようになるのではないかと思っています。


ところで、目的はコメントをダウンロードすることではなく、コメントを分析することです。というわけで、このまま単にコメントのXMLを分析し、グラフィカルに表示するアプリケーションを作ってもいいのですが、やはり、実際に動画とコメントが再生されている様子も見ながら、そういう分析結果を表示したいところです。

というわけで、どうやって動画とコメントを再生すればいいかを調べていると、動画の再生はQuickTimeのフレームワークを使えば簡単にできることがわかりました(FLVプラグインが必要)。実際、動画の再生するアプリケーションは数分足らずで作成できたのですが、問題は動画上でのコメント表示です。

QTMovieViewは、NSViewを継承しているので、NSViewで描画させるときのように、QTMovieViewを継承したカスタムクラスを作り、そこでdrawRectメソッドをオーバーライドして、描画してみました。結果は予想通りというか、さすがに動画上でdrawRectメソッドのオーバーライドで描画というのは無理だったようです。

というわけで、他に何かないかといろいろ見ていると、QTMovieにちょっと面白いメソッドを見つけました。(QTMovie class Reference)

- (NSImage *)frameImageAtTime:(QTTime)time
- (void)addImage:(NSImage *)image forDuration:(QTTime)duration withAttributes:(NSDictionary *)attributes

あまりヘルプが読めなかったのですが、おそらくこの二つのメソッドは、動画中から画像をキャプチャ、また、画像データを動画に追加するというものです。つまり、まず、動画からNSImageで画像を取得し、そこでNSImageに対してコメントを描画、そして、そのNSImageからまた動画に戻せば、コメント付き動画に変換できることになります。

動画にコメントを付加して変換するソフトは、これはこれで欲しいですが、これは変換してからでないと結果が見えないのが問題です。そんなわけで、やはり動画上に文字を描画できるようなものを引き続き探してみました。すると、今度はようやく目的のものにたどり着けたようです。

何を使えばいいのかというと、どうやらCore Videoを使うと、動画に処理を施しながら再生できるようです。この辺はOpenGLと絡んできたり、いろいろ複雑になっていて、動画を再生することすらちょっと難しそうなので、簡単には手を出せなそうです。

ということで、次はいつプログラミングができるかわかりませんが、近いうちに作りたいとは思っています。ちなみに、Cocoa Break!の翻訳文書はいつもありがたく活用させてもらっています。Core Videoとか英文だとよくわからない方は、こちらの日本語訳を使うのも手です。他にも翻訳の量が凄いので、ドキュメントが読めなかったら、こちらで探してみると見つかるかもしれません。

コメント

  1. イグトランス より:

    単純に動画を再生するウィンドウの上に、コメントを表示するための背景透明のウィンドウを置くというのはどうでしょう?

  2. OverTaker より:

    そうですね、一度私も考えたのですが、何となくそれは切り捨てていましたね。よく考えれば、それでも十分かもしれませんね。参考にしてみます。

コメント投稿