--- /dev/null
+#!/usr/bin/env python3
+import json
+import pathlib
+import requests
+import sys
+import time
+
+if __name__ == '__main__':
+ with open(sys.argv[1]) as fp:
+ creds = json.load(fp)
+ key = creds['key']
+ user = creds['user']
+
+ with open(sys.argv[2]) as fp:
+ games = json.load(fp)
+ for i in range(len(games)):
+ gid = games[i]
+ if isinstance(gid, str):
+ games[i] = int(pathlib.PurePosixPath(gid).name)
+
+ session = requests.Session()
+ session.auth = requests.auth.HTTPBasicAuth(user, '')
+ with open(sys.argv[3], 'a+b') as fp:
+ fp.seek(0)
+ progressions = {}
+ for line in fp:
+ g = json.loads(line)
+ progressions[g['ID']] = g
+ for i,gid in enumerate(games):
+ print(f'Game {i+1} (ID = {gid}): ', end='', flush=True)
+ if gid in progressions:
+ print('Already downloaded')
+ else:
+ response = requests.get(
+ f'https://retroachievements.org/API/API_GetGameProgression.php?y={key}&i={gid}'
+ )
+ p = json.loads(response.text)
+ progressions[gid] = p
+ fp.write(json.dumps(p).encode())
+ fp.write(b'\n')
+ fp.flush()
+ print('Downloaded new progression! (Wait for rate limit...)')
+ time.sleep(1)
+
+ with open(sys.argv[4], 'wb') as fp:
+ fp.write('\t'.join([
+ 'Game', 'Console', 'Download', 'Points', 'RetroPoints', 'Achievements',
+ 'Number of Masterers', 'Median Time to Master',
+ 'Number of Hardcore Beaters', 'Median Time to Hardcore Beat',
+ 'Number of Completers', 'Median Time to Complete',
+ 'Number of Beaters', 'Median Time to Beat',
+ '\n',
+ ]).encode())
+ LIMIT = (1 << 53)
+ rows = [(g, sum(a['Points'] for a in g['Achievements']), sum(a['TrueRatio'] for a in g['Achievements'])) for _, g in progressions.items()]
+ rows.sort(key=lambda x: -x[1] / (x[0]['MedianTimeToMaster'] or LIMIT))
+ for g, points, retropoints in rows:
+ fp.write('\t'.join([
+ f'=HYPERLINK("https://retroachievements.org/game/{g['ID']}", "{g['Title']}")',
+ f'=HYPERLINK("https://retroachievements.org/system/{g['ConsoleID']}/games", "{g['ConsoleName']}")',
+ 'TODO',
+ str(points or 0), str(retropoints or 0),
+ str(g['NumAchievements'] or 0),
+ str(g['TimesUsedInMasteryMedian'] or 0), str(g['MedianTimeToMaster'] or LIMIT),
+ str(g['TimesUsedInHardcoreBeatMedian'] or 0), str(g['MedianTimeToBeatHardcore'] or LIMIT),
+ str(g['TimesUsedInCompletionMedian'] or 0), str(g['MedianTimeToComplete'] or LIMIT),
+ str(g['TimesUsedInBeatMedian'] or 0), str(g['MedianTimeToBeat'] or LIMIT),
+ '\n',
+ ]).encode())
+ pass