Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/scripts/generate_achievement_hash_database.py
4208 views
1
from importlib.machinery import FileFinder
2
import json
3
import sys
4
import urllib.request
5
6
if len(sys.argv) < 3:
7
print(f"Syntax: {sys.argv[0]} WEB-API-KEY OUTPUT_FILE.yaml")
8
sys.exit(1)
9
10
print("Sending request...")
11
url = "https://retroachievements.org/API/API_GetGameList.php?y=" + sys.argv[1] + "&i=12&h=1&f=0"
12
req = urllib.request.Request(url)
13
req.add_header("User-Agent", "curl/8.10.1") # CF blocks urllib user agent
14
data = None
15
with urllib.request.urlopen(req) as response:
16
data = response.read().decode('utf-8')
17
18
data = json.loads(data)
19
print(f"Found {len(data)} entries in JSON")
20
21
games = {}
22
hashes = {}
23
for entry in data:
24
if ("ID" not in entry or \
25
"NumAchievements" not in entry or \
26
"Hashes" not in entry or \
27
len(entry["Hashes"]) == 0):
28
continue
29
30
game_id = int(entry["ID"])
31
num_achievements = int(entry["NumAchievements"])
32
33
if game_id not in games:
34
games[game_id] = num_achievements
35
else:
36
print(f"Duplicate game {game_id}")
37
38
for thash in entry["Hashes"]:
39
if thash in hashes:
40
print(f"Duplicate hash {thash}")
41
continue
42
hashes[thash] = game_id
43
44
print(f"Extracted {len(games)} games")
45
print(f"Extracted {len(hashes)} hashes")
46
47
with open(sys.argv[2], "w") as f:
48
f.write("hashes:\n")
49
for ghash, game_id in hashes.items():
50
f.write(f" {ghash}: {game_id}\n")
51
52
f.write("achievements:\n")
53
for game_id, num_achievements in games.items():
54
f.write(f" {game_id}: {num_achievements}\n")
55
56