我已經構建了一個與Icecast源兼容的流式服務器,但可以接受其他元數據。一個典型的Icecast源客戶端將發送其出帶外的元數據更新請求到服務器這樣的:在Liquidosap on_metadata處理程序中獲取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(字符串 - 默認爲「」):強制源ID的值。 (未標記)(([(string * string)]) - > unit):對流中每個元數據包調用的函數。它應該很快,因爲它在主線程中運行。
(未標記)(來源('一))
我不完全理解這個簽名,但我發現一個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編碼?
- 是否有某種調試輸出可用於顯示所有可用變量?