使用Mutagen或EyeD3的脚本无法为MP3保存封面图,求解决?
解决MP3封面无法保存的问题
针对你遇到的MP3封面无法保存的情况,以下是几个排查和修复方向:
1. 修正文件路径的转义问题
Python中字符串里的反斜杠\会被当作转义字符,可能导致路径解析错误。把路径改成原始字符串(加r前缀)或者用正斜杠:
file_path = r'Music\Metadata\sample-3s.mp3' cover_image_path = r'Music\Metadata\pulsar.png' # 或者用正斜杠替代 file_path = 'Music/Metadata/sample-3s.mp3' cover_image_path = 'Music/Metadata/pulsar.png'
2. 确保ID3标签初始化正确
如果目标MP3原本没有ID3标签,直接用ID3(file_path)可能无法正确创建新标签。改用MP3类加载并强制初始化标签:
from mutagen.mp3 import MP3 from mutagen.id3 import ID3, APIC, TALB, TPE1, TDRC, TCON def set_mp3_metadata(file_path, album_name, artist, year, genre, cover_image_path): try: audio = MP3(file_path, ID3=ID3) # 若文件无ID3标签,初始化一个 if not audio.tags: audio.add_tags() # 设置基础元数据 audio.tags['TALB'] = TALB(encoding=3, text=album_name) audio.tags['TPE1'] = TPE1(encoding=3, text=artist) audio.tags['TDRC'] = TDRC(encoding=3, text=str(year)) audio.tags['TCON'] = TCON(encoding=3, text=genre) # 先删除原有封面标签(避免覆盖失败) if 'APIC' in audio.tags: del audio.tags['APIC'] # 添加新封面 with open(cover_image_path, 'rb') as cover_file: audio.tags.add(APIC( encoding=3, mime='image/png', type=3, desc='Cover', data=cover_file.read() )) audio.save() print("Metadata updated successfully.") except Exception as e: print(f"Error: {str(e)}")
3. 验证图片格式与MIME类型匹配
确认封面图片的实际格式,若为JPG/JPEG,需把mime参数改成'image/jpeg'。可以用PIL快速验证:
from PIL import Image with Image.open(cover_image_path) as img: print(img.format) # 输出PNG或JPEG,对应修改mime参数
4. EyeD3的修复写法
如果用EyeD3,需确保标签存在,且显式指定ID3版本:
def set_mp3_metadata_eyed3(filename, album, artist, year, genre, cover_image_path): try: audio = eyed3.load(filename) if audio is None: print("Error loading MP3 file") return # 初始化标签(若不存在) if not audio.tag: audio.initTag() audio.tag.album = album audio.tag.artist = artist audio.tag.year = year audio.tag.genre = genre if cover_image_path: # 清空原有封面 audio.tag.images.remove(3) with open(cover_image_path, "rb") as cover_file: cover_data = cover_file.read() audio.tag.images.set(3, cover_data, "image/png") audio.tag.save(version=eyed3.id3.ID3_V2_3) print("Metadata updated successfully.") except Exception as e: print(f"Error: {str(e)}")
5. 检查文件写入权限
确保脚本有修改目标MP3文件的权限,避免将文件放在系统保护目录(如C:\Program Files),必要时以管理员身份运行脚本。
内容的提问来源于stack exchange,提问作者PandaProgrammer22
相关产品推荐
相关产品推荐

