NicoNicoPlaylist と cooperation する vimperator script

長いな。まぁいいか。昨日 ( http://d.hatena.ne.jp/janus_wel/20080710#1216137593 ) の続き。とりあえずモノを置いとく。

vimperator 側だけではどうにもならなかったので NicoNicoPlaylist ( http://d.hatena.ne.jp/kotas/20071018/playlist ) にも手を加えたんだけど仕方ないね。どうやっても外からアクセスできないんだもの。

使い方

niconicoplaylist.user.js をインストール。既存のものを上書きするので注意。 nnp_cooperation.js も ~/vimperator/plugin 以下に置いておく。 Fx を再起動。以下のコマンドが使えるようになってるはず。

  • :nnpclear
    • プレイリストをすべてクリアする。
  • :nnpgetlist
    • プレイリストを表示する。デフォルトでは 10 件。 g:nnp_coop_numoflist に設定した数の分だけ表示する。
  • :nnpplaynext
    • 次の動画を再生する。再生した動画はプレイリストから取り除かれる。
  • :nnppushallvideos
    • 現在のページにある動画ページをすべてプレイリストに送る。
  • :nnppushthisvideo
    • 現在見ている動画をプレイリストに送る。
  • :nnpremove [index]
    • プレイリストの index 番目の動画を削除する。 index は 1 から数える。

とはいえこれらのコマンドをいちいち叩くのはアレなので map すると思うけどその際に以下を _vimperatorrc に貼り付けると幸せになれるかもしれない。

javascript <<EOM

// [N],nn
// N 番目の動画を再生する。
// 指定なしの場合次の動画が再生される。
liberator.mappings.addUserMap(
    [liberator.modes.NORMAL],
    [',nn'],
    'play next item in NicoNicoPlaylist',
    function(count) {
        if(count === -1) count = 1;
        liberator.execute(':nnpplaynext ' + count);
    },
    { flags: liberator.Mappings.flags.COUNT }
);

// [N],nr
// 上から N 個の動画を削除する。
// 指定なしの場合一番上の動画が削除される。
liberator.mappings.addUserMap(
    [liberator.modes.NORMAL],
    [',nr'],
    'remove item in NicoNicoPlaylist',
    function(count) {
        if(count === -1) count = 1;
        for(var i=0 ; i<count ; ++i) liberator.execute(':nnpremove');
        liberator.execute(':nnpgetlist');
    },
    { flags: liberator.Mappings.flags.COUNT }
);

EOM

それぞれ :nnpgetlist で見えるインデックスを N に指定するとちゃんと動くように設計したのでそんなに戸惑うことはないはず。上記と合わせて以下に俺の map / 設定をさらしておく。表示個数を 7 個にすると 1024 x 768 のディスプレイだと動画が隠れないのでちょうどいい。

map ,na :nnppushallvideos
map ,nt :nnppushthisvideo
map ,nc :nnpclear
map ,nl :nnpgetlist

" 再生リストの表示数を 7 個に
" plugin : nnp_cooperation.js
let g:nnp_coop_numoflist='7'

技術的なはなし

内部的には Fx3 から追加された CommandEvent の受信部を NicoNicoPlaylist 側に仕込んで vimperator plugin 側ではほぼ CommandEvent の送信のみを行ってます ( http://nanto.asablo.jp/blog/2008/06/26/3596261 ) 。いろいろ悩んだんだけど AutoPagerize や MiniBuffer のように window 以下にオブジェクトを仕込むほどたいそうなものでもないので CommandEvent を選択。

今回策定したイベントは以下のものなんだけど接頭辞に GM つけるのってややこしいかな ? ここらへん知ってる方いたら教えてください。

GMNNPClear :nnpclear
GMNNPPlayNext :nnpplaynext
GMNNPPushAllVideos :nnppushallvideos
GMNNPPushThisVideo :nnppushthisvideo
GMNNPRemove :nnpremove

あと :nnpgetlist 用のイベントがないのは vimperator plugin 側でイベントの受信がうまくいかなかったためです。 scraping で逃げてます。