1

我已经构建了一个与 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 编码?
  • 是否有某种调试输出可用于显示所有可用变量?
4

1 回答 1

1

这一切都变得非常简单。

如何获取关联的 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 编码?

url.encode(m['filename'])

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

可能有更好的方法,但我发现 JSON 编码和输出到日志会很有帮助。

log(json_of(m))
于 2014-06-29T17:44:48.380 回答