zoukankan      html  css  js  c++  java
  • 批量自动重命名音乐文件


    有个不好意思的坏习惯,经常在网上下载一些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)
    
  • 相关阅读:
    Python MySQL(SQL语句的补充3)
    Python MySQL(pymysql的使用day1)
    Python MySQL(SQL语句的补充2)
    Python MySQL(对外键使用方法的补充)
    Python MySQL(学习SQL语句)
    Python MySQL数据库的基本使用
    关于http响应内容压缩的一点小积累。
    同一账号,后一用户登录,前一个用户则被踢掉
    对序列化的学习。
    MySQL 函数积累
  • 原文地址:https://www.cnblogs.com/andrewwang/p/8536467.html
Copyright © 2011-2022 走看看