批量自动重命名音乐文件

有个不好意思的坏习惯,经常在网上下载一些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 条评论
登录 后参与评论

相关文章

来自专栏编程一生

系统的稳定性建设

1732
来自专栏双十二技术哥

Android性能优化(八)之网络优化

移动互联网发展到现在,用户的联网方式已经完成了由流量依赖到Wifi依赖的转变。虽然网络环境在变好,但也对网络的应用提出了更高的要求,同时开发人员对网络的重视度却...

1083
来自专栏Netkiller

协议测试

协议测试 May 9, 2016 协议测试 What 什么是协议测试 什么事协议? 协议是计算机进程或网络中进行数据交换而建立的规则、标准或约定的集合。 什么是...

3785
来自专栏大魏分享(微信公众号:david-share)

一张图简介分布式架构架全貌

前言: 本文在书写之前,拜读了张开涛:《亿级流量网站架构核心技术》一书,该书写的系统性很强,建议购买阅读。 本文仅代表个人观点。 本文通过一张图,将分布式开源技...

4747
来自专栏FreeBuf

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

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

2637
来自专栏编程一生

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

1151
来自专栏张善友的专栏

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

1435
来自专栏FreeBuf

VM真的比Container更安全吗?

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

3385
来自专栏技术杂文

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

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

923
来自专栏张善友的专栏

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

1716

扫码关注云+社区