下面例子为 m4a 和 mp3 的 tag 处理。
注意,对于mp3,可能同时有多种 tag. 比如 mp3 文件同时有 apev2, id3v2, id3v1。这些 tag 存放的东西不一定一致。音乐播放软件会优先选取 apev2,然后是 id3v2。
用 python处理时也一样要看看有没有 apev2(用 foobar 看看文件有哪种 tag)。
第二个例子是 apev2的例子。
unicode 的幽灵
今天碰到一件怪事,下载了mp3,想修改名字为 tracknumber.ttitle
以“改变”为例
用python读取title,发现是
t = u'\xb8\xc4\xb1\xe4'
没有怀疑
t.encode('gbk')
报错,很郁闷,查了一个小时才知道怎么回事
原来,正确应该是
u'\xb8c4\xb1e4'
可能是转码的时候,把两个unicode字符,分成4个unicode字符了
修复技巧,foobar 选取,修改tag,随便修改一项
会改成 u'\xb8c4\xb1e4'
# -*- coding: utf-8 -*- from mutagen.m4a import M4A import sys import os import shutil def get_trkn(musicfile): ''' read track number from music file ''' audio = M4A(musicfile) if audio.has_key('trkn'): return audio['trkn'][0] else: return -1 def preZero(num, bits): ''' prefix a num with zeros, output a string of bits digits E.g., preZero(13, 4) --> 0013 ''' return str(num).rjust(bits, '0') if __name__ == '__main__': cwddir = os.getcwd() print 'Write the fold path to fold.txt' srcdir = open('fold.txt').readline() if os.path.exists(srcdir): currsrcdir = srcdir dirList=os.listdir(currsrcdir) for fname in dirList: if fname.endswith('.m4a'): #print fname trkn = get_trkn(os.path.join(currsrcdir, fname)) pre = preZero(trkn, 2) newfname = pre + '.' + fname shutil.move(os.path.join(currsrcdir, fname), os.path.join(currsrcdir, newfname)) else: print 'can not open ' + srcdir
''' 读取一个目录下的 mp3 文件的 album,建立album文件夹,把mp3文件放入文件夹。 适合将多个 album 的音乐分开。 ''' from mutagen.apev2 import APEv2 as MUSIC import sys import os import shutil def get_trkn(musicfile): ''' read track number from music file ''' audio = MUSIC(musicfile) if audio.has_key('trkn'): return audio['trkn'][0] else: return -1 def get_album(musicfile): ''' read track number from music file ''' audio = MUSIC(musicfile) if audio.has_key('Album'): # audio['Album'].__getitem__(0) is unicoded, some of the unicode cannot be encoded in gbk, so use ignore return audio['Album'].__getitem__(0).encode('gbk','ignore') else: return -1 def preZero(num, bits): ''' prefix a num with zeros, output a string of bits digits E.g., preZero(13, 4) --> 0013 ''' return str(num).rjust(bits, '0') if __name__ == '__main__': cwddir = os.getcwd() print('Write the fold path to fold.txt') srcdir = open('fold.txt').readline() if os.path.exists(srcdir): currsrcdir = srcdir dirList=os.listdir(currsrcdir) for fname in dirList: if fname.endswith('.mp3'): fullname = os.path.join(currsrcdir, fname) print fullname album = get_album(fullname) #print album albumdir = os.path.join(currsrcdir, album) #print albumdir if not (os.path.exists(albumdir) and os.path.isdir(albumdir)): os.mkdir(albumdir) shutil.move(os.path.join(currsrcdir, fname), albumdir) else: print('can not open ' + srcdir)
0 comments:
Post a Comment