Ticket #1126: extractor-fix-and-moved-event.patch
File extractor-fix-and-moved-event.patch, 11.6 KB (added by Lattyware, 12 years ago) |
---|
-
deluge/core/torrentmanager.py
From 4be3701b611c83012e3e965dc32638b19e7ba19f Mon Sep 17 00:00:00 2001 From: Gareth Latty <gareth@lattyware.co.uk> Date: Sat, 11 Feb 2012 02:31:21 +0000 Subject: [PATCH] Fixed extractor plugin to work with move on complete - also provides a general solution for working with move on complete torrents using the TorrentMoveEvent event. --- deluge/core/torrentmanager.py | 2 + deluge/event.py | 11 ++ deluge/plugins/extractor/extractor/core.py | 123 ++++++++++++-------- .../extractor/extractor/data/extractor_prefs.glade | 15 +++ deluge/plugins/extractor/extractor/gtkui.py | 4 +- 5 files changed, 107 insertions(+), 48 deletions(-) diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py index 996f5c4..59b9de3 100644
a b def on_alert_storage_moved(self, alert): 977 977 log.debug("on_alert_storage_moved") 978 978 try: 979 979 torrent = self.torrents[str(alert.handle.info_hash())] 980 torrent_id = str(alert.handle.info_hash()) 980 981 except: 981 982 return 982 983 torrent.set_save_path(os.path.normpath(alert.handle.save_path())) 983 984 torrent.set_move_completed(False) 985 component.get("EventManager").emit(TorrentMovedEvent(torrent_id)) 984 986 985 987 def on_alert_torrent_resumed(self, alert): 986 988 log.debug("on_alert_torrent_resumed") -
deluge/event.py
diff --git a/deluge/event.py b/deluge/event.py index 4289990..e2c743e 100644
a b def __init__(self, torrent_id): 154 154 """ 155 155 self._args = [torrent_id] 156 156 157 class TorrentMovedEvent(DelugeEvent): 158 """ 159 Emitted when a torrent finished being moved. 160 """ 161 def __init__(self, torrent_id): 162 """ 163 :param torrent_id: the torrent_id 164 :type torrent_id: string 165 """ 166 self._args = [torrent_id] 167 157 168 class TorrentResumedEvent(DelugeEvent): 158 169 """ 159 170 Emitted when a torrent resumes from a paused state. -
deluge/plugins/extractor/extractor/core.py
diff --git a/deluge/plugins/extractor/extractor/core.py b/deluge/plugins/extractor/extractor/core.py index f7c888e..dca9f3d 100644
a b 49 49 50 50 DEFAULT_PREFS = { 51 51 "extract_path": "", 52 "use_name_folder": True 52 "use_name_folder": True, 53 "use_extract_path_on_moved": False 53 54 } 54 55 55 56 # The first format is the source file, the second is the dest path … … def enable(self): 67 68 if not self.config["extract_path"]: 68 69 self.config["extract_path"] = deluge.configmanager.ConfigManager("core.conf")["download_location"] 69 70 70 component.get("EventManager").register_event_handler("TorrentFinishedEvent", self._on_torrent_finished) 71 self.waiting = {} 72 event_manager = component.get("EventManager") 73 event_manager.register_event_handler("TorrentFinishedEvent", self._on_torrent_finished) 74 event_manager.register_event_handler("TorrentMovedEvent", self.extract) 71 75 72 76 def disable(self): 73 component.get("EventManager").deregister_event_handler("TorrentFinishedEvent", self._on_torrent_finished) 77 event_manager = component.get("EventManager") 78 event_manager.deregister_event_handler("TorrentFinishedEvent", self._on_torrent_finished) 79 event_manager.deregister_event_handler("TorrentMovedEvent", self.extract) 74 80 75 81 def update(self): 76 82 pass … … def _on_torrent_finished(self, torrent_id): 81 87 are any files to extract. 82 88 """ 83 89 # Get the save path 84 save_path = component.get("TorrentManager")[torrent_id].get_status(["save_path"])["save_path"] 85 files = component.get("TorrentManager")[torrent_id].get_files() 86 for f in files: 87 ext = os.path.splitext(f["path"]) 88 if ext[1] in (".gz", ".bz2", ".lzma"): 89 # We need to check if this is a tar 90 if os.path.splitext(ext[0]) == ".tar": 91 cmd = EXTRACT_COMMANDS[".tar" + ext[1]] 92 else: 93 if ext[1] in EXTRACT_COMMANDS: 94 cmd = EXTRACT_COMMANDS[ext[1]] 90 torrent = component.get("TorrentManager").torrents[torrent_id] 91 info = torrent.get_status(["name", "move_completed", "move_completed_path"]) 92 93 log.debug("Beginning extraction of "+info["name"]) 94 95 if not info["move_completed"]: 96 self.extract(torrent_id, True) 97 else: 98 self.waiting[torrent_id] = info["move_completed_path"] 99 log.debug("Waiting for move before extracting.") 100 101 def extract(self, torrent_id, skipcheck=False): 102 if (torrent_id in self.waiting) or skipcheck: 103 save_path = component.get("TorrentManager")[torrent_id].get_status(["save_path"])["save_path"] 104 files = component.get("TorrentManager")[torrent_id].get_files() 105 for f in files: 106 ext = os.path.splitext(f["path"]) 107 if ext[1] in (".gz", ".bz2", ".lzma"): 108 # We need to check if this is a tar 109 if os.path.splitext(ext[0]) == ".tar": 110 cmd = EXTRACT_COMMANDS[".tar" + ext[1]] 95 111 else: 96 log.debug("Can't extract unknown file type: %s", ext[1]) 97 continue 98 99 # Now that we have the cmd, lets run it to extract the files 100 fp = os.path.join(save_path, f["path"]) 101 102 # Get the destination path 103 dest = self.config["extract_path"] 104 if self.config["use_name_folder"]: 105 name = component.get("TorrentManager")[torrent_id].get_status(["name"])["name"] 106 dest = os.path.join(dest, name) 107 108 # Create the destination folder if it doesn't exist 109 if not os.path.exists(dest): 110 try: 111 os.makedirs(dest) 112 except Exception, e: 113 log.error("Error creating destination folder: %s", e) 114 return 115 116 log.debug("Extracting to %s", dest) 117 def on_extract_success(result, torrent_id): 118 # XXX: Emit an event 119 log.debug("Extract was successful for %s", torrent_id) 120 121 def on_extract_failed(result, torrent_id): 122 # XXX: Emit an event 123 log.debug("Extract failed for %s", torrent_id) 124 125 # Run the command and add some callbacks 126 d = getProcessValue(cmd[0], cmd[1].split() + [str(fp)], {}, str(dest)) 127 d.addCallback(on_extract_success, torrent_id) 128 d.addErrback(on_extract_failed, torrent_id) 112 if ext[1] in EXTRACT_COMMANDS: 113 cmd = EXTRACT_COMMANDS[ext[1]] 114 else: 115 log.debug("Can't extract unknown file type: %s", ext[1]) 116 continue 117 118 # Now that we have the cmd, lets run it to extract the files 119 fp = os.path.join(save_path, f["path"]) 120 121 # Get the destination path 122 if torrent_id in self.waiting: 123 if self.config["use_extract_path_on_moved"]: 124 dest = os.path.join(self.waiting[torrent_id], self.config["extract_path"]) 125 else: 126 dest = self.waiting[torrent_id] 127 else: 128 if os.path.isabs(self.config["extract_path"]): 129 dest = self.config["extract_path"] 130 else: 131 dest = os.path.join(deluge.configmanager.ConfigManager("core.conf")["download_location"]) 132 if self.config["use_name_folder"]: 133 name = component.get("TorrentManager")[torrent_id].get_status(["name"])["name"] 134 dest = os.path.join(dest, name) 135 136 # Create the destination folder if it doesn't exist 137 if not os.path.exists(dest): 138 try: 139 os.makedirs(dest) 140 except Exception, e: 141 log.error("Error creating destination folder: %s", e) 142 return 143 144 log.debug("Extracting to %s", dest) 145 def on_extract_success(result, torrent_id): 146 # XXX: Emit an event 147 log.debug("Extract was successful for %s", torrent_id) 148 149 def on_extract_failed(result, torrent_id): 150 # XXX: Emit an event 151 log.debug("Extract failed for %s", torrent_id) 152 153 # Run the command and add some callbacks 154 d = getProcessValue(cmd[0], cmd[1].split() + [str(fp)], {}, str(dest)) 155 d.addCallback(on_extract_success, torrent_id) 156 d.addErrback(on_extract_failed, torrent_id) 157 self.waiting.remove(torrent_id) 129 158 130 159 @export 131 160 def set_config(self, config): -
deluge/plugins/extractor/extractor/data/extractor_prefs.glade
diff --git a/deluge/plugins/extractor/extractor/data/extractor_prefs.glade b/deluge/plugins/extractor/extractor/data/extractor_prefs.glade index c6827e4..84d2ce4 100644
a b 79 79 <property name="position">1</property> 80 80 </packing> 81 81 </child> 82 <child> 83 <widget class="GtkCheckButton" id="chk_use_extract_path_on_moved"> 84 <property name="label" translatable="yes">Use extract folder on torrents using 'move completed'.</property> 85 <property name="visible">True</property> 86 <property name="can_focus">True</property> 87 <property name="receives_default">False</property> 88 <property name="tooltip" translatable="yes">When enabled, this will use the given path when moving completed torrents. Given as a relative path will create subdirectories in the moved-to folder, given as an absolute path will extract all files to the one directory given.</property> 89 <property name="draw_indicator">True</property> 90 </widget> 91 <packing> 92 <property name="expand">False</property> 93 <property name="fill">False</property> 94 <property name="position">1</property> 95 </packing> 96 </child> 82 97 </widget> 83 98 </child> 84 99 <child> -
deluge/plugins/extractor/extractor/gtkui.py
diff --git a/deluge/plugins/extractor/extractor/gtkui.py b/deluge/plugins/extractor/extractor/gtkui.py index 9e3bf61..c478265 100644
a b def on_apply_prefs(self): 71 71 72 72 config = { 73 73 "extract_path": path, 74 "use_extract_path_on_moved": self.glade.get_widget("chk_use_extract_path_on_moved").get_active(), 74 75 "use_name_folder": self.glade.get_widget("chk_use_name").get_active() 75 76 } 76 77 … … def on_get_config(config): 89 90 self.glade.get_widget("folderchooser_path").set_current_folder(config["extract_path"]) 90 91 else: 91 92 self.glade.get_widget("entry_path").set_text(config["extract_path"]) 92 93 94 self.glade.get_widget("chk_use_extract_path_on_moved").set_active(config["use_extract_path_on_moved"]) 93 95 self.glade.get_widget("chk_use_name").set_active(config["use_name_folder"]) 94 96 95 97 client.extractor.get_config().addCallback(on_get_config)