今日の夜から、音楽再生環境をfoobar2000に切り替えた。
最後に手こずったのは、Fusion E-350環境でのRubyで、iTunesからの移行データ(SQLiteデータベース)がうまく作れなかったことである。バレーボール中継を見ながら丸々2時間かかってしまった。
スクリプトは開発マシンで使ってきたものなので、問題ないはずで、動くはずだったのであるが、Rubyの環境を同じものを用意しなかったのが問題だった。
開発マシンではAndroidのアプリを少し前で書いていたので(今は休止中)、Cygwinをインストールしてあり、RubyはCygwinで勝手に入ったものをよく考えないで使っていた。バージョンは1.8.x(詳細は覚えていない)である。
で、Fusionマシンでは、マシンパワー的にバリバリ開発ができるわけでもいろいろなことをするわけでもないので、RubyのためにCygwinを入れるようなことはしたくなかったので、Ruby単体で入れることにした。よく考えずに(知らないのは怖いことでもあった)1.9.2をインストールした。OSが64bitなので、64bitでメイクされたバイナリが配布されていたから、という単純な理由であるが、結局モジュールが64bit版では動かせずに32bit版を使っていた。それでもダメ。
iTunesとCOMで通信はできているのだが、SQLiteへのアクセスもできているのだが、日付カラムだけが空になってしまう。
色々調べると、Time.parseの仕様が1.8系列と1.9系列で変わったということだけは分かったが、どうすればいいかがわからなかった。
iTunesから「最後に再生した日時」を文字列で取ってくると、「2011-11-12 15:10:28 +0900」のような形で帰ってくる。Rubyの1.8.xだとこれがTime.parseで解析できた。しかし、1.9.2だとエラーになる。Timeオブジェクトを返さない。形式指定しようにも、この形はどの指定された書式にも該当しないのでどうしたらいいのかわからなかった。
Rubyを極めるのは目的ではなく、存在するスクリプトを動かしたいだけなので、1.8.7(サイトにあった最新版、32bitバイナリ)をダウンロードして動かすと何の問題もなく動作した。最初からこうすればよかった。
で、これでSQLiteデータベースを正しく作ったところ、自作コンポーネントは正しく動作した。
しかし、問題が出た。エンコードをiTunesでALACでやるのはもう決めたことなのだが、追加したファイルに対するレコードの追加をRubyスクリプトでやろうと思っていた。しかし、foobar2000が動いている場合、自作コンポーネントがデータベースにアクセスしているため、ロックがかかり、動かない。更新をしなければうまくいくかもしれない。新規のみなら排他の対象外だからうまくいくかもしれない。ただ、今後の機能追加の対象として、Media Libraryの新規ファイル追加のタイミング(そんなイベント拾えるのか調べるの嫌になるが)でレコードを追加してやるのがよさそうだ。COMでiTunesのPersistent IDを調べないといけないが、iTunesに対して、Persistent IDからはトラックオブジェクトは一意にキーとして使えるのだが、逆引きは走査して一つ一つ調べて(この場合はファイルをキーにしてやるのがいいだろう)やらないといけない。面倒な処理になりそうだ。iTunesへのバックポートをしないのであればPersistent IDを作らないで新規レコードを追加してやるだけでいいのであるが。
移行したので、ReplayGainを計算させてタグに設定していかなければならない。そのためにiTunesをやめたようなものであるから。
コメント