Skip to content

Commit

Permalink
[pp:exec] support more replacement fields for '--exec' (mikf#4633)
Browse files Browse the repository at this point in the history
- {_directory}
- {_filename}
- {_path} (alias for {})
  • Loading branch information
mikf committed Oct 9, 2023
1 parent 9a00852 commit 67ba4ee
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 12 deletions.
10 changes: 6 additions & 4 deletions docs/options.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 4 additions & 1 deletion gallery_dl/option.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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",
Expand Down
17 changes: 12 additions & 5 deletions gallery_dl/postprocessor/exec.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from .. import util, formatter
import subprocess
import os
import re


if util.WINDOWS:
Expand All @@ -32,6 +33,7 @@ def __init__(self, job, options):
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]
Expand Down Expand Up @@ -69,11 +71,8 @@ def exec_string(self, pathfmt):
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:
Expand All @@ -90,5 +89,13 @@ def _exec_async(self, args, shell):
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
8 changes: 6 additions & 2 deletions test/test_postprocessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -178,7 +178,11 @@ def test_command_string(self):
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):
Expand Down

0 comments on commit 67ba4ee

Please sign in to comment.