rhythmbox library converter

むかし使ってたmp3のファイルなどを、ubuntuのrhythmboxに食わせてみたところ、激しく文字化けしてしまいました...。Shift_JISはダメなのね。

探してみたところ、rhythmboxが使用してるxmlファイルを単純にShift_JISからUTF8に変換してくれるスクリプトは見つかりました。でも、うちの環境は、タグの中がUTF8になってるAACのファイルと、Shift_JISで記述されてるMP3のファイルが混在してて...

とりあえず、上記のスクリプトをカスタマイズして、ファイル名の拡張子で変換するかどうか判断するスクリプトをでっち上げてみた。

#!/usr/bin/perl
# rhythmbox変換スクリプト

use Encode qw(encode decode :fallbacks); #エンコード用のperlライブラリ?

while (<>) {
    if (/<entry type=/) {
        @buffer = ($_);
        $loc="";
        $conv_flg=0;
        while(<>) {
            push @buffer,$_;
            if (/<location>/ && /\.mp3/i) {
                $conv_flg=1;
            }
            if (/<\/entry>/) {
                last;
            }
        }
        while($#buffer) {
            $_=shift(@buffer);
            if($conv_flg) {
                if (/<artist>/ || /title/ || /genre/ || /album/)
                    $_=&conv_utf($_);
                }
            }
            print;
        }
        # add last
        print "</entry>\n";
    } else {
        print;
    }
}
exit;

sub conv_utf {
    shift;
    # Shift_JISの文字参照をバイナリに戻す
    s/\&\#x([0-9A-Fa-f]{2});/pack 'C', hex($1)/ge;
    # UTF-8に変換
    $str=decode('Shift_JIS', $_);
    $str=encode('ascii',$str,FB_XMLCREF);
    return $str;
}

元ネタからはだいぶかけ離れてるけど、まあ気にしない。

このスクリプトを使って$HOME/.gnome2/rhythmbox/rhythmdb.xmlを変換してあげればOKだけど、バックアップとり忘れてファイルがこわれちゃっても責任は持ちませんよ。