Advertisement
Lattyware

Deluge Patch

Feb 10th, 2012
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 11.91 KB | None | 0 0
  1. From 92cb29647ecb8095eca2e93aa8cb717247804abf Mon Sep 17 00:00:00 2001
  2. From: Gareth Latty <[email protected]>
  3. Date: Sat, 11 Feb 2012 01:17:48 +0000
  4. Subject: [PATCH] Fixed extractor plugin to work with move on complete - also
  5.  provides a general solution for working with move on
  6.  complete torrents using the TorrentMoveEvent event.
  7.  
  8. ---
  9. deluge/core/torrentmanager.py                      |    2 +
  10.  deluge/event.py                                    |   11 ++
  11.  .../Extractor/deluge/plugins/extractor/core.py     |  123 ++++++++++++--------
  12.  .../plugins/extractor/data/extractor_prefs.glade   |   15 +++
  13.  .../Extractor/deluge/plugins/extractor/gtkui.py    |    2 +
  14.  5 files changed, 106 insertions(+), 47 deletions(-)
  15.  
  16. diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py
  17. index 43ea994..fe2182a 100644
  18. --- a/deluge/core/torrentmanager.py
  19. +++ b/deluge/core/torrentmanager.py
  20. @@ -1035,10 +1035,12 @@ def on_alert_storage_moved(self, alert):
  21.          log.debug("on_alert_storage_moved")
  22.          try:
  23.              torrent = self.torrents[str(alert.handle.info_hash())]
  24. +            torrent_id = str(alert.handle.info_hash())
  25.          except:
  26.              return
  27.          torrent.set_save_path(os.path.normpath(alert.handle.save_path()))
  28.          torrent.set_move_completed(False)
  29. +        component.get("EventManager").emit(TorrentMovedEvent(torrent_id))
  30.  
  31.      def on_alert_torrent_resumed(self, alert):
  32.          log.debug("on_alert_torrent_resumed")
  33. diff --git a/deluge/event.py b/deluge/event.py
  34. index 4a1d644..e83470b 100644
  35. --- a/deluge/event.py
  36. +++ b/deluge/event.py
  37. @@ -170,6 +170,17 @@ def __init__(self, torrent_id):
  38.          """
  39.          self._args = [torrent_id]
  40.  
  41. +class TorrentMovedEvent(DelugeEvent):
  42. +    """
  43. +    Emitted when a torrent finished being moved.
  44. +    """
  45. +    def __init__(self, torrent_id):
  46. +        """
  47. +        :param torrent_id: the torrent_id
  48. +        :type torrent_id: string
  49. +        """
  50. +        self._args = [torrent_id]
  51. +
  52.  class TorrentResumedEvent(DelugeEvent):
  53.      """
  54.      Emitted when a torrent resumes from a paused state.
  55. diff --git a/deluge/plugins/Extractor/deluge/plugins/extractor/core.py b/deluge/plugins/Extractor/deluge/plugins/extractor/core.py
  56. index 5af4212..812378d 100644
  57. --- a/deluge/plugins/Extractor/deluge/plugins/extractor/core.py
  58. +++ b/deluge/plugins/Extractor/deluge/plugins/extractor/core.py
  59. @@ -51,7 +51,8 @@
  60.  
  61.  DEFAULT_PREFS = {
  62.      "extract_path": "",
  63. -    "use_name_folder": True
  64. +    "use_name_folder": True,
  65. +    "use_extract_path_on_moved": False
  66.  }
  67.  
  68.  # The first format is the source file, the second is the dest path
  69. @@ -69,10 +70,15 @@ def enable(self):
  70.          if not self.config["extract_path"]:
  71.              self.config["extract_path"] = deluge.configmanager.ConfigManager("core.conf")["download_location"]
  72.  
  73. -        component.get("EventManager").register_event_handler("TorrentFinishedEvent", self._on_torrent_finished)
  74. +        self.waiting = {}
  75. +        event_manager = component.get("EventManager")
  76. +        event_manager.register_event_handler("TorrentFinishedEvent", self._on_torrent_finished)
  77. +        event_manager.register_event_handler("TorrentMovedEvent", self.extract)
  78.  
  79.      def disable(self):
  80. -        component.get("EventManager").deregister_event_handler("TorrentFinishedEvent", self._on_torrent_finished)
  81. +        event_manager = component.get("EventManager")
  82. +        event_manager.deregister_event_handler("TorrentFinishedEvent", self._on_torrent_finished)
  83. +        event_manager.deregister_event_handler("TorrentMovedEvent", self.extract)
  84.  
  85.      def update(self):
  86.          pass
  87. @@ -83,51 +89,74 @@ def _on_torrent_finished(self, torrent_id):
  88.          are any files to extract.
  89.          """
  90.          # Get the save path
  91. -        save_path = component.get("TorrentManager")[torrent_id].get_status(["save_path"])["save_path"]
  92. -        files = component.get("TorrentManager")[torrent_id].get_files()
  93. -        for f in files:
  94. -            ext = os.path.splitext(f["path"])
  95. -            if ext[1] in (".gz", ".bz2", ".lzma"):
  96. -                # We need to check if this is a tar
  97. -                if os.path.splitext(ext[0]) == ".tar":
  98. -                    cmd = EXTRACT_COMMANDS[".tar" + ext[1]]
  99. -            else:
  100. -                if ext[1] in EXTRACT_COMMANDS:
  101. -                    cmd = EXTRACT_COMMANDS[ext[1]]
  102. +        torrent = component.get("TorrentManager").torrents[torrent_id]
  103. +        info = torrent.get_status(["name", "move_completed", "move_completed_path"])
  104. +
  105. +        log.debug("Beginning extraction of "+info["name"])
  106. +
  107. +        if not info["move_completed"]:
  108. +            self.extract(torrent_id, True)
  109. +        else:
  110. +            self.waiting[torrent_id] = info["move_completed_path"]
  111. +            log.debug("Waiting for move before extracting.")
  112. +
  113. +    def extract(self, torrent_id, skipcheck=False):
  114. +        if (torrent_id in self.waiting) or skipcheck:
  115. +            save_path = component.get("TorrentManager")[torrent_id].get_status(["save_path"])["save_path"]
  116. +            files = component.get("TorrentManager")[torrent_id].get_files()
  117. +            for f in files:
  118. +                ext = os.path.splitext(f["path"])
  119. +                if ext[1] in (".gz", ".bz2", ".lzma"):
  120. +                    # We need to check if this is a tar
  121. +                    if os.path.splitext(ext[0]) == ".tar":
  122. +                        cmd = EXTRACT_COMMANDS[".tar" + ext[1]]
  123.                  else:
  124. -                    log.debug("Can't extract unknown file type: %s", ext[1])
  125. -                    continue
  126. -
  127. -            # Now that we have the cmd, lets run it to extract the files
  128. -            fp = os.path.join(save_path, f["path"])
  129. -
  130. -            # Get the destination path
  131. -            dest = self.config["extract_path"]
  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. +                    if ext[1] in EXTRACT_COMMANDS:
  158. +                        cmd = EXTRACT_COMMANDS[ext[1]]
  159. +                    else:
  160. +                        log.debug("Can't extract unknown file type: %s", ext[1])
  161. +                        continue
  162. +
  163. +                # Now that we have the cmd, lets run it to extract the files
  164. +                fp = os.path.join(save_path, f["path"])
  165. +
  166. +                # Get the destination path
  167. +                if torrent_id in self.waiting:
  168. +                    if self.config["use_extract_path_on_moved"]:
  169. +                        dest = os.path.join(self.waiting[torrent_id], self.config["extract_path"])
  170. +                    else:
  171. +                        dest = self.waiting[torrent_id]
  172. +                else:
  173. +                    if os.path.isabs(self.config["extract_path"]):
  174. +                        dest = self.config["extract_path"]
  175. +                    else:
  176. +                        dest = os.path.join(deluge.configmanager.ConfigManager("core.conf")["download_location"])
  177. +                if self.config["use_name_folder"]:
  178. +                    name = component.get("TorrentManager")[torrent_id].get_status(["name"])["name"]
  179. +                    dest = os.path.join(dest, name)
  180. +
  181. +                # Create the destination folder if it doesn't exist
  182. +                if not os.path.exists(dest):
  183. +                    try:
  184. +                        os.makedirs(dest)
  185. +                    except Exception, e:
  186. +                        log.error("Error creating destination folder: %s", e)
  187. +                        return
  188. +
  189. +                log.debug("Extracting to %s", dest)
  190. +                def on_extract_success(result, torrent_id):
  191. +                    # XXX: Emit an event
  192. +                    log.debug("Extract was successful for %s", torrent_id)
  193. +
  194. +                def on_extract_failed(result, torrent_id):
  195. +                    # XXX: Emit an event
  196. +                    log.debug("Extract failed for %s", torrent_id)
  197. +
  198. +                # Run the command and add some callbacks
  199. +                d = getProcessValue(cmd[0], cmd[1].split() + [str(fp)], {}, str(dest))
  200. +                d.addCallback(on_extract_success, torrent_id)
  201. +                d.addErrback(on_extract_failed, torrent_id)
  202. +            self.waiting.remove(torrent_id)
  203.  
  204.      @export
  205.      def set_config(self, config):
  206. diff --git a/deluge/plugins/Extractor/deluge/plugins/extractor/data/extractor_prefs.glade b/deluge/plugins/Extractor/deluge/plugins/extractor/data/extractor_prefs.glade
  207. index c6827e4..84d2ce4 100644
  208. --- a/deluge/plugins/Extractor/deluge/plugins/extractor/data/extractor_prefs.glade
  209. +++ b/deluge/plugins/Extractor/deluge/plugins/extractor/data/extractor_prefs.glade
  210. @@ -79,6 +79,21 @@
  211.                      <property name="position">1</property>
  212.                    </packing>
  213.                  </child>
  214. +                <child>
  215. +                  <widget class="GtkCheckButton" id="chk_use_extract_path_on_moved">
  216. +                    <property name="label" translatable="yes">Use extract folder on torrents using 'move completed'.</property>
  217. +                    <property name="visible">True</property>
  218. +                    <property name="can_focus">True</property>
  219. +                    <property name="receives_default">False</property>
  220. +                    <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>
  221. +                    <property name="draw_indicator">True</property>
  222. +                  </widget>
  223. +                  <packing>
  224. +                    <property name="expand">False</property>
  225. +                    <property name="fill">False</property>
  226. +                    <property name="position">1</property>
  227. +                  </packing>
  228. +                </child>
  229.                </widget>
  230.              </child>
  231.              <child>
  232. diff --git a/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py b/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py
  233. index 06cff1b..330d2cc 100644
  234. --- a/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py
  235. +++ b/deluge/plugins/Extractor/deluge/plugins/extractor/gtkui.py
  236. @@ -74,6 +74,7 @@ def on_apply_prefs(self):
  237.  
  238.          config = {
  239.              "extract_path": path,
  240. +            "use_extract_path_on_moved": self.glade.get_widget("chk_use_extract_path_on_moved").get_active()
  241.              "use_name_folder": self.glade.get_widget("chk_use_name").get_active()
  242.          }
  243.  
  244. @@ -93,6 +94,7 @@ def on_get_config(config):
  245.              else:
  246.                  self.glade.get_widget("entry_path").set_text(config["extract_path"])
  247.  
  248. +            self.glade.get_widget("chk_use_extract_path_on_moved").set_active(config["use_extract_path_on_moved"])
  249.              self.glade.get_widget("chk_use_name").set_active(config["use_name_folder"])
  250.  
  251.          client.extractor.get_config().addCallback(on_get_config)
  252. --
  253. 1.7.9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement