批量自動重命名音樂文件



有個不好意思的壞習慣,經常在網上下載一些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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM