def get_document(self, url): """ Connects to the server and retrieves the document """ set_status(_('Contacting SomaFM server...')) hostinfo = urlparse.urlparse(url) try: c = httplib.HTTPConnection(hostinfo.netloc, timeout=20) except TypeError: c = httplib.HTTPConnection(hostinfo.netloc) try: c.request('GET', hostinfo.path, headers={'User-Agent': self.user_agent}) response = c.getresponse() except (socket.timeout, socket.error): raise radio.RadioException(_('Error connecting to SomaFM server.')) if response.status != 200: raise radio.RadioException(_('Error connecting to SomaFM server.')) document = response.read() c.close() set_status('') return document
def get_lists(self, no_cache=False): """ Returns the rlists for icecast """ from xlgui.panel import radio if no_cache or not self.data: set_status(_('Contacting Icecast server...')) hostinfo = urlparse.urlparse(self.genre_url) try: c = httplib.HTTPConnection(hostinfo.netloc, timeout=20) except TypeError: # python 2.5 doesnt have timeout= c = httplib.HTTPConnection(hostinfo.netloc) try: c.request('GET', hostinfo.path, headers={'User-Agent': self.user_agent}) response = c.getresponse() except (socket.timeout, socket.error): raise radio.RadioException( _('Error connecting to Icecast server.')) if response.status != 200: raise radio.RadioException( _('Error connecting to Icecast server.')) body = response.read() c.close() set_status('') data = {} dom = minidom.parseString(body) divs = dom.getElementsByTagName('div') for div in divs: if div.getAttribute('id') == 'content': anchors = div.getElementsByTagName('a') for anchor in anchors: anchor.normalize() for node in anchor.childNodes: if node.nodeType == minidom.Node.TEXT_NODE: data[node.nodeValue] = anchor.getAttribute( 'href') break break self.data = data self._save_cache() else: data = self.data rlists = [] for item in data.keys(): rlist = RadioList(item, station=self) rlist.get_items = lambda no_cache, name=item: \ self._get_subrlists(name=name, no_cache=no_cache) rlists.append(rlist) sort_list = [(item.name, item) for item in rlists] sort_list.sort() rlists = [item[1] for item in sort_list] self.rlists = rlists return rlists
def _get_stations(self, url): from xlgui.panel import radio hostinfo = urlparse.urlparse(url) query = hostinfo.query items = [] thisPage = -1 nextPage = 0 set_status(_('Contacting Icecast server...')) try: c = httplib.HTTPConnection(hostinfo.netloc, timeout=20) except TypeError: # python 2.5 doesnt have timeout= c = httplib.HTTPConnection(hostinfo.netloc) while thisPage < nextPage: thisPage += 1 try: c.request('GET', "%s?%s" % (hostinfo.path, query), headers={'User-Agent': self.user_agent}) response = c.getresponse() except (socket.timeout, socket.error): raise radio.RadioException( _('Error connecting to Icecast server.')) if response.status != 200: raise radio.RadioException( _('Error connecting to Icecast server.')) body = response.read() # XML parser can't handle the audio tag body = re.sub('<audio.*?>.*?</audio>', '', body, flags=(re.M | re.DOTALL)) dom = minidom.parseString(body) divs = dom.getElementsByTagName('div') for div in divs: if div.getAttribute('id') == 'content': servers = div.getElementsByTagName('tr') for server in servers: spans = server.getElementsByTagName('span') for span in spans: if span.getAttribute('class') == 'name': span.normalize() if span.firstChild.nodeType == minidom.Node.TEXT_NODE: sname = span.firstChild.nodeValue else: sname = span.firstChild.firstChild.nodeValue break tds = server.getElementsByTagName('td') for td in tds: if td.getAttribute('class') == 'tune-in': anchors = td.getElementsByTagName('a') for anchor in anchors: href = anchor.getAttribute('href') matcher = re.match( '/listen/(\d+)/listen\.xspf\Z', href) if matcher: sid = matcher.group(1) break paragraphs = td.getElementsByTagName('p') for paragraph in paragraphs: if paragraph.hasAttribute('title'): quality = paragraph.getAttribute( 'title').split() if quality[0] == 'Quality': sbitrate = self._calc_bitrate( quality[1]) elif len(quality[0]) > 3: sbitrate = str( int(quality[0]) / 1024) else: sbitrate = quality[0] anchor = paragraph.getElementsByTagName( 'a').item(0) anchor.normalize() for text in anchor.childNodes: if text.nodeType == minidom.Node.TEXT_NODE: sformat = text.nodeValue break break break items.append((sname, sid, sbitrate, sformat)) nextPage = -1 uls = div.getElementsByTagName('ul') for ul in uls: if ul.getAttribute('class') == 'pager': anchors = ul.getElementsByTagName('a') query = anchors.item(anchors.length - 1).getAttribute('href') matcher = re.match('\?(.*?page=(\d+))\Z', query) query = matcher.group(1) nextPage = int(matcher.group(2)) break break dom.unlink() c.close() set_status('') rlists = [] for item in items: rlist = RadioItem(item[0], station=self) rlist.bitrate = item[2] rlist.format = item[3] rlist.get_playlist = lambda name=item[0], station_id=item[1]: \ self._get_playlist(name, station_id) rlists.append(rlist) return rlists