mirror of
https://git.deluge-torrent.org/deluge
synced 2025-09-17 15:21:56 +00:00
fetch tracker icons in thread
This commit is contained in:
parent
723715ec98
commit
7359ddb879
3 changed files with 61 additions and 33 deletions
|
@ -1,15 +1,39 @@
|
|||
import time
|
||||
import gobject
|
||||
import os
|
||||
|
||||
from deluge.tracker_icons import TrackerIcons
|
||||
from deluge.common import get_default_config_dir
|
||||
|
||||
def test():
|
||||
def del_old():
|
||||
filename = os.path.join(get_default_config_dir("trackers"),"legaltorrents.com.ico")
|
||||
if os.path.exists(filename):
|
||||
os.remove(filename)
|
||||
|
||||
def test_get():
|
||||
del_old()
|
||||
trackericons = TrackerIcons()
|
||||
|
||||
print trackericons._fetch_icon("unknown?") #exception, Returns None
|
||||
print trackericons._fetch_icon("deluge-torrent.org") #404 , returns False
|
||||
print trackericons._fetch_icon("legaltorrents.com")
|
||||
print trackericons.get("thepiratebay.com")
|
||||
print trackericons.get("unknown2") #exception, returns None
|
||||
print trackericons.get("legaltorrents.com") #logs cached
|
||||
print trackericons.get("unknown2")
|
||||
print trackericons.get("google.com")
|
||||
print trackericons.get("legaltorrents.com")
|
||||
time.sleep(1.0)
|
||||
print trackericons.get("legaltorrents.com")
|
||||
|
||||
def callback1(value):
|
||||
print "callback1:", value
|
||||
return False
|
||||
|
||||
def test_async():
|
||||
#test is broken :(,. but filtertreeview works.
|
||||
del_old()
|
||||
trackericons = TrackerIcons()
|
||||
trackericons.get_async("legaltorrents.com",callback1)
|
||||
print "here"
|
||||
gobject.MainLoop()
|
||||
|
||||
|
||||
|
||||
test_get()
|
||||
#test_async()
|
||||
|
||||
|
||||
test()
|
||||
|
|
|
@ -31,6 +31,9 @@
|
|||
# this exception statement from your version. If you delete this exception
|
||||
# statement from all source files in the program, then also delete it here.
|
||||
|
||||
|
||||
import threading
|
||||
import gobject
|
||||
from urllib import urlopen
|
||||
from deluge.log import LOG as log
|
||||
from deluge.common import get_default_config_dir, get_pixmap
|
||||
|
@ -53,15 +56,14 @@ class TrackerIcons(object):
|
|||
#load image-names in cache-dir
|
||||
for icon in os.listdir(self.image_dir):
|
||||
if icon.endswith(".ico"):
|
||||
self.add_icon(icon[:-4], os.path.join(self.image_dir, icon))
|
||||
self.images[icon[:-4]] = os.path.join(self.image_dir, icon)
|
||||
|
||||
|
||||
def _fetch_icon(self, tracker_host):
|
||||
def _fetch_icon_thread(self, tracker_host, callback):
|
||||
"""
|
||||
gets new icon from the internet.
|
||||
used by get().
|
||||
calls add_icon()
|
||||
returns True or False
|
||||
calls callback on sucess
|
||||
assumes dicts,urllib and logging are threadsafe.
|
||||
"""
|
||||
try:
|
||||
host_name = RENAMES.get(tracker_host, tracker_host)
|
||||
|
@ -75,7 +77,6 @@ class TrackerIcons(object):
|
|||
raise Exception("No data")
|
||||
except Exception, e:
|
||||
log.debug("%s %s %s" % (tracker_host, e, e.message))
|
||||
self.add_icon(tracker_host, None)
|
||||
return False
|
||||
|
||||
filename = os.path.join(get_default_config_dir("trackers"),"%s.ico" % tracker_host)
|
||||
|
@ -83,23 +84,21 @@ class TrackerIcons(object):
|
|||
f = open(filename,"wb")
|
||||
f.write(icon_data)
|
||||
f.close()
|
||||
self.add_icon(tracker_host, filename)
|
||||
return True
|
||||
|
||||
def add_icon(self, tracker_host, filename):
|
||||
self.images[tracker_host] = filename
|
||||
if callback:
|
||||
gobject.idle_add(callback, filename)
|
||||
|
||||
def get_async(self, tracker_host, callback):
|
||||
threading.Thread(
|
||||
target=self. _fetch_icon_thread,
|
||||
args=(tracker_host, callback)).start()
|
||||
|
||||
def get(self, tracker_host):
|
||||
"""
|
||||
use this method to get the filename of an icon.
|
||||
returns None if the icon is not fetched(yet) or not fond.
|
||||
"""
|
||||
if not tracker_host in self.images:
|
||||
self._fetch_icon(tracker_host)
|
||||
else:
|
||||
log.debug("cached tracker icon:%s" % tracker_host)
|
||||
self.images[tracker_host] = None
|
||||
self.get_async(tracker_host, None)
|
||||
return self.images[tracker_host]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -231,15 +231,20 @@ class FilterTreeView(component.Component):
|
|||
return gtk.gdk.pixbuf_new_from_file(deluge.common.get_pixmap("%s16.png" % pix))
|
||||
|
||||
elif cat == "tracker_host":
|
||||
ico = self.tracker_icons.get(value)
|
||||
if ico:
|
||||
try: #assume we could get trashed images here..
|
||||
return gtk.gdk.pixbuf_new_from_file(ico)
|
||||
except:
|
||||
log.debug(e.message)
|
||||
self.tracker_icons.get_async(value, lambda filename: self.set_row_image(cat, value, filename))
|
||||
|
||||
return None
|
||||
|
||||
def set_row_image(self, cat, value, filename):
|
||||
try: #assume we could get trashed images here..
|
||||
pix = gtk.gdk.pixbuf_new_from_file(filename)
|
||||
row = self.filters[(cat, value)]
|
||||
self.treestore.set_value(row, 4, pix)
|
||||
except Exception, e:
|
||||
log.debug(e.message)
|
||||
return False
|
||||
|
||||
|
||||
def on_selection_changed(self, selection):
|
||||
try:
|
||||
(model, row) = self.label_view.get_selection().get_selected()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue