}
}
- 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);
+ }
}
}
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);
class CatalogSqlite : Object {
Database db;
+ SList<Movie> result;
+ int results_waiting;
public delegate void ReceiveMovieFunction (string title, int year, int rating, int genres);
return 1;
}
+ result = new SList<Movie> ();
+ results_waiting = 0;
+
do {
Idle.add (query.callback);
yield;
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;
}
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 ();
else
movie.secondary = movie.cinema_name + " - " + movie.showtimes;
- callback (movie);
+ result.append (movie);
}
+ callback (result);
+
if (finished) {
search = null;
Idle.add (get_movies_callback);
}
class IMDBSource : MovieSource {
+ SList<Movie> result;
+ int results_waiting;
+
public override bool active { get; set construct; }
public IMDBSource () {
"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;
}
} 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) {
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 ();
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);