0

我正在构建一个小工具,我想扫描音乐收藏,读取曲目的 ID3 信息,只要该特定艺术家的歌曲没有被访问超过两次,就可以存储它。我打算Mutagen用于阅读标签。

然而,我和其他许多人的音乐收藏量很大,超过 20,000 首歌曲。据我所知,图书馆之类Mutagen的必须打开和关闭每首歌曲才能从中获取 ID3 信息。虽然 MP3 的性能不是很重,但歌曲很多。我已经计划以保持每个艺术家的数量的形式进行小的优化,如果他们的歌曲数量超过 2,则不存储任何信息,但据我所知,我仍然需要打开每首歌曲以检查艺术家 ID3 标签.

我玩弄了使用目录作为艺术家姓名提示的想法,并且一旦艺术家歌曲数量超过 2,就不再阅读该目录中的任何信息,但并不是每个人都将他们的音乐设置在整洁的 Artist/Album/Songs 目录中。

有没有人想到任何其他优化可以减少打开这么多 MP3 的开销?

4

2 回答 2

1

提防过早的优化。你真的确定这将是一个性能问题吗?您的要求是什么——脚本需要多快运行?使用天真的方法运行速度有多快?在优化之前进行分析和评估。我认为您很可能会遇到实际不存在的性能问题。

如果您想要一个有保证的正确答案,您无法避免访问每个文件一次。如您所见,完全跳过文件的优化基本上相当于自动猜测。

您是否可以记录您之前完成的扫描,并在后续扫描中使用文件的最后修改日期来避免重新扫描您已经扫描过一次的文件?这可能意味着您的第一次扫描可能需要一点时间,但后续扫描会更快。

如果您需要快速对音乐收藏进行大量复杂查询,请考虑将整个收藏的元数据导入数据库(例如 SQLite 或 MySQL)。导入需要时间——更新以插入新文件需要一点时间(如上检查最后修改的日期)。然而,一旦数据进入您的数据库,假设数据库设置合理,一切都应该是相当快速的。

于 2013-03-10T17:26:33.283 回答
1

一般来说,对于这个问题,我建议您使用多种方法来检测艺术家或曲目标题:

第一种检查方法:文件名可能是 ARTIST-TITLE.mp3 格式吗?(或类似的)
(文件名是“Artist-Track.mp3”)

for file in os.listdir(PATH_TO_MP3s):
   artist = re.split("[\_\-\.]", file)[-3]
   track = re.split("[\_\-\.]", file)[-2]
   filetype = re.split("[\_\-\.]", file)[-1]

当然,您必须先确定文件是否为该格式。

第二步(如果首先不适合该文件)将检查目录名称是否适合(如您所说)

第三个也是最后一个是检查 ID3 标签。

但请确保在信任之前检查这些值是否正确。
例如,如果有人将“Track-Artist.mp3”用于我提供的代码艺术家和轨道将被切换。

于 2013-03-10T17:34:08.143 回答