ui: Improved image fetching
authorSimón Pena <spenap@gmail.com>
Sun, 20 Jun 2010 15:22:59 +0000 (17:22 +0200)
committerSimón Pena <spenap@gmail.com>
Sun, 20 Jun 2010 15:22:59 +0000 (17:22 +0200)
* The 'mid' size of the poster image is downloaded now
* If we find it already fetched, we don't download it again

ui/maeviesui/maeviesui/gui.py
ui/maeviesui/util/moviemanager.py

index ae1393e..4fd83f3 100644 (file)
@@ -246,7 +246,7 @@ class MoviesListStore(gtk.ListStore):
     def add(self, movies_found):
         self.clear()
         for movie in movies_found:
-            row = {self.IMAGE_COLUMN: movie.get_image(),
+            row = {self.IMAGE_COLUMN: movie.get_placeholder_image(),
                    self.INFO_COLUMN: movie.get_info(),
                    self.MOVIE_COLUMN: movie,
                   }
@@ -263,28 +263,39 @@ class AboutDialog(gtk.Dialog):
 
 class MovieWindow(hildon.StackableWindow):
 
-    def _create_movie_image(self, movie):
+    def _fetch_movie_image(self, movie):
         image = gtk.Image()
-        image.set_from_pixbuf(gtk.IconTheme().load_icon('general_video',
-                                                        256, 0))
-        banner = hildon.hildon_banner_show_information_with_markup(self,
-                                                                   'ignored',
-                                                                   'Fetching movie cover')
-        banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
-        hildon.hildon_gtk_window_set_progress_indicator(self, True)
 
-        async_item = AsyncItem(image_downloader, (movie.get_images()[0].get_url(), '/tmp/' + movie.get_title()),
-                               self._set_downloaded_image, (image,))
-        self.async_worker.queue.put(async_item)
-        self.async_worker.start()
+        movie_image = movie.get_image('poster', 'mid')
+        image_file = os.path.abspath('/tmp/' + movie_image.get_id() + '.jpg')
+
+        if os.path.isfile(image_file):
+            image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
+                                                                       256,
+                                                                       256))
+        else:
+            image.set_from_pixbuf(gtk.IconTheme().load_icon('general_video',
+                                                            256, 0))
+            banner = hildon.hildon_banner_show_information_with_markup(self,
+                                                                       'ignored',
+                                                                       'Fetching movie poster')
+            banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
+            hildon.hildon_gtk_window_set_progress_indicator(self, True)
+
+            async_item = AsyncItem(image_downloader, (movie_image.get_url(),
+                                                      '/tmp/' + movie_image.get_id()),
+                                   self._set_fetched_image, (image,))
+            self.async_worker.queue.put(async_item)
+            self.async_worker.start()
 
         return image
 
-    def _set_downloaded_image(self, image, target, error):
-        image_file = os.path.abspath(target)
-        image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
-                                                                   256,
-                                                                   256))
+    def _set_fetched_image(self, image, target, error):
+        if not error:
+            image_file = os.path.abspath(target)
+            image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
+                                                                       256,
+                                                                       256))
         hildon.hildon_gtk_window_set_progress_indicator(self, False)
 
     def _create_contents(self, movie):
@@ -295,7 +306,7 @@ class MovieWindow(hildon.StackableWindow):
         upper_content = gtk.HBox(False, 40)
         upper_content.set_border_width(20)
 
-        image = self._create_movie_image(movie)
+        image = self._fetch_movie_image(movie)
 
         side_content = gtk.VBox(False, 30)
 
index 8cfc617..bee0472 100644 (file)
@@ -87,6 +87,12 @@ class MovieImage:
     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):
@@ -103,10 +109,13 @@ class MovieProxy:
         return interface
 
     def _retrieve_images(self):
-        images = []
+        images = { }
         dbus_images = self.interface.GetImages()
-        for image in dbus_images:
-            images.append(MovieImage(image))
+        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):
@@ -130,8 +139,8 @@ class MovieProxy:
     def get_rating(self):
         return self.interface.GetRating()
 
-    def get_images(self):
-        return self._images
+    def get_image(self, type, size):
+        return self._images[type][size]
 
     def get_released(self):
         return self.interface.GetReleased()
@@ -148,7 +157,7 @@ class MovieProxy:
     def get_overview(self):
         return self.interface.GetOverview()
 
-    def get_image(self):
+    def get_placeholder_image(self):
         return self._get_placeholder_pixbuf()
 
     def _get_placeholder_pixbuf(self):