[Icecast-dev] Icecast status-json.xsl improvements

Marvin Scholz epirat07 at gmail.com
Fri Mar 3 12:37:40 UTC 2017


Hi, thanks for your e-mail and detailed description.

On 3 Mar 2017, at 12:51, Roger H├ągensen wrote:

> While  http://127.0.0.1:8000/status-json.xsl?mount=/live
> is fine for info on the server itself and the current track played 
> it's missing a played history.
>
>
> I'd like to suggest adding history to status-json.xsl or to reduce the 
> size of the json to the bare minimum that a Web base mediaplayer might 
> need
> Add a new one at http://127.0.0.1:8000/playing-json.xsl?mount=/live
> Which will only hold the current info:

Right now I personally don't think there should be more .xsl json  
things be added, as it's just a transform from XML to JSON and
has proven to sometimes cause some weird bugs with malformed json in the 
past, so proper JSON generation capabilities in Icecast
would be preferred.

>
> {
> "date":"2017-03-03T10:57:20Z",
> "server_name":"Testing Stuff",
> "server_description":"Blah blah blah",
> "history":
> [
> {"date":"2017-03-03T10:52:10Z","artist":"Some artist","title":"Some 
> song (this is the current one)"},
> {"date":"2017-03-03T10:48:10Z","artist":"Some other artist 
> 2","title":"Some Song 2"},
> {"date":"2017-03-03T10:44:10Z","artist":"Artist 3","title":"Song 3"},
> {"date":"2017-03-03T10:40:10Z","artist":"Artist 4","title":"Song 4"},
> {"date":"2017-03-03T10:36:10Z","artist":"Artist 5","title":"Song 5"},
> {"date":"2017-03-03T10:32:10Z","artist":"Artist 6","title":"Song 6"},
> {"date":"2017-03-03T10:28:10Z","artist":"Artist 7","title":"Song 7"},
> {"date":"2017-03-03T10:24:10Z","artist":"Artist 8","title":"Song 8"},
> {"date":"2017-03-03T10:20:10Z","artist":"Artist 9","title":"Song 9"},
> {"date":"2017-03-03T10:16:10Z","artist":"Artist 10","title":"Song 10"}
> ]
> }
>
>
> Now ideally a web player should not directly poll this, a webdesigner 
> would hopefully make a serverside script that fetches this say maybe 
> once each 300 seconds (5 minutes) which should be enough unless the 
> station is a jingles only station in which case a shorter interval is 
> needed to not miss any songs. The script will then cache and provide 
> the cached copy to the web players. This avoids hundreds of (needless) 
> requests to the Icecast servers at the same time. But I'm getting 
> sidetracked here now.

More suitable would it be, to use the STATS streaming API that Icecast 
offers, server side, and then use a websocket connection to update the 
players.

>
> Back to the JSON above, the first "date" is critical, this is the date 
> This info was retrieved/provided and act's as a clock reference for 
> the "date" fields in the song history array. Why a clock reference? 
> Let me digress or a moment. Working on a webplayer myself right now 
> I'm frustrated with Shoutcast v2 providing a nice history of songs but 
> the UTC time is off, I'm assuming the server time is off by N amount 
> of minutes (and I don't control that server), Shoutcast v2's 
> http://127.0.0.1:8000/played?sid=1&type=json does not provide a 
> date/reference clock, nor does Shoutcast v2 even provide a HTTP date 
> header (what the hell?). Luckily I'm able to poke a different (non 
> Shoutcast v2) served page on the same server and get the server date 
> from there so I can't adjust all the times in the history to the 
> correct UTC that the server hosting the script has).
> The server_name and server_description is included since those could 
> change between DJs (and are nice to display in the webplayer to the 
> listener).
> The date for each song is somewhat useful for a webplayer, not only 
> can a webplayer show the start time for each song to the listener but 
> (with the exeception of the current song) it can calculate and show 
> the duration of songs.

While this in theory works, it requires that you do _not_ use ICY 
metadata (which is used for MP3 and AAC), as ICY metadata can't be very 
accurate,
due to the way ICY works.

>
> With Shoutcast v1 you have the scrape the pages for this info (stream 
> title/description is one url, history is another url, and a third url 
> to try and get server datetime).
> With Shoutcast v2 there is luckily JSON support but it's still 3 urls 
> since, you are just spared having to scrape anything.
>
> With Icecast there is luckily no need to get a server datetime from 
> anywhere else as Icecast has proper HTTP headers, but providing the 
> date in the JSON would be easier to code in a script/webplayer, HTTP 
> headers can be a bit fiddly, although with a server side script PHP or 
> something else should have no issues handling the HTTP Date value, but 
> still providing the date in the json simplifies the implementation (no 
> parsing needed, just passthrough and cache basically).

Using the Date headers is the right thing to do.

>
> I believe the lack of a song history has been pointed out before, now 
> with Webplayers possible (which do not support in-stream metadata 
> "out-of-the-box") this is very useful. If Shoutcast v2 had a proper 
> server date provided it would still be two calls (to get the history 
> and the stream name/description). Icecast can easily do this better, 
> right?

When streaming in modern formats, like Ogg or WebM, browser players 
should support metadata.

>
> Could such a feature be snuck into the 2.4.x branch or would it be the 
> 2.5.x branch?

That is up to Thomas to decide, personally I don't think this can be 
done (properly, at least) for 2.4.x

> All the needed info is there internally, and Icecast just need to 
> "remember" the current + the last 9 (total history of 10 as a 
> default).

Icecast is already able to remember the song history, in 2.5 at least.

Could you maybe register at trac.xiph.org and create a feature request 
there with the information you included in this E-mail?
(If you do, don't forget to choose Icecast as the component)

>
>
> ---
> Roger H├ągensen,
> Freelancer, Norway.
>
> _______________________________________________
> Icecast-dev mailing list
> Icecast-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/icecast-dev


More information about the Icecast-dev mailing list