2009年 05月 22日

コマンドラインのmp3 id3 タグ編集ツール

linux のコマンドラインで id3v2 を編集するやつってたくさんある割にろくなものがなくて、文字化けしたり正しいフォーマットで書きこめなかったりするのだけど、とりあえず使える方法を見つけたのでメモ

eyeD3 をとりあえず使う。python で書かれた id3 タグ編集ツール。そこそこよくできているけど、正しく文字コードを扱わない。

$ echo $LANG
ja_JP.UTF-8

$ eyeD3 --version
eyeD3 0.6.14 (C) Copyright 2002-2007 Travis Shirk <travis@pobox.com>

$ eyeD3 --set-encoding=utf16-LE --to-v2.3 --artist "ふー" --title "ばぁー" foo.mp3 
foo.mp3 [ 6.01 MB ]
--------------------------------------------------------------------------------
Time: 6:34      MPEG1, Layer III        [ 128 kb/s @ 44100 Hz - Joint stereo ]
--------------------------------------------------------------------------------
Setting artist: ふー
Setting title: ばぁー
Converting tag to ID3 version v2.3
Writing tag...
ID3 v2.3:
title: ã°ãã¼          artist: ãµã¼
album:          year: None
track:  

UserTextFrame: [Description: Tagging time]
2009-05-21T15:39:24

というふうに、頑張って書いてくれるのはいいけど、自分で書いたやつをちゃんと読みだせていない。

とりあえず決め打ちでちゃんと書けてくれさえすればいいので

#!/usr/bin/env python

import eyeD3
import os, sys
from optparse import OptionParser

parser = OptionParser(usage=u'%prog [opts] target.mp3')
parser.add_option("-T", "--title",
    dest   = "title",
    action = "store",
    type   = "string",
)
parser.add_option("-A", "--artist",
    dest   = "artist",
    action = "store",
    type   = "string",
)
parser.add_option("-L", "--album",
    dest   = "album",
    action = "store",
    type   = "string",
)

(options, args) = parser.parse_args(sys.argv[1:])
if not len(args) == 1:
    sys.stderr.write("requires target.mp3")
    exit();
target = args[0]

tag = eyeD3.Tag()
tag.link(target)
tag.header.setVersion(eyeD3.ID3_V2_3)
tag.setTextEncoding( eyeD3.UTF_16_ENCODING )

if options.title:
    tag.setTitle( unicode(options.title, 'UTF-8') )
if options.artist:
    tag.setArtist( unicode(options.artist, 'UTF-8') )
if options.album:
    tag.setAlbum( unicode(options.album, 'UTF-8') )

tag.update()

os.execlp("eyeD3", "", target)

というのを非常に頑張って書いた。Python 無理です。

なんかこれだと foobar2000 で場合によって文字化けする。なんなんだろ…… 判定に失敗するんだろうか。

firefly (mt-daap) だと大丈夫なんだけどなぁ。なんで id3 をまともに付けられる/読める環境になってないんだろ