diff options
Diffstat (limited to 'gallery_dl/postprocessor/exec.py')
| -rw-r--r-- | gallery_dl/postprocessor/exec.py | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/gallery_dl/postprocessor/exec.py b/gallery_dl/postprocessor/exec.py index c86b480..19a9b87 100644 --- a/gallery_dl/postprocessor/exec.py +++ b/gallery_dl/postprocessor/exec.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2018 Mike Fährmann +# Copyright 2018-2019 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -9,35 +9,61 @@ """Execute processes""" from .common import PostProcessor +from .. import util import subprocess +import os + + +if os.name == "nt": + def quote(s): + return '"' + s.replace('"', '\\"') + '"' +else: + from shlex import quote class ExecPP(PostProcessor): def __init__(self, pathfmt, options): PostProcessor.__init__(self) + args = options["command"] - try: - self.args = options["command"] - self.args[0] # test if 'args' is subscriptable - except (KeyError, IndexError, TypeError): - raise TypeError("option 'command' must be a non-empty list") + if isinstance(args, str): + if "{}" not in args: + args += " {}" + self.args = args + self.shell = True + self._format = self._format_args_string + else: + self.args = [util.Formatter(arg) for arg in args] + self.shell = False + self._format = self._format_args_list if options.get("async", False): - self._exec = subprocess.Popen + self._exec = self._exec_async + + def run_after(self, pathfmt): + self._exec(self._format(pathfmt)) - def run(self, pathfmt): - self._exec([ - arg.format_map(pathfmt.keywords) - for arg in self.args - ]) + def _format_args_string(self, pathfmt): + return self.args.replace("{}", quote(pathfmt.realpath)) + + def _format_args_list(self, pathfmt): + kwdict = pathfmt.kwdict + kwdict["_directory"] = pathfmt.realdirectory + kwdict["_filename"] = pathfmt.filename + kwdict["_path"] = pathfmt.realpath + return [arg.format_map(kwdict) for arg in self.args] def _exec(self, args): - retcode = subprocess.Popen(args).wait() + self.log.debug("Running '%s'", args) + retcode = subprocess.Popen(args, shell=self.shell).wait() if retcode: self.log.warning( - "executing '%s' returned non-zero exit status %d", - " ".join(args), retcode) + "Executing '%s' returned with non-zero exit status (%d)", + " ".join(args) if isinstance(args, list) else args, retcode) + + def _exec_async(self, args): + subprocess.Popen(args, shell=self.shell) __postprocessor__ = ExecPP |
