Greasemonkeyに拡張機能でないとできないことをする関数を追加するPrivilegedMonkey
chrome特権つきのLDRize Minibufferコマンドを作るでちょこっと書いてたやつですが、とりあえずファイルをローカルに保存するやつだけ完成させました。
GreasemonkeyからGoogle Gearsの機能を利用するGearsMonkeyと似たアプローチなのでPrivilegedMonkeyという名前にしました。
インストール
- for Firefox2
- PrivilegedMonkey v.0.0.1
- for Firefox3
- PrivilegedMonkey v.0.0.3
使い方
PrivilegedMonkeyをインストールするとMinibufferにsave.localというコマンドが追加されます。
stdinにはURLを持っているXPathのAttrオブジェクトもしくは、URLの文字列(まはたtoString()でURLになるもの)を渡します。
今回はフランス語でなんなのかぜんぜんわからないけど、ときどきミックスが紹介されているVous y êtes !*からAタグでリンクされている拡張子.mp3のファイルをダウンロードする場合。
Minibufferを開いて
xpath "//a[ contains(@href, '.mp3') ]/@href" | save.local
で、ページの中の.mp3(という文字列がURLに含まれているもの)へのリンクがダウンロードされます。

Firefox標準のダウンロードマネージャ経由でダウンロードされるようになっています。
注意点
2007.11.24以前のバージョンのMinibufferはxpathコマンドが機能しなくなっています。あと、コマンドに引数をつけたときにパイプ( | )が入力できなくなっているので(これは自分が前に入れてもらった機能の影響だったりもするんですけど…)以下のパッチを当ててください。
--- minibuffer.20071124.js 2007-11-26 21:57:38.000000000 +0900
+++ minibuffer.user.js 2007-11-27 04:10:22.000000000 +0900
@@ -237,7 +237,7 @@
'PageUp' : 'bindScrollPrev',
'TAB' : 'bindComplete',
'C-i' : 'bindComplete',
- '|' : 'bindCompleteAndPipe',
+ 'C-/' : 'bindCompleteAndPipe',
},
initialize: function(){
this.separator = '|';
@@ -1343,7 +1343,7 @@
if(stdin.length == 0) stdin.push(document);
var res = [];
for(var i=0,l=stdin.length; i<l; i++){
- var lst = window.Minibuffer.$X(exp, node);
+ var lst = window.Minibuffer.$X(exp, stdin[i]);
for(var j=0,l=lst.length; j<l; j++){
res.push(lst[j]);
}
内部解説
PrivilegedMonkeyからchrome特権つきのLDRize Minibufferコマンドを作るに書いている通りGreasemonkeyのinjectScriptを書き換えてGreasemonkeyが実行されるときのグローバルスコープにPM_saveという関数を追加して、これを呼び出すことでファイルをローカルに保存できるようにしています。この関数はsave.local専用というわけではないので、ふつうにほかのGreasemonkeyスクリプトからも呼び出すことができます。
PM_save: function (uri, savefilename, displayName) {
uri: ダウンロードするURL
savefilename: 保存するときのファイル名(省略した場合uriから決定)
displayName: Firefoxのダウンロードマネージャ上での表示名(省略した場合uriから決定)
で呼び出せるようになっています。
image.siteinfoみたいなのを作ってMinibufferでピンを立てた画像をダウンロードできるとか、画像をそのままflickr(とかいろいろ)にアップロードするとか(PM_saveのほかにPM_postMultipartというのも書いてたのですが複雑になりそうなので保留にしました)、PrivilegedMonkeyでそういうやつを作れるようにしたいなと思ってます。

No comments
Jump to comment form | comments rss [?] | trackback uri [?]