Hatena::Groupvimperator

ヴィンペラートル・オクタウィアヌス RSSフィード

記事一覧 | はてダ
 | 

2010-03-09

タブで開いている画像ファイルを全て保存するコマンド

| 17:10 | タブで開いている画像ファイルを全て保存するコマンド - ヴィンペラートル・オクタウィアヌス を含むブックマーク はてなブックマーク - タブで開いている画像ファイルを全て保存するコマンド - ヴィンペラートル・オクタウィアヌス

もう既にそういうのはあったりするかもしれないですが、書いてみる

とりあえず書いてみる

vimperatorrcに書く
" タブ上にある全ての画像を保存するコマンド
" -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\"とかすると動くと思います

teramakoteramako2010/03/09 18:03>> //URLの拡張子だけで判別すると404とかだったときに困るのでMIME-TYPEからも調べる
browser.contentDocument.contentType から "image/jpeg" 等を得ることが出来たりしますよー

voidy21voidy212010/03/09 18:09おおお、助言ありがとうございます!!

voidy21voidy212010/03/09 18:41どうもBarTabのlinkedBrowserからは読み込まれていないタブが"text/html"になってしまっているようで、本当のContent-Typeを知ることが出来ない感じでした・・

 |