Plugins: allow returning multiple movies per callback invocation
authorPhilipp Zabel <philipp.zabel@gmail.com>
Sat, 10 Jul 2010 19:55:27 +0000 (21:55 +0200)
committerPhilipp Zabel <philipp.zabel@gmail.com>
Wed, 14 Jul 2010 21:34:09 +0000 (23:34 +0200)
src/movie-list-store.vala
src/plugin-interface.vala
src/plugins/catalog-sqlite.vala
src/plugins/google-plugin.vala
src/plugins/imdb-plugin.vala
src/plugins/moviepilot-plugin.vala

index 7a9d208..09d6c1d 100644 (file)
@@ -160,17 +160,19 @@ public class MovieListStore : ListStore, TreeModel {
                }
        }
 
-       private void receive_movie (Movie movie) {
+       private void receive_movie (SList<Movie> movies) {
                TreeIter iter;
 
                if (cancellable.is_cancelled ())
                        return;
 
-               add (movie, out iter);
-               try {
-                       poster_factory.queue_thumbnail (movie, 64, 64, false, receive_poster_thumbnail);
-               } catch (Error e) {
-                       warning ("Failed to queue poster request: %s\n", e.message);
+               foreach (Movie movie in movies) {
+                       add (movie, out iter);
+                       try {
+                               poster_factory.queue_thumbnail (movie, 64, 64, false, receive_poster_thumbnail);
+                       } catch (Error e) {
+                               warning ("Failed to queue poster request: %s\n", e.message);
+                       }
                }
        }
 
index c1012ff..0c76178 100644 (file)
@@ -35,7 +35,7 @@ public enum SourceFlags {
 public abstract class MovieSource : Object {
        public abstract bool active { get; set construct; }
 
-       public delegate void ReceiveMovieFunction (Movie movie);
+       public delegate void ReceiveMovieFunction (SList<Movie> movie);
 
        public abstract async int get_movies (MovieFilter filter, ReceiveMovieFunction callback, int limit, GLib.Cancellable? cancellable);
 
index be05605..c2bfbbc 100644 (file)
@@ -20,6 +20,8 @@ using Sqlite;
 
 class CatalogSqlite : Object {
        Database db;
+       SList<Movie> result;
+       int results_waiting;
 
        public delegate void ReceiveMovieFunction (string title, int year, int rating, int genres);
 
@@ -235,6 +237,9 @@ class CatalogSqlite : Object {
                        return 1;
                }
 
+               result = new SList<Movie> ();
+               results_waiting = 0;
+
                do {
                        Idle.add (query.callback);
                        yield;
@@ -247,10 +252,19 @@ class CatalogSqlite : Object {
                                movie.genres.field = stmt.column_int (3);
                                // TODO - depending on settings, this could be something else, like director info or runtime
                                movie.secondary = movie.genres.to_string ();
-                               callback (movie);
+                               result.append (movie);
+                               if (++results_waiting >= 10) {
+                                       callback (result);
+                                       result = new SList<Movie> ();
+                                       results_waiting = 0;
+                               }
                        }
                } while (rc == Sqlite.ROW);
 
+               if (results_waiting > 0)
+                       callback (result);
+               result = new SList<Movie> ();
+
                db.progress_handler (0, null);
                return 0;
        }
index f8b17b4..65abc6f 100644 (file)
@@ -250,6 +250,7 @@ class GoogleSource : MovieSource {
        private void on_movies_found (DBus.Object sender, string[] movies, bool finished) {
                print ("found %d movies\n", movies.length);
                var parser = new Json.Parser ();
+               var result = new SList<Movie> ();
 
                for (int i = 0; i < movies.length; i++) {
                        var movie = new GoogleMovie ();
@@ -271,9 +272,11 @@ class GoogleSource : MovieSource {
                        else
                                movie.secondary = movie.cinema_name + " - " + movie.showtimes;
 
-                       callback (movie);
+                       result.append (movie);
                }
 
+               callback (result);
+
                if (finished) {
                        search = null;
                        Idle.add (get_movies_callback);
index 5c5e31b..1fb5d8e 100644 (file)
@@ -206,6 +206,9 @@ class IMDbMovie : Movie {
 }
 
 class IMDBSource : MovieSource {
+       SList<Movie> result;
+       int results_waiting;
+
        public override bool active { get; set construct; }
 
        public IMDBSource () {
@@ -218,7 +221,12 @@ class IMDBSource : MovieSource {
                                             "cinaest", "imdb.db", null));
 
                _get_callback = callback;
+               result = new SList<Movie> ();
+               results_waiting = 0;
                int n = yield sqlite.query (filter, receive_movie, limit, cancellable);
+               if (results_waiting > 0)
+                       _get_callback (result);
+               result = new SList<Movie> ();
                return n;
        }
 
@@ -234,7 +242,12 @@ class IMDBSource : MovieSource {
                } else {
                        movie.secondary = movie.genres.to_string ();
                }
-               _get_callback (movie);
+               result.append (movie);
+               if (++results_waiting >= 10) {
+                       _get_callback (result);
+                       result = new SList<Movie> ();
+                       results_waiting = 0;
+               }
        }
 
        public override void add_movie (Movie movie) {
index 43cf94b..27fe167 100644 (file)
@@ -132,6 +132,7 @@ class MoviePilotSource : MovieSource {
        private void on_movies_found (DBus.Object sender, string[] movies, bool finished) {
                print ("found %d movies\n", movies.length);
                var parser = new Json.Parser ();
+               var result = new SList<Movie> ();
 
                for (int i = 0; i < movies.length; i++) {
                        var movie = new Movie ();
@@ -147,9 +148,11 @@ class MoviePilotSource : MovieSource {
                        movie.rating = (int) object.get_double_member ("rating");
                        movie.secondary = object.get_string_member ("genres").replace (",", ", ");
 
-                       callback (movie);
+                       result.append (movie);
                }
 
+               callback (result);
+
                if (finished) {
                        search = null;
                        Idle.add (get_movies_callback);