MacからPS3にメディアを送信するためのDLNAサーバとして、Mediatombをインストールしていましたが、これまでMP3ファイルの日本語で書いたアルバムやアーティストなどが文字化けしてしまっていました。
これはMediaTombがLatin-1以外の文字に対して使われることを想定していないためですが、不便と言うか気持ち悪いので、いろいろ調べてみました。その結果、何とか文字化けを解消して、MediatombでiTunes等で設定したアルバムやアーティスト情報を表示させることに成功しました。
詳しくは以下の通り。
まず、MediaTombではID3タグなどメタ情報を解釈するために、
の二つのライブラリをサポートしています。
どちらもC++用のライブラリですが、taglibはoggやflac用のタグなど、より広範なメタデータをサポートしているようです。
MediaTombデフォルトはid3libの方で、finkで入れた場合もこちらが使われています。
このid3libですが、いまいちUTF-16等の対応状況がよく分かりません。一方、taglibの方はUnicodeのサポートが正式に謳われていますので、こちらを使うことにしました。
ただし、MediaTomb自体もUnicodeの対応はちゃんと行われていません。そのため、MediaTombの一部を修正する必要があります。
とりあえず、finkで作業することを前提に、手順を示します。無理矢理なので悪しからず。
mediatombのインストール
一回はfink install mediatombで、MediaTombを最後までインストールしておきます。(そうしないと多分finkが混乱します。)
後々、これを修正していきます。
MediaTombのUnicode対応化
finkにMediaTombを再コンパイルさせ、configureが始まったところで、Ctrl-Cで止めます。
% sudo fink rebuild mediatomb ...(中略)... checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... no checking for mawk... no ^C
すると /sw/src/fink.build/mediatomb-0.10.0-1021 以下にmediatombのソースコードが展開されているので、そこで作業します。
% cd /sw/src/fink.build/mediatomb-0.10.0-1021/mediatomb-0.10.0/
src/metadata/taglib_handler.cc の121行目に、次のようにtrueを追加します。ちなみにこのtrueは、文字列をUTF-8で返すためのフラグです。
% sudo emacs src/metadata/taglib_handler.cc 120 if ((field != M_DATE) && (field != M_TRACKNUMBER)) 121 value = String((char *)val.toCString(true)); 122
MediaTombのconfigure & make & install
そして、taglibを使うように指定した上で、ビルド&インストール。最後の --with-taglib-cfg=/sw/bin/taglib-config がポイントです。
sudo ./configure --prefix=/sw --disable-dependency-tracking \ --with-js-h=/sw/include/js --with-js-libs=/sw/lib \ --with-iconv-h=/sw/include --with-iconv-libs=/sw/lib \ --disable-id3lib --enable-taglib \ --with-taglib-cfg=/sw/bin/taglib-config
ちなみに、mysql対応にするためには、以下のオプションも追加しましょう。パスはお使いの環境に適当に合わせてください。
--enable-mysql --with-mysql_config=/usr/local/mysql/bin/mysql_config
そして、makeしてインストール。
sudo make && sudo make install
設定の変更
iTunesは、例によってnormalization form Dで濁点や半濁点を記録するため、それに対応するため設定が必要です。
~/.mediatomb/config.xml の importセクションに、metadata-charset をUTF-8-MACにする設定をすればOKです。
... <import hidden-files="no"> <filesystem-charset>UTF-8-MAC</filesystem-charset> <metadata-charset>UTF-8-MAC</metadata-charset> ...
これがすんだら、いったんsqlite3のDBファイル(~/.mediatomb/mediatomb.db)やmysqlのテーブルを削除し、再度追加し直します。
以下mysqlの場合。
% mysql mediatomb -p -e 'drop table mt_autoscan,mt_cds_active_item,mt_internal_setting,mt_cds_object;' % mediatomb --add /Users/Shared/Media
追加が終わるまで結構掛かりますが、じっと待ちましょう。MySQLだとそこそこ速いです。
TagLib: String::prepare() - Invalid UTF16 string.
というエラーが出ることがありますが、どうやらtaglibのBOMの処理方法がマズいためのようです。幸いこれが出ても正常に追加されます。
その他
TagLib: MPEG::Header::parse() -- Invalid sample rate. TagLib: MPEG::Properties::read() -- Could not find a valid first MPEG frame in the stream.
などが出ますが、これらのエラーはよくわかりません。。