nicovideo Thumbinfo popup の配付サイトを移動 & @grant 対応

超久々 Greasemonkey 更新情報です。

nicovideo Thumbinfo popup の配付サイトとして利用していた userscripts.org が死亡したらしいので、 新しい配付サイトとして Greasy Fork へと移動しました。

スクリプトの自動更新など行っている方は、上記サイトから再度スクリプトをダウンロードすると良いと思います。

ちなみに Greasemonkey 2.0 (と、Scriptish の最近のバージョン) で必要になったっぽい、 @grant 指定についても対応しています。 実は 5/2 にこっそりと更新していたのですが、このブログ上では告知していなかったので。。。

ついでに、 GitHubリポジトリを作成しました。

今後の方向性ですが、このスクリプトFirefox の独自構文を多様した作りになっているので、 ES6 や 7 の標準に従った作りにしていきたいな、と考えています。 Google Chrome 等との互換性をとるのも大変な作りになっていますし、Firefox 独自機能はいつ削除されるか分からないので。。。 あとは、もう少し全体的に見通しの良い作りにしたいですね。 めっきり静的型付け信者になってしまったので、 TypeScript への移行も選択肢の内かも。

ニコニコ動画で watch ページにタグの履歴を表示する Greasemonkey スクリプト: NicoTag Tab を作った

インストールはこちら
NicoTag Tab for Greasemonkey

機能

  • データグリッド状にタグを表示します
  • グリッドの列毎にソートすることができます
  • 表示する要素をフィルタリングすることができます
    • XUL/Migemoがインストールされていると,ローマ字から日本語のタグをフィルタリングできます。

スクリーンショット

過去タグの一覧表示

存在期間の長い順でソート

ローマ字でフィルタリング


ここ最近はニコタグが503エラーを吐くことが多いのが残念です。運営者さん復帰しないかな…

ニコニコ動画でコメントを取得する方法のメモ

動画再生ページ上で動作するGreasemonkeyスクリプトから,動画についたコメントを取得する方法は主に2通りある。それぞれについてメモ。

新プレイヤーのAPIを使う方法

javascript: function hoge(data)alert(uneval(data)); void(document.getElementById("flvplayer").ext_getThreads('hoge'));

以下のような応答が得られる。

[{type:"main", id:0}, {type:"local", id:1}]

ここで得られたスレッドID?を使って,以下を呼び出す。

javascript: alert(JSON.stringify(document.getElementById("flvplayer").ext_getComments(1)));

以下のような応答が得られる。コメント番号降順で得られるっぽい。

[
  {"message": "mohrmohr", "resNo": 13, "vpos": 14970, "date": "Sun Nov 21 2010", "command": "184"},
  {"message": "ahogeahoge", "resNo": 12, "vpos": 7340, "date": "Sun Nov 21 2010", "command": "184"},
  {"message": "mohrmohr", "resNo": 11, "vpos": 3160, "date": "Sun Nov 21 2010", "command": "184"}
]

得られるコメントは,動画上で表示されているものと同じよう。10分超の動画なら1000件だし,短ければ得られるコメントも少なくなる。
メッセージサーバにアクセスしてXMLを取得する場合と比較したメリット・デメリットは以下の通り。

メリット
  • 通信が発生しない
    • 即座にコメントを取得できる
    • 複数のGreasemonkeyスクリプトからコメントを取得してもアクセス制限されない
  • JSのオブジェクトとして直接取得できる
    • パース処理が不要
デメリット
  • 動画に表示されているコメントしか取得できない
  • ユーザID,プレミアムか否か,コマンド等が取得できない
  • 投稿者コメントが取得できない?

コメント中のURLを抽出するなどの用途なら十分使い物になりそうですね。

メッセージサーバにアクセスする方法

昔からある方法。404 Not Foundを参考にすれば良さそう。
リクエストの<thread>要素の属性として,whenとwaybackkeyを与えれば過去ログも取得できる?

ニコニコ動画で getflv を呼び出すときに便利なGM用ライブラリ

NicoFilter Tabを書くときに使った関数をライブラリ化しました。gistにアップロードしてあります。ニコニコ動画でgetFlvを呼び出す関数

概要

ニコニコ動画用のGMスクリプトを書くときに,http://flapi.nicovideo.jp/api/getflv/sm*****を呼び出す処理が必要になることがあります。このAPIへのアクセスを簡単にするライブラリです。APIの呼び出し回数を減らして,アクセス制限にひっかからないようにするのも目的の1つです。

使い方

GMスクリプトの冒頭で

// @require        https://gist.github.com/raw/670311/2a32978c5b58a477af62c7ae3e4123403c873f8a/nicovideo_getFlv.js

などと記述しておきます (指定するURLは,最新版のものにしておくことをオススメします。上記のgistのリンク先から入手できます)。そして,getflvの情報を取得したいところで

nicovideo_getFlv('sm9', function(obj, responseText) {
 ...
});

