39 lines
1.5 KiB
Python
39 lines
1.5 KiB
Python
|
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 = str(int(_child_el_content(node, 'marketvercode')) - 10)
|
||
|
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))
|