pythonでid3タグ(アルバム画像)

mp3とかの再生情報を表示させようと思って、
1年ぶりくらいにSamurizeを復活させてみた。
さしあたって今使っているfoobar2000の状態を表示させてみた。
http://samurize.xworks.org/wiki/?cmd=read&page=Introduction%2F%E3%83%97%E3%83%AC%E3%83%BC%E3%83%A4%E3%83%BC%E5%86%8D%E7%94%9F%E6%83%85%E5%A0%B1&word=ampi

まずは、曲名とか再生のプログレスバーの表示までは成功。
順調であります。
画像も表示させてみる。全然違う画像が出る。
これは、id3タグ内に埋めてあるのを表示するんで無くて
オンラインからダウンロードしてくる仕様ですな。
なんで埋め込み画像表示機能は無いのだろぅ・・・


せっかくなので、ampiから取ったファイルパスを元に
pythonスクリプトを活用して自前でなんとすることにした。
id3libをctypesで使う方針で活動開始。

  • CDLLとWinDLLを間違っていて頓挫。
  • id3lib-3.8.3のunicodeバグで頓挫。
  • unicodeバグのパッチを当てた自前ビルドが落ちる件で頓挫。

かくしてid3libを諦めた。


仕方が無いので、画像フレームに対応した別のライブラリを探す。
で、eyeD3にたどり着く。


先人のログを参考にしつつ
http://sun.ap.teacup.com/applet/futot/msgcate2/archive
なんとか画像を抜き出して保存するスクリプトまで辿り着いた。

# -*- coding: utf8 -*-
import string
import eyeD3

def printID3(file):
  print "## %s" % (file)
  tag = eyeD3.Tag()
  tag.link(file)
  print fixEncoding(tag.getArtist())
  print fixEncoding(tag.getAlbum())
  print fixEncoding(tag.getTitle())
  tag.getImages()[0].writeFile()

def fixEncoding(buf, encoding='cp932'):
  rowstr =  string.join( [ chr(ord(x)) for x in buf ], "")
  return unicode(rowstr, encoding)


if __name__ == '__main__':
  file=u'test.mp3'

  printID3(file)

eye3Dは素だとタグがasciiもしくはunicodeの時のみ正常に動作するっぽい。
我が国伝統のsjisタグはだめ。
pythonでの文字コード変換とかunicodeの扱いについてのクンフーを積んだ。