+/* This file is part of Cinaest.
+ *
+ * Copyright (C) 2009 Philipp Zabel
+ *
+ * Cinaest is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Cinaest is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Cinaest. If not, see <http://www.gnu.org/licenses/>.
+ */
+
using GLib;
namespace MoviePoster {
public class Factory : Object {
private static Factory the_factory = null;
- private List<Request> requests;
- dynamic DBus.Object server;
+ internal List<Request> requests;
+ internal dynamic DBus.Object server;
internal bool download_posters;
private GConf.Client gc;
private uint cxnid;
construct {
try {
var conn = DBus.Bus.get (DBus.BusType.SESSION);
- server = conn.get_object ("org.maemo.movieposter.GoogleImages",
- "/org/maemo/movieposter/GoogleImages",
+ server = conn.get_object ("org.maemo.movieposter.IMDb",
+ "/org/maemo/movieposter/IMDb",
"org.maemo.movieposter.Provider");
- server.Fetched += this.on_poster_fetched;
+ server.Fetched.connect (this.on_poster_fetched);
+ server.Failed.connect (this.on_poster_failed);
} catch (Error e) {
- warning ("Couldn't connect to Google image downloader: %s\n", e.message);
+ warning ("Couldn't connect to IMDb poster downloader: %s\n", e.message);
}
gc = GConf.Client.get_default ();
- download_posters = gc.get_bool ("/apps/cinaest/download_posters");
- gc.add_dir ("/apps/cinaest", GConf.ClientPreloadType.ONELEVEL);
- cxnid = gc.notify_add ("/apps/cinaest/download_posters", on_download_posters_changed);
+ try {
+ download_posters = gc.get_bool ("/apps/cinaest/download_posters");
+ gc.add_dir ("/apps/cinaest", GConf.ClientPreloadType.ONELEVEL);
+ cxnid = gc.notify_add ("/apps/cinaest/download_posters", on_download_posters_changed);
+ } catch (Error e) {
+ stdout.printf ("Error installing GConf notification: %s\n", e.message);
+ }
}
private static void on_download_posters_changed (GConf.Client gc, uint cxnid, GConf.Entry entry) {
} else if (server != null && download_posters) {
var request = new Request ();
- request.handle = server.fetch (movie.title.down (), movie.year.to_string (), "movie");
+ request.handle = server.Fetch (movie.title, movie.year.to_string (), "movie");
request.movie = movie;
request.callback = callback;
request.width = 268;
public int queue_thumbnail (Movie movie, uint width, uint height, bool cropped, RequestCallback callback) throws Error {
string path = get_path_thumbnail (movie);
+ foreach (Request request in requests)
+ if (request.movie == movie)
+ return 0;
+
if (FileUtils.test (path, FileTest.IS_REGULAR)) {
// TODO: make this async?
- var pixbuf = new Gdk.Pixbuf.from_file_at_size (path, (int) width, (int) height);
+ var pixbuf = new Gdk.Pixbuf.from_file_at_scale (path, (int) width, (int) height, true);
+
callback (pixbuf, movie);
} else if (server != null && download_posters) {
var request = new Request ();
- request.handle = server.fetch_thumbnail (movie.title.down (), movie.year.to_string (), "movie");
+ request.handle = server.FetchThumbnail (movie.title, movie.year.to_string (), "movie");
request.movie = movie;
request.callback = callback;
request.width = (int) width;
}
private void on_poster_fetched (dynamic DBus.Object server, int handle, string path) {
- foreach (Request request in requests) {
- if (request.handle != handle)
- continue;
- try {
- var pixbuf = new Gdk.Pixbuf.from_file_at_size (path, request.width, request.height);
-
- requests.remove (request);
- request.callback (pixbuf, request.movie);
- return;
- } catch (Error e) {
- warning ("Failed to open poster: %s\n", e.message);
+ Request request = null;
+ foreach (Request r in requests) {
+ if (r.handle == handle) {
+ request = r;
+ break;
+ }
+ }
+ if (request == null)
+ return;
+ try {
+ var pixbuf = new Gdk.Pixbuf.from_file_at_size (path, request.width, request.height);
+
+ requests.remove (request);
+ request.callback (pixbuf, request.movie);
+ return;
+ } catch (Error e) {
+ warning ("Failed to open poster: %s\n", e.message);
+ }
+ }
+
+ private void on_poster_failed (dynamic DBus.Object server, int handle) {
+ Request request = null;
+ foreach (Request r in requests) {
+ if (r.handle == handle) {
+ request = r;
+ break;
}
}
+ if (request == null)
+ return;
+ requests.remove (request);
+ // request.callback (pixbuf, request.movie);
}
public void join () {
public static void factory_clean_cache (int max_size, time_t min_mtime) {
}
+
+ public void clear_queue () {
+ if (server != null) {
+ foreach (Request r in requests)
+ server.Unqueue (r.handle);
+ }
+ requests = null;
+ }
}
public class Request {
public int height;
public void unqueue () {
+ if (Factory.get_instance ().server != null)
+ Factory.get_instance ().server.Unqueue (this.handle);
+
+ Factory.get_instance ().requests.remove (this);
}
public void join () {