3

I've been trying to get the name/title of internet radio stations based on the url in python, but with no luck so far. It seems that internet radio stations use another protocol than HTTP, but please correct me if I'm wrong.

For example: http://89.238.146.142:7030

Has the title: "Ibiza Global Radio"

How can i store this title in a variable? Any help will be deeply appreciated :)

Kind regards, frigg

Jonas
  • 121,568
  • 97
  • 310
  • 388
Fredrik
  • 1,741
  • 4
  • 24
  • 40

1 Answers1

8

From a little curl, it seems to be using shoutcast protocol, so you're looking for an early line starting with icy-name:

$ curl http://89.238.146.142:7030 | head -5
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13191    0 13191    0     0  16013      0 --:--:-- --:--:-- --:--:-- 28516ICY 200 OK
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
icy-name:Ibiza Global Radio
icy-genre:Electronic
100 33463    0 33463    0     0  30954      0 --:--:--  0:00:01 --:--:-- 46579
curl: (23) Failed writing body
$ 

Therefore:

>>> import urllib2
>>> f = urllib2.urlopen('http://89.238.146.142:7030')
>>> for i, line in enumerate(f):
...   if line.startswith('icy-name') or i > 20: break
... 
>>> if i > 20: print 'failed to find station name'
... else: print 'station name is', line.replace('icy-name:', '')
... 
station name is Ibiza Global Radio

>>> 

You may want to add e.g. some .lower() calls because I believe these header names are meant to be case-insensitive, but that's the general idea.

Alex Martelli
  • 854,459
  • 170
  • 1,222
  • 1,395
  • Thanks for a great solution and a thorough explanation! Saved my day :) – Fredrik Jun 25 '10 at 07:50
  • This is a little old now, but these are just http headers. You should access them as normal headers, not by scraping the content of the reply. f = urllib2.urlopen(someurl). print f.headers['icy-name']. – John Tyree Dec 25 '13 at 00:53
  • After a little more digging, it seems that some hair-brained stations don't use headers and just stuff everything in the response content. Sadly this is probably the best way to handle those. – John Tyree Dec 25 '13 at 03:21