書いてみた | |
もう既にそういうのはあったりするかもしれないですが、書いてみる
" タブ上にある全ての画像を保存するコマンド " -cオプションでタブを閉じながら保存 let g:imageSaveDirectory = "~/Pictures/" let g:saveAndClose = "false" javascript <<EOM commands.addUserCommand( ['saveallimage'], 'save all image in tabs', function(args) { let mTabs = document.getElementById("content").mTabs; let index = -1; let closes = 0; function closeTab(i) { if( args["-close"] || eval(liberator.globalVariables.saveAndClose) ) { let ts = getBrowser().tabContainer.childNodes; getBrowser().removeTab(ts[i - closes]); ++closes; } }; function isTextType(url){ try{ const ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); let ch = ioService.newChannel(url, "UTF-8", null); let stream = ch.open(); return ch.contentType.match(/^text/); }catch(e){liberator.echoerr(e)}; return true; }; function downloadImage(url,file,leafname) { if ( !file.exists() || args.bang ){ //以下の1行でもほぼOKだけど、保存先がどうしても変更できない・・・ //saveImageURL(url,targetpath,null,true,makeURI(url,getCharsetforSave(null))); //URLからダウンロードする const dm = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager); let persist = makeWebBrowserPersist(); try{ let to_file = services.create('file'); to_file.initWithPath(file.path); let to_uri = makeFileURI(to_file); let from_uri = makeURI(url,null,null); let download = dm.addDownload(0, from_uri, to_uri, leafname, null, null, null, null, persist); persist.progressListener = download; persist.saveURI(from_uri, null, null, null, null, to_file); liberator.echo("Save : " + file.path); }catch(e){liberator.echoerr(e)} }else{ liberator.echoerr("E13: File exists (add ! to override) : " + file.path); } }; for each ( [,tab] in tabs.browsers ) { ++index; let lb = mTabs[index-closes].linkedBrowser; let bartabURL = lb.userTypedValue ? lb.userTypedValue : lb.mIconURL; let url = bartabURL ? bartabURL : tab.currentURI.spec; if( url.match(/\.(jpe?g|gif|png|bmp)$/i) ){ //URLの拡張子だけで判別すると404とかだったときに困るのでMIME-TYPEからも調べる if( isTextType(url) ) { closeTab(index); continue; } //ファイル名取得 let leafname = url.split(/\/+/g).pop(); let targetpath = liberator.globalVariables.imageSaveDirectory + leafname; let file = io.File(targetpath); downloadImage(url,file,leafname); closeTab(index); } } }, { bang: true, options: [ [["-close", "-c"], commands.OPTION_NOARG], ] } ); EOM
:saveallimageで全ての画像を保存(ファイルが既に存在する場合は保存しない)
-closeオプションを付けると画像を保存しつつタブを閉じる(グローバル変数でもセットできる)
グローバル変数でデフォルトの保存先をあらかじめ指定しておく必要がある
:saveallimage!とすると強制的に上書き保存する
こんなに長くなってしまった\(^o^)/
プラグインとして書いた方がよかったかも・・・
画像を保存するヒントモードを作った - vimpめも - vimperatorグループ
#vimperator プラグイン: ZIPでダウンロードするお! - Vimple Star Sprites - vimperatorグループ
ありがとうございました!
Vimperator2.3のみで動作しました
Windowsの場合は let g:imageSaveDirectory = "C:\hoge\"とかすると動くと思います
browser.contentDocument.contentType から "image/jpeg" 等を得ることが出来たりしますよー