絵日記プラグインから flickr プラグインへのマイグレーションツールを作った
先日から書いていたけど、tDiary の絵日記プラグイン (image.rb) から flickr プラグイン (flickr.rb) へ写真を移行するためのツールを作った。
簡単な説明
ツールがやってくれること
- 絵日記プラグインでアップロードした写真を flickr へアップロードします
- tDiary の日記データから、絵日記プラグインの呼び出しを flickr プラグインの呼び出しへ書き換えます
- image, image_left, image_right の呼び出しに対応
要件
- tDiary2.3.1以降で、日記データがUTF-8化されている必要があります
- 日記がWiki記法で書かれている必要があります
ダウンロード
ファイルは CodeRepos にアップしました。
使い方
image2flickr.rb の USAGE をご覧ください。
メモ
古い日記データはバックアップするようにしたし、自分の環境では何度もテストしたけど、やっぱり日記データを書き換えるツールなので少し心配。 なので、Webから簡単に使えるようにはせずに、コマンドラインからの操作にした。 何かあれば、バックアップから日記データを戻すことができるくらいの知識があることを想定してる。 もうひとつの理由は、 flickr に写真をアップするのでCGI経由の起動だとタイムアウトになる可能性があるから。
flickr への写真のアップロードは、こないだの日記に書いたように rflickr ライブラリを使えば簡単にできた。
課題だった tDiary の日記データの書き換えは、こうやってみた。
# imageプラグインをflickrプラグインへ置き換える def convert(yearmonth) @parser.each_diary(yearmonth) do |@date, diary| # 現在はWiki記法のみ対応 diary.gsub!(/\{\{(image[^}]+)\}\}/) {|match| begin "{{#{eval($1)}}}" rescue => e # 例外が発生したら置換しない match end } diary end end def image(index, title = nil) replace("flickr", @date, index, title) end def image_left(index, title = nil) replace("flickr_left", @date, index, title) end def image_right(index, title = nil) replace("flickr_right", @date, index, title) end
やってることは、以下のとおり。
- 日記データから、"..."という文字列を検索
- eval で image, image_left, image_right を呼び出し
- flickr プラグインへの置換文字列を返す
最初は普通に置換しようと思ったけど、プラグイン呼び出しの文字列のパースが面倒だった。 たとえば、スペースの数やシングルクオーテーションとダブルクオーテーションの違いとかね。 だったら、evalを使ってrubyに解釈してもらえばいいじゃん、と気がついて、今の形になった。 自分のスクリプトで、はじめて eval を使ったなぁ。
それから、途中でツールを中断しても再開できるように、気を配った。 日記データはバックアップから元に戻せるけど、flickr にアップした写真まで元に戻すのは大変だからね。
- flickr にアップした写真ファイル名はYAMLで記録しておき、アップ済みのファイルは2度アップしない
なので、もし日記データの書き換えに失敗しても、YAMLファイルが残っていれば flickr へのアップはやり直す必要がない。
そういえば
久しぶりに Ruby のスクリプトを書いたなぁ。 PHP や Perl のあとに Ruby を書くと、最初は思わず $ や ; を付けそうになっちゃう。