[#1290] [Execute] Add TorrentRemoved event

This commit is contained in:
Calum Lind 2014-07-19 23:02:42 +01:00
parent 2c54c696a1
commit 56bbc90c5b
3 changed files with 41 additions and 25 deletions

View File

@ -44,6 +44,8 @@ import deluge.component as component
from deluge.configmanager import ConfigManager from deluge.configmanager import ConfigManager
from deluge.core.rpcserver import export from deluge.core.rpcserver import export
from deluge.event import DelugeEvent from deluge.event import DelugeEvent
from deluge.common import utf8_encoded
DEFAULT_CONFIG = { DEFAULT_CONFIG = {
"commands": [] "commands": []
@ -55,9 +57,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.
@ -65,6 +69,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.
@ -72,12 +77,14 @@ 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.torrent_manager = component.get("TorrentManager") self.torrent_manager = component.get("TorrentManager")
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"]:
@ -91,28 +98,31 @@ 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): 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", "save_path"]) info = torrent.get_status(["name", "save_path"])
self.preremoved_cache[torrent_id] = [utf8_encoded(torrent_id), utf8_encoded(info["name"]),
utf8_encoded(info["save_path"])]
# Grab the torrent name and save path def execute_commands(self, torrent_id, event):
torrent_name = info["name"]
if event == "added" and not self.torrent_manager.session_started: if event == "added" and not self.torrent_manager.session_started:
return return
elif event == "removed":
torrent_id, torrent_name, save_path = self.preremoved_cache.pop(torrent_id)
else: else:
save_path = info["save_path"] torrent = component.get("TorrentManager").torrents[torrent_id]
info = torrent.get_status(["name", "save_path"])
# getProcessOutputAndValue requires args to be str # getProcessOutputAndValue requires args to be str
if isinstance(torrent_id, unicode): torrent_id = utf8_encoded(torrent_id)
torrent_id = torrent_id.encode("utf-8", "ignore") torrent_name = utf8_encoded(info["name"])
if isinstance(torrent_name, unicode): save_path = utf8_encoded(info["save_path"])
torrent_name = torrent_name.encode("utf-8", "ignore")
if isinstance(save_path, unicode):
save_path = save_path.encode("utf-8", "ignore")
log.debug("[execute] Running commands for %s", event) log.debug("[execute] Running commands for %s", event)
@ -130,9 +140,12 @@ class Core(CorePluginBase):
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, save_path), env=os.environ) log.debug("[execute] Running %s", command)
d.addCallback(log_error, command) d = getProcessOutputAndValue(command, (torrent_id, torrent_name, save_path), env=os.environ)
d.addCallback(log_error, command)
else:
log.error("[execute] 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

@ -49,10 +49,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):