优化质量ID3标签扫描

时间:2013-03-10 17:11:19

标签: python id3 mutagen

我正在构建一个小工具,我想要扫描音乐集,读取轨道的ID3信息,并存储它,只要该特定艺术家没有一首已被访问过两次以上的歌曲。我打算使用Mutagen来阅读标签。

然而,我和其他许多人的音乐收藏都很庞大,超过20,000首歌曲。据我所知,像Mutagen这样的图书馆必须打开和关闭每首歌曲才能从中获取ID3信息。虽然MP3的表现并不是非常糟糕,但很多歌曲都是如此。我已经计划进行一次小的优化,保持每个艺术家的数量而不是存储任何信息,如果他们的歌曲数量超过2,但据我所知,我仍然需要打开每首歌来检查艺术家ID3标签。

我玩弄了使用目录作为艺术家名字提示的想法,并且在艺术家的歌曲数量超过2时不再阅读该目录中的任何更多信息,但并非所有人都将他们的音乐设置在整洁的艺术家/专辑/歌曲中目录。

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

2 个答案:

答案 0 :(得分:1)

注意过早优化。你确定这会是性能问题吗?您有什么要求 - 脚本需要多快运行?它以多么快的速度运行?在优化之前进行配置和评估。我认为你很可能会看到一个实际上并不存在的性能问题。

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

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

如果您需要快速对音乐集合进行大量复杂查询,请考虑将整个集合的元数据导入数据库(例如SQLite或MySQL)。导入将花费时间 - 更新以插入新文件将花费一点时间(如上所述检查上次修改日期)。但是,一旦数据存在于您的数据库中,假设数据库设置合理,那么一切都应该是相当快速的。

答案 1 :(得分: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]

当然,您必须先确保文件是否采用该格式。

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

第3个,最后一个是检查ID3标签。

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