Skip to content

Instantly share code, notes, and snippets.

@obfusk
Last active September 27, 2023 17:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save obfusk/70d4ec1fb778ad60f279f96cc5d88e18 to your computer and use it in GitHub Desktop.
Save obfusk/70d4ec1fb778ad60f279f96cc5d88e18 to your computer and use it in GitHub Desktop.
diff f-droid v2 index (new apps & versions)
#!/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