Add a fetch command; this could probably use some refinement.

This commit is contained in:
yrriban 2025-04-19 23:05:38 -04:00
parent d1ddad97ef
commit 790f3af1a2
3 changed files with 44 additions and 1 deletions

View file

@ -17,6 +17,8 @@ DEFAULT_IWAD=IWADS.joinpath("DOOM2.WAD")
THUMB_WIDTH=1280 THUMB_WIDTH=1280
THUMB_HEIGHT=720 THUMB_HEIGHT=720
MIRROR="https://youfailit.net/pub/idgames" # NYC
def DsdaPreamble(wad, mapstr): def DsdaPreamble(wad, mapstr):
args = [] args = []
pwadpath = PWADS.joinpath(wad) pwadpath = PWADS.joinpath(wad)
@ -60,6 +62,9 @@ def DemoOutPath(wad, mapstr):
def DemoName(wad, mapstr): def DemoName(wad, mapstr):
return "{}_map{}.lmp".format(wad, mapstr) return "{}_map{}.lmp".format(wad, mapstr)
def PwadPath(wad):
return Ensure(PWADS.joinpath(wad))
def BaseThumbPath(wad, mapstr): def BaseThumbPath(wad, mapstr):
return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_base.png".format(wad, mapstr)) return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_base.png".format(wad, mapstr))
@ -68,5 +73,5 @@ def VideoPath(wad, mapstr):
def Ensure(path): def Ensure(path):
if not path.exists(): if not path.exists():
ok.mkdir(path) os.mkdir(path)
return path return path

37
dcc/fetch.py Normal file
View file

@ -0,0 +1,37 @@
from cliff.command import Command
import dcc.config
import io
import json
import pathlib
import urllib.request
import zipfile
class Fetch(Command):
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
parser.add_argument("id_or_name")
return parser
def take_action(self, parsed_args):
idgames_id = parsed_args.id_or_name
if not parsed_args.id_or_name.isdigit():
idgames_id = self.search_idgames(parsed_args.id_or_name)
with urllib.request.urlopen("https://www.doomworld.com/idgames/api/api.php?action=get&id={}&out=json".format(idgames_id)) as response:
reply = json.loads(response.read())
rpath = "/".join([dcc.config.MIRROR, reply["content"]["dir"], reply["content"]["filename"]])
wad = reply["content"]["filename"][0:-4]
with urllib.request.urlopen(rpath) as response:
z = zipfile.ZipFile(io.BytesIO(response.read()))
z.extractall(path=dcc.config.PwadPath(wad))
# TODO: explicit error handling. Let users choose when >1 result.
def search_idgames(self, wad):
with urllib.request.urlopen("https://www.doomworld.com/idgames/api/api.php?action=search&query={}&out=json".format(wad)) as response:
reply = json.loads(response.read())
files = reply["content"]["file"]
if type(files) is dict: # One result.
return files["id"]
else: # More than one. Zero will raise an error.
return files[0]["id"]

View file

@ -29,6 +29,7 @@ setup(
'ss = dcc.ss:SS', 'ss = dcc.ss:SS',
'check = dcc.check:Check', 'check = dcc.check:Check',
'extract = dcc.extract:Extract', 'extract = dcc.extract:Extract',
'fetch = dcc.fetch:Fetch',
], ],
}, },
zip_safe=False, zip_safe=False,