[#1290] [Execute] Add TorrentRemoved event
This commit is contained in:
parent
7b44980912
commit
4d5e01abef
|
@ -58,9 +58,11 @@ EXECUTE_COMMAND = 2
|
||||||
|
|
||||||
EVENT_MAP = {
|
EVENT_MAP = {
|
||||||
"complete": "TorrentFinishedEvent",
|
"complete": "TorrentFinishedEvent",
|
||||||
"added": "TorrentAddedEvent"
|
"added": "TorrentAddedEvent",
|
||||||
|
"removed": "TorrentRemovedEvent"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ExecuteCommandAddedEvent(DelugeEvent):
|
class ExecuteCommandAddedEvent(DelugeEvent):
|
||||||
"""
|
"""
|
||||||
Emitted when a new command is added.
|
Emitted when a new command is added.
|
||||||
|
@ -68,6 +70,7 @@ class ExecuteCommandAddedEvent(DelugeEvent):
|
||||||
def __init__(self, command_id, event, command):
|
def __init__(self, command_id, event, command):
|
||||||
self._args = [command_id, event, command]
|
self._args = [command_id, event, command]
|
||||||
|
|
||||||
|
|
||||||
class ExecuteCommandRemovedEvent(DelugeEvent):
|
class ExecuteCommandRemovedEvent(DelugeEvent):
|
||||||
"""
|
"""
|
||||||
Emitted when a command is removed.
|
Emitted when a command is removed.
|
||||||
|
@ -75,11 +78,13 @@ class ExecuteCommandRemovedEvent(DelugeEvent):
|
||||||
def __init__(self, command_id):
|
def __init__(self, command_id):
|
||||||
self._args = [command_id]
|
self._args = [command_id]
|
||||||
|
|
||||||
|
|
||||||
class Core(CorePluginBase):
|
class Core(CorePluginBase):
|
||||||
def enable(self):
|
def enable(self):
|
||||||
self.config = ConfigManager("execute.conf", DEFAULT_CONFIG)
|
self.config = ConfigManager("execute.conf", DEFAULT_CONFIG)
|
||||||
event_manager = component.get("EventManager")
|
event_manager = component.get("EventManager")
|
||||||
self.registered_events = {}
|
self.registered_events = {}
|
||||||
|
self.preremoved_cache = {}
|
||||||
|
|
||||||
# Go through the commands list and register event handlers
|
# Go through the commands list and register event handlers
|
||||||
for command in self.config["commands"]:
|
for command in self.config["commands"]:
|
||||||
|
@ -93,43 +98,56 @@ class Core(CorePluginBase):
|
||||||
return event_handler
|
return event_handler
|
||||||
event_handler = create_event_handler(event)
|
event_handler = create_event_handler(event)
|
||||||
event_manager.register_event_handler(EVENT_MAP[event], event_handler)
|
event_manager.register_event_handler(EVENT_MAP[event], event_handler)
|
||||||
|
if event == "removed":
|
||||||
|
event_manager.register_event_handler("PreTorrentRemovedEvent", self.on_preremoved)
|
||||||
self.registered_events[event] = event_handler
|
self.registered_events[event] = event_handler
|
||||||
|
|
||||||
log.debug("Execute core plugin enabled!")
|
log.debug("Execute core plugin enabled!")
|
||||||
|
|
||||||
def execute_commands(self, torrent_id, event, *arg):
|
def on_preremoved(self, torrent_id):
|
||||||
|
# Get and store the torrent info before it is removed
|
||||||
torrent = component.get("TorrentManager").torrents[torrent_id]
|
torrent = component.get("TorrentManager").torrents[torrent_id]
|
||||||
info = torrent.get_status(["name", "download_location"])
|
info = torrent.get_status(["name", "download_location"])
|
||||||
|
self.preremoved_cache[torrent_id] = [utf8_encoded(torrent_id), utf8_encoded(info["name"]),
|
||||||
|
utf8_encoded(info["download_location"])]
|
||||||
|
|
||||||
# Grab the torrent name and download location
|
def execute_commands(self, torrent_id, event, *arg):
|
||||||
# getProcessOutputAndValue requires args to be str
|
|
||||||
torrent_id = utf8_encoded(torrent_id)
|
|
||||||
torrent_name = utf8_encoded(info["name"])
|
|
||||||
if event == "added" and arg[0]:
|
if event == "added" and arg[0]:
|
||||||
# No futher action as from_state (arg[0]) is True
|
# No futher action as from_state (arg[0]) is True
|
||||||
return
|
return
|
||||||
|
elif event == "removed":
|
||||||
|
torrent_id, torrent_name, download_location = self.preremoved_cache.pop(torrent_id)
|
||||||
else:
|
else:
|
||||||
|
torrent = component.get("TorrentManager").torrents[torrent_id]
|
||||||
|
info = torrent.get_status(["name", "download_location"])
|
||||||
|
# Grab the torrent name and download location
|
||||||
|
# getProcessOutputAndValue requires args to be str
|
||||||
|
torrent_id = utf8_encoded(torrent_id)
|
||||||
|
torrent_name = utf8_encoded(info["name"])
|
||||||
download_location = utf8_encoded(info["download_location"])
|
download_location = utf8_encoded(info["download_location"])
|
||||||
|
|
||||||
log.debug("[execute] Running commands for %s", event)
|
log.debug("Running commands for %s", event)
|
||||||
|
|
||||||
def log_error(result, command):
|
def log_error(result, command):
|
||||||
(stdout, stderr, exit_code) = result
|
(stdout, stderr, exit_code) = result
|
||||||
if exit_code:
|
if exit_code:
|
||||||
log.warn("[execute] command '%s' failed with exit code %d", command, exit_code)
|
log.warn("Command '%s' failed with exit code %d", command, exit_code)
|
||||||
if stdout:
|
if stdout:
|
||||||
log.warn("[execute] stdout: %s", stdout)
|
log.warn("stdout: %s", stdout)
|
||||||
if stderr:
|
if stderr:
|
||||||
log.warn("[execute] stderr: %s", stderr)
|
log.warn("stderr: %s", stderr)
|
||||||
|
|
||||||
# Go through and execute all the commands
|
# Go through and execute all the commands
|
||||||
for command in self.config["commands"]:
|
for command in self.config["commands"]:
|
||||||
if command[EXECUTE_EVENT] == event:
|
if command[EXECUTE_EVENT] == event:
|
||||||
command = os.path.expandvars(command[EXECUTE_COMMAND])
|
command = os.path.expandvars(command[EXECUTE_COMMAND])
|
||||||
command = os.path.expanduser(command)
|
command = os.path.expanduser(command)
|
||||||
log.debug("[execute] running %s", command)
|
if os.path.isfile(command) and os.access(command, os.X_OK):
|
||||||
d = getProcessOutputAndValue(command, (torrent_id, torrent_name, download_location), env=os.environ)
|
log.debug("Running %s", command)
|
||||||
d.addCallback(log_error, command)
|
d = getProcessOutputAndValue(command, (torrent_id, torrent_name, download_location), env=os.environ)
|
||||||
|
d.addCallback(log_error, command)
|
||||||
|
else:
|
||||||
|
log.error("Execute script not found or not executable")
|
||||||
|
|
||||||
def disable(self):
|
def disable(self):
|
||||||
self.config.save()
|
self.config.save()
|
||||||
|
|
|
@ -54,7 +54,8 @@ Deluge.ux.ExecuteWindowBase = Ext.extend(Ext.Window, {
|
||||||
fields: ['id', 'text'],
|
fields: ['id', 'text'],
|
||||||
data: [
|
data: [
|
||||||
['complete', _('Torrent Complete')],
|
['complete', _('Torrent Complete')],
|
||||||
['added', _('Torrent Added')]
|
['added', _('Torrent Added')],
|
||||||
|
['removed', _('Torrent Removed')]
|
||||||
]
|
]
|
||||||
}),
|
}),
|
||||||
name: 'event',
|
name: 'event',
|
||||||
|
@ -152,7 +153,8 @@ Deluge.ux.preferences.ExecutePage = Ext.extend(Ext.Panel, {
|
||||||
Deluge.ux.preferences.ExecutePage.superclass.initComponent.call(this);
|
Deluge.ux.preferences.ExecutePage.superclass.initComponent.call(this);
|
||||||
var event_map = this.event_map = {
|
var event_map = this.event_map = {
|
||||||
'complete': _('Torrent Complete'),
|
'complete': _('Torrent Complete'),
|
||||||
'added': _('Torrent Added')
|
'added': _('Torrent Added'),
|
||||||
|
'removed': _('Torrent Removed')
|
||||||
}
|
}
|
||||||
|
|
||||||
this.list = new Ext.list.ListView({
|
this.list = new Ext.list.ListView({
|
||||||
|
|
|
@ -52,10 +52,11 @@ EXECUTE_COMMAND = 2
|
||||||
|
|
||||||
EVENT_MAP = {
|
EVENT_MAP = {
|
||||||
"complete": _("Torrent Complete"),
|
"complete": _("Torrent Complete"),
|
||||||
"added": _("Torrent Added")
|
"added": _("Torrent Added"),
|
||||||
|
"removed": _("Torrent Removed")
|
||||||
}
|
}
|
||||||
|
|
||||||
EVENTS = ["complete", "added"]
|
EVENTS = ["complete", "added", "removed"]
|
||||||
|
|
||||||
class ExecutePreferences(object):
|
class ExecutePreferences(object):
|
||||||
def __init__(self, plugin):
|
def __init__(self, plugin):
|
||||||
|
|
Loading…
Reference in New Issue