清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#! /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"