MediaTomb メタ情報の文字化け解消編

MacからPS3にメディアを送信するためのDLNAサーバとして、Mediatombをインストールしていましたが、これまでMP3ファイルの日本語で書いたアルバムやアーティストなどが文字化けしてしまっていました。

これはMediaTombがLatin-1以外の文字に対して使われることを想定していないためですが、不便と言うか気持ち悪いので、いろいろ調べてみました。その結果、何とか文字化けを解消して、MediatombでiTunes等で設定したアルバムやアーティスト情報を表示させることに成功しました。

詳しくは以下の通り。

まず、MediaTombではID3タグなどメタ情報を解釈するために、

の二つのライブラリをサポートしています。
どちらもC++用のライブラリですが、taglibはoggflac用のタグなど、より広範なメタデータをサポートしているようです。

MediaTombデフォルトはid3libの方で、finkで入れた場合もこちらが使われています。

このid3libですが、いまいちUTF-16等の対応状況がよく分かりません。一方、taglibの方はUnicodeのサポートが正式に謳われていますので、こちらを使うことにしました。
ただし、MediaTomb自体もUnicodeの対応はちゃんと行われていません。そのため、MediaTombの一部を修正する必要があります。
とりあえず、finkで作業することを前提に、手順を示します。無理矢理なので悪しからず。

mediatombのインストー

一回はfink install mediatombで、MediaTombを最後までインストールしておきます。(そうしないと多分finkが混乱します。)
後々、これを修正していきます。

taglibのインストー

普通にfinkでインストールします。

% sudo fink install taglib

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.

などが出ますが、これらのエラーはよくわかりません。。

これでとりあえず、動くようです。