Path: blob/master/scripts/generate_achievement_hash_database.py
4208 views
from importlib.machinery import FileFinder1import json2import sys3import urllib.request45if len(sys.argv) < 3:6print(f"Syntax: {sys.argv[0]} WEB-API-KEY OUTPUT_FILE.yaml")7sys.exit(1)89print("Sending request...")10url = "https://retroachievements.org/API/API_GetGameList.php?y=" + sys.argv[1] + "&i=12&h=1&f=0"11req = urllib.request.Request(url)12req.add_header("User-Agent", "curl/8.10.1") # CF blocks urllib user agent13data = None14with urllib.request.urlopen(req) as response:15data = response.read().decode('utf-8')1617data = json.loads(data)18print(f"Found {len(data)} entries in JSON")1920games = {}21hashes = {}22for entry in data:23if ("ID" not in entry or \24"NumAchievements" not in entry or \25"Hashes" not in entry or \26len(entry["Hashes"]) == 0):27continue2829game_id = int(entry["ID"])30num_achievements = int(entry["NumAchievements"])3132if game_id not in games:33games[game_id] = num_achievements34else:35print(f"Duplicate game {game_id}")3637for thash in entry["Hashes"]:38if thash in hashes:39print(f"Duplicate hash {thash}")40continue41hashes[thash] = game_id4243print(f"Extracted {len(games)} games")44print(f"Extracted {len(hashes)} hashes")4546with open(sys.argv[2], "w") as f:47f.write("hashes:\n")48for ghash, game_id in hashes.items():49f.write(f" {ghash}: {game_id}\n")5051f.write("achievements:\n")52for game_id, num_achievements in games.items():53f.write(f" {game_id}: {num_achievements}\n")545556