跳到主要内容

编程 | 逼哥的音乐元数据修复

· 阅读需 4 分钟

picture 1

今日在 Apple Music 中导入逼哥的音乐库时,出现了信息乱码:

picture 2

可以看到,主要是titleauthor列出现了问题,这不禁引起了我的兴趣。

我第一反应便是去对应的原素材文件夹,右键 get info,可以看到确实是有两个属性是乱码(左边是原来的,右边是后续修复的)。

picture 3

我原以为可以直接在属性窗上修改,结果不行。

于是我就想到,可能需要借助一些专业软件。果然,涉及到 apple music 列表显示的关键信息,是 mp3 文件的 meta 数据

picture 4

按照老经验,去我们的破解专用软件站去下载:

picture 5

使用起来很简单,导入我们的文件夹,然后一个个修改 mp3 原数据的信息即可:

picture 6

但既然了解了背后的原理,一个个手动修改元数据未免太慢了。

考虑到我导入的音乐,其文件名本身是良好定义的,所以直接写个程序去批量化处理比较好。

picture 7

它们用的是eyeD3这个库:

picture 8

使用方法也非常简单,一看就明白:

picture 9

那就轻松了,我们直接写程序即可。

import eyed3
import re
import os


def edit_mp3_meta(fp, title, author):
print("fp_: ", fp)
audiofile = eyed3.load(fp)
# ref: https://stackoverflow.com/a/67541983/9422455
audiofile.tag.artist = u'%s' % author
audiofile.tag.title = u'%s' % title
# ref: https://stackoverflow.com/a/32908607/9422455
audiofile.tag.save(version=eyed3.id3.ID3_DEFAULT_VERSION, encoding='utf-8')


if __name__ == '__main__':
author = "李志"

# 处理第一个乱码文件夹,它们内部的命名是 “李志 - 歌名(专辑).mp3",用正则提取比较方便
# dir = '/Volumes/Disk2/resources/乐/lizhi-18砖/2015年《i.O》 (2014-2015李志跨年音乐会)'
# for fn in os.listdir(dir):
# fp_ = os.path.join(dir, fn)
# song_name_match = re.match(f'{author} - (.*?)\(2014i/O版\).mp3', fn)
# assert song_name_match, fn
# song_name = song_name_match.groups()[0]
# edit_mp3_meta(fp_, song_name, author)

# 处理第二个乱码文件夹,里面有两个CD文件夹,因此使用`walk`迭代,音乐命名是其本身,因此直接提取
for root, dirs, fns in os.walk('/Volumes/Disk2/resources/乐/lizhi-18砖/2013《108个关键词》'):
for fn in fns:
if fn.endswith("mp3"):
fp = os.path.join(root, fn)
song_name = fn[:-4]
edit_mp3_meta(fp, song_name, author)

处理完后,我们重新导入这些音乐,就发现,apple music 中的属性都正常了:

picture 10

希望对你有用~

查询参考: