Hatena::ブログ(Diary)

KBDAHOLIC - やぬすさんとこ

2008-07-14(Mon)

ニコニコ動画のプレーヤーをキーボードで操作する vimperator script

NicoNicoPlaylist をキーボードで操作できるようになった ( http://d.hatena.ne.jp/janus_wel/20080711#1216145320 ) ので今度はプレーヤーを操作 ( 一時停止・シーク・コメント etc ) したときにフォーカスを取られてしまうのがもどかしくて何とかならないかと思っていろいろ試してみた結果なんか出来てしまった。

http://www012.upp.so-net.ne.jp/legio/distribute/nicontroller.js

http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/nicontroller.js

使い方

~/vimperator/plugin 以下につっこんで Fx 再起動。以下のコマンドが使えるようになってるはず。

  • :nicoinfo
    • プレーヤーに関しての情報を表示する。今のところバージョンだけ。
  • :nicopause
    • 再生 / 一時停止を切り替える。
  • :nicomute
    • 音声あり / なしを切り替える。
  • :nicommentvisible
    • コメント表示 / 非表示を切り替える。
  • :nicorepeat
    • リピート再生するかどうかを切り替える。
  • :nicosize
    • 最大化 / ノーマルを切り替える。
  • :nicoseek [position]
    • 指定した場所にシークする。秒数で指定が可能。指定なしの場合一番最初にシークする。
  • :nicoseek! delta
    • 現在の位置から delta 秒離れた所にシークする。秒数で指定が可能。マイナスを指定すると戻る。指定なしの場合変化しない。
  • :nicovolume [volume]
    • ボリュームを設定する。 0 〜 100 が指定できる。指定なしの場合 100 にセットする。
  • :nicovolume! delta
    • ボリュームを現在の値から変更する。 -100 〜 +100 を指定可能。指定なしの場合変化しない。
  • :nicomment comment
    • コメント欄を指定した文字列で埋める。
  • :nicommand command
    • コマンド欄を指定した文字列で埋める。使えるコマンドの補完機能つき。

:nicomment と :nicommand はコマンド欄を埋めるだけで投稿しません。注意。そしてこの二つは g:subtech:id:otsune の nicovideo_comment.js ( http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/nicovideo_comment.js ) からのパクリです。まとめちゃった、テヘ。

以下は恒例の map 例。正直 Fx3 の - / + のページ拡縮が bell とともに暴発するのがウザかったのでここに割り当ててしまった。

map ,ni :nicoinfo
map ,np :nicopause
map ,nm :nicomute
map ,nv :nicommentvisible
map ,nz :nicosize
map ,ns :nicoseek
javascript <<EOM
// [N]-
// N 秒前にシークする。
// 指定なしの場合 10 秒前。
liberator.mappings.addUserMap(
    [liberator.modes.NORMAL],
    ['-'],
    'seek by count backward',
    function(count) {
        if(count === -1) count = 10;
        liberator.execute(':nicoseek! ' + '-' + count);
    },
    { flags: liberator.Mappings.flags.COUNT }
);

// [N]+
// N 秒後にシークする。
// 指定なしの場合 10 秒後。
liberator.mappings.addUserMap(
    [liberator.modes.NORMAL],
    ['+'],
    'seek by count forward',
    function(count) {
        if(count === -1) count = 10;
        liberator.execute(':nicoseek! ' + count);
    },
    { flags: liberator.Mappings.flags.COUNT }
);
EOM

上記の設定をしたあと http://www.nicovideo.jp/watch/sm3966413 を見ると我ながら感動した。順位ごとにキーフレームが割ってある親切動画なので + を押すだけで次の順位へいってくれる。あと地味に便利なのが :nicopause, :nicommentvisible, :nicosize の 3 つ。動画内の文字の流れが速いときに :nicopause で止めながら見たりコメントが多すぎて動画が見えないときに :nicommentvisible で隠したりわかむらやの新作を :nicosize で最大化してみたりと使える場所が多い。あと個人的にイヤホン使用時に :nicovolume 50 して音量調節したり途中でおもしろい動画だということに気づいて最初から見直すのに :nicoseek を使ったりしている。


スクリーンショット


技術的なはなし

ソース覗くとわかると思いますが NicoPlayerController クラスがメインです。コマンド定義はこいつ呼び出してるだけです。で、このクラスには vimperator 特有のコードは入ってないので vimperator 入れてない方は自前 Greasemonkey script で window.addEventListener('keydown', function() { /* processing */ } , true); すればたぶん動くと思います ( /* processing */ 部分は自分で考えてね !! ) 。

で、どうやってこれ書いたんだってハナシですがえーとほらそのアレですよアレ。以下で察せ。

  • http://twitter.com/janus_wel/statuses/858918611
  • http://twitter.com/koizuka/statuses/858922137

関連して、コメント投稿ができないのは nicoplayer.swf 側にそのための外部インターフェイスがないからなんですよ。というわけで根本的にダメなので諦め気味。