From 85d3686f1c4fc21630a56be1c52b3b1773108837 Mon Sep 17 00:00:00 2001 From: yrriban Date: Sun, 11 May 2025 17:28:07 -0400 Subject: [PATCH] Support setting a name for a demo, supporting more than one demo stored at a time for a map. --- dcc/config.py | 31 +++++++++++++++++-------------- dcc/doom_base.py | 1 + dcc/dsda.py | 10 +++++----- dcc/fabricate.py | 4 ++-- dcc/pb.py | 2 +- dcc/put.py | 4 ++-- dcc/record.py | 2 +- dcc/ss.py | 2 +- dcc/text.py | 2 +- dcc/thumb.py | 6 +++--- setup.py | 1 + 11 files changed, 35 insertions(+), 30 deletions(-) diff --git a/dcc/config.py b/dcc/config.py index 0ef4146..4892118 100644 --- a/dcc/config.py +++ b/dcc/config.py @@ -45,8 +45,8 @@ def DsdaPreamble(wad, mapstr): args = args + ["-warp", mapstr] # TODO: UDoom return args -def DemoInPath(wad, mapstr): - candidates = [x for x in DEMOS.joinpath(wad).glob("{}_map{}*.lmp".format(wad, mapstr))] +def DemoInPath(wad, mapstr, name=None): + candidates = [x for x in DEMOS.joinpath(wad).glob("{}_map{}{}*.lmp".format(wad, mapstr, NameString(name)))] if len(candidates) == 0: raise Exception("no suitable demo candidates for WAD {} MAP {}.".format(wad, mapstr)) if len(candidates) == 1: @@ -56,11 +56,11 @@ def DemoInPath(wad, mapstr): def DsdaTextPath(wad, mapstr): return Ensure(DEMOS.joinpath(wad)).joinpath("{}_map{}.txt".format(wad, mapstr)) -def DemoOutPath(wad, mapstr): - return Ensure(DEMOS.joinpath(wad)).joinpath(DemoName(wad, mapstr)) +def DemoOutPath(wad, mapstr, name=None): + return Ensure(DEMOS.joinpath(wad)).joinpath(DemoName(wad, mapstr, name)) -def DemoName(wad, mapstr): - return "{}_map{}.lmp".format(wad, mapstr) +def DemoName(wad, mapstr, name=None): + return "{}_map{}{}.lmp".format(wad, mapstr, NameString(name)) def Complevel(wad): complevel = PwadPath(wad).joinpath("complevel") @@ -81,20 +81,23 @@ def IwadPath(wad): def PwadPath(wad): return Ensure(PWADS.joinpath(wad)) -def BaseThumbPath(wad, mapstr): - return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_base.png".format(wad, mapstr)) +def BaseThumbPath(wad, mapstr, name=None): + return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}{}_base.png".format(wad, mapstr, NameString(name))) def MDoomPath(wad): return Ensure(OUTPUT.joinpath(wad)).joinpath("M_DOOM_scaled.png") -def TextThumbPath(wad, mapstr): - return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_text.png".format(wad, mapstr)) +def TextThumbPath(wad, mapstr, name=None): + return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_text.png".format(wad, mapstr, NameString(name))) -def ThumbPath(wad, mapstr): - return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_thumb.png".format(wad, mapstr)) +def ThumbPath(wad, mapstr, name=None): + return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_thumb.png".format(wad, mapstr, NameString(name))) -def VideoPath(wad, mapstr): - return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}.mp4".format(wad, mapstr)) +def VideoPath(wad, mapstr, name=None): + return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}{}.mp4".format(wad, mapstr, NameString(name))) + +def NameString(name): + return "" if name is None else "_" + name def Ensure(path): if not path.exists(): diff --git a/dcc/doom_base.py b/dcc/doom_base.py index 5ec84e4..afc9e78 100644 --- a/dcc/doom_base.py +++ b/dcc/doom_base.py @@ -5,4 +5,5 @@ class WadMap(Command): parser = super().get_parser(prog_name) parser.add_argument('wad') parser.add_argument('map') + parser.add_argument('-n','--name','--demo_name') return parser diff --git a/dcc/dsda.py b/dcc/dsda.py index 42eeeba..df61a67 100644 --- a/dcc/dsda.py +++ b/dcc/dsda.py @@ -10,12 +10,12 @@ class DSDA(dcc.doom_base.WadMap): def get_parser(self, prog_name): parser = super().get_parser(prog_name) parser.add_argument("-s", "--single", action="store_true") - parser.add_argument("-n", "--name") + parser.add_argument("-a", "--abbreviation") return parser def take_action(self, parsed_args): - dip = dcc.config.DemoInPath(parsed_args.wad, parsed_args.map) - dtp = dcc.config.DsdaTextPath(parsed_args.wad, parsed_args.map) + dip = dcc.config.DemoInPath(parsed_args.wad, parsed_args.map, parsed_args.name) + dtp = dcc.config.DsdaTextPath(parsed_args.wad, parsed_args.map, parsed_args.name) if not dtp.exists(): command = [dcc.config.DSDA] if shutil.which("xvfb-run") is not None: @@ -28,8 +28,8 @@ class DSDA(dcc.doom_base.WadMap): if "EDITOR" in os.environ: editor = os.environ["EDITOR"] subprocess.run([editor, dtp]) - if parsed_args.name: - fh1 = parsed_args.name + if parsed_args.abbreviation: + fh1 = parsed_args.abbreviation if not parsed_args.single: fh1 += parsed_args.map else: diff --git a/dcc/fabricate.py b/dcc/fabricate.py index c021a50..2a1b54a 100644 --- a/dcc/fabricate.py +++ b/dcc/fabricate.py @@ -19,5 +19,5 @@ class Fabricate(dcc.doom_base.WadMap): command = ["xvfb-run"] + command subprocess.run(command + dcc.config.DsdaPreamble(parsed_args.wad, parsed_args.map) + - ["-timedemo", dcc.config.DemoInPath(parsed_args.wad, parsed_args.map)] + - ["-viddump", dcc.config.VideoPath(parsed_args.wad, parsed_args.map)]) + ["-timedemo", dcc.config.DemoInPath(parsed_args.wad, parsed_args.map, parsed_args.name)] + + ["-viddump", dcc.config.VideoPath(parsed_args.wad, parsed_args.map, parsed_args.name)]) diff --git a/dcc/pb.py b/dcc/pb.py index ed2535b..ce413e0 100644 --- a/dcc/pb.py +++ b/dcc/pb.py @@ -4,4 +4,4 @@ import subprocess class PB(dcc.doom_base.WadMap): def take_action(self, parsed_args): - subprocess.run(["ffplay", dcc.config.VideoPath(parsed_args.wad, parsed_args.map)]) + subprocess.run(["ffplay", dcc.config.VideoPath(parsed_args.wad, parsed_args.map, parsed_args.name)]) diff --git a/dcc/put.py b/dcc/put.py index 09f1e93..c076bcc 100644 --- a/dcc/put.py +++ b/dcc/put.py @@ -12,8 +12,8 @@ class Put(dcc.doom_base.WadMap): # TODO: accept configuration for bucket name def take_action(self, parsed_args): s3_client = boto3.client('s3') - demo = dcc.config.DemoInPath(parsed_args.wad, parsed_args.map) - bucket = dcc.config.DemoName(parsed_args.wad, parsed_args.map) + demo = dcc.config.DemoInPath(parsed_args.wad, parsed_args.map, parsed_args.name) + bucket = dcc.config.DemoName(parsed_args.wad, parsed_args.map, parsed_args.name) if parsed_args.dsda: pattern = ("{}{}".format(parsed_args.wad[0:2], parsed_args.map) if not parsed_args.single else parsed_args.wad[0:4]) + "*.zip" zips = [x for x in dcc.config.DEMOS.joinpath(parsed_args.wad).glob(pattern)] diff --git a/dcc/record.py b/dcc/record.py index 7b18b6b..15aeea8 100644 --- a/dcc/record.py +++ b/dcc/record.py @@ -6,4 +6,4 @@ class Record(dcc.doom_base.WadMap): def take_action(self, parsed_args): subprocess.run([dcc.config.DSDA] + dcc.config.DsdaPreamble(parsed_args.wad, parsed_args.map) + - ["-record", dcc.config.DemoOutPath(parsed_args.wad, parsed_args.map)]) + ["-record", dcc.config.DemoOutPath(parsed_args.wad, parsed_args.map, parsed_args.name)]) diff --git a/dcc/ss.py b/dcc/ss.py index a0697a6..39061af 100644 --- a/dcc/ss.py +++ b/dcc/ss.py @@ -29,7 +29,7 @@ class SS(dcc.doom_base.WadMap): sys.exit("Gave up on image verification") if not accepted: return False - img.save(filename=dcc.config.BaseThumbPath(parsed_args.wad, parsed_args.map)) + img.save(filename=dcc.config.BaseThumbPath(parsed_args.wad, parsed_args.map, parsed_args.name)) return True while not try_screenshot(): diff --git a/dcc/text.py b/dcc/text.py index fbc9327..5bd256c 100644 --- a/dcc/text.py +++ b/dcc/text.py @@ -31,4 +31,4 @@ class Text(dcc.doom_base.WadMap): draw(img) img.trim() img.reset_coords() - img.save(filename=dcc.config.TextThumbPath(parsed_args.wad, parsed_args.map)) + img.save(filename=dcc.config.TextThumbPath(parsed_args.wad, parsed_args.map, parsed_args.name)) diff --git a/dcc/thumb.py b/dcc/thumb.py index b9502a1..5982ef4 100644 --- a/dcc/thumb.py +++ b/dcc/thumb.py @@ -10,8 +10,8 @@ class Thumb(dcc.doom_base.WadMap): return parser def take_action(self, parsed_args): - base = dcc.config.BaseThumbPath(parsed_args.wad, parsed_args.map) - text = dcc.config.TextThumbPath(parsed_args.wad, parsed_args.map) + base = dcc.config.BaseThumbPath(parsed_args.wad, parsed_args.map, parsed_args.name) + text = dcc.config.TextThumbPath(parsed_args.wad, parsed_args.map, parsed_args.name) mdoom = dcc.config.MDoomPath(parsed_args.wad) with wand.image.Image(filename=base) as bi, wand.color.Color("transparent") as tc: with wand.image.Image(filename=text) as ti: @@ -27,4 +27,4 @@ class Thumb(dcc.doom_base.WadMap): di.border(tc, 1, 1) bi.composite(di, gravity="north_east") - bi.save(filename=dcc.config.ThumbPath(parsed_args.wad, parsed_args.map)) + bi.save(filename=dcc.config.ThumbPath(parsed_args.wad, parsed_args.map, parsed_args.name)) diff --git a/setup.py b/setup.py index 702fd3a..9cc63aa 100644 --- a/setup.py +++ b/setup.py @@ -35,6 +35,7 @@ setup( 'dsda = dcc.dsda:DSDA', 'eureka = dcc.eureka:Eureka', 'ls = dcc.ls:List', + 'configure = dcc.configure:Configure', ], }, zip_safe=False,