如何在Elixir

时间:2015-05-23 21:18:03

标签: erlang mp4 elixir id3

我想使用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调用另一种语言编写的库(没有系统调用)?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

使用:

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

答案 2 :(得分:0)

您也可以尝试直接读取文件的二进制文件以查找相关标签。

选中此项以开始:http://elixir-lang.org/docs/v1.0/elixir/File.html#stream!/3

答案 3 :(得分:0)

我在Elixir中实现了ID3v2标签读取(不写入)。它位于GitHubHex上。

支持非常基本;我实现了最低限度来支持我的用例。有很多错误,但所有构建块都可用于分叉/改进/贡献。