[pp:exec] support more replacement fields for '--exec' (#4633)

- {_directory}
- {_filename}
- {_path} (alias for {})
pull/4667/head
Mike Fährmann 12 months ago
parent 9a008523ac
commit 67ba4ee842
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

@ -121,11 +121,13 @@
--write-tags Write image tags to separate text files
--mtime-from-date Set file modification times according to 'date'
metadata
--exec CMD Execute CMD for each downloaded file. Example:
--exec "convert {} {}.png && rm {}"
--exec CMD Execute CMD for each downloaded file. Supported
replacement fields are {} or {_path},
{_directory}, {_filename}. Example: --exec
"convert {} {}.png && rm {}"
--exec-after CMD Execute CMD after all files were downloaded
successfully. Example: --exec-after "cd {} &&
convert * ../doc.pdf"
successfully. Example: --exec-after "cd
{_directory} && convert * ../doc.pdf"
-P, --postprocessor NAME Activate the specified post processor
-O, --postprocessor-option OPT
Additional '<key>=<value>' post processor

@ -510,6 +510,8 @@ def build_parser():
dest="postprocessors", metavar="CMD",
action=AppendCommandAction, const={"name": "exec"},
help=("Execute CMD for each downloaded file. "
"Supported replacement fields are "
"{} or {_path}, {_directory}, {_filename}. "
"Example: --exec \"convert {} {}.png && rm {}\""),
)
postprocessor.add_argument(
@ -518,7 +520,8 @@ def build_parser():
action=AppendCommandAction, const={
"name": "exec", "event": "finalize"},
help=("Execute CMD after all files were downloaded successfully. "
"Example: --exec-after \"cd {} && convert * ../doc.pdf\""),
"Example: --exec-after \"cd {_directory} "
"&& convert * ../doc.pdf\""),
)
postprocessor.add_argument(
"-P", "--postprocessor",

@ -12,6 +12,7 @@ from .common import PostProcessor
from .. import util, formatter
import subprocess
import os
import re
if util.WINDOWS:
@ -32,6 +33,7 @@ class ExecPP(PostProcessor):
args = options["command"]
if isinstance(args, str):
self.args = args
self._sub = re.compile(r"\{(_directory|_filename|_path|)\}").sub
execute = self.exec_string
else:
self.args = [formatter.parse(arg) for arg in args]
@ -69,11 +71,8 @@ class ExecPP(PostProcessor):
if archive and archive.check(pathfmt.kwdict):
return
if pathfmt.realpath:
args = self.args.replace("{}", quote(pathfmt.realpath))
else:
args = self.args.replace("{}", quote(pathfmt.realdirectory))
self.pathfmt = pathfmt
args = self._sub(self._replace, self.args)
self._exec(args, True)
if archive:
@ -90,5 +89,13 @@ class ExecPP(PostProcessor):
self.log.debug("Running '%s'", args)
subprocess.Popen(args, shell=shell)
def _replace(self, match):
name = match.group(1)
if name == "_directory":
return quote(self.pathfmt.realdirectory)
if name == "_filename":
return quote(self.pathfmt.filename)
return quote(self.pathfmt.realpath)
__postprocessor__ = ExecPP

@ -168,7 +168,7 @@ class ExecTest(BasePostprocessorTest):
def test_command_string(self):
self._create({
"command": "echo {} && rm {};",
"command": "echo {} {_path} {_directory} {_filename} && rm {};",
})
with patch("subprocess.Popen") as p:
@ -178,7 +178,11 @@ class ExecTest(BasePostprocessorTest):
self._trigger(("after",))
p.assert_called_once_with(
"echo {0} && rm {0};".format(self.pathfmt.realpath), shell=True)
"echo {0} {0} {1} {2} && rm {0};".format(
self.pathfmt.realpath,
self.pathfmt.realdirectory,
self.pathfmt.filename),
shell=True)
i.wait.assert_called_once_with()
def test_command_list(self):

Loading…
Cancel
Save