import os,base64,struct
#这是python代码,用于获取mp3部分信息。
#编写者:SDY

#判断IDV2是否存在
def IDV2_exsist(mp3_file):
    b_data=mp3_file.read(3)
    a_data=b_data.decode('ASCII')
    if a_data=='ID3':
        return True
    else:        
        return False

#获取IDV2大小
def get_IDV_Size(mp3_file):
    mp3_file.seek(6)
    data=mp3_file.read(4)
    int_data=struct.unpack('>BBBB',data)
    all_size=int_data[0]*2*16**5+int_data[1]*4*4*16**2+int_data[2]*8*16+int_data[3]+10
    return all_size

#判断信息是否有价值
def judge_value(mp3_file,N):
    mp3_file.seek(N)
    value=mp3_file.read(4)
    if value==b'\x00\x00\x00\x00':
        return True
    else:
        return False

#获取数据种类
def get_type(mp3_file,N):
    mp3_file.seek(N)
    b_type=mp3_file.read(4)
    a_type=b_type.decode('ASCII')
    return a_type

#获取数据帧大小
def get_size(mp3_file,N):
    mp3_file.seek(N+4)
    b_size=mp3_file.read(4)
    number=struct.unpack('>BBBB',b_size)
    size=number[0]*16**8+number[1]*16**4+number[2]*16**2+number[3]+10
    return size

#获取数据编码方式
def get_code_style(mp3_file,N):
    mp3_file.seek(N+10)
    temp=mp3_file.read(1)
    temp=struct.unpack('>B',temp)
    if temp[0]==0:
        code_style='ISO-8859-1'
    elif temp[0]==1:
        code_style='UTF-16'
    elif temp[0]==2:
        code_style='UTF-16BE'
    elif temp[0]==3:
        code_style='UTF-8'
    return code_style

#获取具体信息
def get_message(mp3_file,code_style,N,size):
    mp3_file.seek(N+11)
    eb_data=mp3_file.read(size-11)
    ea_data=eb_data.decode(code_style)
    return ea_data

#获取mp3信息
def IDV2_GET_MESSAGE(mp3_file,file_name):
    ms_dic={'TIT2':'未知','TPE1':'未知','TALB':'未知','TYER':'未知'}
    global B
    B=0
    lis=['TIT2','TPE1','TALB','TYER']
    N,size=10,0
    if not IDV2_exsist(mp3_file):
        print('error')
        global A
        A=file_name
        B=1
    else:
        all_size=get_IDV_Size(mp3_file)
        while True:
            N=size+N
            if judge_value(mp3_file,N):
                break
            kind=get_type(mp3_file,N)
            size=get_size(mp3_file,N)
            if kind in lis:                
                code_style=get_code_style(mp3_file,N)
                message=get_message(mp3_file,code_style,N,size)
                ms_dic[kind]=message
    return ms_dic

#错误文件处理
def error_delete(error_list1,error_list2,delete_X,path):
    if delete_X=='Y':
        for file in os.listdir(path):
            if file in error_list1:
                file_path=path+'\\'+file
                print(f"delete {file} succeed.")
                os.remove(file_path)
            if file in error_list2:
                file_path=path+'\\'+file
                print(f"{file} delete successfully.")
                os.remove(file_path)

#主函数
print('TLT2:标题,TPE1:作者,TALB:专辑,TYER:年代')
n,m,mn=0,0,0
error_list1=[]
error_list2=[]
#文件路径获取
path='F:\\Temp'
for file in os.listdir(path):
    address=path+'\\'+file 
    mp3_file=open(address,'rb')
    try:        
        dic=IDV2_GET_MESSAGE(mp3_file,file)
    except:
        error_list2.append(file)
    else:
            a1=dic['TIT2']
            a2=dic['TPE1']
            a3=dic['TALB']
            a4=dic['TYER']
            value=a1+','+a2+','+a3+','+a4+','+address
            print(value)
            n+=1
    m+=1
    if B==1:
        error_list1.append(A)
        B=0
        mn+=1
    mp3_file.close()    
print(f'成功录入 {n} 首;共 {m} 首 ')
if error_list1:
    print('以下歌曲不存在IDV2标签:')
    print(error_list1)
if error_list2:
    print('以下歌曲解析失败:')
    print(error_list2)
if error_list1 or error_list2:
    delete_X=input('如果你想删除有问题的歌曲,请输入 Y :')
    error_delete(error_list1,error_list2,delete_X,path)

os.system('pause')

