音频文件修改脚本

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()

 

posted @ 2026-01-15 16:19  天际之上可有蓝天  阅读(2)  评论(0)    收藏  举报