Support setting a name for a demo, supporting more than one demo stored at a time for a map.

This commit is contained in:
yrriban 2025-05-11 17:28:07 -04:00
parent c73c7dd457
commit 85d3686f1c
11 changed files with 35 additions and 30 deletions

View file

@ -45,8 +45,8 @@ def DsdaPreamble(wad, mapstr):
args = args + ["-warp", mapstr] # TODO: UDoom args = args + ["-warp", mapstr] # TODO: UDoom
return args return args
def DemoInPath(wad, mapstr): def DemoInPath(wad, mapstr, name=None):
candidates = [x for x in DEMOS.joinpath(wad).glob("{}_map{}*.lmp".format(wad, mapstr))] candidates = [x for x in DEMOS.joinpath(wad).glob("{}_map{}{}*.lmp".format(wad, mapstr, NameString(name)))]
if len(candidates) == 0: if len(candidates) == 0:
raise Exception("no suitable demo candidates for WAD {} MAP {}.".format(wad, mapstr)) raise Exception("no suitable demo candidates for WAD {} MAP {}.".format(wad, mapstr))
if len(candidates) == 1: if len(candidates) == 1:
@ -56,11 +56,11 @@ def DemoInPath(wad, mapstr):
def DsdaTextPath(wad, mapstr): def DsdaTextPath(wad, mapstr):
return Ensure(DEMOS.joinpath(wad)).joinpath("{}_map{}.txt".format(wad, mapstr)) return Ensure(DEMOS.joinpath(wad)).joinpath("{}_map{}.txt".format(wad, mapstr))
def DemoOutPath(wad, mapstr): def DemoOutPath(wad, mapstr, name=None):
return Ensure(DEMOS.joinpath(wad)).joinpath(DemoName(wad, mapstr)) return Ensure(DEMOS.joinpath(wad)).joinpath(DemoName(wad, mapstr, name))
def DemoName(wad, mapstr): def DemoName(wad, mapstr, name=None):
return "{}_map{}.lmp".format(wad, mapstr) return "{}_map{}{}.lmp".format(wad, mapstr, NameString(name))
def Complevel(wad): def Complevel(wad):
complevel = PwadPath(wad).joinpath("complevel") complevel = PwadPath(wad).joinpath("complevel")
@ -81,20 +81,23 @@ def IwadPath(wad):
def PwadPath(wad): def PwadPath(wad):
return Ensure(PWADS.joinpath(wad)) return Ensure(PWADS.joinpath(wad))
def BaseThumbPath(wad, mapstr): def BaseThumbPath(wad, mapstr, name=None):
return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_base.png".format(wad, mapstr)) return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}{}_base.png".format(wad, mapstr, NameString(name)))
def MDoomPath(wad): def MDoomPath(wad):
return Ensure(OUTPUT.joinpath(wad)).joinpath("M_DOOM_scaled.png") return Ensure(OUTPUT.joinpath(wad)).joinpath("M_DOOM_scaled.png")
def TextThumbPath(wad, mapstr): def TextThumbPath(wad, mapstr, name=None):
return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_text.png".format(wad, mapstr)) return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_text.png".format(wad, mapstr, NameString(name)))
def ThumbPath(wad, mapstr): def ThumbPath(wad, mapstr, name=None):
return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_thumb.png".format(wad, mapstr)) return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}_thumb.png".format(wad, mapstr, NameString(name)))
def VideoPath(wad, mapstr): def VideoPath(wad, mapstr, name=None):
return Ensure(OUTPUT.joinpath(wad)).joinpath("{}_map{}.mp4".format(wad, mapstr)) 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): def Ensure(path):
if not path.exists(): if not path.exists():

View file

@ -5,4 +5,5 @@ class WadMap(Command):
parser = super().get_parser(prog_name) parser = super().get_parser(prog_name)
parser.add_argument('wad') parser.add_argument('wad')
parser.add_argument('map') parser.add_argument('map')
parser.add_argument('-n','--name','--demo_name')
return parser return parser

View file

