前回はこれ
コマンドラインで渡す関係上UTF-16の適用を諦めてUTF-8でID3v2.4のタグを作ったのだが, PSPでは問題なかったものの手持ちのICプレイヤーが対応してなかったので再考, 因みにWindows Media Playerもv2.4には対応していない
前回使ったid3v2コマンドはid3libを使っていたのだが, このライブラリ自体がかなりクズである予感がしてきたので他の方法を試すことにした
というのも, id3libで任意のフィールドの内容を参照するID3_GetString APIのソースを見たら, 無理やりマクロ定数がこうなってたのでこう書いたけど, 実際は多分latin-1"ASCII"に内部構造を変換して文字列を得た後に元のエンコードに再変換していた, これでは当然Latin-1に入らない文字は全部壊れるわけで, この時点でLatin-1以外のロケールを一切考えてない作りであると分かった
まぁ2003年で開発がとまってるものだし仕方が無いとも言えるかな, そもそも継続して開発が続けられる類のものでもないけど…
さて, RhythmboxとかはどうやってID3を読んでいるのかと思って調べてみるとtaglibというものを使っているらしい
これはID3やVorbisCommentなどのタグを同じインタフェースで読み書きできるものらしい
実際CPANにもAudio::TagLib
があり, そこそこ使えそうな模様
ただ, 複数のタグ形式に対応するため必然ではあるが, ライブラリが対応していないタグを埋める方法がない
id3v2の--T???オプションとか, oggencの-cオプションの相当品がないのである
これは通常は問題ないだろうが, 何か痒いところに手が届かなくなった瞬間にまた彷徨うのもアレだなと…
他にもID3ではオプションとして総トラック数を分数の形で書けるトラック番号とかの分母を書けないとか細かいところに手が届かないところがあったり
ということで, なんだかんだ言ってID3v2.3.0の仕様書は一通り読んでしまったので結局PerlでUTF-16な直接タグを生成することに, ビバ車輪の再発明
ついでにこんな問題も見つけたので, ついでにTLENフィールドも埋めることにした
方針としてはそれぞれのフィールドについてこれは(use localeしてない場合)Cのisprint()が0を返す, つまりASCIIの範囲に入っていない文字にマッチする[[:^print]]に引っかかる文字が入っていたらPerlのEncodeモジュールはUTF-16と指定するとBOMつきのUTF-16BEで出力するUTF-16にエンコードし, UTF-8と違ってUTF-16はASCIIでもバイト数を馬鹿食いするので不要なところには使わないことにした入ってなければASCIIで出力, あとはid3v2.3.0の規格に合うように適宜ごちゃごちゃしておしまい
タグを読めないソフトがタグをMP3の同期信号と誤認するのを防ぐための場当たり的なエスケープ処理非同期化が面倒そうだったけど, ID3v2.3.0を解するソフトなら使っては居ないが某プレイヤーは逆に非同期かをするとタグを読めなくなるらしいやらなくても良さそうな雰囲気だったので今回は無視
で, 再生してみると軒並みまともに動いてくれている模様なので, これでおしまいかと思ってWindowsに移り, 開いてみるとどうも日本語タイトルだけ認識しない模様
まさかと思ってバイナリエディタでエンディアンを逆転させてみると認識される…
なんでBOMいれてるのにLittle Endianを強制するのかなWMP君は…
ということでLEで出力されるように修正して終了, スクリプトは気が向いたときにアップする予定
それにしてもPSPはともかく3年前に安売りされてた携帯音楽プレイヤーにも後れを取るWMPって…
Comments (0):
FalcomのPC次作は『ZWEI II』だそうで, 期待なのです
これ, ドイツに行ったらなんて呼ばれるんだろう? まぁ行かないだろうから問題ないけど
Comments (0):