2013年5月18日土曜日

macでAnkPixivToolsでダウンロードした漫画の画像の連番ファイル名をリネームする。

パッと目についたGotomsさんを参考用に使用。
Pixivの画像を保存するときにはFirefoxのプラグインである「Ank Pixiv Tools」なんてのを使わせてもらってて。
普通の画像はもちろん、漫画形式のファイルとかもダウンロードできるわけです。(ジェスチャにも登録できるからサックサク)
設定でダウンロードしたときのファイル名をいじれるからすごく管理が楽になって便利なんで愛用させてもらってる。

ただ、漫画形式のファイルは「作者名 - 作品タイトル」ってフォルダと、その中に「01.jpg(png)」から始まる連番ファイル名の画像が生成されるのね。
確認してみても、この連番ファイル名を変えるような設定はないっぽい…。
自分的にはこの連番ファイル名にも作者名とかつけたくて、「作者名 - 作品タイトル 01.jpg」みたいにしたいわけ。

ってなわけであれこれ策を弄して自分でリネームすることに。
以下、事の経緯をだらだらと書き連ねる。
例によって先に結論をいっておくと、「Automator」とシェルスクリプトで満足のいく動作を実現できた。

自分が求める動きは、とにかく手軽にできること。
なるべく自動化したい。ワンクリックで済むならgoodってとこ。
漫画フォルダを選択して、ワンクリックでリネームって流れね。

まず第一候補。リネームってんだからリネーマーアプリを使うのを考える。
が、MountainLionで動くリネーマーアプリって良く知らないのよね(´・ω・`)
それにソフトの起動を含めると「ワンクリック」とは行かなそう。断念。

第二候補。本命「Automator」。
こいつはmacのいろんなバッチ処理を作成できるアプリ。
まさしくリネーム作業に向いてるアプリなんだけど、 だめ…。
というのもリネームするときにフォルダの名前から作者名とタイトルを拾ってくるさいに、複数のフォルダを同時に処理すると、そこでつまづいちゃう…。
「A」フォルダの中身を「A xx.jpg」にしてから「B」フォルダの中身を「B xx.jpg」にするようにしてほしかったのに、うまくいかない。「AB xx.jpg」とかになっちゃう。
Appleスクリプトを途中で噛ましたりすればいけそうだったけど、なにやら先行き不安なので断念。

第三候補。シェルスクリプト。
前回Blenderの定期スクリーンショットで撮るのに使ったように、これまたリネーム作業に向いてると言えるんじゃないかな。
ただシェルスクリプトはターミナルを一度開かないといけないし、以前のようにapp化したスクリプトに選択したフォルダを渡す方法ってのがないと思ってた。
だからちょっと望み薄かなあと考えてたわけ。
しかし「Automator」のライブラリを見てたら、シェルスクリプトが使えることが判明!

ってなわけで「Automator」で選択したフォルダを受け取りつつ、シェルスクリプトでリネームする方向に決定。
まずはググる。参考になったのはこちら
ネックは「入力の引き渡し方法」。これが第二候補で詰んでた原因だしね。
どうやら入力を「引数として」受け取るようにすれば各フォルダごとに処理ができるらしい。
引き渡し方法を選択した時点で最低限のシェルスクリプト(ループ処理)が自動で書かれるのは親切親切。
あとはトライアンドエラーでいじくり回していく。
「Automator」の設定は以下の画像の通りシンプルきわまりない。
保存設定は「アプリケーション」で。「.app」ファイルをアプリケーションフォルダでもどこでも適当なところに置いて、Finderのツールバーに登録すればおk。
ちなみに保存方法を「サービス」にすれば右クリックメニューからも使えるし、「選択されたFinder項目を取得」を無くせば「フォルダアクション」としてつかうこともできた。
肝心のシェルスクリプトは以下の通り。
リネームした画像は「mv」で移動させてるので、「~/Downloads」はお好みで変えてくだしゃー。
元の漫画フォルダ内に残したい場合は「mv」の行そのものを削除で。
万が一を考えて「cp」で元のファイルは残して処理してるけど、それがいやなら「cp」を「mv」に変えて、もともと書いてある「mv」の行を削除すれば期待どおりになる…はず。

OD=$PWD
for f in "$@"
do
    #if directory doesn't exist, exit.
    if [ ! -d "$f" ]; then
 echo Not found \"$f\"
 exit
    fi

    ESHI=`basename "$f"`
    cd "$f"

    #if there is any folder inside directory, exit.
    if [ `ls -F | grep / | wc -l` -gt 0 ]; then
 echo ERROR! may be not PixivMangaFolder
 exit
    fi

    for image in `ls -F | grep -v /`
    do
 cp $image "$ESHI"\ "$image"
 mv "$ESHI"* ~/Downloads
    done

    cd "$OD"
done
処理の簡単さのわりに意外と長い。
実は、試行錯誤を繰り返してる最中に「mv」コマンドや「rm」コマンドの指定をミスって、ホームフォルダを吹き飛ばしそうになったりしたから、そこらへんを慎重に処理するために、if分を2回ほど挟む事になっちゃった。
見れば分かると思うけど、指定したフォルダがなかった場合と、そのフォルダの中にフォルダが入っている場合(漫画フォルダは中身は画像ファイルだけのはず)には終了するようになってる。
前者は「Automator」でアプリケーション化したらあり得ない条件になるから、いらないかも。
後者は間違ってダウンロードフォルダとか、別のフォルダをリネームしようとしたときに一応ストッパーになるはず。
当然、中身にフォルダを持たないフォルダは全部漫画フォルダって認識しちゃうから、あまり信用できたものじゃないYO。
連番ファイルの認識がよー分からなかったよ。正規表現とかでやるのかなあ。
他に案としては「grep」で「jpg」「png」「gif」だけを拾って処理とか考えたんだけど、これ以外の画像フォーマットが来た場合とか(あるわけないのにw)考慮して無条件で拾ってきてる。
(それらのおかげと言っちゃなんだけど、「フォルダ名を中身のファイルに付与するリネーマー」としても使えちゃったりする。以前にAnkPixivToolsを使わずにDLした画像もこれでリネームするとちょっとすっきりする。)

とまあ、こんな感じ。4、5時間経過しとるわw
できる人からみたら結構めんどくさかったり、危ないことしてるんだろうなあ。
自分の思うままの機能をもったアプリを作るのはやっぱりおもしろいね。
そういう意味ではシェルスクリプトはすごく手が出しやすいと思う。
「Automator」を使えばスクリプトからアプリケーションに早変わりするのも良い。

0 件のコメント: