[actions] allow using actions as 'signals-actions' target
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user