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)
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