D'un peu curl
, il semble utiliser le protocole shoutcast, vous êtes à la recherche d'une ligne rapide commençant par 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
$
Par conséquent:
>>> 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
>>>
Vous voudrez peut-être ajouter par exemple certains appels .lower()
parce que je crois que ces noms d'en-tête sont censés être insensible à la casse, mais c'est l'idée générale.
Merci pour une excellente solution et une explication complète! Sauvé ma journée :) – frigg
Ceci est un peu vieux maintenant, mais ce ne sont que des en-têtes http. Vous devriez y accéder en tant qu'en-têtes normaux, et non en raclant le contenu de la réponse. f = urllib2.urlopen (someurl). print f.headers ['nom-de-glace']. –
Après un peu plus de fouilles, il semble que certaines stations cérébrales n'utilisent pas les en-têtes et fourrent tout dans le contenu de la réponse. Malheureusement, c'est probablement la meilleure façon de les gérer. –