mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-06 05:02:50 +02:00
Reduce F-Droid indexes and fetch APK alternatives asynchronously
This commit is contained in:
1 parent
fbe7ba9575
commit
32196b4260
7 files changed
+359
-51
No files matched your search
+24
-21
@@ -3,7 +3,6 @@ from urllib.parse import quote, urlencode
|
||||
|
||||
import frame_android
|
||||
import frame_catalog
|
||||
from pick import installable
|
||||
|
||||
ANDROID = dict(enumerate([
|
||||
'1.0', '1.1', '1.5', '1.6', '2.0', '2.0.1', '2.1', '2.2', '2.3', '2.3.3',
|
||||
@@ -45,38 +44,42 @@ def search_links(package):
|
||||
)]
|
||||
|
||||
|
||||
def alternatives(package, current_version_code=None):
|
||||
"""All compatible builds, ordered by version code; keep per-ABI builds distinct."""
|
||||
def _versions(package, cached_only=False):
|
||||
versions, errors, seen = [], [], set()
|
||||
for source, repo in REPOS:
|
||||
try:
|
||||
index = frame_catalog.load_index(repo)
|
||||
index = frame_catalog.load_index(repo, cached_only=cached_only)
|
||||
except (OSError, ValueError) as e:
|
||||
errors.append(f'Could not check {source}: {e}')
|
||||
continue
|
||||
for v in index.get('packages', {}).get(package, {}).get('versions', {}).values():
|
||||
m, file = v['manifest'], v['file']
|
||||
code = m.get('versionCode', 0)
|
||||
if not installable(v):
|
||||
continue
|
||||
url = repo + file['name'].lstrip('/')
|
||||
key = (code, file.get('sha256') or url)
|
||||
if code == current_version_code or key in seen:
|
||||
for v in index.get(package, []):
|
||||
url = repo + v['name'].lstrip('/')
|
||||
key = (v['version_code'], v.get('sha256') or url)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
versions.append({'version': m.get('versionName', ''), 'version_code': code,
|
||||
'min_sdk': m.get('usesSdk', {}).get('minSdkVersion', 1),
|
||||
'abis': m.get('nativecode') or [], 'url': url,
|
||||
'source': source, 'sha256': file.get('sha256')})
|
||||
versions.sort(key=lambda v: v['version_code'], reverse=True)
|
||||
return {'package': package, 'versions': versions, 'links': search_links(package),
|
||||
'note': NOTE, 'errors': errors}
|
||||
versions.append(dict(v, url=url, source=source))
|
||||
return versions, errors
|
||||
|
||||
|
||||
def alternatives(package, current_version_code=None):
|
||||
"""At most eight releases, preferring arm64-only builds over universal builds."""
|
||||
versions, errors = _versions(package)
|
||||
versions = [v for v in versions if v['version_code'] != current_version_code]
|
||||
total = len(versions)
|
||||
versions.sort(key=lambda v: (v['abis'] == ['arm64-v8a'], v['version_code']), reverse=True)
|
||||
releases = {}
|
||||
for v in versions:
|
||||
releases.setdefault(v['version'], v)
|
||||
versions = sorted(releases.values(), key=lambda v: v['version_code'], reverse=True)[:8]
|
||||
return {'package': package, 'versions': versions, 'total': total,
|
||||
'links': search_links(package), 'note': NOTE, 'errors': errors}
|
||||
|
||||
|
||||
def install(package, url):
|
||||
# Resolve the selection again: the client cannot supply a trusted hash or arbitrary URL.
|
||||
result = alternatives(package)
|
||||
version = next((v for v in result['versions'] if v['url'] == url), None)
|
||||
records, _ = _versions(package, cached_only=True)
|
||||
version = next((v for v in records if v['url'] == url), None)
|
||||
if not version:
|
||||
raise frame_android.FrameError('That version is no longer available; check the APK again')
|
||||
apk = frame_catalog.fetch_apk({'a': version['url'], 'h': version['sha256'], 'n': package})
|
||||
|
||||
Reference in new issue
Block a user