summaryrefslogtreecommitdiffstats
path: root/gallery_dl/postprocessor/exec.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/postprocessor/exec.py')
-rw-r--r--gallery_dl/postprocessor/exec.py56
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