- #! /usr/bin/env python
- # encoding: utf8
- import sys
- import os
- import binascii
- import json
- def getId3Info(fp):
- id3Tags = []
- frameIds = ['AENC', 'APIC', 'COMM', 'COMR', 'ENCR', 'ETC0', 'GEOB', 'GRID', 'IPLS',
- 'MCDI', 'MLLT', 'OWNE', 'PRIV', 'PCNT', 'POPM', 'POSS', 'RBUF', 'RVAD',
- 'RVRB', 'SYLT', 'SYTC', 'TALB', 'TBPM', 'TCOM', 'TCON', 'TCOP', 'TDAT',
- 'TDLY', 'TENC', 'TEXT', 'TFLT', 'TIME', 'TIT1', 'TIT2', 'TIT3', 'TKEY',
- 'TLAN', 'TLEN', 'TMED', 'TOAL', 'TOFN', 'TOLY', 'TOPE', 'TORY', 'TOWM',
- 'TPE1', 'TPE2', 'TPE3', 'TPE4', 'TPOS', 'TPUB', 'TRCK', 'TRDA', 'TRSN',
- 'TRSO', 'TSIZ', 'TSRC', 'TSSE', 'TYER', 'TXXX', 'UFID', 'USER', 'USLT',
- 'WCOM', 'WCOP', 'WOAF', 'WOAR', 'WOAS', 'WORS', 'WPAY', 'WPUB', 'WXXX']
- fp.read(10)
- while True:
- id3Info = {}
- tag = fp.read(4)
- if tag not in frameIds:
- break
- sizePos = fp.tell()
- binSize = fp.read(4)
- size = int(binascii.b2a_hex(binSize), 16)
- fp.read(2)
- conPos = fp.tell()
- cont = fp.read(size)
- id3Info['sizePos'] = sizePos
- id3Info['size'] = size
- id3Info['tag'] = tag
- id3Info['conPos'] = conPos
- id3Info['con'] = cont
- id3Tags.append(id3Info)
- return id3Tags
- def getCon(id3Info, tag):
- for info in id3Info:
- if tag == info['tag']:
- return info['con']
- def getConPos(id3Info, tag):
- for info in id3Info:
- if tag == info['tag']:
- return info['conPos']
- def getConSize(id3Info, tag):
- for info in id3Info:
- if tag == info['tag']:
- return info['size']
- def getConSizePos(id3Info, tag):
- for info in id3Info:
- if tag == info['tag']:
- return info['sizePos']
- def writeInfo(path, tag, newCon):
- fp = open(path, 'rb')
- id3Info = getId3Info(fp)
- fp.seek(0)
- oldCon = getCon(id3Info, tag)
- size = getConSize(id3Info, tag)
- sizePos = getConSizePos(id3Info, tag)
- tmpSize = str(len(newCon) + 1)
- while(len(tmpSize) < 8):
- tmpSize = '0' + tmpSize
- newSize = binascii.a2b_hex(tmpSize)
- split = binascii.a2b_hex('0000')
- newCon = binascii.a2b_hex('00') + newCon
- pre = fp.read(sizePos)
- fp.seek(getConPos(id3Info, tag) + size)
- last = fp.read()
- newFile = pre + newSize + split + newCon + last
- p,n = os.path.split(path)
- b,l = os.path.splitext(n)
- newPath = os.path.join(p, b + "_" + newCon.strip('\\x00') + l)
- newFp = open(newPath, 'wb')
- newFp.write(newFile)
- newFp.close()
- fp.close()
- return newPath
- if __name__ == '__main__':
- if len(sys.argv) < 3:
- print "用法: getGenre.py 新的genre mp3文件"
- exit()
- newCon = sys.argv[1]
- abspath = os.path.abspath(sys.argv[2])
- ret = writeInfo(abspath, "TCON", newCon)
- print ret + " OK"
- #该片段来自于http://www.codesnippet.cn/detail/1203201511855.html
来源: http://www.codesnippet.cn/detail/1203201511855.html