[#1290] [Execute] Add TorrentRemoved event

This commit is contained in:
Calum Lind 2014-07-12 21:41:48 +01:00
parent 7b44980912
commit 4d5e01abef
3 changed files with 38 additions and 17 deletions

View File

@ -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"])]
def execute_commands(self, torrent_id, event, *arg):
if event == "added" and arg[0]:
# No futher action as from_state (arg[0]) is True
return
elif event == "removed":
torrent_id, torrent_name, download_location = self.preremoved_cache.pop(torrent_id)
else:
torrent = component.get("TorrentManager").torrents[torrent_id]
info = torrent.get_status(["name", "download_location"])
# Grab the torrent name and download location # Grab the torrent name and download location
# getProcessOutputAndValue requires args to be str # getProcessOutputAndValue requires args to be str
torrent_id = utf8_encoded(torrent_id) torrent_id = utf8_encoded(torrent_id)
torrent_name = utf8_encoded(info["name"]) torrent_name = utf8_encoded(info["name"])
if event == "added" and arg[0]:
# No futher action as from_state (arg[0]) is True
return
else:
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):
log.debug("Running %s", command)
d = getProcessOutputAndValue(command, (torrent_id, torrent_name, download_location), env=os.environ) d = getProcessOutputAndValue(command, (torrent_id, torrent_name, download_location), env=os.environ)
d.addCallback(log_error, command) 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()

View File

@ -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({

View File

@ -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):