diff --git a/weboob/applications/qhavesex/contacts.py b/weboob/applications/qhavesex/contacts.py index 0546eec8..402c338f 100644 --- a/weboob/applications/qhavesex/contacts.py +++ b/weboob/applications/qhavesex/contacts.py @@ -26,7 +26,7 @@ from weboob.tools.application.qt import QtDo, HTMLDelegate from weboob.capabilities.contact import ICapContact, Contact from weboob.capabilities.chat import ICapChat from weboob.capabilities.messages import ICapMessages, ICapMessagesPost, Message -from weboob.capabilities.base import NotLoaded, NotLoadedMeta +from weboob.capabilities.base import NotLoaded from .ui.contacts_ui import Ui_Contacts from .ui.contact_thread_ui import Ui_ContactThread @@ -191,8 +191,6 @@ class ContactThread(QWidget): class ContactProfile(QWidget): - displayed_photo_idx = 0 - def __init__(self, weboob, contact, parent=None): QWidget.__init__(self, parent) self.ui = Ui_Profile() @@ -204,6 +202,8 @@ class ContactProfile(QWidget): self.weboob = weboob self.contact = contact self.loaded_profile = False + self.displayed_photo_idx = 0 + self.process_photo = {} missing_fields = self.gotProfile(self.weboob.get_backend(contact.backend), contact) if len(missing_fields) > 0: @@ -219,23 +219,21 @@ class ContactProfile(QWidget): if not backend: return [] - missing_fields = set(['photos']) - photo = contact.photos.values()[0] - data = None - if photo.data: - self.displayed_photo_idx = 0 - data = photo.data - try: - missing_fields.remove('photos') - except KeyError: - pass - elif photo.thumbnail_data: - data = photo.thumbnail_data - if data: - self.display_photo(photo, data) + missing_fields = set() + + self.display_photo() self.ui.nicknameLabel.setText('

%s

' % contact.name) - self.ui.statusLabel.setText('%s' % contact.status_msg) + if contact.status == Contact.STATUS_ONLINE: + status_color = 0x00aa00 + elif contact.status == Contact.STATUS_OFFLINE: + status_color = 0xff0000 + elif contact.status == Contact.STATUS_AWAY: + status_color = 0xffad16 + else: + status_color = 0xaaaaaa + + self.ui.statusLabel.setText('%s' % (status_color, contact.status_msg)) self.ui.contactUrlLabel.setText('URL: %s' % (contact.url, contact.url)) if contact.summary is NotLoaded: self.ui.descriptionEdit.setText('

Description

Receiving...

') @@ -291,16 +289,41 @@ class ContactProfile(QWidget): def previousClicked(self): self.displayed_photo_idx = (self.displayed_photo_idx - 1) % len(self.contact.photos) - self.display_photo(self.contact.photos.values()[self.displayed_photo_idx]) + self.display_photo() def nextClicked(self): self.displayed_photo_idx = (self.displayed_photo_idx + 1) % len(self.contact.photos) - self.display_photo(self.contact.photos.values()[self.displayed_photo_idx]) + self.display_photo() + + def display_photo(self): + if self.displayed_photo_idx >= len(self.contact.photos): + self.displayed_photo_idx = len(self.contact.photos) - 1 + if self.displayed_photo_idx < 0: + self.ui.photoLabel.setPixmap(None) + self.ui.photoUrlLabel.setText('') + return + + photo = self.contact.photos.values()[self.displayed_photo_idx] + if photo.data: + data = photo.data + if photo.id in self.process_photo: + self.process_photo.pop(photo.id) + else: + self.process_photo[photo.id] = QtDo(self.weboob, lambda b,p: self.display_photo()) + self.process_photo[photo.id].do('fillobj', photo, ['data'], backends=self.contact.backend) + + if photo.thumbnail_data: + data = photo.thumbnail_data + else: + self.ui.photoLabel.setPixmap(None) + self.ui.photoLabel.setText('Loading...') + return + + img = QImage.fromData(data) + img = img.scaledToWidth(self.width()/3) - def display_photo(self, photo, data=None): - img = QImage.fromData(data if data else photo.data).scaledToWidth(self.width()/3) self.ui.photoLabel.setPixmap(QPixmap.fromImage(img)) - if not isinstance(photo.url, NotLoadedMeta): + if photo.url is not NotLoaded: text = '%s' % (photo.url, photo.url) if not photo.shown: text += '
(Hidden photo)' @@ -374,9 +397,13 @@ class ContactsWidget(QWidget): def setPhoto(self, contact, item): if not contact: - return + return False + + try: + self.photo_processes.pop(contact.id, None) + except KeyError: + pass - self.photo_processes.pop(contact.id, None) img = None for photo in contact.photos.itervalues(): if photo.thumbnail_data: @@ -385,6 +412,9 @@ class ContactsWidget(QWidget): if img: item.setIcon(QIcon(QPixmap.fromImage(img))) + return True + + return False def addContact(self, contact): if not contact: @@ -411,9 +441,16 @@ class ContactsWidget(QWidget): item.setText('

%s

%s
%s' % (contact.name, status_color, status, contact.backend)) item.setData(Qt.UserRole, contact) - process = QtDo(self.weboob, lambda b, c: self.setPhoto(c, item)) - process.do('fillobj', contact, ['photos'], backends=contact.backend) - self.photo_processes[contact.id] = process + if contact.photos is NotLoaded: + process = QtDo(self.weboob, lambda b, c: self.setPhoto(c, item)) + process.do('fillobj', contact, ['photos'], backends=contact.backend) + self.photo_processes[contact.id] = process + elif len(contact.photos) > 0: + if not self.setPhoto(contact, item): + photo = contact.photos.values()[0] + process = QtDo(self.weboob, lambda b, p: self.setPhoto(contact, item)) + process.do('fillobj', photo, ['thumbnail_data'], backends=contact.backend) + self.photo_processes[contact.id] = process for i in xrange(self.ui.contactList.count()): if self.ui.contactList.item(i).data(Qt.UserRole).toPyObject().status > contact.status: diff --git a/weboob/backends/aum/backend.py b/weboob/backends/aum/backend.py index 468fe6df..56b2bf67 100644 --- a/weboob/backends/aum/backend.py +++ b/weboob/backends/aum/backend.py @@ -26,7 +26,7 @@ from weboob.capabilities.base import NotLoaded from weboob.capabilities.chat import ICapChat from weboob.capabilities.messages import ICapMessages, ICapMessagesPost, Message, Thread from weboob.capabilities.dating import ICapDating, StatusField, OptimizationNotFound -from weboob.capabilities.contact import ICapContact, Contact, ProfileNode, Query, QueryError +from weboob.capabilities.contact import ICapContact, Contact, ContactPhoto, ProfileNode, Query, QueryError from weboob.capabilities.account import ICapAccount from weboob.tools.backend import BaseBackend from weboob.tools.browser import BrowserUnavailable @@ -298,13 +298,21 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh if contact and 'photos' in fields: for name, photo in contact.photos.iteritems(): with self.browser: - if photo.url: + if photo.url and not photo.data: data = self.browser.openurl(photo.url).read() contact.set_photo(name, data=data) - elif photo.thumbnail_url: + if photo.thumbnail_url and not photo.thumbnail_data: data = self.browser.openurl(photo.thumbnail_url).read() contact.set_photo(name, thumbnail_data=data) + def fill_photo(self, photo, fields): + with self.browser: + if 'data' in fields and photo.url and not photo.data: + photo.data = self.browser.readurl(photo.url) + if 'thumbnail_data' in fields and photo.thumbnail_url and not photo.thumbnail_data: + photo.thumbnail_data = self.browser.readurl(photo.thumbnail_url) + return photo + def get_contact(self, contact): with self.browser: if isinstance(contact, Contact): @@ -372,7 +380,9 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh c = Contact(contact['id'], contact['pseudo'], s) c.url = self.browser.id2url(contact['id']) c.status_msg = u'%s old' % contact['birthday'] - c.set_photo(contact['cover'].split('/')[-1].replace('thumb0_', 'image'), thumbnail_url=contact['cover']) + c.set_photo(contact['cover'].split('/')[-1].replace('thumb0_', 'image'), + url=contact['cover'].replace('thumb0_', 'image'), + thumbnail_url=contact['cover']) yield c def send_query(self, id): @@ -484,4 +494,6 @@ class AuMBackend(BaseBackend, ICapMessages, ICapMessagesPost, ICapDating, ICapCh raise NotImplementedError() OBJECTS = {Thread: fill_thread, - Contact: fill_contact} + Contact: fill_contact, + ContactPhoto: fill_photo + } diff --git a/weboob/backends/aum/pages/profile.py b/weboob/backends/aum/pages/profile.py index 1da4c2a8..9ba4787f 100644 --- a/weboob/backends/aum/pages/profile.py +++ b/weboob/backends/aum/pages/profile.py @@ -251,12 +251,13 @@ class ProfilePage(PageBase): self.id = 0 self.photos = [] self.status = '' - self.stats = {'score': 0, - 'visits': 0, - 'charms': 0, - 'baskets': 0, - 'mails': 0, - } + self.stats = OrderedDict(( + ('score', 0), + ('visits', 0), + ('charms', 0), + ('baskets', 0), + ('mails', 0), + )) divs = self.document.getElementsByTagName('td') for div in divs: