Ocaml 在\u元数据处理程序上的Liquidosap中获取Icecast输出模块设置

Ocaml 在\u元数据处理程序上的Liquidosap中获取Icecast输出模块设置,ocaml,liquidsoap,Ocaml,Liquidsoap,我已经构建了一个与Icecast源兼容的流媒体服务器,但可以接受额外的元数据。典型的Icecast源客户端将向服务器发送其带外元数据更新请求,如下所示: /admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title system("curl \"http://HOST:PORT/admin/metadata?pass=PASSWORD&mode=updinfo&song=#{m["artist"

我已经构建了一个与Icecast源兼容的流媒体服务器,但可以接受额外的元数据。典型的Icecast源客户端将向服务器发送其带外元数据更新请求,如下所示:

/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title
system("curl \"http://HOST:PORT/admin/metadata?pass=PASSWORD&mode=updinfo&song=#{m["artist"]}%20-%20#{m["title"]}&filename=#{m["filename"]}\"")
我的服务器接受其他查询字符串参数,如
meta[album]
meta[filename]

/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title&meta[album]=Album%02Name&meta[filename]=somefile.mp3
我正在尝试配置Liquidsoap以发送此扩展元数据。根据文档,我似乎可以通过设置
ice\u metadata=false
进行更新。从那里,我应该可以。该文档为_metadata调用提供了以下签名:

(?id:string,(([(string*string)])->unit),source('a))->
source('a)
对元数据包调用给定的处理程序

  • id(字符串–默认为“”):强制源id的值

  • (未标记)(([(string*string)]->unit):对流中的每个元数据包调用的函数。它应该很快,因为它是在主线程中运行的

  • (未标记)(来源('a))

我不完全理解这个签名,但我发现:

有了这些信息,我应该能够调用cURL向我的服务器发出请求,更新元数据。大概是这样的:

/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title
system("curl \"http://HOST:PORT/admin/metadata?pass=PASSWORD&mode=updinfo&song=#{m["artist"]}%20-%20#{m["title"]}&filename=#{m["filename"]}\"")
我很接近,但我不知道最后的部分:

  • 如何获取关联Icecast输出的配置主机、端口和密码
  • 如何对元数据参数进行适当的URL编码
  • 是否有某种调试输出可用于显示所有可用变量

这一切都很简单

如何获取关联Icecast输出的配置主机、端口和密码

这是不可能的,直接的。元数据处理程序未获取对源的引用。然而,编写一个同时设置两者的函数并不重要

def output.my_custom_output(encoder, source, host, port, password, mount, genre, url, name) =
  def send_meta(m) = 
    # Code to send metadata here.
    # You can use source, host, port, etc
  end

  output.icecast(...)
end
如何对元数据参数进行适当的URL编码

是否有某种调试输出可用于显示所有可用变量

也许有更好的方法,但我发现JSON编码和输出到日志是有帮助的

log(json_of(m))