Last active
September 27, 2023 17:06
-
-
Save obfusk/70d4ec1fb778ad60f279f96cc5d88e18 to your computer and use it in GitHub Desktop.
diff f-droid v2 index (new apps & versions)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
import json | |
from typing import Any, Dict, Iterable, List, Set, Tuple | |
def packages(data: Dict[str, Any]) -> Dict[str, str]: | |
d = {} | |
for k, v in data["packages"].items(): | |
m = v["metadata"] | |
d[k] = name = m["name"]["en-US"] | |
if "summary" in m: | |
for locale in ("en-US", "en_US", "en-us", "en", "en-GB"): | |
if locale in m["summary"]: | |
d[k] = f"{name}: {m['summary'][locale]}" | |
break | |
return d | |
def versions(data: Dict[str, Any], pkgs: Dict[str, str]) -> Iterable[Tuple[str, int, str]]: | |
for app in pkgs: | |
d = {} | |
for version in data["packages"][app]["versions"].values(): | |
m = version["manifest"] | |
d[m["versionCode"]] = m["versionName"] | |
for k, v in sorted(d.items()): | |
yield app, k, v | |
def updates(old_pkgs: Dict[str, Any], old_vsns: List[Tuple[str, int, str]], | |
new_vsns: List[Tuple[str, int, str]]) -> Tuple[List[Tuple[str, int, str]], int]: | |
old_codes: Dict[str, Set[int]] = {app: set() for app in old_pkgs} | |
new_apks = [] | |
upd_apps = set() | |
for app, code, _ in old_vsns: | |
old_codes[app].add(code) | |
for app, code, name in new_vsns: | |
if app in old_pkgs and (code in old_codes[app] or code < min(old_codes[app])): | |
continue | |
new_apks.append((app, code, name)) | |
if app in old_pkgs: | |
upd_apps.add(app) | |
return new_apks, len(upd_apps) | |
if __name__ == "__main__": | |
import argparse | |
parser = argparse.ArgumentParser() | |
parser.add_argument("old_index_v2") | |
parser.add_argument("new_index_v2") | |
args = parser.parse_args() | |
with open(args.old_index_v2) as fh: | |
old = json.load(fh) | |
with open(args.new_index_v2) as fh: | |
new = json.load(fh) | |
old_pkgs = packages(old) | |
new_pkgs = packages(new) | |
old_vsns = list(versions(old, old_pkgs)) | |
new_vsns = list(versions(new, new_pkgs)) | |
new_apps = set(new_pkgs) - set(old_pkgs) | |
rmd_apps = set(old_pkgs) - set(new_pkgs) | |
new_apks, n_update = updates(old_pkgs, old_vsns, new_vsns) | |
print(f"App stats: {len(new_apps)} new, {len(rmd_apps)} removed, {n_update} updated") | |
print("New apps:") | |
for app in sorted(new_apps): | |
print(f" {app} ({new_pkgs[app]})") | |
print("Removed apps:") | |
for app in sorted(rmd_apps): | |
print(f" {app} ({old_pkgs[app]})") | |
print("New APKs:") | |
for app, code, name in sorted(new_apks): | |
print(f" {app} ({new_pkgs[app]}) {name} ({code})") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment