Ruby製ニコニコ動画用ダウンローダー for Operaとか
地味に更新。
変更点
- 動画がエコノミーだった場合、ファイル名に_lowを追加するようにした。
- プレミアムアカウント時のみ、-aオプションにて全コメントのダウンロードを可能にした。
- 認証用ファイルを指定できるようにした。
- その他細部を調整。
本当はダウンロードしている動画をOperaのキャッシュから探して無駄なダウンロードを省くようにするつもりだったが、土壇場でバグが見つかったので見送り。
Info
2007
1225
目次
地味に更新。
本当はダウンロードしている動画をOperaのキャッシュから探して無駄なダウンロードを省くようにするつもりだったが、土壇場でバグが見つかったので見送り。
Info
2007
1225
RubyでGUIが作れるというので勉強も兼ねてVisualuRubyに挑戦。
userjsmanager.zip
2007/12/20:エディタが正確に開けない不具合が早速出たので修正。
userjsmanager.exeを実行すると、GreaseMonkeyほぼまんまの管理画面が現れるので、そちらを弄ったことがあるなら操作上迷うことは無いだろう。詳しくは同梱のテキストを参照。
開発途中だから仕方が無いか。一応気合でなんとかなる。
コントロールの配置については、Formdesignerを使えばある程度は解消するが、配置したコントロールをクリックすると大きさが変わってしまったり、出力するとウインドウスタイルが全部整数になってしまうので、若干手直しが必要になる。
簡単にGUIが書けるのは確かだが、結局はWindowsのコントロールを使うので、構築上ある程度の縛りは受ける。
それはいいんだが、現時点ではWindowsAPIの資料を漁るのが必須なのが正直めどい。そこまで凝ったGUIを作れなくてもいいので、Rubyの知識だけで書ける様になるのが一番の理想か。
exerbのguiモードでコンパイルしたらAVGが反応したので思わず吹いた。久々にAVGのダイアログ見たわ。
cuiにしたら反応しなくなったので良かったが。ってか、コードのどこに反応したんだ?
Info
SBM Comments
2007
1219
実行ファイル形式になっているので、Rubyがインストールされていなくても使うことができる。
[Document Popup Menu]
...
Item, "動画とコメントをダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -v -c"
Item, "動画をダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -v"
Item, "コメントをダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -c"
こんな感じで使用しているmenu用設定ファイルに追加すれば、右クリックから開いているページの動画とコメントをダウンロード。動画タイトルと動画IDの名前で保存される。12月9日時点の新コメントサーバー仕様及びマイメモリーにも対応。
この手のツールは探せば他にも大量に見つかるが、「プレイヤー等が絡まないシンプルな構成」「実行ファイル」「修正が容易なもの」。ということで、Rubyの勉強がてら、余所様のコードをパク・・・もとい、参考にして作った。
なお、コマンドプロンプトで色々渡してるだけなので、Opera以外からでも当然使える。
使い方の詳細等はソースを参照してほしい。
Operaのアクションからはウインドウタイトルはどうやっても取得できない。そこで、常套手段であるAutoHotKey経由でスクリプトを動かそうとしたが、なぜか動かない。
Run, C:\nicovideo_downoad.rb http://www.nicovideo.jp/watch/sm****** C:\download -v -c, C:\, Min
通常ならこれで動くはずだが、なぜかファイルが存在しません、との警告。
どうやらAutoHotKeyはexeやbat以外のものにコマンドラインオプションを指定しても、コマンドラインオプションとして認識してくれず、全て連結したファイル名を探そうとするようだ。
仕方ないので、実行ファイルと同じディレクトリにbatを作った。「Opera⇒ahk⇒bat⇒rb」という過程を得てようやくタイトル取得に成功。
RubyからWin32API使えるんだから、ウインドウ一覧ぐらい取得できるのでは?
あった。無事にアクティブなOperaウインドウを取得できた。
ニコニコ動画の仕様上、一度動画ページにアクセスしてるんだから、その時ついでにHTMLソース取得しとけば良くね?
Operaが絡むと毎回ウインドウタイトルで泣かされる。今回は最終的に関係無くなったからいいが、やっぱりタイトルを取得できるようにするべきだ。
あと、せっかくなんで、ウインドウクラスからアクティブウインドウタイトルを取得するスクリプトを置いとく。Win32APIを使ってるんで、ActiveRubyとかじゃないと無理?
Info
SBM Comments
2007
1209
oAutoPagerizeはAutoPagerizeのOpera版。SITEINFOが取得できず、手動で追加しなければいけないのが面倒だったので、SITEINFOを取得して更新してくれるスクリプトを作った。
元はRubyスクリプトだが、exerbで実行形式のファイルにしてあるので、解凍したファイルの中にあるooprize.exeをooAutoPagerize.jsと同じフォルダにおいて実行するだけで更新してくれる。
他人がコンパイルしたファイルなぞ信用できないという人の為にソースも用意しているので、そういう人は自分でコンパイルするなりそのままRubyで走らせて欲しい。
なお、自分でもあまり試していないので、動かなかったらごめんなさい。
Info
SBM Comments
2007
1204
Praggerの動作やらRuby自体に苦戦しつつも、そこそこプラグインを書けるようになってきたので公開。
ニッチなプラグインばかりだが、暇を見てちょくちょく増やそうと思う。
とりあえずこしらえたのが下記4本。
大体のコツを掴めたので、次はRSS非対応サイトからRSSを作ることにする。
Info
2007
1130
Rubyの勉強も兼ねてPraggerを弄ることにした。
PRagger - Tracにある通り、SubversionをインストールしてPraggerをチェックアウト。ActiveRubyも入れて動作確認。が、動かない。なぜだ!?
Rubyのライブラリコードを追うなど、試行錯誤を繰り返したが動作せず、結局ActiveRuby入れなおしたら何事も無かったかのように動いた。所要時間3時間。疲れた。
PluginList - PRaggerまとめサイト それPraを参考にしてyamlを記述していく。
custom_feedというプラグインを使えば良いいようだ。
yamlはこのような感じになった。
- module: Feed::custom_feed
config:
url: http://www.insertcredit.com/
capture: <!-- Begin news segments -->(.*?)<!-- Begin sidebar segments -->
split: ^\s<table border="0" cellspacing="0" cellpadding="2" width="590">(.*?)</table>\s*?</table>\s*?<br>
title: <p id="title" align="left">(.*?)<
date: <p id="date">(.*?)</td>
link: <a href="http://www\.insertcredit\.com/(archives/\d+\.html)"><font color="#EEEEEE">\[p\]</font>
- module: RSS::save
config:
title: insert credit
about: http://www.insertcredit.com/
description: insert credit
link: http://www.insertcredit.com/
filename: insertcredit.rdf
praggerを実行すると見事にrdfファイルが作成された。ちゃんとタイトルとリンクが入ってる。
まず、linkに無駄な#が入る。普通は抽出ページからの相対パスだろうから、#が必要になるとは思えない。
次にdescription。splitで分割した後のものがそのまま入るので、すごい中途半端なHTMLタグが混入して美しくない。
そこでcustom_feedを改造することにした。
plugin/feed/custom_feed.rbをplugin/myplugin/とでもフォルダを作成してコピー。以後、コピー先を弄る。
まずはlinkの調整。#を追加しないようにする。
mylink = config['url'] ? (config['url'] + '#' + $1) : $1
↓
mylink = config['url'] ? (config['url'] + $1) : $1
次にdescriptionで本文っぽいのを取らせたいので
if(config['description'])
description = Regexp.new(config['description'])
items.each do|i|
if i =~ description
mydescription = $1
i.instance_eval do
@description = mydescription
def description
@description
end
end
end
end
end
return items
end
ソースファイルの最後をこのような感じにする。title取得部分をコピペしてdescriptionにしただけだが。
最後にプラグイン名が同じだとアレなのでファイル名をcustom_custom_feed.rbにしてメソッド名も同様に変える。で、yamlも書き換えて完成。
- module: myplugin::custom_custom_feed
config:
url: http://www.insertcredit.com/
capture: <!-- Begin news segments -->(.*?)<!-- Begin sidebar segments -->
split: ^\s<table border="0" cellspacing="0" cellpadding="2" width="590">(.*?)</table>\s*?</table>\s*?<br>
title: <p id="title" align="left">(.*?)<
date: <p id="date">(.*?)</td>
link: <a href="http://www\.insertcredit\.com/(archives/\d+\.html)"><font color="#EEEEEE">\[p\]</font>
description: <p id="text"><font color="#EEEEEE">([\s\S]*?)</font></p>
- module: RSS::save
config:
title: insert credit
about: http://www.insertcredit.com/
description: insert credit
link: http://www.insertcredit.com/
filename: insertcredit.rdf
無事に本文の抽出に成功。んむ、美しい。出来上がったRSSはこんなかんじ。
仕組みが複雑ではないので、Ruby初心者の自分にとっては勉強用として丁度良い。
WWW::mechanizeを使うことでフォーム等の操作が可能になるので、今度はそっちに挑戦するつもり。
正規表現を記述する際はHTMLソースとにらめっこするわけだが、マッチするはずなのにしないなーと思ったら、ご丁寧にもFirefoxが<br>を<br />に変えてくれてました。余計なことすんな、橙パンダ。
Info
2007
1117