批量自动重命名音乐文件

有个不好意思的坏习惯,经常在网上下载一些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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程一生

美团点评智能支付核心交易系统的可用性实践

1311
来自专栏FreeBuf

极客DIY:用树莓派制作低成本高清监控摄像机

本文将为大家展示一款高清监控摄像机的DIY过程,且相较于其市场价,本次DIY的花费不到其十分之一。另外通过该摄像机,你可以随时从浏览器或者手机中查看监控区域的画...

3067
来自专栏DevOps时代的专栏

大型分布式团队的集中化持续交付

持续集成是一种软件开发实践,即团队开发成员集成他们的工作,通常每个成员每天至少集成一次,随着对自动化要求的不断提高,需要自动化构建来完成的应用也越来越多,此问题...

691
来自专栏FreeBuf

VM真的比Container更安全吗?

理论上来说,是的。但在工作实践中,那可就不一定了。 ? 写在前面的话 我们经常会说,“HTTPS是安全的”或者“HTTP是不安全的”。但其实我们想表达的是,“H...

3525
来自专栏技术杂文

你信任的公司正在窃取你的信息

通常来讲,“购买新产品” 指的是这样的交易过程:购买食物时,可以先确认食材然后购买它,即使难吃也不会要了你的命;购买汽车时,首先它得符合所有安全标准;为特定目的...

1013
来自专栏张善友的专栏

业务配置开发平台qMISPlat 2.0 产品介绍

1585
来自专栏逸鹏说道

数据库高可用实战案例

原文链接:http://www.cnblogs.com/double-K/p/5803956.html 说到高可用,看官们会想到很多方案,也许是自亲身经历过系统...

3417
来自专栏腾讯移动品质中心TMQ的专栏

论Android适配踩到的坑

说起Android适配,恐怕是每一个Android开发/测试工程师心里的痛,且不论Android设备品牌众多、分辨率各异等痛点,单论Android版本的繁多也会...

3398
来自专栏张善友的专栏

业务配置开发平台qMISPlat 2.0 产品介绍

1976
来自专栏CSDN技术头条

ButterCMS架构:完成数百万次调用的关键任务API

原文:ButterCMS Architecture: A Mission-Critical API Serving Millions Of Requests P...

2306

扫码关注云+社区