Module: deluge
Branch: chunked-sessionproxy-and-gtkui-speedups
Commit: 95d7caf3ac4df009462d553bec2581a3625edb4e

Author: Pedro Algarvio <[email protected]>
Date:   Sat May  7 20:06:37 2011 +0100

Implement Last Seen Complete, on core and on GTK UI.

---

 deluge/core/torrent.py         |   22 +++++++++++++++++++++-
 deluge/core/torrentmanager.py  |   19 ++++++++++++++++++-
 deluge/ui/gtkui/listview.py    |    8 ++++++++
 deluge/ui/gtkui/torrentview.py |    8 +++++++-
 4 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py
index 9f8efef..c21bf25 100644
--- a/deluge/core/torrent.py
+++ b/deluge/core/torrent.py
@@ -188,6 +188,13 @@ class Torrent(object):
         else:
             self.owner = owner
 
+        # XXX: Remove when libtorrent 0.16 get's released???
+        if lt.version_minor < 16:
+            if state:
+                self._last_seen_complete = state.last_seen_complete or 0.0
+            else:
+                self._last_seen_complete = 0.0
+
         # Keep track if we're forcing a recheck of the torrent so that we can
         # repause it after its done if necessary
         self.forcing_recheck = False
@@ -585,7 +592,6 @@ class Torrent(object):
         if distributed_copies < 0:
             distributed_copies = 0.0
 
-        #if you add a key here->add it to core.py STATUS_KEYS too.
         full_status = {
             "active_time": self.status.active_time,
             "all_time_download": self.status.all_time_download,
@@ -633,6 +639,10 @@ class Torrent(object):
             "tracker_status": self.tracker_status,
             "upload_payload_rate": self.status.upload_payload_rate
         }
+        if lt.version_minor > 16:
+            full_status["last_seen_complete"] = self.status.last_seen_complete
+        else:
+            full_status["last_seen_complete"] = self._last_seen_complete
 
         def ti_comment():
             if self.handle.has_metadata():
@@ -935,3 +945,13 @@ class Torrent(object):
         for key in self.prev_status.keys():
             if not self.rpcserver.is_session_valid(key):
                 del self.prev_status[key]
+
+    # XXX: Remove when libtorrent 0.16 get's released???
+    def calculate_last_seen_complete(self):
+        availability = self.handle.piece_availability()
+        if filter(lambda x: x<1, availability):
+            # Torrent does not have all the pieces
+            return
+        log.trace("Torrent %s has all the pieces. Setting last seen complete.",
+                  self.torrent_id)
+        self._last_seen_complete = time.time()
diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py
index 9e1fec2..433f83f 100644
--- a/deluge/core/torrentmanager.py
+++ b/deluge/core/torrentmanager.py
@@ -85,7 +85,8 @@ class TorrentState:
             move_completed_path=None,
             magnet=None,
             time_added=-1,
-            owner="",
+            last_seen_complete=0.0,   # 0 is the default returned when the info
+            owner="",                 # does not exist on lt >= .16
             shared=False
         ):
         self.torrent_id = torrent_id
@@ -96,6 +97,7 @@ class TorrentState:
         self.is_finished = is_finished
         self.magnet = magnet
         self.time_added = time_added
+        self.last_seen_complete = last_seen_complete
         self.owner = owner
 
         # Options
@@ -632,6 +634,17 @@ class TorrentManager(component.Component):
                 log.error("Torrent state file is either corrupt or 
incompatible! %s", e)
                 break
 
+
+        # XXX: Remove when libtorrent 0.16 get's released???
+        if lt.version_minor < 16:
+            log.debug("libtorrent version is lower than 0.16. Start looping "
+                      "callback to calculate last_seen_complete info.")
+            def calculate_last_seen_complete():
+                for torrent in self.torrents.values():
+                    torrent.calculate_last_seen_complete()
+            task = LoopingCall(calculate_last_seen_complete)
+            task.start(60)
+
         component.get("EventManager").emit(SessionStartedEvent())
 
     def save_state(self):
@@ -670,6 +683,10 @@ class TorrentManager(component.Component):
                 torrent.owner,
                 torrent.options["shared"]
             )
+            # XXX: Remove when libtorrent 0.16 get's released???
+            if lt.version_minor < 16:
+                torrent_state.last_seen_complete = torrent._last_seen_complete
+
             state.torrents.append(torrent_state)
 
         # Pickle the TorrentManagerState object
diff --git a/deluge/ui/gtkui/listview.py b/deluge/ui/gtkui/listview.py
index f7b002c..7b43fb7 100644
--- a/deluge/ui/gtkui/listview.py
+++ b/deluge/ui/gtkui/listview.py
@@ -103,6 +103,14 @@ def cell_data_date(column, cell, model, row, data):
     """Display value as date, eg 05/05/08"""
     cell.set_property('text', deluge.common.fdate(model.get_value(row, data)))
 
+def cell_data_date_or_never(column, cell, model, row, data):
+    """Display value as date, eg 05/05/08 or Never"""
+    value = model.get_value(row, data)
+    if value > 0.0:
+        cell.set_property('text', deluge.common.fdate(value))
+    else:
+        cell.set_property('text', _("Never"))
+
 class ListViewColumnState:
     """Used for saving/loading column state"""
     def __init__(self, name, position, width, visible, sort, sort_order):
diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py
index 2e3a028..8b2b96a 100644
--- a/deluge/ui/gtkui/torrentview.py
+++ b/deluge/ui/gtkui/torrentview.py
@@ -240,6 +240,9 @@ class TorrentView(listview.ListView, component.Component):
                              status_field=["distributed_copies"])
         self.add_func_column(_("Added"), listview.cell_data_date, [float],
                              status_field=["time_added"])
+        self.add_func_column(_("Last Seen Complete"),
+                             listview.cell_data_date_or_never, [float],
+                             status_field=["last_seen_complete"])
         self.add_texticon_column(_("Tracker"),
                                  status_field=["tracker_host", "tracker_host"],
                                  function=cell_data_trackericon)
@@ -395,7 +398,10 @@ class TorrentView(listview.ListView, component.Component):
                                 if row[column_index[i]] != row_value:
                                     row[column_index[i]] = row_value
                             except Exception, e:
-                                log.debug("%s", e)
+                                log.debug("Error while updating row for column 
"
+                                          "index %d, status field %r, value 
%r:"
+                                          " %s", column_index[0], status_field,
+                                          row_value, e)
 
         component.get("MenuBar").update_menu()
 

-- 
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en.

Reply via email to