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