mirror of
https://github.com/DragoonAethis/itch-dl.git
synced 2024-12-21 02:21:52 +01:00
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:
parent
e1a800a4ab
commit
4627a863d8
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user