示例#1
0
    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
示例#2
0
文件: __init__.py 项目: 0mark/exaile
    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 = sorted([(item.name, item) for item in rlists])
        rlists = [item[1] for item in sort_list]
        self.rlists = rlists
        return rlists
示例#3
0
    def _get_stations(self, url):
        from xlgui.panel import radio

        hostinfo = urllib.parse.urlparse(url)
        query = hostinfo.query
        items = []
        thisPage = -1
        nextPage = 0
        set_status(_('Contacting Icecast server...'))
        c = http.client.HTTPConnection(hostinfo.netloc, timeout=20)
        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().decode('utf-8', 'replace')

            # 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