tomblooで画像をLocalにpostする時、条件により保存ディレクトリを振り分けたい

例えば hogehoge.com の画像は hogehoge ディレクトリに保存したり、タイトルからディレクトリ名を切り出して保存したい。
Tombloo Patch、はてなブックマークでタイトルを修正しないようにする、アスペクト - 戦争
tombloo には外部スクリプトを取り込みパッチをあてる機能があるので、上の記事を参考にパッチを書いてみた。

addAround(Local.Photo,'post',function(proceed,args,target,methodName){
    var ps = args[0];
//保存先。条件一致の画像はデータdirとは別の場所に。
    var baseDir = 'd:/tombloo/';
    var photoDir;
    var badChars = ['\\',/',':,*','?','"','<','>','|'];
    var safeChars = ['%uFFE5','%uFF0F','%uFF1A','%uFF0A','%uFF1F','%u201D','%uFF1C','%uFF1E','%uFF5C'];
//ディレクトリ名に全角文字を使うときはエスケープ
    var dirList = [
                    {
                        pageUrl : '^http:/www\\.pixiv\\.net/',
                        autoDir : '/\\s(.+)\\s\\[pixiv\\]'
                    },{
                        pageUrl : '^http:/danbooru\\.donmai\\.us/',
                        dir     : 'danbooru'
                    }
                  ]

    var getDataDir2 = function (base,name){
            	var path = 'file://' + unescape(base);
            	var dir = createDir(getLocalFile(path));
            	name && dir.append(name);
            	return dir;
            }

    dirList.forEach(function(tL){
        if( (tL.pageUrl && ps.pageUrl.match(tL.pageUrl)) ||
            (tL.itemUrl && ps.itemUrl.match(tL.itemUrl)) ||
            (tL.page && ps.page.match(unescape(tL.page))) ){
            photoDir = unescape(tL.dir);
        }
        if( tL.autoDir && ps.pageUrl.match(tL.pageUrl) && ps.page.match(tL.autoDir)){
            photoDir = RegExp.$1;
        }
    });

    if(photoDir){
        for(var i = 0; i < badChars.length ; i++){
            photoDir = photoDir.replace(badChars[i],unescape(safeChars[i]),'g');
        }
    }
			var file = photoDir ? getDataDir2(baseDir,photoDir) : getDataDir('photo'); 
//以下、主処理のコピペ。
//前処理のみじゃ駄目っぽいので、こうするしかない?(追記:こうでいいらしい。)
			createDir(file);
			if(ps.file){
				file.append(ps.file.leafName);
			} else {
				var uri = broad(createURI(ps.itemUrl));
				var fileName = validateFileName(uri.fileName);
				file.append(fileName);
			}
			clearCollision(file);
			
			return succeed().addCallback(function(){
				if(ps.file){
					return ps.file.copyTo(file.parent, file.leafName);
				} else {
					return download(ps.itemUrl, file);
				}
			}).addCallback(function(file){
				if(AppInfo.OS == 'Darwin'){
					var script = getTempDir('setcomment.scpt');
					
					putContents(script, [
						'set aFile to POSIX file ("' + file.path + '" as Unicode text)',
						'set cmtStr to ("' + ps.pageUrl + '" as Unicode text)',
						'tell application "Finder" to set comment of (file aFile) to cmtStr'
					].join('\n'), 'UTF-16');
					
					var process = new Process(new LocalFile('/usr/bin/osascript'));
					process.run(false, [script.path], 1);
				}
			});
});

この例では danbooru.donmai.us の画像は、d:/tombloo/danbooru に保存され、pixiv の画像はタイトルから作者のニックネームを切り出し d:/tombloo/作者のニックネーム に保存される。一応動いたが多分色々と酷い筈。とりあえずさせたい事の実現を優先し、マシな書き方は追々勉強する。
追記:
id:brazil氏にコメントをいただいた。ありがとうございます。

修正

  • 09/20 replaceの'g'フラグ付け忘れ