こんな感じで書きます。responseTextにはAPIにアクセスして得られる文字列が,objにはその文字列をパースした結果のオブジェクトが代入されます。objのフォーマットは以下のような感じ

{ "thread_id": "1173206704",
  "l": "111",
  "url": "http://smile-pcm31.nicovideo.jp/smile?v=8702.9279",
  "link": "http://www.smilevideo.jp/view/8702/43375",
  "ms": "http://msg.nicovideo.jp/7/api/",
  "user_id": <ユーザーID>,
  "is_premium": "1",
  "nickname": <ニックネーム>,
  "time": "1289361631",
  "done": "true",
  "feedrev": "9eb78",
  "ng_rv": "434",
  "ng_up": [
    ["はー","はあああああああああああああああああああああああああああああ"],
    ["どー","どおおおおおおおおおおおおおおおおおおおおおおおおおおおおお"],
    ["らっちー","らっち〜☆ミ らっち〜☆ミ"],
    ["つー","つううううううううううううううううううううううううううううううううううううううううう"]
  ],
  "hms": "hiroba01.nicovideo.jp",
  "hmsp": "2530", 
  "hmst": "1000000006",
  "hmstk": "1289361691.cROP5uDxwti4Dfb-3rFLRXoGIow",
  "rpu": {
    "count": 1031240,
    "users": [
      <ユーザー名1>,
      ...,
      <ユーザー名n>
    ], 
    "extra":0 
  }
}

各値の意味についてはgetflvの戻り値についてまとめ(2010年8月版) - MineAPの(開発)日記を参照してください。

ニコニコ動画の動画再生ページに投稿者フィルターを表示させるGreasemonkeyスクリプト,NicoFilter Tab を作った

インストールはこちら
http://userscripts.org/scripts/show/90132


近頃めっきり見なくなった投稿者フィルターですが,見えないよりは見えた方がいいよね!ということで,タブの形で見えるようにしてみました。
フィルターを可視化するスクリプトは,既に腐るほど存在するとは思うのですが,タブで表示させるってのが新しい点ですね。タブ表示はニコニコ動画オリジナルのUIと調和して,いい感じの見た目(&使い勝手?)になります。

参考にしたサイト
getflvの戻り値についてまとめ(2010年8月版) - MineAPの(開発)日記

わくわくするルーレット「わくわくルーレット」を作った

わくわくルーレットというソフトを作りました。

説明やらダウンロードやらはこちらから
わくわくルーレット
バグ報告やら要望やらはこちらへどうぞ
【わくわく】わくわくルーレットサポートスレッド【するの?】 - Greasemonkey等サポート掲示板

ソフトの命名は某コミュ向けの内輪ネタなんですが,ソフト自体は割と汎用的なんでこちらでも紹介した次第です。用途としては,電凸で会話などするニコ生で話題を選ぶ時に使ったりすると良いかなと。

姉妹ソフト
ルーレットが楽しめるソフト「わくわくルーレット」 : ゆきちゃんのソフトウェアなページ
インスパイアされたソフト
罰ゲームルーレットの詳細情報 : Vector ソフトを探す!

以下どうでもいい言い訳と感想

ルーレット中に「ピッピッピッ」と音が鳴るようにしたんですが、.NETデフォルトの機能だと音声の同時再生ができないみたいで、ブツブツ途切れてしまいます。解決するにはDirectXを使わなきゃいけないらしく、500MBもあるSDK落としてきてインストールしたけど .NET 4.0 から使えるようにするにはまた別のSDK (SlimDX) が必要だとか。しかもそれは開発者が入れるだけでは駄目で、アプリ使用者もなんかインストールしなきゃいけないっぽい。こんなソフトの為に何かインストールさせるのもアレだなあと思って結局音声は諦めた。Managedじゃないコードからアクセスするやり方もあるっぽいけど、諦めた。音声って意外と難しいんだな…。Flashくらい気軽に使えると思ったのに。Silverlightだとまた違うんだろうか。
今回 Visual Studio 2010 + .NET Framework 4.0 + C# 4.0 + WPF って環境でアプリ作ったんですが、VS2005と比較するとXAMLアプリがものすごく作りやすくなっていて驚いた。あとはStyleのSetterでプロパティと値の補完ができるようになれば個人的には完全に満足。
相変わらずXAMLはすごく柔軟でなんでもできるけど、実際それほどなんでもできない気もした。複雑で全容を把握できない!仕様もちょっとは分かったけど把握できない!MSDN重い!難しい!そんなXAMLのせいで「C#でコード書いたら負けだと思う病」にかかってしまい、結構無駄な時間を費やしてしまった気がするwまあ楽しかったからいいか。
そんなこんなで久しぶりのC#開発、初めてのGUIアプリの公開でした。C#Javaよりも断然素敵だと思いました。varとかlambdaとか。他にも色々。varを多用したC#のコードはパッと見JavaScriptみたいで大変親しみを感じました。まる。