diff --git a/dcc/config.py b/dcc/config.py index aeb90e7..3858dd5 100644 --- a/dcc/config.py +++ b/dcc/config.py @@ -17,6 +17,8 @@ DEFAULT_IWAD=IWADS.joinpath("DOOM2.WAD") THUMB_WIDTH=1280 THUMB_HEIGHT=720 +MIRROR="https://youfailit.net/pub/idgames" # NYC + def DsdaPreamble(wad, mapstr): args = [] pwadpath = PWADS.joinpath(wad) @@ -60,6 +62,9 @@ def DemoOutPath(wad, mapstr): def DemoName(wad, mapstr): return "{}_map{}.lmp".format(wad, mapstr) +def PwadPath(wad): + return Ensure(PWADS.joinpath(wad)) + def BaseThumbPath(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): if not path.exists(): - ok.mkdir(path) + os.mkdir(path) return path diff --git a/dcc/fetch.py b/dcc/fetch.py new file mode 100644 index 0000000..a0238b0 --- /dev/null +++ b/dcc/fetch.py @@ -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"] diff --git a/setup.py b/setup.py index 3f83c90..f8076de 100644 --- a/setup.py +++ b/setup.py @@ -29,6 +29,7 @@ setup( 'ss = dcc.ss:SS', 'check = dcc.check:Check', 'extract = dcc.extract:Extract', + 'fetch = dcc.fetch:Fetch', ], }, zip_safe=False,