mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-02 22:48:40 +00:00
Implement Last Seen Complete, on core and on GTK UI.
This commit is contained in:
parent
4044f52f77
commit
95d7caf3ac
4 changed files with 54 additions and 3 deletions
|
@ -188,6 +188,13 @@ class Torrent(object):
|
||||||
else:
|
else:
|
||||||
self.owner = owner
|
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
|
# Keep track if we're forcing a recheck of the torrent so that we can
|
||||||
# repause it after its done if necessary
|
# repause it after its done if necessary
|
||||||
self.forcing_recheck = False
|
self.forcing_recheck = False
|
||||||
|
@ -585,7 +592,6 @@ class Torrent(object):
|
||||||
if distributed_copies < 0:
|
if distributed_copies < 0:
|
||||||
distributed_copies = 0.0
|
distributed_copies = 0.0
|
||||||
|
|
||||||
#if you add a key here->add it to core.py STATUS_KEYS too.
|
|
||||||
full_status = {
|
full_status = {
|
||||||
"active_time": self.status.active_time,
|
"active_time": self.status.active_time,
|
||||||
"all_time_download": self.status.all_time_download,
|
"all_time_download": self.status.all_time_download,
|
||||||
|
@ -633,6 +639,10 @@ class Torrent(object):
|
||||||
"tracker_status": self.tracker_status,
|
"tracker_status": self.tracker_status,
|
||||||
"upload_payload_rate": self.status.upload_payload_rate
|
"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():
|
def ti_comment():
|
||||||
if self.handle.has_metadata():
|
if self.handle.has_metadata():
|
||||||
|
@ -935,3 +945,13 @@ class Torrent(object):
|
||||||
for key in self.prev_status.keys():
|
for key in self.prev_status.keys():
|
||||||
if not self.rpcserver.is_session_valid(key):
|
if not self.rpcserver.is_session_valid(key):
|
||||||
del self.prev_status[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()
|
||||||
|
|
|
@ -85,7 +85,8 @@ class TorrentState:
|
||||||
move_completed_path=None,
|
move_completed_path=None,
|
||||||
magnet=None,
|
magnet=None,
|
||||||
time_added=-1,
|
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
|
shared=False
|
||||||
):
|
):
|
||||||
self.torrent_id = torrent_id
|
self.torrent_id = torrent_id
|
||||||
|
@ -96,6 +97,7 @@ class TorrentState:
|
||||||
self.is_finished = is_finished
|
self.is_finished = is_finished
|
||||||
self.magnet = magnet
|
self.magnet = magnet
|
||||||
self.time_added = time_added
|
self.time_added = time_added
|
||||||
|
self.last_seen_complete = last_seen_complete
|
||||||
self.owner = owner
|
self.owner = owner
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
|
@ -632,6 +634,17 @@ class TorrentManager(component.Component):
|
||||||
log.error("Torrent state file is either corrupt or incompatible! %s", e)
|
log.error("Torrent state file is either corrupt or incompatible! %s", e)
|
||||||
break
|
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())
|
component.get("EventManager").emit(SessionStartedEvent())
|
||||||
|
|
||||||
def save_state(self):
|
def save_state(self):
|
||||||
|
@ -670,6 +683,10 @@ class TorrentManager(component.Component):
|
||||||
torrent.owner,
|
torrent.owner,
|
||||||
torrent.options["shared"]
|
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)
|
state.torrents.append(torrent_state)
|
||||||
|
|
||||||
# Pickle the TorrentManagerState object
|
# Pickle the TorrentManagerState object
|
||||||
|
|
|
@ -103,6 +103,14 @@ def cell_data_date(column, cell, model, row, data):
|
||||||
"""Display value as date, eg 05/05/08"""
|
"""Display value as date, eg 05/05/08"""
|
||||||
cell.set_property('text', deluge.common.fdate(model.get_value(row, data)))
|
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:
|
class ListViewColumnState:
|
||||||
"""Used for saving/loading column state"""
|
"""Used for saving/loading column state"""
|
||||||
def __init__(self, name, position, width, visible, sort, sort_order):
|
def __init__(self, name, position, width, visible, sort, sort_order):
|
||||||
|
|
|
@ -240,6 +240,9 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
status_field=["distributed_copies"])
|
status_field=["distributed_copies"])
|
||||||
self.add_func_column(_("Added"), listview.cell_data_date, [float],
|
self.add_func_column(_("Added"), listview.cell_data_date, [float],
|
||||||
status_field=["time_added"])
|
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"),
|
self.add_texticon_column(_("Tracker"),
|
||||||
status_field=["tracker_host", "tracker_host"],
|
status_field=["tracker_host", "tracker_host"],
|
||||||
function=cell_data_trackericon)
|
function=cell_data_trackericon)
|
||||||
|
@ -395,7 +398,10 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
if row[column_index[i]] != row_value:
|
if row[column_index[i]] != row_value:
|
||||||
row[column_index[i]] = row_value
|
row[column_index[i]] = row_value
|
||||||
except Exception, e:
|
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()
|
component.get("MenuBar").update_menu()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue