Ticket #1126: extractor-fix-and-moved-event.patch

File extractor-fix-and-moved-event.patch, 11.6 KB (added by Lattyware, 14 years ago)

[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

    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):  
    977977        log.debug("on_alert_storage_moved")
    978978        try:
    979979            torrent = self.torrents[str(alert.handle.info_hash())]
     980            torrent_id = str(alert.handle.info_hash())
    980981        except:
    981982            return
    982983        torrent.set_save_path(os.path.normpath(alert.handle.save_path()))
    983984        torrent.set_move_completed(False)
     985        component.get("EventManager").emit(TorrentMovedEvent(torrent_id))
    984986
    985987    def on_alert_torrent_resumed(self, alert):
    986988        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):  
    154154        """
    155155        self._args = [torrent_id]
    156156
     157class 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
    157168class TorrentResumedEvent(DelugeEvent):
    158169    """
    159170    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  
    4949
    5050DEFAULT_PREFS = {
    5151    "extract_path": "",
    52     "use_name_folder": True
     52    "use_name_folder": True,
     53    "use_extract_path_on_moved": False
    5354}
    5455
    5556# The first format is the source file, the second is the dest path
    def enable(self):  
    6768        if not self.config["extract_path"]:
    6869            self.config["extract_path"] = deluge.configmanager.ConfigManager("core.conf")["download_location"]
    6970
    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)
    7175
    7276    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)
    7480
    7581    def update(self):
    7682        pass
    def _on_torrent_finished(self, torrent_id):  
    8187        are any files to extract.
    8288        """
    8389        # 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]]
    95111                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)
    129158
    130159    @export
    131160    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  
    7979                    <property name="position">1</property>
    8080                  </packing>
    8181                </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>
    8297              </widget>
    8398            </child>
    8499            <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):  
    7171
    7272        config = {
    7373            "extract_path": path,
     74            "use_extract_path_on_moved": self.glade.get_widget("chk_use_extract_path_on_moved").get_active(),
    7475            "use_name_folder": self.glade.get_widget("chk_use_name").get_active()
    7576        }
    7677
    def on_get_config(config):  
    8990                self.glade.get_widget("folderchooser_path").set_current_folder(config["extract_path"])
    9091            else:
    9192                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"])
    9395            self.glade.get_widget("chk_use_name").set_active(config["use_name_folder"])
    9496
    9597        client.extractor.get_config().addCallback(on_get_config)