[actions] allow using actions as 'signals-actions' target

This commit is contained in:
Mike Fährmann
2025-07-14 22:39:26 +02:00
parent f7e84f0a09
commit bccf467d19
3 changed files with 134 additions and 59 deletions

View File

@@ -90,23 +90,8 @@ def main():
signal.signal(signal_num, signal.SIG_IGN)
if signals := config.get((), "signals-actions"):
import signal
def signals_handler(event, action):
def handler(signal_num, frame):
signal_name = signal.Signals(signal_num).name
output.stderr_write(f"{signal_name} received\n")
util.FLAGS.__dict__[event] = action
return handler
for signal_name, action in signals.items():
signal_num = getattr(signal, signal_name, None)
if signal_num is None:
log.warning("signal '%s' is not defined", signal_name)
else:
event, _, action = action.rpartition(":")
signal.signal(signal_num, signals_handler(
event.upper() if event else "FILE", action.lower()))
from . import actions
actions.parse_signals(signals)
# enable ANSI escape sequences on Windows
if util.WINDOWS and config.get(("output",), "ansi", output.COLORS):

View File

@@ -15,7 +15,7 @@ import functools
from . import util, exception
def parse(actionspec):
def parse_logging(actionspec):
if isinstance(actionspec, dict):
actionspec = actionspec.items()
@@ -73,6 +73,41 @@ def parse(actionspec):
return actions
def parse_signals(actionspec):
import signal
if isinstance(actionspec, dict):
actionspec = actionspec.items()
for signal_name, spec in actionspec:
signal_num = getattr(signal, signal_name, None)
if signal_num is None:
log = logging.getLogger("gallery-dl")
log.warning("signal '%s' is not defined", signal_name)
continue
if isinstance(spec, str):
type, _, args = spec.partition(" ")
before, after = ACTIONS[type](args)
action = before if after is None else after
else:
actions_before = []
actions_after = []
for s in spec:
type, _, args = s.partition(" ")
before, after = ACTIONS[type](args)
if before is not None:
actions_before.append(before)
if after is not None:
actions_after.append(after)
actions = actions_before
actions.extend(actions_after)
action = _chain_actions(actions)
signal.signal(signal_num, signals_handler(action))
class LoggerAdapter():
def __init__(self, logger, job):
@@ -128,6 +163,12 @@ def _chain_actions(actions):
return _chain
def signals_handler(action, args={}):
def handler(signal_num, frame):
action(args)
return handler
# --------------------------------------------------------------------
def action_print(opts):