python代码,用于获取mp3部分信息并存入MySQL中

2023-11-03

#a1,a2,a3,a4参数需要自己输

#host=a1,user=a2,password=a3,database=a4

import os
import base64
import struct
import pymysql
#这是python代码,用于获取mp3部分信息并存入MySQL中
#编写者: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)

#连接数据库
def connect_database(a1,a2,a3,a4):
    print('连接到MySQL...')
    try:
        db=pymysql.connect(host=a1,user=a2,password=a3,database=a4)
    except:
        print('连接失败')
        return False
    else:
           return db

#向database插入数据
def insert_data(db,dic,file_name):
    cursor=db.cursor()
    data1,data2,data3,data4=dic['TIT2'],dic['TPE1'],dic['TALB'],dic['TYER']
    sql="INSERT INTO tb1(Title,Anchor,Ablum,Year,Name) values('{}','{}','{}','{}','{}')".format(data1,data2,data3,data4,file_name)
    cursor.execute(sql)
    db.commit()
    db.close()
    

#主函数
a1,a2,a3,a4=' ','  ','  ','  '
print('TLT2:标题,TPE1:作者,TALB:专辑,TYER:年代')
n,m,mn=0,0,0
error_list1=[]
error_list2=[]
path='F:\\Temp'
for file in os.listdir(path):
    addr=path+'\\'+file 
    mp3_file=open(addr,'rb')
    try:        
        dic=IDV2_GET_MESSAGE(mp3_file,file)
    except:
        error_list2.append(file)
    else:
        db=connect_database(a1,a2,a3,a4)
        try:
            insert_data(db,dic,file)
        except:
            print('录入失败')
        else:
            print('录入成功')
        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')
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python代码,用于获取mp3部分信息并存入MySQL中 的相关文章

随机推荐

  • windows上的linux子系统(WSL)

    目录 一 介绍 二 原理 2 1 wsl组件 2 2 wsl运行过程 2 3 文件系统 2 4 禁忌 三 使用 3 1 安装 3 2 用户账户和权限 3 3 wsl管理 3 3 互操作 参考 推荐阅读 一 介绍 Windows Subsys
  • 时间对象new Date 以及中国标准时间与时间戳,标准时间之间的转换

  • C语言程序设计大作业——员工管理系统(代码超详细内含实验报告)

    写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也希望大家多多支持我鸭
  • 基于BP神经网络的回归预测

    基本概念 误差反向传播神经网络简称为BP Back Propagation 网络 它是一种具有三层或三层以上的多层神经网络 每一层都由若干个神经元组成 如图所示为一个BP神经网络的结构图 它的左 右各层之间各个神经元实现全连接 即左层的每一
  • LINUX下搭建JAVA的开发环境

    1 Linux下JDK的安装 至于下载JDK的二进制可执行文件 这里就不讲了 大家直接到官方网去下载就可以了 1 我下载下来的JDK安装文件名称为 jdk 1 5 0 14 linux i586 rpm bin 我把它保存在 tools目录
  • el search 条件更新

    from elasticsearch import Elasticsearch es Elasticsearch 192 168 55 90 9200 updateBody query bool must wildcard fileName
  • esxi管理端口_VMWare Esxi 基于NAT的管理端口转发

    上一篇关于WMWare Esxi的文章介绍了在多台虚拟机之间用软路由共享一个IP的情况 VMWare Esxi 海蜘蛛配置NAT共享IP上网 其中用了两个IP 一个用于虚拟机上网 一个用于Management Network 但是在只有一个
  • R语言 数据导出和导入 csv tsv xls xlsx

    R语言 Excel 导出为Excel的xls xlsx 导出数据 write table data2 file train1 xls sep t row names TRUE col names TRUE quote TRUE write
  • Promise的理解和使用

    一 Promise 是什么 1 理解 Promise是一门新的技术 ES6规范 Promise是JS中进行异步编程的新解决方案 旧方案是使用回调函数 Promise是一个构造函数 Promise对象用来封装一个异步操作并可以获取其成功 失败
  • 使用 Docker 部署 Prometheus + Grafana 监控平台

    使用 Docker 部署 Prometheus Grafana 监控平台 默认docker 已经安装好 我使用的是CentOS7 注意一定要开启服务器对应的端口 1 安装Prometheus docker run itd name prom
  • Windows虚拟机激活

    打开cmd命令提示符 首先连接kms服务器 slmgr skms skms netnr eu org 接着输入对应系统版本的产品密钥 xxxxx xxxxx xxxxx xxxxx xxxxx slmgr ipk xxxxx xxxxx x
  • 【DEBUG】MoviePy couldn't find the codec associated with the filename.Provide the 'codec' parameter

    问题描述 ValueError MoviePy couldn t find the codec associated with the filename Provide the codec parameter in write videof
  • __weak详解

    object默认的修饰符是 strong 然而在开发中我们也经常使用 weak 用它来解决循环引用的问题 两个对象相互引用无法释放 造成内存泄露 用 weak来破坏一个强引用 来达到正常释放的目的 这种情况常见于block中 但是有没有想过
  • linux驱动面试题2018

    linux驱动面试题2018 面试题整理 含答案 版权声明 本文为博主原创文章 未经博主允许不得转载 转载请标明原址 https blog csdn net kai zone article details 82021233 前言 这篇文章
  • Camera:高斯模糊

    高斯模糊场景 手机相机不同于工业相机以及车载相机 手机相机的模式切换往往会伴随着预览分辨率的改变 而分辨率的切换伴随手机App gt Framework gt HAL gt Drivel一层层的下发上传 所造成的时间延迟已经带来了不可忽略的
  • Elasticsearch数据刷新策略RefreshPolicy简述

    说明 默认情况下ElasticSearch索引的refresh interval为1秒 这意味着数据写1秒才就可以被搜索到 每次索引refresh会产生一个新的 lucene 段 这会导致频繁的 segment merge 行为 对系统 C
  • node入门(一)bcrypt密码加密和验证

    前言 node js越来越被广泛的使用 现在找工作职位要求上大都写熟悉或了解一门后端 语言 如 java php node等 Node js是一个javascript运行环境 它让javascript可以开发后端程序 实现几乎其他后端语言实
  • 一道智力题--三个运动员参加M个项目,在每一项目中,第一,第二,第三名分别得X,Y,Z分

    题目 有一种体育竞赛共含M个项目 有运动员A B C三人参加 在每一项目中 第一 第二 第三名分别得X Y Z分 其中X Y Z为正整数且X gt Y gt Z 最后A得22分 B与C均得9分 B在百米赛中取得第一 1 求M的值 2 在跳高
  • 使用excel将一个数字随机分摊?

    在Excel中 如何把一个数值随机分配到N个单元格内 分配后每个单元格的数值之和等于这个数值 比如这里我们需要在A1 A10区域中随机输入数字 其实结果等于10000 这里我们可以选中区域 然后输入公式 FREQUENCY ROW 1 10
  • python代码,用于获取mp3部分信息并存入MySQL中

    a1 a2 a3 a4参数需要自己输 host a1 user a2 password a3 database a4 import os import base64 import struct import pymysql 这是python