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'フラグ付け忘れ