MP3 のタグを Python から書き込む

英語のお勉強用の CD が手元にあり、MP3 を全て iTunes に取り込みました。この CD には英文が全て text file として含まれているので、せっかくだったら「歌詞」として MP3 に取り込みたいところです。そうすれば、iTunesiPod/iPhone から英文自体を参照できます。

ここに、Python を使って MP3 のタグを書き換える方法が載っていました。これを参照して、MP3 に歌詞などを書き込むことにします。ついでに、title、album、artist、track No. の全てを追加します。

使った CD は、ALL IN ONE という本に付属していたものです。

この CD には、Natural_419/{000..419}.mp3、Slow_419/{000..419}.mp3、data_allinone.txt といった file が含まれており、data_allinone.txt の中身は次のようになっています。

[001]
He grinned and said, “I make lots of money.  On weekdays I receive an average of 50 orders a day from all over the globe via the Internet.” 
彼はにっこり笑った/そして言った/「私は稼いでいる・たくさんのお金を。平日に/私は受け取っている・平均で50の注文を/一日当たり/地球の至る所から/インターネット経由で」 
彼はにっこり笑って「とても儲かっていますよ。平日はインターネット経由で世界中から1日平均50件の注文があるんです」と言った。 
[002]
“What does your son do?” “Well, he used to work for a multinational corporation, but unfortunately he is unemployed at the moment.” 
「何を・あなたの息子さんは(日頃)していますか?」「えーと/彼はかつては働いていました/多国籍企業のために/しかし/残念なことに/彼は雇われていません/現時点では」
「息子さんのご職業は何ですか?」「ええそれがですね,以前は多国籍企業に勤めていたのですが,残念ながら現時点では失業中なんです」 

使用した Python script は次の通りです。mutagen という package を使用しています。

from mutagen.id3 import ID3, USLT, TIT2, COMM, TALB, TPE1, TRCK
import codecs

lines = codecs.open("data_allinone.txt", "r", "shift_jis").readlines()

for i in range(419):
    num = lines[i*4 + 0]
    en_txt = lines[i*4 + 1]
    jp_txt1 = lines[i*4 + 2]
    jp_txt2 = lines[i*4 + 3]

    txt = en_txt + jp_txt1 + jp_txt2

    for fname in ("Natural_419/%03d.mp3" % (i + 1), "Slow_419/%03d.mp3" % (i + 1)):
        tags = ID3(fname)
        tags[u"USLT::'eng'"] = USLT(encoding=3, lang=u"eng", desc=u"desc", text=txt) # lyrics
        title = fname.split("_")[0] + (" %03d" % (i + 1))
        tags["TIT2"] = TIT2(encoding=3, text=title) # track title
        tags["TRCK"] = TRCK(encoding=3, text=["%d/419" % (i + 1)]) # track number
        tags["TALB"] = TALB(encoding=3, text=u"All in One") # album title
        tags["TPE1"] = TPE1(encoding=3, text=u"Linkage Club") # artist
        tags.save(fname)

読めば大雑把に分かると思いますが、MP3 を開いて、ID3 という class を使って色々なタグを上書きしています。