@ -10,12 +10,12 @@ class DSDA(dcc.doom_base.WadMap):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super().get_parser(prog_name) parser = super().get_parser(prog_name)
parser.add_argument("-s", "--single", action="store_true") parser.add_argument("-s", "--single", action="store_true")
parser.add_argument("-n", "--name") parser.add_argument("-a", "--abbreviation")
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
dip = dcc.config.DemoInPath(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) dtp = dcc.config.DsdaTextPath(parsed_args.wad, parsed_args.map, parsed_args.name)
if not dtp.exists(): if not dtp.exists():
command = [dcc.config.DSDA] command = [dcc.config.DSDA]
if shutil.which("xvfb-run") is not None: if shutil.which("xvfb-run") is not None:
@ -28,8 +28,8 @@ class DSDA(dcc.doom_base.WadMap):
if "EDITOR" in os.environ: if "EDITOR" in os.environ:
editor = os.environ["EDITOR"] editor = os.environ["EDITOR"]
subprocess.run([editor, dtp]) subprocess.run([editor, dtp])
if parsed_args.name: if parsed_args.abbreviation:
fh1 = parsed_args.name fh1 = parsed_args.abbreviation
if not parsed_args.single: if not parsed_args.single:
fh1 += parsed_args.map fh1 += parsed_args.map
else: else:

View file

@ -19,5 +19,5 @@ class Fabricate(dcc.doom_base.WadMap):
command = ["xvfb-run"] + command command = ["xvfb-run"] + command
subprocess.run(command + subprocess.run(command +
dcc.config.DsdaPreamble(parsed_args.wad, parsed_args.map) + dcc.config.DsdaPreamble(parsed_args.wad, parsed_args.map) +
["-timedemo", dcc.config.DemoInPath(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)]) ["-viddump", dcc.config.VideoPath(parsed_args.wad, parsed_args.map, parsed_args.name)])

View file

@ -4,4 +4,4 @@ import subprocess
class PB(dcc.doom_base.WadMap): class PB(dcc.doom_base.WadMap):
def take_action(self, parsed_args): 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)])

View file

@ -12,8 +12,8 @@ class Put(dcc.doom_base.WadMap):
# TODO: accept configuration for bucket name # TODO: accept configuration for bucket name
def take_action(self, parsed_args): def take_action(self, parsed_args):
s3_client = boto3.client('s3') s3_client = boto3.client('s3')
demo = dcc.config.DemoInPath(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) bucket = dcc.config.DemoName(parsed_args.wad, parsed_args.map, parsed_args.name)
if parsed_args.dsda: 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" 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)] zips = [x for x in dcc.config.DEMOS.joinpath(parsed_args.wad).glob(pattern)]

View file

@ -6,4 +6,4 @@ class Record(dcc.doom_base.WadMap):
def take_action(self, parsed_args): def take_action(self, parsed_args):
subprocess.run([dcc.config.DSDA] + subprocess.run([dcc.config.DSDA] +
dcc.config.DsdaPreamble(parsed_args.wad, parsed_args.map) + 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)])

View file

@ -29,7 +29,7 @@ class SS(dcc.doom_base.WadMap):
sys.exit("Gave up on image verification") sys.exit("Gave up on image verification")
if not accepted: if not accepted:
return False 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 return True
while not try_screenshot(): while not try_screenshot():

View file

@ -31,4 +31,4 @@ class Text(dcc.doom_base.WadMap):
draw(img) draw(img)
img.trim() img.trim()
img.reset_coords() 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))

View file

@ -10,8 +10,8 @@ class Thumb(dcc.doom_base.WadMap):
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
base = dcc.config.BaseThumbPath(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) text = dcc.config.TextThumbPath(parsed_args.wad, parsed_args.map, parsed_args.name)
mdoom = dcc.config.MDoomPath(parsed_args.wad) 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=base) as bi, wand.color.Color("transparent") as tc:
with wand.image.Image(filename=text) as ti: with wand.image.Image(filename=text) as ti:
@ -27,4 +27,4 @@ class Thumb(dcc.doom_base.WadMap):
di.border(tc, 1, 1) di.border(tc, 1, 1)
bi.composite(di, gravity="north_east") 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))

View file

@ -35,6 +35,7 @@ setup(
'dsda = dcc.dsda:DSDA', 'dsda = dcc.dsda:DSDA',
'eureka = dcc.eureka:Eureka', 'eureka = dcc.eureka:Eureka',
'ls = dcc.ls:List', 'ls = dcc.ls:List',
'configure = dcc.configure:Configure',
], ],
}, },
zip_safe=False, zip_safe=False,