iPhotoのmixi用エクスポートプラグン

追記 2008.6.2

別スレッドでexportされるiPhotoプラグインの仕様でRubyCocoaで動かすのが難しくて、けっきょくiPhotoからmixiにエクスポートするプラグイン(きちんと動くObjective-Cバージョン)を作ったのでそちらをご利用ください。

ぜんぜんちゃんとしたものではなくていつのまにか無限ループに入ってたりして扱いが難しかったりするんですがiPhotoからmixiにexportするプラグインをとりあえず動くくらいになったので公開。

mixiはどうでもよくてほんとは30days Album™用のを作りたかったのですが、Flashの中で認証コードを生成してるっぽくてそれを解析しつつプラグインを作るのはちょっと厳しかったので(そしてFlickrフォト蔵はもうあって、はてなフォトライフはなんかAPI壊れてるらしいし)mixiになりました。

ダウンロード

バイナリ
iphoto.exporter.mixi.zip
ソース
iphoto.exporter.mixi.20080504.zip

つかいかた

/Applications/iPhoto.app/Contents/PlugIns/
もしくは
~/Library/Application Support/iPhoto/Plugins/
iphoto.exporter.mixi.zipの中にあるsimpleFileExporter.iPhotoExporterをコピーしてください。

そうするとexportメニューの中にmixi exporterというのができてるはずなので、自分のmixiのアカウント情報と写真をアップロードしたいアルバムの名前を書いて入れてください。

そうするとアップロードが終わるまでexporting画面が出てきて、しかもまったく反応しなくなるけどたぶん動いているので大丈夫です。

補足

はじめ調べたらiPhoto exporterの仕様は非公開だと書かれてあったけどiPhoto SDKとかで探すと出てきました。Appleのサンプルコードをベースにmootoh.log – QSTwitter 1.4を参考にRubyCocoaを使うようにしました。mixiにアップロードする部分は買い物ログ別館: mixi-photo.rbのコードを使わせてもらっています。

Objetive-Cもrubyもまともに使ったことがなくていきなりRubyCocoaなのがいけないのですが、なんかプログレスバーをアップデートできなくて困っていて、それに加えて無限ループにはまることがあって、たぶんRubyCocoaを初期化しているスレッドと実際にコードを動かすスレッドが別になってる(結果おかしくなる)?のかなーと思ったけどなにもわかんないのでした。たぶん続く。

追記

NSPrincipalClass::loadでロードしてperformExportでrubyを呼び出すと、一定のCPU時間を使ったあとruby側が反応しなくなる(無限ループにはまっているかんじ)。これはNSPrincipalClass::loadでロードするのをやめてperformExportでロードするように書き直したら解決した。

でもこうするとRubyCocoaがロードされているかどうかがわからなくなる(exportダイアログが再度オープンされたときにはstatic installedが再び初期化されてる)ので、二回呼び出すと

[BUG] rb_cocoa_thread_schedule_hook: expecting to run on NSThread 0x13bb2340 but was 0x125bb410

といって落ちる。

Quicksilverのpluginは起動時に一回しか読み込まれないけどiPhotoはexportダイアログを開くたびに読み込まれるっていう違い?
既に読み込まれているかどうかの判定ができない。メインのスレッドになにかフラグ立てたりできればいいんだけど。

こんなふうには書けないよねーと思ったことがかけちゃうObjective-C+RubyCocoa+rubyの組み合わせはすげいっす。


About this entry