diff --git a/docs/configuration.rst b/docs/configuration.rst index 47c50d2f..9fd15638 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -936,23 +936,31 @@ Description extractor.*.actions ------------------- Type - * ``object`` (`pattern` -> `action`) - * ``list`` of ``lists`` with 2 ``strings`` as elements + * ``object`` (`pattern` -> `action(s)`) + * ``list`` of ``lists`` with `pattern` -> `action(s)` pairs as elements Example .. code:: json { - "error" : "status |= 1", + "info:Logging in as .+" : "level = debug", "warning:(?i)unable to .+": "exit 127", - "info:Logging in as .+" : "level = debug" + "error" : [ + "status |= 1", + "exec notify.sh 'gdl error'", + "abort" + ] } .. code:: json [ - ["error" , "status |= 1" ], + ["info:Logging in as .+" , "level = debug"], ["warning:(?i)unable to .+", "exit 127" ], - ["info:Logging in as .+" , "level = debug"] + ["error" , [ + "status |= 1", + "exec notify.sh 'gdl error'", + "abort" + ]] ] Description @@ -968,6 +976,9 @@ Description ``action`` is parsed as action type followed by (optional) arguments. + It is possible to specify more than one ``action`` per ``pattern`` + by providing them as a ``list``: ``["", "", …]`` + Supported Action Types: ``status``: @@ -982,9 +993,9 @@ Description ``level``: | Modify severity level of the current logging message. | Can be one of ``debug``, ``info``, ``warning``, ``error`` or an integer value. - ``print`` + ``print``: Write argument to stdout. - ``exec`` + ``exec``: Run a shell command. ``abort``: Stop the current extractor run. @@ -993,7 +1004,8 @@ Description ``restart``: Restart the current extractor run. ``wait``: - Stop execution until Enter is pressed. + | Sleep for a given Duration_ or + | wait until Enter is pressed when no argument was given. ``exit``: Exit the program with the given argument as exit status. diff --git a/gallery_dl/actions.py b/gallery_dl/actions.py index 6b682b72..2dd8599d 100644 --- a/gallery_dl/actions.py +++ b/gallery_dl/actions.py @@ -27,9 +27,17 @@ def parse(actionspec): for event, spec in actionspec: level, _, pattern = event.partition(":") - type, _, args = spec.partition(" ") search = re.compile(pattern).search if pattern else util.true - action = (search, ACTIONS[type](args)) + + if isinstance(spec, str): + type, _, args = spec.partition(" ") + action = (search, ACTIONS[type](args)) + else: + action_list = [] + for s in spec: + type, _, args = s.partition(" ") + action_list.append(ACTIONS[type](args)) + action = (search, _chain_actions(action_list)) level = level.strip() if not level or level == "*": @@ -50,6 +58,13 @@ def _level_to_int(level): return int(level) +def _chain_actions(actions): + def _chain(args): + for action in actions: + action(args) + return _chain + + def action_print(opts): def _print(_): print(opts)