Most of this is now in doom_base.py, which stores wad/map/name, exposes them as properties, and also takes care of most common tasks needed for building command lines and such.
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
import dcc.config
|
|
import dcc.doom_base
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import zipfile
|
|
|
|
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("-a", "--abbreviation")
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
dip = self.demo_in_path()
|
|
dtp = self.dsda_text_path()
|
|
if not dtp.exists():
|
|
command = [dcc.config.DSDA]
|
|
if shutil.which("xvfb-run") is not None:
|
|
command = ["xvfb-run"] + command
|
|
# TODO: negative tics should seek from the end, but this doesn't seem to work.
|
|
subprocess.run(command + self.dsda_preamble() +
|
|
["-fastdemo", dip, "-nosound", "-skiptic", "999999999", "-export_text_file"])
|
|
editor = "nano"
|
|
if "EDITOR" in os.environ:
|
|
editor = os.environ["EDITOR"]
|
|
subprocess.run([editor, dtp])
|
|
if parsed_args.abbreviation:
|
|
fh1 = parsed_args.abbreviation
|
|
if not parsed_args.single:
|
|
fh1 += self.map
|
|
else:
|
|
fh1 = self.wad[0:2] + self.map
|
|
if parsed_args.single:
|
|
fh1 = self.wad[0:min(len(self.wad), 4)]
|
|
fh2 = ""
|
|
with open(dtp, mode="r") as f:
|
|
for line in f:
|
|
if line[0:4] == "Time":
|
|
m = re.search("[^0-9]*([0-9]*):([0-9]*).[0-9]*", line)
|
|
if m is None:
|
|
continue
|
|
fh2 = m[1]+m[2]
|
|
if len(fh2)%2==1:
|
|
fh2 = "0" + fh2
|
|
break
|
|
if not fh2:
|
|
sys.exit("Failed to match any line in {} against Time regex.".format(dtp))
|
|
|
|
# TODO: demo names other than uv-max.
|
|
fnf = fh1 + "-" + fh2 + ".zip"
|
|
with zipfile.ZipFile(dcc.config.DEMOS.joinpath(self.wad).joinpath(fnf), mode="w") as zf:
|
|
zf.write(dip, arcname=dip.name)
|
|
zf.write(dtp, arcname=dtp.name)
|