mp3 ID3 use python

来源:互联网 发布:软件功能 编辑:程序博客网 时间:2024/05/11 18:57

我都不知道给这货起个什么名字好……


话说,Michael Lees让我们写一个python程序,能够读取mp3中的ID3信息,例如什么作者,专辑,年份,等等~

研究了一上午……对着一堆HEX无语发愁……

对了……还好有sublime text 2~虽然不知道插件我是怎么装上的~但是用起来还是不错的~虽然卡了很多次,但我相信那是在运行……呵呵……


上一下部分的16进制代码……

算了……截图吧……


哈哈~造型不错~


继续……然后可以看到最右侧ID3 紧跟其后的  #v  我就一直不知道是个毛线……

TYER是百度百科告诉我的……年份,于是就可以用这个关键词来搜索了~

写到这里我突然想到一个修正代码的部分,待会放了代码再说~

__author__ = 'Lu Shengliang'import structdef check(st,length):    l = ''    for i in range(length-1):        l += 'b'    now = struct.unpack(l, st)    ans = ''    for i in now:        ans += chr(i)    return ansdef main():    fd = open('Yellow Submarine-The Beatles.mp3', 'rb')    s = ''    while len(s) < 100000:        c = fd.read(4)        #print(c)        s += str(c)        if 'IT' in str(c):            buffer = fd.read(4)            t = fd.read(1)            length = ord(t)            if length>10:                buffer = fd.read(3)                name = fd.read(length-1)                print("title: ", check(name, length))        elif 'TY' in str(c):            buffer = fd.read(5)            t = fd.read(1)            length = ord(t)            buffer = fd.read(3)            year = fd.read(length-1)            print("year: ", check(year, length))            buffer = fd.read(3)    #print(s)if __name__ == '__main__':    main()

我强烈的承认,这是我写的最丑的python代码……啊啊啊啊……受不了了……


大体意思就是为了找关键字,然后看看关键字后面几个空格之后跟随着的显示后面代码长度的空格(16进制下因为太短,没有对应的字符,依旧显示成为空格了)比如 5 或者 1d什么的~

接下来就是输出了

FormatC TypePython typeStandard sizeNotesxpad byteno value  ccharbytes of length 11 bsigned charinteger1(1),(3)Bunsigned charinteger1(3)?_Boolbool1(1)hshortinteger2(3)Hunsigned shortinteger2(3)iintinteger4(3)Iunsigned intinteger4(3)llonginteger4(3)Lunsigned longinteger4(3)qlong longinteger8(2), (3)Qunsigned long longinteger8(2), (3)nssize_tinteger (4)Nsize_tinteger (4)ffloatfloat4(5)ddoublefloat8(5)schar[]bytes  pchar[]bytes  Pvoid *integer (6)来源python.org


import structstruct.unpack(fmt, buffer)

Unpack from the buffer buffer (presumably packed by pack(fmt, ...)) according to the format string fmt. The result is a tuple even if it contains exactly one item. The buffer must contain exactly the amount of data required by the format (len(bytes) must equal calcsize(fmt)).

我只能说……真的是python2和python3不一样……之前这个buffer位置是个string,如今成了bytes……害得我错了好久……

然后用这个struct.unpack就可以把讨厌的16进制转成了普通的 ASCII, chr一下就好了~


我想到的改进就是每次都把当前的c填补到4 bytes. 如果没用,就把第一个byte删掉,重复循环。

这样就能避免  因为 ID3结构不像之前什么30-byte title这样规整而产生的错误了。

下次再说吧……等看看Michael 给我们讲的好不好了……

讲的精彩那我再考虑重新写写……咩……承认一直以来都很懒,不认真…… 

Unpack from the buffer buffer (presumably packed by pack(fmt, ...)) according to the format string fmt. The result is a tuple even if it contains exactly one item. The buffer must contain exactly the amount of data required by the format (len(bytes) must equal calcsize(fmt)).


本来想上michael 的code呢……结果人家不放……

好吧~
简单说说……
他就是提取,然后seek(-128, 2)到达倒数128个位置,然后读取tag,读取各种信息……

话说他把byte类型的数据转换出来的水平真低……
原创粉丝点击