diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py index 9f8efefa3..c21bf2566 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 9e1fec2f8..433f83fa7 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 f7b002c88..7b43fb7cc 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 2e3a02838..8b2b96a29 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()