批量自动重命名音乐文件

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

相关文章

来自专栏编程一生

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

每个系统都有它最核心的指标。比如在收单领域:进件系统第一重要的是保证入件准确,第二重要的是保证上单效率。清结算系统第一重要的是保证准确打款,第二重要的是保证及时...

22530
来自专栏施炯的IoT开发专栏

Microsoft IoT Starter Kit 开发初体验

1. 引子     今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter Kit ,并且免费...

289100
来自专栏猿人谷

如何学习linux操作系统

一、 选择适合自己的linux发行版 谈到linux的发行版本,太多了,可能谁也不能给出一个准确的数字,但是有一点是可以肯定的,linux正在变得越来越流行,...

511100
来自专栏编程一生

系统的稳定性建设

27120
来自专栏DevOps时代的专栏

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

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

10810
来自专栏FreeBuf

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

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

43470
来自专栏FreeBuf

VM真的比Container更安全吗?

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

37850
来自专栏张善友的专栏

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

23160
来自专栏Java进阶干货

三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构

分布式数据库,已经进入了全面快速发展阶段,这种发展,是与时俱进的,与人的需求是分不开的,因为现在信息时代的高速发展,导致数据量和交易量越来越大。这种现象首先导致...

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

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

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

59170

扫码关注云+社区

领取腾讯云代金券