下载的音乐,音频文件信息歌手和歌名都是乱码或其他信息的
在foobar2000播放器里看着不爽,决定批量处理下音频文件
mutagen可以读取文件音频信息,也能修改信息,使用非常方便
库介绍
介绍
Mutagen是一个用于处理音频元数据的Python模块。它支持ASF、FLAC、MP4、Monkey's Audio、MP3、Musepack、Ogg Opus、Ogg FLAC、Ogg Speex、Ogg Theora、Ogg Vorbis、True Audio、WavPack、OptimFROG和AIFF音频文件。它支持所有版本的ID3v2,并解析所有标准的ID3v2.4帧。它可以读取Xing头部以准确计算MP3的比特率和长度。无论音频格式如何,都可以编辑ID3和APEv2标签。它还可以在单个数据包/页面级别上操作Ogg流。
安装
pip install mutagen
遍历所有文件
import os
def get_all_files(path):
all_files: Dict[str, str] = {}
# 首先遍历当前目录所有文件及文件夹
file_list = os.listdir(path)
# 准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,是文件夹的话,递归
for file in file_list:
# 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
cur_path = os.path.join(path, file)
# 判断是否是文件夹
if os.path.isdir(cur_path):
subs = get_all_file(cur_path)
all_files.update(subs)
else:
all_files[file] = cur_path
return all_files
音频文件处理
import os
import re
import mutagen
from mutagen.flac import FLAC
from mutagen.mp3 import EasyMP3
from mutagen.wave import WAVE
def rename_music(musicdir: str):
# 文件名的处理,根据大家自己的实际情况调整
# 音乐处理 歌名-歌手_歌手-数字.后缀 处理为 歌手_歌手-歌名.后缀
allfile = get_all_files(musicdir)
for file in allfile.values():
# 分离路径和文件名
path, fname = os.path.split(file)
# 使用正则表达式,用‘-’ ‘.’ 将文件名分割为4段
reObj = re.compile('[-.]+')
data = reObj.split(fname)
if len(data) < 4:
continue
nfile = os.path.join(path, f"{data[1]}-{data[0]}.{data[-1]}")
if os.path.exists(nfile):
os.remove(nfile) # 删除重复歌曲
continue
print(f'{file} ==> {nfile}')
os.rename(file, nfile)
def change_music_info(musicdir: str):
'''
歌曲文件名:歌手-歌曲名称.后缀
音频文件信息歌手和歌名乱码或其他信息替换为文件名中歌名、歌手
补全文件中歌曲音乐信息(歌名、歌手)
:param musicdir:
:return:
'''
allfile = get_all_files(musicdir)
infostr = ('title', 'album', 'artist')
for file in allfile.values():
# 分离路径和文件名
path, fname = os.path.split(file)
# 使用正则表达式,用‘-’ ‘.’ 将文件名分割为3段,获取歌手和歌名
reObj = re.compile('[-.]+')
data = reObj.split(fname)
# 根据后缀创建对应的audio对象
if file[-4:] == 'flac':
audio = FLAC(file)
elif file[-3:] == 'mp3':
audio = EasyMP3(file)
else:
audio = None
if audio != None:
artist = data[0]
title = data[1]
# 歌名异常处理,同时处理歌手
if audio['title'] != title:
audio["title"] = data[1]
audio["album"] = data[1]
audio['artist'] = data[0]
audio.save()
print(audio.values())
else:
pass
def start_working():
# 歌曲重命名
rename_music(r'E:\Music\xxxx\111')
# 补全歌曲信息
change_music_info(r'E:\Music\xxxx\111')
if __name__ == "__main__":
start_working()
补充wav格式处理
try:
audio.add_tags()
except mutagen.id3.error:
pass
audio['TALB'] = TALB(encoding=3, text=data[1])
audio['TPE1'] = TPE1(encoding=3, text=data[0])
audio['TIT2'] = TIT2(encodings=3, text=data[1])
audio.save()