import os
import re
from mutagen.id3 import ID3,TIT2,TPE1
from mutagen.flac import FLAC
from mutagen.oggvorbis import OggVorbis
directory ='F:/train/powershell/'
separator="-"
class AudioMetadataEditor:
def get_name(self, filename,init_select="all"):
#文件判断
file_path = os.path.join(directory,filename)
if not os.path.exists(file_path):
return False, "文件不存在"
self.supported_formats = {
'.mp3': self._handle_mp3,
'.flac': self._handle_flac,
'.ogg': self._handle_ogg,
}
#变量加载
self.filename = filename
base_name,extension = os.path.splitext(filename)
#类型判断
if extension not in self.supported_formats:
return False, f"不支持的文件格式: {extension}"
#变量处理
if separator in base_name:
result = re.sub(r'\[|\]|【|】|,|_|、|,', ' ', base_name)
pattern = rf'^(.*?){separator}(.*?)$'
match = re.match(pattern, result)
before_sep = match.group(1).strip()
after_sep = match.group(2).strip()
#调换用变量
if init_select == "get_base":
self.basename = base_name
self.extension = extension
art = before_sep.split(" ")
art_set = [s.strip() for s in art if s.strip()]
arts = '_'.join(art_set)
new_base_name = f"{after_sep} {separator} {arts}"
new_name = f"{new_base_name}{extension}"
self.new_name = new_name
return
#修改元数据用变量
if init_select == "set_metadata":
#标题
self.title = before_sep.strip()
match = re.match(pattern, base_name)
art_sep = match.group(2).strip()
art = art_sep.split("_")
art_set = [s.strip() for s in art if s.strip()]
#艺术家
self.arts = '/'.join(art_set)
if extension == ".flac":
self.metadata = {
'title': self.title,
'artist': self.arts,
'album artist': self.arts,
'encoder': '',
'description': '',
}
elif extension == ".ogg":
self.metadata = {
'title': self.title,
'artist': self.arts,
'album artist': self.arts,
'COPYRIGHT': '',
'COMMENT': '',
}
elif extension == ".mp3":
self.metadata = {
'title': self.title,
'artist': self.arts,
'comments': '',
}
#修改元数据
def write_metadata(self, file_path, metadata):
if not os.path.exists(file_path):
return False, "文件不存在"
ext = os.path.splitext(file_path)[1].lower()
try:
return self.supported_formats[ext](file_path, metadata)
except Exception as e:
return False, f"写入元数据失败: {str(e)}"
#处理 FLAC 文件
def _handle_flac(self, file_path, metadata):
audio = FLAC(file_path)
for key, value in metadata.items():
audio[key] = str(value)
audio.save()
return True, "FLAC 元数据写入成功"
#处理 MP3 文件
def _handle_mp3(self, file_path, metadata):
tags = ID3(file_path)
if 'title' in metadata:
tags["TIT2"] = TIT2(encoding=3, text=[metadata['title']])
if 'artist' in metadata:
tags["TPE1"] = TPE1(encoding=3, text=[metadata['artist']])
if 'comments' in metadata:
# 删除所有现有的COMM标签
tags.delall('COMM')
tags.save(file_path)
return True, "MP3 元数据写入成功"
#处理 OGG 文件
def _handle_ogg(self, file_path, metadata):
audio = OggVorbis(file_path)
for key,value in metadata.items():
audio[key] = str(value)
audio.save()
return True, "OGG 元数据写入成功"
#---------------------------------------------------
names = AudioMetadataEditor()
def switch_new_name(old_name):
names.get_name(old_name,init_select="get_base")
new_name = names.new_name
return new_name
def switch_ab():
for file_name in os.listdir(directory):
filepath=os.path.join(directory,file_name)
new_name = switch_new_name(file_name)
if not os.path.isfile(filepath):
continue
if new_name:
new_path = os.path.join(directory, new_name)
print(new_path)
if new_path == filepath:
print(f"跳过:'{file_name}' -> 无需更改")
continue
#检查目标文件是否已存在
if os.path.exists(new_path):
print(f"跳过:'{file_name}' -> 目标文件 '{new_name}' 已存在")
continue
try:
os.rename(filepath,new_path)
print(f"重命名: '{file_name}' -> '{new_name}'")
except Exception as e:
print(f"错误: 重命名 '{file_name}' 失败 - {e}")
def set_matadata():
for file_name in os.listdir(directory):
names.get_name(file_name,init_select="set_metadata")
filepath = os.path.join(directory, file_name)
md = names.metadata
# print(md)
success, message = names.write_metadata(filepath, md)
print(f"{file_name},结果: {success}, 消息: {message}")
#打印菜单
def menu():
while True:
print("\n" + "="*50)
print("请选择操作:")
print("1. 前后调换")
print("2. 元数据修改")
print("3. 。。。")
print("4. 退出")
print("="*50)
choice = input("请输入选项编号 (1-4): ").strip()
if choice == "1":
print("文件名根据 - 前后调换...")
switch_ab()
elif choice == "2":
print("将对文件重新写入元数据...")
set_matadata()
elif choice == "3":
print("未设置...")
# 这里添加实际功能
elif choice == "4":
print("感谢使用,再见!")
break
else:
print("输入无效,请重新输入!")
# 运行菜单
menu()