From d0718df82b7f09d2cb05daacd8ec86c4b9f59f97 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Mon, 11 Aug 2014 22:03:01 +0100 Subject: [PATCH] Refactor torrent.update_state --- deluge/common.py | 19 ---------- deluge/core/torrent.py | 78 ++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 60 deletions(-) diff --git a/deluge/common.py b/deluge/common.py index 446c77b2a..a8b228405 100644 --- a/deluge/common.py +++ b/deluge/common.py @@ -34,25 +34,6 @@ from deluge.error import InvalidPathError log = logging.getLogger(__name__) -LT_TORRENT_STATE = { - "Queued": 0, - "Checking": 1, - "Downloading Metadata": 2, - "Downloading": 3, - "Finished": 4, - "Seeding": 5, - "Allocating": 6, - "Checking Resume Data": 7, - 0: "Queued", - 1: "Checking", - 2: "Downloading Metadata", - 3: "Downloading", - 4: "Finished", - 5: "Seeding", - 6: "Allocating", - 7: "Checking Resume Data" -} - TORRENT_STATE = [ "Allocating", "Checking", diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py index a68bc34d8..881a40857 100644 --- a/deluge/core/torrent.py +++ b/deluge/core/torrent.py @@ -7,7 +7,12 @@ # See LICENSE for more details. # -"""Internal Torrent class""" +"""Internal Torrent class + +Attributes: + LT_TORRENT_STATE_MAP (dict): Maps the torrent state from libtorrent to Deluge state. + +""" from __future__ import division @@ -22,11 +27,21 @@ import deluge.component as component from deluge.configmanager import ConfigManager, get_config_dir from deluge.event import TorrentStateChangedEvent, TorrentFolderRenamedEvent from deluge.common import decode_string, utf8_encoded, TORRENT_STATE -from deluge.common import LT_TORRENT_STATE as LTSTATE from deluge.core.authmanager import AUTH_LEVEL_ADMIN log = logging.getLogger(__name__) +LT_TORRENT_STATE_MAP = { + "queued_for_checking": "Checking", + "checking_files": "Checking", + "downloading_metadata": "Downloading", + "downloading": "Downloading", + "finished": "Finished", + "seeding": "Seeding", + "allocating": "Allocating", + "checking_resume_data": "Checking" +} + def sanitize_filepath(filepath, folder=False): """Returns a sanitized filepath to pass to libtorrent rename_file(). @@ -585,59 +600,40 @@ class Torrent(object): self.tracker_status = self.get_tracker_host() + ": " + status def update_state(self): - """Updates the state based on what libtorrent's state for the torrent is""" - # Set the initial state based on the lt state + """Updates the state, based on libtorrent's torrent state""" status = self.handle.status() - ltstate = int(status.state) - - # Set self.state to the ltstate right away just incase we don"t hit some of the logic below - self.state = LTSTATE.get(ltstate, str(ltstate)) - session_is_paused = component.get("Core").session.is_paused() - if log.isEnabledFor(logging.DEBUG): - log.debug("set_state_based_on_ltstate: %s", LTSTATE[ltstate]) - log.debug("session.is_paused: %s", session_is_paused) - - # First we check for an error from libtorrent, and set the state to that if any occurred. if status.error or self.error_statusmsg: - # This is an error'd torrent self.state = "Error" - if status.error: - self.set_error_statusmsg(decode_string(status.error)) - self.set_status_message(self.error_statusmsg) # This will be reverted upon resuming. self.handle.auto_managed(False) if not status.paused: self.handle.pause() - if not status.error: + + if status.error: + self.set_error_statusmsg(decode_string(status.error)) + log.debug("Error state from lt: %s", self.error_statusmsg) + else: # As this is not a libtorrent Error we should emit a state changed event component.get("EventManager").emit(TorrentStateChangedEvent(self.torrent_id, "Error")) - return - else: - self.set_status_message("OK") - self.set_error_statusmsg(None) - - if self.moving_storage: + log.debug("Error state forced by Deluge, error_statusmsg: %s", self.error_statusmsg) + self.set_status_message(self.error_statusmsg) + elif self.moving_storage: self.state = "Moving" - return - - if ltstate in (LTSTATE["Queued"], LTSTATE["Checking"]): - self.state = "Checking" - if status.paused: - self.state = "Paused" - return - elif ltstate in (LTSTATE["Downloading"], LTSTATE["Downloading Metadata"]): - self.state = "Downloading" - elif ltstate in (LTSTATE["Finished"], LTSTATE["Seeding"]): - self.state = "Seeding" - elif ltstate == LTSTATE["Allocating"]: - self.state = "Allocating" - - if not session_is_paused and status.paused and status.auto_managed: + elif not session_is_paused and status.paused and status.auto_managed: self.state = "Queued" - elif session_is_paused or (status.paused and not status.auto_managed): + elif session_is_paused or status.paused: self.state = "Paused" + else: + try: + self.state = LT_TORRENT_STATE_MAP[str(status.state)] + except KeyError: + self.state = str(status.state) + + if log.isEnabledFor(logging.DEBUG): + log.debug("State from lt was: %s | Session is paused: %s", status.state, session_is_paused) + log.debug("Torrent state set to '%s' (%s)", self.state, self.torrent_id) def set_state(self, state): """Manually set the state for the torrent.