【发布时间】:2015-08-05 17:11:13
【问题描述】:
我想使用 Elixir 扫描音乐文件和读/写元数据(整个项目都是关于学习 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
非常慢,尤其是对于数千个文件。我希望它在每次启动时运行以检查更改/新文件。
现在我正在尝试对带有 id3 标签的 mp3 做同样的事情。我在 Ubuntu 上尝试了 libid3-tools,它只找到了 id3v1 标签。 eyeD3 只找到 id3v2 标签。我的 mp3 两者都有,所以我需要确保它们是相同的(我想我可以删除 id3v1 标签,但我一直认为旧设备需要 id3v1 标签)。
是否有任何用于音乐元数据的 Erlang 或 Elixir 库?如果不是,对 ubuntu 实用程序的系统调用是我的最佳选择吗(关于哪些建议)?
或者我需要编写一个库来获得合理的性能吗?如果是这样,是否有我可以尝试移植的功能语言的现有库?
或者是否可以直接从 Elixir 调用用另一种语言编写的库(无需系统调用)?
【问题讨论】:
-
是的,这些链接很棒,因为它们展示了 Elixir 位语法的强大功能。无需外部库。
-
是的,你是对的。我使用上面的链接作为模型来读取 id3v1 标签,它非常简单。我对攻击 id3v2 或 mp4 标签犹豫不决,因为它们更复杂。我认为 Elixir 使用起来很有趣,并且可以很好地工作,但我对这些格式的了解有限(我担心不断扩展的副项目)。我想我会先看看下面 Paweł 提到的 Elixir NIF/Ports。知道在哪里可以找到更多信息吗?