ui: Improved image fetching
[maevies] / ui / maeviesui / util / moviemanager.py
index 3d73948..bee0472 100644 (file)
@@ -21,8 +21,8 @@
 import dbus
 import gobject
 from dbus import glib
-import random
 import gtk
+from dbus.exceptions import DBusException
 
 gobject.threads_init()
 glib.init_threads()
@@ -36,54 +36,128 @@ WATC = 1
 
 class MovieManager:
 
-    def __init__(self, callback):
-        self.bus = dbus.SessionBus()
-
-        self.minfo_provider = self.bus.get_object(MINFO_PROVIDER_BUS_NAME,
-                                                  '/MInfoProvider')
-        self.minfo_interface = dbus.Interface(self.minfo_provider,
-                                              dbus_interface = MINFO_PROVIDER_INTERFACE)
-        self.minfo_interface.connect_to_signal("ResponseReceived",
-                                              self._on_response_received)
-        self.callback = callback
-
-    def query(self, movie_name = '', query_type = TMDB):
-        self.minfo_interface.Query(query_type, movie_name)
-
-    def _on_response_received(self, object_paths, sender = None):
+    def __init__(self, response_received_cb=None):
+        self.response_received_cb = response_received_cb
+        self._bus = None
+        self._provider = None
+
+        self._bus = dbus.SessionBus()
+
+    def _get_provider(self):
+        if not self._provider:
+            self._provider = self._create_minfo_provider()
+        return self._provider
+
+    def _create_minfo_provider(self):
+        provider_proxy = self._bus.get_object(MINFO_PROVIDER_BUS_NAME,
+                                             '/MInfoProvider')
+        provider_interface = dbus.Interface(provider_proxy,
+                                            dbus_interface=MINFO_PROVIDER_INTERFACE)
+        provider_interface.connect_to_signal('ResponseReceived',
+                                             self._on_response_received)
+        return provider_interface
+
+    def query(self, movie_name='', query_type=TMDB):
+        try:
+            self._get_provider().Query(query_type, movie_name)
+        except DBusException:
+            self._on_response_received([])
+
+    def _on_response_received(self, object_paths):
         movies = []
         for path in object_paths:
-            movies.append(self._create_from_path(path))
-
-        self.callback(movies)
-
-    def _create_from_path(self, object_path):
-        dbus_movie = self.bus.get_object(TMDB_MOVIE_BUS_NAME,
-                                         object_path)
-        return MovieDecorator(dbus_movie.GetTitle(dbus_interface = TMDB_MOVIE_INTERFACE))
-
-class MovieDecorator:
-
-    def __init__(self, name):
-        self._name = name
-        pass
-
-    def get_name(self):
-        return self._name
-
-    def get_length(self):
-        return "%sh:%sm" % (random.randrange(1, 2), random.randrange(0, 59))
-
-    def get_score(self):
-        return "%s" % (random.randrange(6, 9))
+            movies.append(MovieProxy(self._bus, path))
+
+        if self.response_received_cb:
+            self.response_received_cb(movies)
+
+class MovieImage:
+    def __init__(self, image_struct):
+        self._type, self._url, self._size, self._id = image_struct
+
+    def get_url(self):
+        return self._url
+
+    def get_id(self):
+        return self._id
+
+    def get_size(self):
+        return self._size
+
+    def get_type(self):
+        return self._type
+
+    def __str__(self):
+        str = ''
+        for field in [self._id, self._url, self._type, self._size]:
+            str += '\t%s\n' % field
+        return str
+
+class MovieProxy:
+
+    def __init__(self, bus, object_path):
+        self._bus = bus
+        self.interface = self._create_movie_interface(object_path)
+        self.fields = ['Title', 'Release date', 'Rating', 'Popularity']
+        self._images = self._retrieve_images()
+
+    def _create_movie_interface(self, object_path):
+        proxy = self._bus.get_object(TMDB_MOVIE_BUS_NAME,
+                                    object_path)
+        interface = dbus.Interface(proxy,
+                                   dbus_interface=TMDB_MOVIE_INTERFACE)
+        return interface
+
+    def _retrieve_images(self):
+        images = { }
+        dbus_images = self.interface.GetImages()
+        for dbus_image in dbus_images:
+            image = MovieImage(dbus_image)
+            if not images.has_key(image.get_type()):
+                images[image.get_type()] = {}
+            images[image.get_type()][image.get_size()] = image
+        return images
+
+    def get_value(self, field):
+        if field == 'Title':
+            return self.get_title()
+        elif field == 'Release date':
+            return self.get_released()
+        elif field == 'Rating':
+            return self.get_rating()
+        elif field == 'Popularity':
+            return self.get_popularity()
+        else:
+            return ''
+
+    def get_title(self):
+        return self.interface.GetTitle()
+
+    def get_popularity(self):
+        return self.interface.GetPopularity()
+
+    def get_rating(self):
+        return self.interface.GetRating()
+
+    def get_image(self, type, size):
+        return self._images[type][size]
+
+    def get_released(self):
+        return self.interface.GetReleased()
 
     def get_info(self):
-        return "<b>%s</b>\n<small><i>Length: </i>%s || <i>Score: </i>%s</small>" % (
-                                                                                     self.get_name(),
-                                                                                     self.get_length(),
-                                                                                     self.get_score())
-
-    def get_image(self):
+        return ('<b>%(title)s</b>\n<small><i>Popularity: </i>%(popularity)s'
+                '    <i>Rating: </i>%(rating)s    <i>Released: </i>'
+                '%(released)s</small>' %
+                {'title' : self.get_title(),
+                 'popularity' : self.get_popularity(),
+                 'rating' : self.get_rating(),
+                 'released' : self.get_released()})
+
+    def get_overview(self):
+        return self.interface.GetOverview()
+
+    def get_placeholder_image(self):
         return self._get_placeholder_pixbuf()
 
     def _get_placeholder_pixbuf(self):