gstreamerを使うアプリ(Rhythmboxなど)で曲名の文字化けを直す方法

最近、私は livedoorの「ねとらじ」 で配信されている BLACK ANGEL 同人音楽 東方 SIDE や、初音ミク垂れ流し を良く聞いています。

Ubuntuを標準設定でインストールした場合、音楽再生ソフトとして Rhythmbox というソフトが入っています。このソフトはネットラジオも対応しているので、「ねとらじ」のラジオも PLAY ボタンを押してダウンロードされる m3u ファイルを Rhythmbox に渡せばラジオ局として登録され、再生することが出来ます。

ところが。

このように、曲名やラジオ局名が文字化けしてしまうのです。

今日のエントリはこの文字化けの対策のメモです。

原因

まずは真っ当に Rhythmbox の設定を一覧してみるものの、それらしい設定は見つからず。

mp3のタグを思い起こせばご存知の方も多いと思いますが、曲名などのタグ情報は、歴史的な経緯(とハッカーのいい加減な対応w)から、地域ローカルな文字コードが使われており、どの文字コードが使われているかを表す情報は載っていないのが普通です。

データ列から文字コードをある程度推定できるといえば出来るのですが、運の悪いことにヨーロッパ圏で一番使われている latin1 は日本語の半角カナ並に何でも食ってしまう文字コードなので、日本語であっても latin1 で読まれてしまうと即アウトです。

つまり、アプリはユーザーの言語環境などからうまく文字コードを推定してやる必要があるのです。

そういった事情から Rhythmbox が化けるのは Rhythmbox の対応不足だろう、とタカをくくって、 Rhythmbox のバックエンドを司る Gstreamer (Windows では DirectShow に相当する、メディアフレームワーク)を直接叩いて試してみたのですが、どうやら Gstreamer が返して来る時点でUnicode化されており、それが既に化けている様子でした。

仕方が無いので、 Gstreamer のソースコードをダイブして探してみると……

static gchar *
gst_icydemux_unicodify (const gchar * str)
{
  const gchar *env_vars[] = { "GST_ICY_TAG_ENCODING",
    "GST_TAG_ENCODING", NULL
  };

  return gst_tag_freeform_string_to_utf8 (str, -1, env_vars);
}

( http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/icydemux/gsticydemux.c?id=RELEASE-0.10.18 より)

これはラジオ局の情報を扱うエレメントのコードの一部ですが、これによると、GST_ICY_TAG_ENCODING や GST_TAG_ENCODING といった環境変数が設定されていると、その値の文字コードだと思って変換してくれるようです。 前者が、ネットラジオの放送局メタデータ専用なのに対し、後者は MP3のタグなども含めた全般に効きます。(ちなみに、MP3のID3タグの専用環境変数は GST_ID3_TAG_ENCODING です。)

解決方法

Rhythmbox を起動する前に環境変数 GST_TAG_ENCODING に、"CP932"(いわゆるShift_JISと呼ばれる物の正体*1 )と設定すれば、Gstreamer、ひいては、Rhythmbox はきちんと曲名などのTAGデータを扱えるようになります。

とりあえず、Rhythmboxを終了したうえで、ターミナル上で

$ export GST_TAG_ENCODING=CP932
$ rhythmbox

と打って試してみてください。

Gstreamerを使うすべてのアプリでこの設定を有効にさせたいなら、デスクトップのログイン時に自動的に設定させるようにするのが良いでしょう。

~/.xprofile ファイルに(無ければ作成して)以下の文言を追記すればOKです。

export GST_TAG_ENCODING=CP932

これで、次回ログイン時からはすべてのアプリでこの設定が有効になります。

*1:Shift_JISなどと指定したいのなら止めませんが、多分"〜"などの文字が化けるでしょう。