from xml.dom import minidom, pulldom import requests_cache requests_session = requests_cache.CachedSession('updater', backend='memory') class ApkRelease: version_name: str version_code: int download_url: str def __init__(self, version_name: str, version_code: int, download_url: str): self.version_name = version_name self.version_code = version_code self.download_url = download_url def _child_el_content(el: minidom.Element, tag_name: str): return el.getElementsByTagName(tag_name).item(0).firstChild.data def fdroid_recommended_release(repo: str, application_id: str): with requests_session.get('{}/index.xml'.format(repo)) as r: doc = pulldom.parseString(r.text) for event, node in doc: if event == pulldom.START_ELEMENT and node.tagName == 'application': if node.getAttribute('id') == application_id: doc.expandNode(node) marketvercode = _child_el_content(node, 'marketvercode') for p in node.getElementsByTagName('package'): if _child_el_content(p, 'versioncode') == marketvercode: return ApkRelease( _child_el_content(p, 'version'), int(marketvercode), '{}/{}'.format(repo, _child_el_content(p, 'apkname')) ) raise Exception('Did not find {} in repo {}'.format(application_id, repo))