在vs中做网站如何连接数据库,北京优秀网站设计公司,店铺推广渠道有哪些方式,客户可以自主发帖的网站建设需求
近期有朋友拜托弄一批 mp3 放 U 盘里面以便开车的时候听#xff0c;于是下载了一批歌曲#xff0c;都整理成 歌曲名-歌唱者.mp3 这样的文件名。可是有些播放器会优先使用 ID3#xff08;即 mp3 文件的一个自带的信息段。顺便吐槽一下#xff0c;官方网站 https://id3…需求
近期有朋友拜托弄一批 mp3 放 U 盘里面以便开车的时候听于是下载了一批歌曲都整理成 歌曲名-歌唱者.mp3 这样的文件名。可是有些播放器会优先使用 ID3即 mp3 文件的一个自带的信息段。顺便吐槽一下官方网站 https://id3.org 居然打不开提示 500 错误 来罗列歌单而不是文件名这些 mp3 本身的 ID3 属性良莠不齐到时候就乱套了。因此需要逐个将文件名上面的歌曲、歌者信息写入 mp3 文件的 ID3 属性内。
实战
此类日常事务最方便的自然是 python 了。查了一下python 下的音频文件处理模块有 eyed3、pydub、pyAudio 等。其中的 eyed3 最为小巧便捷。完整代码如下
import os
import eyed3def main(path):files os.listdir(path)counter 0for mp3 in files:if mp3[-3:] ! mp3 :continuetitle, artist get_title_artist_from_filename(mp3)# 调用 eyed3 模块写入歌曲信息try:audio eyed3.load(path / mp3)print(f[eyed3] load {mp3} success,, end )except:print(f[error] {mp3} load fail!)continueif(audio.tag None): # 部分歌曲 ID3 信息缺失audio.tag eyed3.id3.tag.Tag()audio.tag.title titleaudio.tag.artist artistprint(fready to write ID3: {title} {artist})audio.tag.save(versioneyed3.id3.ID3_V2_4, encoding utf8) # 指定使用 ID3 V2.4确保支持中文ref: ..\lib\site-packages\eyed3\id3counter 1print(f共处理了 {counter} 个 mp3 文件)def get_title_artist_from_filename(filename):通过文件名获取歌曲信息文件名样式歌曲名 - 歌唱人员.mp3prefix filename.split(.)[0]msg prefix.split(-) title msg[0].strip()artist msg[1].strip()return (title, artist)if __name__ __main__:mp3 d:/temp/经典老歌main(mp3)踩坑
这里最大的坑有两个
低版本 ID3 不支持 unicode导致写入的中文会变成一串的 ?部分歌曲本身不带 ID3 属性此时需要自行添加之。
下面逐一解释
指定 ID3 版本
有些歌曲自带的 ID3 属性是 v1.0 版本的只支持英文字母强行写入中文会导致乱码或者干脆显示成一串的 ?????。
解决这个问题的办法就在 eyed3.id3.tag.Tag.save()里面官方文档说给 save() 函数加上 version... 的参数确保使用高版本的 ID3 就可以支持 unicode。可是文档到这里就没了也没告诉我这个版本具体要怎么指定。
没办法只能打开下载的 eyed3 源代码找到函数定义发现 ID3 版本号都定义在 site_packages\eyed3\id3\__init__.py 里面直接取用即可。如下
# Version 1, 1.0 or 1.1
ID3_V1 (1, None, None)
# Version 1.0, specifically
ID3_V1_0 (1, 0, 0)
# Version 1.1, specifically
ID3_V1_1 (1, 1, 0)
# Version 2, 2.2, 2.3 or 2.4
ID3_V2 (2, None, None)
# Version 2.2, specifically
ID3_V2_2 (2, 2, 0)
# Version 2.3, specifically
ID3_V2_3 (2, 3, 0)
# Version 2.4, specifically
ID3_V2_4 (2, 4, 0)因此我们使用 tag.save(versioneyed3.id3.ID3_V2_4, encoding utf8) 即可确保中文不乱码。
添加 ID3 属性
有些 mp3 文件本身不自带 ID3 属性此时 eyed3 调用 tag 属性就会出错。
运行一个 python 的交互界面手动生成一个 eyed3 对象检查 __dict__ 属性大致如下 import eyed3a eyed3.load(d:/temp/a/q.mp3)a.__dict__
{_tag_version: None,
_path: d:\\temp\\a\\q.mp3,
type: 1,
_info: Mp3AudioInfo(time_secs316.78, size_bytes5056888),
_tag: None}可以看到 _tag 属性为 None。解决办法就是自行生成一个 Tag 对象手动赋值即可。即代码中的 audio.tag eyed3.id3.tag.Tag() 这句
参考
eyed3 模块的官方文档[CSDN] Python读取音乐文件mp3标签信息——eyeD3[CSDN] ID3格式介绍