示例#1
0
 def _et_node_text(self, etnode, etpath, default=''):
     """
     element tree helper function to select a sub-element of the 
     given node and return the text of the selected element
     """
     node = etnode.find(etpath)
     if node is None:
         return default
     else:
         return unescape(node.text)
示例#2
0
    def getRecordings(self):
    
        self.recordings.clear()
        
        if self.useCachedResponse('getRecordingsCache'):
            xmldata = self.getCachedResponse('getRecordingsCache')
            BongEnvironment.logger.info(u"using cached response for getRecordings()")
            #BongEnvironment.logger.info(unicode_string(xmldata))
            tree = ET.fromstring(xmldata)
        else:
            url = "http://{server}/api/recordings.xml?{credentials}".format( server = self.server
                                                                           , credentials = urllib.urlencode({ 'username' : self.username
                                                                                                            , 'password' : self.password }))
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            if response.code != 200:
                BongEnvironment.logger.warning(url)
                BongEnvironment.logger.warning("request failed ({code!s} {message!s})".format( code = response.code
                                                                                  , message = response.msg ))
                return False

            BongEnvironment.logger.info("{req} -> ({code!s} {message!s})".format( req = url
                                                                     , code = response.code
                                                                     , message = response.msg ))
            xmldata = response.read()
            BongEnvironment.logger.info(unicode_string(xmldata))
        
            tree = ET.fromstring(xmldata)

            if self._et_node_text(tree, "status", "false") != 'true':
                BongEnvironment.logger.warning("response contains errors.")
                return False
            else:
                self.cacheResponse('getRecordingsCache', xmldata)

        # find all recording elements with an id sub-element
        for rec in tree.findall("recording/[id]"):
            id = self._et_node_text(rec, "id")
            if 0 < len(id):
                recitems = {}
                self.recordings[id] = recitems
                for item in rec:
                    if item.tag != u"files":
                        recitems[item.tag] = unescape(item.text)
                for media in rec.findall("files/file"):
                    if self._et_node_text(media, "type") == 'download':
                        if self._et_node_text(media, "quality") == 'HQ':
                            recitems["downloadHQ"] = self._et_node_text(media, "url")
                        elif self._et_node_text(media, "quality") == 'NQ':
                            recitems["downloadNQ"] = self._et_node_text(media, "url")
                for name in self.reccat:
                    if not name in recitems:
                        BongEnvironment.logger.warning("missing element {} in recording {}".format(name, id))
                        return False
        return True