2015-05-23 16 views
6

Tôi muốn để quét các file nhạc và đọc/ghi siêu dữ liệu sử dụng Elixir (toàn bộ dự án này là về học tập Elixir - vì vậy hãy đừng nói với tôi để sử dụng Python). Như tôi đã hiểu, tôi có hai lựa chọn: gọi một tiện ích hệ thống hoặc (vì không có thư viện nào tồn tại trong Erlang hoặc Elixir mà tôi biết) viết một thư viện Elixir. Đối với các tập tin m4a, tôi thực hiện một cuộc gọi hệ thống đến MP4Box và nó ghi một tập tin xml vào đĩa. Sau đó tôi đọc trong tệp, phân tích cú pháp và tải dữ liệu vào cơ sở dữ liệu.Làm thế nào để đọc và viết ID3v1 và ID3v2 thẻ trong Elixir

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

Rất chậm, đặc biệt đối với hàng nghìn tệp. Và tôi muốn nó chạy lúc khởi động mọi lúc để kiểm tra các tập tin đã thay đổi/mới.

Bây giờ tôi đang cố gắng làm tương tự cho các thẻ mp3 có thẻ id3. Tôi đã thử các công cụ libid3 trên Ubuntu và nó chỉ tìm thấy các thẻ id3v1. eyeD3 chỉ tìm thấy thẻ id3v2. MP3 của tôi có cả hai vì vậy tôi cần phải chắc chắn rằng có giống nhau (Tôi cho rằng tôi có thể xóa các thẻ id3v1, nhưng tôi đã được dẫn đến tin rằng thẻ id3v1 là cần thiết trên thiết bị di sản).

Có bất kỳ Erlang hoặc Elixir thư viện cho siêu dữ liệu âm nhạc? Nếu không, có phải hệ thống gọi đến các tiện ích ubuntu lựa chọn tốt nhất của tôi (bất kỳ đề xuất nào trên đó)?

Hoặc tôi có cần phải viết thư viện để có được hiệu suất hợp lý không? Nếu vậy, có một thư viện hiện có trong một ngôn ngữ chức năng mà tôi có thể thử cổng không?

Hoặc là nó có thể gọi một thư viện viết bằng một ngôn ngữ khác trực tiếp từ Elixir (không có cuộc gọi hệ thống)?

+2

, khả năng này liên kết bạn sẽ giúp: http://benjamintan.io/blog/2014/06/10/elixir-bit-syntax-and-id3/ http://www.citizen428.net/blog/2010/09/04/erlang-bit-syntax-and-id3 –

+1

Vâng, các liên kết này rất tuyệt vì chúng cho thấy cú pháp bit Elixir mạnh mẽ như thế nào. Không cần thư viện bên ngoài. –

+0

Có, bạn đã đúng. Tôi đã sử dụng liên kết ở trên làm mô hình để đọc các thẻ id3v1 và nó khá đơn giản. Tôi ngần ngại tấn công các thẻ id3v2 hoặc mp4 vì chúng phức tạp hơn. Tôi nghĩ Elixir là một niềm vui để sử dụng và sẽ làm việc tốt cho điều đó, nhưng tôi có kiến ​​thức hạn chế về các định dạng này (tôi lo sợ dự án phụ không ngừng mở rộng). Tôi nghĩ rằng tôi sẽ lần đầu tiên nhìn vào Elixir NIF/Ports được đề cập bởi Paweł dưới đây. Bất kỳ ý tưởng nơi để tìm thêm thông tin? –

Trả lời

1

Trong dự án này, chúng tôi có một module viết bằng Elixir được chiết xuất thẻ ID3 từ mp3:

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

Cách sử dụng:

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

Cảm ơn. Tôi chỉ viết một mô-đun để đọc các thẻ id3v1, nhưng nó là tốt đẹp để so sánh. Bây giờ tôi đang nhìn vào id3v2 - phức tạp hơn nhiều. –

0

Tôi đã triển khai đọc thẻ ID3v2 (không viết) trong Elixir. Đó là trên GitHubHex.

Hỗ trợ là rất cơ bản; Tôi đã triển khai mức tối thiểu để hỗ trợ trường hợp sử dụng của mình. Có rất nhiều lỗi, nhưng tất cả các khối xây dựng đều có sẵn để nâng cấp/cải thiện/đóng góp.

Các vấn đề liên quan