【发布时间】:2023-03-30 05:30:01
【问题描述】:
我已经构建了一个与 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 来更新disable the built-in metadata。从那里,我应该可以write my own function to handle on_metadata。该文档为on_metadata 调用提供了以下签名:
(?id:string,(([(string*string)])->unit),source('a))->
source('a)
在元数据包上调用给定的处理程序。
id (string – 默认为 ""):强制源 ID 的值。
(unlabeled) (([(string*string)])->unit):对流中的每个元数据包调用的函数。它应该很快,因为它是在主线程中运行的。
(未标记)(来源('a))
这个签名我不是很懂,但是找到了mailing list post that has a good example:
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 编码?
- 是否有某种调试输出可用于显示所有可用变量?
【问题讨论】:
标签: ocaml liquidsoap