PythonでID3タグの取得・設定

Pythonでmp3のタグを扱うeyeD3モジュールを使ってみた。
eyeD3 — eyeD3 v0.7.1 (final)


公式サイトに載ってあるとおり使ってみると日本語を含むタグがうまく表示できなかったので、以下のサイトのとおりやってみるとうまくいった。tag.getArtist()が返す文字列をisinstance()してみるとunicode文字列であることがわかるが、これをそのまま表示しようとしても文字化けしてしまう。どうやらutf-8Unicode文字列はそのまま表示することができないらしい。ということはPythonが扱えるUnicode文字列というのはutf-16の文字列のことなのだろうか。なんだかひどくややこしい。


ファイルによってはタグの文字列がutf-16のものもあるので、これを同様にchr()で変換しようとするとValueErrorを送出する。utf-16は普通のUnicode文字列なのでencodeで変換する。



TARGETDIR以下のmp3ファイルのArtistを表示するテスト

# -*- coding: utf-8 -*-

import os,sys
import eyeD3

TARGETDIR = u"c:\\mp3"

def fix_str(s):
  try:
    #utf-8のunicode文字列を通常文字列に変換
    buf = "".join([chr(ord(x)) for x in s])
  except ValueError:
    #utf-16のunicode文字列が来たときはencodeで変換
    buf = s.encode("mbcs")
  return buf

def main():
  #TARGETDIR以下のフォルダとファイルを列挙
  for root,dirs,files in os.walk(TARGETDIR):
    
    #各フォルダのファイルを列挙
    for file in files:
      
      #ファイルの絶対パス取得
      path = os.path.join(root,file)
      
      #ID3v1/v2タグの取得
      tag = eyeD3.Tag()
      tag.link(path)
      artist = fix_str(tag.getArtist())
      
      if path.endswith(".mp3"):
        print path
        print "Artist = " + artist
        print [ord(x) for x in artist]
        
if __name__ == '__main__':
  main()