Extract and download entries JSON from a jam URL

Script now accepts either a JSON file path or a jam URL, in which case
it downloads the page, extracts the jam ID, downloads the entries JSON
and grabs all titles accordingly.
This commit is contained in:
Ryszard Knop 2021-10-13 13:45:19 +02:00
parent e1a800a4ab
commit 4627a863d8

View File

@ -1,6 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Python 3.8+ and dependencies listed below required. # Python 3.8+ and dependencies listed below required.
import os import os
import re
import sys import sys
import json import json
import time import time
@ -129,16 +130,54 @@ def parse_jobs(jam_json: dict) -> list[tuple[int, str, str]]:
return [(int(e['game']['id']), e['game']['title'], e['game']['url']) for e in jam_json['jam_games']] return [(int(e['game']['id']), e['game']['title'], e['game']['url']) for e in jam_json['jam_games']]
def download_jam(path_to_json: str, download_to: str, api_key: str, continue_from: str=None): def get_game_jam_json(jam_path: str) -> dict:
try: # Do we have an URL?
with open(path_to_json) as f: jam_path = jam_path.strip()
jam_json = json.load(f) if jam_path.startswith("https://") or jam_path.startswith("http://"):
except FileNotFoundError: r = requests.get(jam_path)
print(f"File {path_to_json} not found.") if not r.ok:
except json.decoder.JSONDecodeError: raise Exception(f"Could not download game jam site from {jam_path} (code {r.status_code}): {r.reason}")
print(F"Provided entries file is not a valid JSON file.")
jam_id_line = None
for line in r.text.splitlines():
if "ViewJam" in line:
jam_id_line = line
if jam_id_line is None:
raise Exception(f"Jam site did not contain the ID line - please provide the path to the game jam entries JSON file instead.")
found_ids = re.findall(r'\"id\":([0-9]+)', jam_id_line)
if len(found_ids) == 0:
raise Exception(f"Could not extract the jam ID from the provided site.")
jam_id = int(found_ids[0]) # Always grab the first one for now...
print(f"Extracted jam ID: {jam_id}")
r = requests.get(f"https://itch.io/jam/{jam_id}/entries.json")
if not r.ok:
raise Exception(f"Could not download the game jam entries list.")
content = r.text
elif os.path.isfile(jam_path):
try:
with open(jam_path) as f:
content = f.read()
except Exception as e:
raise Exception(f"Could not open/read the game jam entries file: {e}")
else:
raise Exception(f"Provided game jam path is invalid (not a link/existing file).")
try:
jam_json = json.loads(content)
except json.decoder.JSONDecodeError:
print(f"Provided game jam entries file is not a valid JSON file.")
return jam_json
def download_jam(jam_path: str, download_to: str, api_key: str, continue_from: str=None):
client = ItchApiClient(ITCH_API, api_key) client = ItchApiClient(ITCH_API, api_key)
jam_json = get_game_jam_json(jam_path)
# Check API key validity: # Check API key validity:
profile_req = client.get("/profile") profile_req = client.get("/profile")