2014-06-21 24 views
1

我已經構建了一個與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編碼?
  • 是否有某種調試輸出可用於顯示所有可用變量?

回答

0

這一切都變得非常簡單。

如何獲取關聯的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)) 
相關問題