在Python中如何编辑文件对象上的MP3元数据?

3
我们正在使用Python动态生成MP3文件,并需要使用类似文件的对象在内存中编辑ID3标头。 PyPI上所有的ID3库都似乎要求你传递一个文件系统路径作为字符串,我觉得这非常令人沮丧!
将我们生成的MP3写入磁盘(或ramdisk)以添加ID3标签是不可接受的,原因有很多,特别是性能问题。
鉴于ID3库的丰富性,是否有一个可以简单使用类似文件的对象的ID3库?
4个回答

3

对于那些在遥远的未来找到这个答案的人,mutagen 对我来说非常完美,它的 MP3 对象构造器需要一个文件路径或者一个类似文件的对象(文档称之为“filething”)。

来自https://mutagen.readthedocs.io/en/latest/user/filelike.html

The first argument passed to a FileType or Metadata can either be a file name or a file-like object, such as StringIO (BytesIO in Python 3) and mutagen will figure out what to do.

MP3("myfile.mp3")
MP3(myfileobj)

这应该是自2019年(也就是“遥远的未来”)以来被接受的答案。顺便说一句,如果你正在使用Django,并且你有一个带有FileField的模型,你可以将FieldFile对象传递给mutagen,它会按预期工作。例如,如果你有一个带有字段audio 的模型,并且你有一个名为instance的模型实例,你可以执行mutagen.File(instance.audio)并且你可以像预期的那样访问info - DataGreed

0

嗯,答案似乎是这样的:没有这样的东西存在。对于Python MP3帧黑客来说,编程到接口的优势显然被忽视了。我们通过修改现有库来解决了这个问题。


0

问题是,我看到的所有库都不能与StringIO或类似的东西一起使用,因为它们需要文件系统路径。 - David Eyk
你不想修改其中一个更简单的库吗? - foosion
你会推荐一个简单的修改吗? - David Eyk
我只是在PyPI上浏览库,找到一个能够满足你需求且体积较小的库。你可以重新定义open函数,使其接受一个字符串(而不是文件名),并返回fh,其中fh = StringIO.StringIO(string_variable)。 - foosion

-1
AFAIR 标签附加到文件末尾。您可能想要研究格式并自行制作一个简单的库,这应该不会太困难。此外,您可以考虑将它们存储在像 tmpfs(ramdisk)这样的文件系统上进行临时存储。

对于 tmpfs,它太过 hackish 了。我已经将对象保存在内存中了,为什么需要复制才能操作它呢? - David Eyk
因为你可以节省编程时间。在 RAM 中复制相对便宜(5MB 文件在我三年前的笔记本电脑上只需 0.05 秒)。因此,决定因素是你如何评价自己的努力。唯一更重要的事情可能是与其他服务器任务相比引入的服务器负载...而我对你的代码一无所知,所以请自行决定。 - liori
你说得完全正确,我们可能最终会这样做,或者采用自己的帧劫持策略。然而,问题的重点是通过发现一个开箱即用的解决方案来避免所有这些,这将节省我们的编程时间。劫持框架或服务器是更多的工作,而不是更少的工作,并且超出了这个问题的范围。 - David Eyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接