]> localhost Git - radev.git/commitdiff
Rename scraper, add EZSets script
authormisomosi <[email protected]>
Thu, 27 Aug 2026 03:07:33 +0000 (23:07 -0400)
committermisomosi <[email protected]>
Thu, 27 Aug 2026 03:07:40 +0000 (23:07 -0400)
EZSets/EZSets.py [new file with mode: 0644]
EZSets/RAHubScraper.js [moved from EZSets/FreelyAvailableScraper.js with 100% similarity]

diff --git a/EZSets/EZSets.py b/EZSets/EZSets.py
new file mode 100644 (file)
index 0000000..c679e3d
--- /dev/null
@@ -0,0 +1,70 @@
+#!/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