获取mp3部分信息的python代码相关推荐

  1. python获取mp3音频数据,python 读取音频文件的详细信息

    有一项测试的需求是判断录像是否和预期一致,检查项是:分辨率.录像时长等内容 文件的详细信息.png os模块有一个stat()方法 st_mode: inode 保护模式 st_ino: inode ...

  2. 获取clientheight为0_用10行python代码获取全国城市交通生活圈

    今天在网上冲浪看到一个很花哨的数据,全国各城市主要商圈从早上6点到晚上10点的20min,30min,45min,60min,90min生活圈轮廓. 1 获取思路 按下F12 按下F12,点击淮海路可 ...

  3. 数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)

    数据结构之二叉查找树的代码实现 本节继续对上一节BST的功能实现 在实现之前,先对要实现的功能进行一下简单的介绍 BST的几种常见遍历方式 以一个简化的树为例,一棵树包含根(父)结点和其左子树及右子树 ...

  4. 数据结构之二叉树:二叉查找树基本功能,Python代码实现——10

    数据结构之二叉查找树的代码实现 定义 二叉查找树(Binary Search Tree,BST),是一种内存中特殊的树类型的存储结构,它允许对存储在其结点的数据进行增删改查,或者用作动态的数据集合,或 ...

  5. 使用python代码表白_用Python代码花式表白小姐姐,她会不会生气啊

    对于程序员来说,情人节表白当然少不了代码打辅助.小笨聪这次给大家带来两份不同的表白代码(Python版),原理都很基础,第一份主要用到pygame库,第二份主要用到turtle库[附:小笨聪的运行环境 ...

  6. c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法

    c# typescript by Leonardo Carreiro 莱昂纳多·卡雷罗(Leonardo Carreiro) 在任何IDE中从C#,Java或Python代码获取TypeScript接 ...

  7. 3行Python代码就能获取海量数据?

    一谈起数据分析,首先想到的就是数据,没有数据,谈何分析. 毕竟好的菜肴,没有好的原材料,是很难做的- 所以本期小F就给大家分享一个获取数据的方法,只需三行代码就能搞定. 「GoPUP」,大佬造的轮子, ...

  8. python代码获取每一天在一年中出现的次数(星期)

    python代码获取每一天在一年中出现的次数(星期) # python代码获取每一天在一年中出现的次数(星期),例如星期一出现了52次, # python program Find number of ...

  9. python代码获取今天、昨天、明天的日期

    python代码获取今天.昨天.明天的日期 #python代码获取今天.昨天.明天的日期 # Python program to find yesterday, # today and tomorro ...

  10. python代码根据当前时间获取下一周的日期

    python代码根据当前时间获取下一周的日期 #使用python代码根据当前日期计算下一周的日期范围 import datetime,calendar import pandas as pddef g ...

最新文章

  1. Linux下安装Oracle参数自动初始化脚本
  2. SAP WM Storage Type下不允许负库存的设置
  3. win2008 域服务器搭建教程
  4. 并发基础(七):Thread 类的sleep()、yeild()、join()
  5. 自然语言处理领域基本概念笔记
  6. java+long是什么_Java中long的模运算符是什么? - java
  7. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?...
  8. SublimeText3.2.1的汉化方法(也适用于3)
  9. Jobdu 1005
  10. 腾讯进军播放器,QQ影音能否撼动暴风影音?
  11. 虚拟化主机系统在线web管理平台
  12. 怎样用ipad录制游戏视频?ipad如何录制视频?
  13. MAL-PEG-Cholesterol,MAL-PEG-CLS
  14. Ubuntu 18.04 LTS上编译安装BCC
  15. Maven Archetype
  16. YOLOV7分割新手WIN10踩坑过程
  17. scrcpy-将Android手机屏幕实时投射到电脑
  18. 国产最强负载均衡器LVS(理论+实战)
  19. os模块创建多级目录
  20. java-仿滴滴出行 App 功能

热门文章

  1. 金代文化是中华民族文化的重要组成部分
  2. An unhandled exception occurred: listen EADDRNOTAVAIL: address not available
  3. 服务器不能使用无线键盘,台式机无线键盘不能使用解决方法
  4. 解决HP无线键盘无法连接的问题
  5. 2021-2027中国光电红外传感器市场现状及未来发展趋势
  6. supersu二进制更新安装失败_supersu 二进制更新解决方法
  7. 新浪邮箱界面登录按钮效果制作
  8. php垃圾回收,PHP垃圾回收机制的理解
  9. 剖析美国大片《西部世界》 嵌入式技术应用新高度
  10. LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)