有個不好意思的壞習慣,經常在網上下載一些MP3音樂,大家可別學我,請努力支持正版。
很多不同時間、不同來源的MP3,一般采用了不同的命名規則,或者干脆就是混亂的命名,比如一串誰也看不懂的數字,感覺這些起名字的人實在是不走心。
但管理起來或者欣賞起來,這些雜亂的名字就實在太令人惱火了。自己寫了一個小程序,讀取MP3音樂中的標簽(Taginfo)信息,這些信息一般是壓制MP3的時候直接從CD中得到並且保存到MP3文件的,然后用這些信息重新命名MP3文件,我當前采用的方式是“藝術家+曲名.mp3”,源碼內很清楚,如果有不同的需求可以自己再修改。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#usage: ./mp3rename.py ~/mp3/*mp3
#prepare: pip install mutagen
import sys
import os
import locale
import re
from struct import *
from optparse import OptionParser
from mutagen.mp3 import MP3
def hexdump(s):
for b in xrange(0, len(s), 16):
lin = [c for c in s[b : b + 16]]
hxdat = ' '.join('%02X' % ord(c) for c in lin)
pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)
print ' %04x: %-48s %s' % (b, hxdat, pdat)
print
def ustr2str(s):
tstr = b''
for c in s:
n=ord(c)
tstr = tstr+chr(n)
return tstr
def gb2utf(sstr):
return ustr2str(sstr).decode('gbk').encode('utf-8')
def muReadMp3ID(filename):
audio = MP3(filename)
if 'TPE1' in audio:
s1Artist=audio['TPE1'].text[0]
else:
s1Artist=""
if 'TIT2' in audio:
s1Title=audio['TIT2'].text[0]
else:
s1Title=""
try:
sArtist=gb2utf(s1Artist)
sTitle=gb2utf(s1Title)
except:
sArtist=s1Artist
sTitle=s1Title
if sTitle=="":
sTitle=os.path.splitext(os.path.basename(filename))[0]
#print audio["TRCK"].text[0]
sArtist=sArtist.replace('/','_')
sTitle=sTitle.replace('/','_')
pathname=os.path.dirname(filename)
if pathname != "":
newname=pathname+"/"+sArtist+"_"+sTitle+".mp3"
else:
newname=sArtist+"_"+sTitle+".mp3"
newname = re.sub('[: ]','_',newname)
print filename," => ",newname
os.rename(filename,newname)
def main(argv):
parser = OptionParser()
(options, args) = parser.parse_args(argv[1:])
if not args:
raise SystemExit(parser.print_help() or 1)
for filename in args:
muReadMp3ID(filename)
if __name__ == "__main__":
main(sys.argv)
因為使用了mutagen代碼包,所以使用之前要先安裝一下pip install mutagen
。另外要注意,有個別歌曲內置就沒有taginfo,當然現在這種情況很少見,我只見過2首特別情況,這種情況的話,程序將只在源文件名之前增加"_"。
很多使用目前比較火的音樂app下載的歌曲,后綴是m4a,是MP4標准中的音頻格式。這種方式有很多優點,諸如壓縮率更高、同樣容量音質更好,可以加密等等,這里不做技術科普,網上有很多。然后為了應對這種文件的情況,改寫了類似程序來完成m4a文件的批量改名,考慮很多的隨身聽實際上是以mp3為主的,這里就不合並到一個程序了。m4arename.py分享如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#./m4arename.py ~/m4a/*
#prepare: pip install mutagen
import sys
import os
import locale
import struct
from optparse import OptionParser
from mutagen.mp4 import MP4
def hexdump(s):
for b in xrange(0, len(s), 16):
lin = [c for c in s[b : b + 16]]
hxdat = ' '.join('%02X' % ord(c) for c in lin)
pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)
print ' %04x: %-48s %s' % (b, hxdat, pdat)
print
def ustr2str(s):
tstr = b''
for c in s:
n=ord(c)
tstr = tstr+chr(n)
return tstr
def gb2utf(sstr):
return ustr2str(sstr).decode('gbk').encode('utf-8')
def m4afilename(filename):
if not filename.endswith('.m4a'):
print "Error filetype, only .m4a allowed"
return
audio=MP4(filename)
stitle=audio['\xa9nam'][0]
sartist=audio['\xa9ART'][0]
newfilename=sartist+stitle+".m4a"
newfilename=newfilename.replace("/","-")
print "["+newfilename+"]"
os.rename(filename,newfilename)
#os.system(doCmdStr)
def main(argv):
parser = OptionParser()
(options, args) = parser.parse_args(argv[1:])
if not args:
raise SystemExit(parser.print_help() or 1)
for filename in args:
m4afilename(filename)
if __name__ == "__main__":
main(sys.argv)