Four columns of figures, from three different places. Here is which is which.
The station list comes from Radio Browser, an open, community-run directory of internet radio. We ask it for one page at a time, filtered and ordered by whatever the sidebar is set to. It gives us each station's name, genre tags, country, homepage and stream address — and nothing about who is listening right now.
Now Playing and Listeners/Max come from the stations themselves. For every row on
the page we ask that station's own server directly. Stream servers send no CORS headers and
many still run over plain http, so a browser cannot ask them from a page like this one; the
asking is done here on the server instead. Each station is tried at the addresses these
servers conventionally answer on — Icecast's status-json.xsl, SHOUTcast's
stats and 7.html, their HTML status pages — at the host root
and at the path prefixes proxied streams hide behind. When none of them answers, we open the
stream itself and read the ICY metadata the track title travels in. Whichever address worked
is remembered for a day, so later visits ask once rather than hunting, and answers are held
for 30 seconds so a busy page does not pester anyone.
A stream can answer without saying much. Roughly one station in five has no status
page at any of those addresses and sends no track title either, yet still answers: the ICY
headers that open the connection carry the bitrate and the server's own name, and nothing
else. Those rows show a bitrate, no listener count and no Now Playing, and
headers under the empty figure. It is the thinnest honest answer a station can
give, and it is still an answer — the alternative would be a row that looks as though
we invented the number.
Every figure says where it came from. Under each number in the Listeners/Max column
is the source it was read from — icecast, shoutcast,
somafm, uber.radio, stream for a track title read off
the stream itself, headers for the case above, no answer where the
station never replied, and not counted for a figure we show but do not rank on.
Hovering the number spells the same thing out in full. Nothing here is a figure of ours: the
listener counts are whatever the station's own server said when the page was built.
Not everything speaks Icecast or SHOUTcast. Some networks publish their figures
somewhere else entirely, and no amount of probing the conventional addresses will find them.
SomaFM is the clearest case: every one of their Icecast status pages is deliberately stubbed
— ask for status-json.xsl and you get a request for donations — while
one public document at somafm.com/channels.json carries the listener count and
current track for all 46 channels. uber.radio does the same for the thousand-odd stations it
hosts. That is the better number anyway, since it totals their
relays rather than counting one. Where a network does that, we read what it publishes, and
the line under the listener figure names it.
Numbers that are not counts. A few servers answer with a fixed figure rather than a measurement. Three rautemusik streams return the same line as each other — 5,000 listeners, 5,000 peak, 5,000 maximum, 2 unique — and it does not move from one minute to the next, which is enough to put it at the top of a listener ranking permanently. Where a server claims to be exactly at capacity, or reports a unique count far below its current one, the figure is shown in the listing but struck through, left out of the total at the top of the page, and not ranked on.
Why so many stations read n/a. Only about one in four publishes a listener count: 13 of 50 on the first page, 8 of 40 and 11 of 40 further down the directory. The rest are either fronted by a CDN, where no origin server is reachable and no such number exists publicly, or run a server whose operator switched the stats page off. It is not something this site can fix by asking harder, so the sidebar can hide them instead.
Two counters, deliberately kept apart. Clicks (RB) is Radio Browser's: tune-ins over the last 24 hours across every app built on that directory, one per listener. Plays (here) is ours: tune-ins that happened on ypshout. Pressing Tune In! counts once in each, because Radio Browser asks the players it feeds to report a play, and this one does. Our count takes one play per address per station per hour, and stores the address only as a salted hash — enough to stop one person running a number up, not enough to identify anybody afterwards.
The genre menu is built from the directory's own tag list — every tag it knows, with how many stations carry it — grouped under families so the sub-genres sit where you would look for them: deep house and tech house under House, black metal and thrash under Metal. Tags are free-form, so the popular end of that list is full of things that are not genres; the menu keeps only what sits under a family it recognises.
The chat rooms are ours too, one per station, kept for 48 hours and then dropped. A nick is held by a token your browser generates, so nobody can take yours while you are using it. There are no accounts and nothing is shared with the stations.
« back to the listing