我已经构建了一个与 Icecast 源兼容的流媒体服务器,但可以接受额外的元数据。典型的 Icecast 源客户端会将其带外元数据更新请求发送到服务器,如下所示:
/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title
我的服务器接受额外的查询字符串参数,例如meta[album]
和meta[filename]
:
/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title&meta[album]=Album%02Name&meta[filename]=somefile.mp3
我正在尝试配置 Liquidsoap 以发送此扩展元数据。根据文档,似乎我可以通过设置禁用内置元数据更新icy_metadata=false
。从那里,我应该能够编写自己的函数来处理on_metadata
. 该文档为on_metadata
调用提供了以下签名:
(?id:string,(([(string*string)])->unit),source('a))->
source('a)
在元数据包上调用给定的处理程序。
id (string – 默认为 ""):强制源 ID 的值。
(未标记)(([(字符串*字符串)])->单元):对流中的每个元数据包调用的函数。它应该很快,因为它是在主线程中运行的。
(未标记)(来源('a))
我不完全理解这个签名,但我发现一个邮件列表帖子有一个很好的例子:
def send_meta(m) =
system("/path/to/script #{m["title"]} #{m["artist"]}")
end
source = on_metadata(send_meta, source)
有了这些信息,我应该能够调用 cURL 向我的服务器发出请求,更新元数据。像这样的东西:
system("curl \"http://HOST:PORT/admin/metadata?pass=PASSWORD&mode=updinfo&song=#{m["artist"]}%20-%20#{m["title"]}&filename=#{m["filename"]}\"")
我很接近,但我无法弄清楚这个的最后部分:
- 如何获取关联的 Icecast 输出的配置主机、端口和密码?
- 如何对元数据参数进行适当的 URL 编码?
- 是否有某种调试输出可用于显示所有可用变量?