如何在 Elixir 中读写 id3v1 和 id3v2 标签

How to read and write id3v1 and id3v2 tags in Elixir

我想使用 Elixir 扫描音乐文件和 read/write 元数据(整个项目都是关于学习 Elixir - 所以请不要告诉我使用 Python!)。据我所知,我有两个选择:调用系统实用程序或(因为我知道 Erlang 或 Elixir 中不存在任何库)编写一个 Elixir 库。对于 m4a 文件,我对 MP4Box 进行系统调用,并将 xml 文件写入磁盘。然后我读入文件,解析它,并将数据加载到数据库中。

def parse(file_name) do
  System.cmd("MP4Box", ["-diso",file_name])
  Ainur.XmlParser.parse(xml_file_name(file_name))
  |> get_tags
end

非常慢,尤其是对于数千个文件。我希望它在每次启动时 运行 来检查 changed/new 个文件。

现在我正尝试对带有 id3 标签的 mp3 做同样的事情。我在 Ubuntu 上尝试了 libid3-tools,它只找到了 id3v1 标签。 eyeD3 只找到 id3v2 标签。我的 mp3 都有,所以我需要确保它们相同(我想我可以删除 id3v1 标签,但我被引导相信旧设备需要 id3v1 标签)。

是否有任何用于音乐元数据的 Erlang 或 Elixir 库?如果不是,对 ubuntu 实用程序的系统调用是否是我的最佳选择(有哪些建议)?

或者我需要写一个库来获得合理的性能吗?如果是这样,是否有我可以尝试移植的函数式语言的现有库?

或者是否可以直接从 Elixir 调用用另一种语言编写的库(无需系统调用)?

您始终可以使用 erlang NIF (http://erlang.org/doc/tutorial/nif.html) 来包装外部库

您也可以尝试直接读取文件的二进制文件来查找有问题的标签。

查看 File.stream/3 文档以开始使用。

在这个项目中,我们有一个用 Elixir 编写的模块,它从 mp3 中提取 ID3 标签:

https://github.com/anisiomarxjr/shoutcast_server/blob/master/lib/mp3_file.ex

使用:

id3 = Mp3File.extract_id3("./test/fixtures/nederland.mp3")

我已经在 Elixir 中实现了 ID3v2 标签读取(而不是写入)。在 GitHub and Hex 上。

支持非常基本;我实现了最低限度来支持我的用例。有很多错误,但所有构建块都在那里fork/improve/contribute。