[tracker] tracker-miner-fs: move albumart extraction to tracker-extract



commit c68add4b49f6bcf4163bae6556396ff0fa58f2db
Author: Martyn Russell <martyn imendio com>
Date:   Tue Jul 28 12:06:51 2009 +0100

    tracker-miner-fs: move albumart extraction to tracker-extract
    
    Now we do the processing in tracker-extract and only request the
    thumbnail for the albumart to be queued from tracker-miner-fs. This
    saves us sending potentially large album art over dbus

 data/dbus/tracker-extract.xml                      |    7 +-
 src/tracker-extract/Makefile.am                    |    7 +
 .../tracker-albumart.c                             |  351 +++++++++-----------
 .../tracker-albumart.h                             |   19 +-
 src/tracker-extract/tracker-extract-gstreamer.c    |   32 +-
 src/tracker-extract/tracker-extract-mp3.c          |   33 +-
 src/tracker-extract/tracker-extract.c              |   49 +---
 src/tracker-extract/tracker-extract.h              |    7 -
 src/tracker-extract/tracker-main.c                 |    4 +
 src/tracker-extract/tracker-marshal.list           |    2 +-
 src/tracker-miner-fs/Makefile.am                   |    4 -
 src/tracker-miner-fs/tracker-main.c                |  103 ++++++-
 src/tracker-miner-fs/tracker-marshal.list          |    2 +-
 13 files changed, 309 insertions(+), 311 deletions(-)
---
diff --git a/data/dbus/tracker-extract.xml b/data/dbus/tracker-extract.xml
index 9100fda..51e31b5 100644
--- a/data/dbus/tracker-extract.xml
+++ b/data/dbus/tracker-extract.xml
@@ -22,12 +22,9 @@
       <arg type="s" name="sparql" direction="out" />
     </method>
 
-    <signal name="ProcessAlbumArt">
-      <arg type="ay" name="buffer"/>
-      <arg type="s" name="mime"/>
-      <arg type="s" name="artist"/>
-      <arg type="s" name="album"/>
+    <signal name="QueueThumbnail">
       <arg type="s" name="filename"/>
+      <arg type="s" name="mime"/>
     </signal>
   </interface>
 </node>
diff --git a/src/tracker-extract/Makefile.am b/src/tracker-extract/Makefile.am
index 5d2cb26..7a92519 100644
--- a/src/tracker-extract/Makefile.am
+++ b/src/tracker-extract/Makefile.am
@@ -12,6 +12,7 @@ INCLUDES = 								\
 	$(WARN_CFLAGS)							\
 	$(GLIB2_CFLAGS)							\
 	$(GCOV_CFLAGS)							\
+	$(GDKPIXBUF_CFLAGS)						\
 	$(GMODULE_CFLAGS) 						\
 	$(DBUS_CFLAGS)							\
 	$(EXEMPI_CFLAGS) 						\
@@ -231,6 +232,8 @@ libextract_playlist_la_LIBADD = $(GLIB2_LIBS) $(TOTEM_PL_PARSER_LIBS) $(GCOV_LIB
 libexec_PROGRAMS = tracker-extract
 
 tracker_extract_SOURCES = 						\
+	tracker-albumart.c						\
+	tracker-albumart.h						\
 	tracker-config.c						\
 	tracker-config.h						\
 	tracker-dbus.c							\
@@ -255,6 +258,10 @@ tracker_extract_SOURCES += tracker-topanalyzer.cpp tracker-topanalyzer.h
 tracker_extract_LDADD += $(STREAMANALYZER_LIBS)
 endif
 
+if HAVE_GDKPIXBUF
+tracker_extract_LDADD += $(GDKPIXBUF_LIBS)
+endif
+
 tracker-marshal.h: tracker-marshal.list
 	$(GLIB_GENMARSHAL) $< --prefix=tracker_marshal --header > $@
 
diff --git a/src/tracker-miner-fs/tracker-albumart.c b/src/tracker-extract/tracker-albumart.c
similarity index 87%
rename from src/tracker-miner-fs/tracker-albumart.c
rename to src/tracker-extract/tracker-albumart.c
index 8bd7d0c..db6cc9a 100644
--- a/src/tracker-miner-fs/tracker-albumart.c
+++ b/src/tracker-extract/tracker-albumart.c
@@ -38,9 +38,12 @@
 
 #include <dbus/dbus-glib-bindings.h>
 
+#include <libtracker-common/tracker-storage.h>
 #include <libtracker-common/tracker-thumbnailer.h>
 
 #include "tracker-albumart.h"
+#include "tracker-dbus.h"
+#include "tracker-extract.h"
 #include "tracker-marshal.h"
 
 #define ALBUMARTER_SERVICE    "com.nokia.albumart"
@@ -51,29 +54,18 @@
 #define THUMBNAILER_PATH      "/org/freedesktop/thumbnailer/Generic"
 #define THUMBNAILER_INTERFACE "org.freedesktop.thumbnailer.Generic"
 
-#define DBUS_TYPE_UCHAR_ARRAY (dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR))
-
 typedef struct {
 	TrackerStorage *hal;
 	gchar *art_path;
 	gchar *local_uri;
 } GetFileInfo;
 
-static void     albumart_queue_cb   (DBusGProxy          *proxy,
-				     DBusGProxyCall      *call,
-				     gpointer             user_data);
-static gboolean albumart_process_cb (DBusGProxy          *proxy,
-				     GArray              *buffer,
-				     const gchar         *mime,
-				     const gchar         *artist,
-				     const gchar         *album,
-				     const gchar         *filename,
-				     gpointer             user_data);
-
+static void albumart_queue_cb (DBusGProxy     *proxy,
+			       DBusGProxyCall *call,
+			       gpointer        user_data);
 
 static gboolean initialized;
 static gboolean disable_requests;
-static TrackerConfig *albumart_config;
 static TrackerStorage *albumart_storage;
 static GHashTable *albumart_cache;
 static DBusGProxy *albumart_proxy;
@@ -512,7 +504,7 @@ albumart_heuristic (const gchar *artist,
 	file = NULL;
 
 	if (g_stat (dirname, &st) == -1) {
-		g_warning ("Could not g_stat() directory:'%s' for albumart heuristic",
+		g_warning ("Could not g_stat() directory:'%s' for album art heuristic",
 			   dirname);
 
 		g_free (dirname);
@@ -631,6 +623,26 @@ albumart_heuristic (const gchar *artist,
 	return retval;
 }
 
+static void
+albumart_signal_queue_thumbnail (const gchar *file,
+				 const gchar *mime)
+{
+	GObject *object;
+
+	object = tracker_dbus_get_object (TRACKER_TYPE_EXTRACT);
+	if (!object) {
+		/* This can happen if we run tracker-extract on the
+		 * command line for one file only because we don't
+		 * register the TrackerExtract object with DBus.
+		 */
+		return;
+	}
+
+	g_message ("Album art being signaled for thumbnail queue for file:'%s', mime:'%s'", 
+		   file, mime);
+	g_signal_emit_by_name (object, "queue-thumbnail", file, mime);
+}
+
 #ifdef HAVE_GDKPIXBUF
 
 static gboolean
@@ -700,10 +712,7 @@ albumart_set (const unsigned char *buffer,
 		}
 	}
 
-	if (tracker_config_get_enable_thumbnails (albumart_config)) {
-		tracker_thumbnailer_queue_add (local_path, "image/jpeg"); 
-	}
-
+	albumart_signal_queue_thumbnail (local_path, mime);
 	g_free (local_path);
 
 	return TRUE;
@@ -830,129 +839,6 @@ albumart_copy_to_local (TrackerStorage *hal,
 	}
 }
 
-static gboolean
-albumart_process_cb (DBusGProxy          *proxy,
-		     GArray              *buffer,
-		     const gchar         *mime,
-		     const gchar         *artist,
-		     const gchar         *album,
-		     const gchar         *filename,
-		     gpointer             user_data)
-{
-	gchar *art_path;
-	gboolean processed = TRUE;
-	gchar *local_uri = NULL;
-	gchar *filename_uri;
-
-
-	if (strstr (filename, "://")) {
-		filename_uri = g_strdup (filename);
-	} else {
-		filename_uri = g_filename_to_uri (filename, NULL, NULL);
-	}
-
-	albumart_get_path (artist, 
-			   album, 
-			   "album", 
-			   filename_uri, 
-			   &art_path, 
-			   &local_uri);
-
-	if (!art_path) {
-		g_warning ("Albumart path could not be obtained, not processing any further");
-
-		g_free (filename_uri);
-		g_free (local_uri);
-
-		return FALSE;
-	}
-
-	if (!g_file_test (art_path, G_FILE_TEST_EXISTS)) {
-#ifdef HAVE_GDKPIXBUF
-		/* If we have embedded album art */
-		if (buffer && buffer->len > 0) {
-			processed = albumart_set ((const unsigned char *) buffer->data, 
-						  (size_t) buffer->len, 
-						  mime,
-						  artist,
-						  album,
-						  filename);
-		} else {
-#endif /* HAVE_GDK_PIXBUF */
-			/* If not, we perform a heuristic on the dir */
-			gchar *key;
-			gchar *dirname;
-			GFile *file, *dirf;
-
-			file = g_file_new_for_path (filename);
-			dirf = g_file_get_parent (file);
-			dirname = g_file_get_path (dirf);
-			g_object_unref (file);
-			g_object_unref (dirf);
-
-			key = g_strdup_printf ("%s-%s-%s", 
-					       artist ? artist : "",
-					       album ? album : "",
-					       dirname ? dirname : "");
-
-			g_free (dirname);
-
-			if (!g_hash_table_lookup (albumart_cache, key)) {
-				if (!albumart_heuristic (artist, 
-							 album, 
-							 filename, 
-							 local_uri, 
-							 NULL)) {
-					/* If the heuristic failed, we
-					 * request the download the
-					 * media-art to the media-art
-					 * downloaders
-					 */
-					albumart_request_download (albumart_storage, 
-								   artist,
-								   album,
-								   local_uri,
-								   art_path);
-				}
-
-				g_hash_table_insert (albumart_cache, 
-						     key, 
-						     GINT_TO_POINTER(TRUE));
-			} else {
-				g_free (key);
-			}
-#ifdef HAVE_GDKPIXBUF
-		}
-#endif /* HAVE_GDKPIXBUF */
-
-		if (processed) {
-			if (tracker_config_get_enable_thumbnails (albumart_config)) {
-				tracker_thumbnailer_queue_add (filename_uri, "image/jpeg"); 
-			}
-		}
-	} else {
-		g_debug ("Albumart already exists for uri:'%s'", 
-			 filename_uri);
-	}
-
-	if (local_uri && !g_file_test (local_uri, G_FILE_TEST_EXISTS)) {
-		/* We can't reuse art_exists here because the
-		 * situation might have changed
-		 */
-		if (g_file_test (art_path, G_FILE_TEST_EXISTS)) {
-			albumart_copy_to_local (albumart_storage,
-						art_path, 
-						local_uri);
-		}
-	}
-
-	g_free (art_path);
-	g_free (filename_uri);
-	g_free (local_uri);
-
-	return processed;
-}
-
 static void
 albumart_queue_cb (DBusGProxy     *proxy,
 		   DBusGProxyCall *call,
@@ -987,10 +873,7 @@ albumart_queue_cb (DBusGProxy     *proxy,
 		g_debug ("Downloaded album art using DBus service for uri:'%s'", 
 			 uri);
 
-		if (tracker_config_get_enable_thumbnails (albumart_config)) {
-			tracker_thumbnailer_queue_add (uri, "image/jpeg");
-		}
-
+		albumart_signal_queue_thumbnail (uri, "image/jpeg");
 		g_free (uri);
 
 		albumart_copy_to_local (info->hal,
@@ -1009,22 +892,17 @@ albumart_queue_cb (DBusGProxy     *proxy,
 }
 
 gboolean
-tracker_albumart_init (TrackerConfig  *config,
-		       TrackerStorage *storage)
+tracker_albumart_init (void)
 {
-	DBusGProxy *proxy;
 	DBusGConnection *connection;
 	GError *error = NULL;
 
 	g_return_val_if_fail (initialized == FALSE, FALSE);
-	g_return_val_if_fail (TRACKER_IS_CONFIG (config), FALSE);
-
-	albumart_config = g_object_ref (config);
 
 #ifdef HAVE_HAL
-	g_return_val_if_fail (TRACKER_IS_STORAGE (storage), FALSE);
-
-	albumart_storage = g_object_ref (storage);
+	albumart_storage = tracker_storage_new ();
+#else  /* HAVE_HAL */
+	albumart_storage = NULL;
 #endif /* HAVE_HAL */
 
 	/* Cache to know if we have already handled uris */
@@ -1043,41 +921,6 @@ tracker_albumart_init (TrackerConfig  *config,
 		return FALSE;
 	}
 
-	/* Get proxy for Service / Path / Interface of the indexer */
-	proxy = dbus_g_proxy_new_for_name (connection,
-					   "org.freedesktop.Tracker.Extract",
-					   "/org/freedesktop/Tracker/Extract",
-					   "org.freedesktop.Tracker.Extract");
-
-	if (!proxy) {
-		g_critical ("Could not create a DBusGProxy to the extract service");
-                return FALSE;
-	}
-
-        dbus_g_object_register_marshaller (tracker_marshal_VOID__POINTER_STRING_STRING_STRING_STRING,
-                                           G_TYPE_NONE,
-					   DBUS_TYPE_UCHAR_ARRAY,
-					   G_TYPE_STRING,
-					   G_TYPE_STRING,
-                                           G_TYPE_STRING,
-                                           G_TYPE_STRING,
-                                           G_TYPE_INVALID);
-	
-        dbus_g_proxy_add_signal (proxy,
-                                 "ProcessAlbumArt",
-                                 DBUS_TYPE_UCHAR_ARRAY,
-                                 G_TYPE_STRING,
-                                 G_TYPE_STRING,
-                                 G_TYPE_STRING,
-                                 G_TYPE_STRING,
-                                 G_TYPE_INVALID);
-        			
-        dbus_g_proxy_connect_signal (proxy,
-                                     "ProcessAlbumArt",
-                                     G_CALLBACK (albumart_process_cb),
-                                     NULL,
-                                     NULL);
-
 	/* Get album art downloader proxy */
 	albumart_proxy = dbus_g_proxy_new_for_name (connection,
 						    ALBUMARTER_SERVICE,
@@ -1108,9 +951,131 @@ tracker_albumart_shutdown (void)
 	}
 #endif /* HAVE_HAL */
 
-	if (albumart_config) {
-		g_object_unref (albumart_config);
+	initialized = FALSE;
+}
+
+gboolean
+tracker_albumart_process (const unsigned char *buffer,
+			  size_t               len,
+			  const gchar         *mime,
+			  const gchar         *artist,
+			  const gchar         *album,
+			  const gchar         *filename)
+{
+	gchar *art_path;
+	gboolean processed = TRUE;
+	gchar *local_uri = NULL;
+	gchar *filename_uri;
+
+	g_debug ("Processing album art, buffer is %ld bytes, artist:'%s', album:'%s', filename:'%s', mime:'%s'",
+		 len,
+		 artist ? artist : "", 
+		 album ? album : "",
+		 filename, 
+		 mime);
+
+	if (strstr (filename, "://")) {
+		filename_uri = g_strdup (filename);
+	} else {
+		filename_uri = g_filename_to_uri (filename, NULL, NULL);
 	}
 
-	initialized = FALSE;
+	albumart_get_path (artist, 
+			   album, 
+			   "album", 
+			   filename_uri, 
+			   &art_path, 
+			   &local_uri);
+
+	if (!art_path) {
+		g_warning ("Album art path could not be obtained, not processing any further");
+
+		g_free (filename_uri);
+		g_free (local_uri);
+
+		return FALSE;
+	}
+
+	if (!g_file_test (art_path, G_FILE_TEST_EXISTS)) {
+#ifdef HAVE_GDKPIXBUF
+		/* If we have embedded album art */
+		if (buffer && len > 0) {
+			processed = albumart_set (buffer,
+						  len, 
+						  mime,
+						  artist,
+						  album,
+						  filename);
+		} else {
+#endif /* HAVE_GDK_PIXBUF */
+			/* If not, we perform a heuristic on the dir */
+			gchar *key;
+			gchar *dirname;
+			GFile *file, *dirf;
+
+			file = g_file_new_for_path (filename);
+			dirf = g_file_get_parent (file);
+			dirname = g_file_get_path (dirf);
+			g_object_unref (file);
+			g_object_unref (dirf);
+
+			key = g_strdup_printf ("%s-%s-%s", 
+					       artist ? artist : "",
+					       album ? album : "",
+					       dirname ? dirname : "");
+
+			g_free (dirname);
+
+			if (!g_hash_table_lookup (albumart_cache, key)) {
+				if (!albumart_heuristic (artist, 
+							 album, 
+							 filename, 
+							 local_uri, 
+							 NULL)) {
+					/* If the heuristic failed, we
+					 * request the download the
+					 * media-art to the media-art
+					 * downloaders
+					 */
+					albumart_request_download (albumart_storage, 
+								   artist,
+								   album,
+								   local_uri,
+								   art_path);
+				}
+
+				g_hash_table_insert (albumart_cache, 
+						     key, 
+						     GINT_TO_POINTER(TRUE));
+			} else {
+				g_free (key);
+			}
+#ifdef HAVE_GDKPIXBUF
+		}
+#endif /* HAVE_GDKPIXBUF */
+
+		if (processed) {
+			albumart_signal_queue_thumbnail (filename_uri, "image/jpeg");
+		}
+	} else {
+		g_debug ("Album art already exists for uri:'%s'", 
+			 filename_uri);
+	}
+
+	if (local_uri && !g_file_test (local_uri, G_FILE_TEST_EXISTS)) {
+		/* We can't reuse art_exists here because the
+		 * situation might have changed
+		 */
+		if (g_file_test (art_path, G_FILE_TEST_EXISTS)) {
+			albumart_copy_to_local (albumart_storage,
+						art_path, 
+						local_uri);
+		}
+	}
+
+	g_free (art_path);
+	g_free (filename_uri);
+	g_free (local_uri);
+
+	return processed;
 }
diff --git a/src/tracker-miner-fs/tracker-albumart.h b/src/tracker-extract/tracker-albumart.h
similarity index 69%
rename from src/tracker-miner-fs/tracker-albumart.h
rename to src/tracker-extract/tracker-albumart.h
index 9cd3e6c..4aa2ff8 100644
--- a/src/tracker-miner-fs/tracker-albumart.h
+++ b/src/tracker-extract/tracker-albumart.h
@@ -18,21 +18,22 @@
  * Boston, MA  02110-1301, USA.
  */
 
-#ifndef __TRACKER_MINER_FS_ALBUMART_H__
-#define __TRACKER_MINER_FS_ALBUMART_H__
+#ifndef __TRACKER_EXTRACT_ALBUMART_H__
+#define __TRACKER_EXTRACT_ALBUMART_H__
 
 #include <glib.h>
 
-#include <libtracker-common/tracker-storage.h>
-
-#include "tracker-config.h"
-
 G_BEGIN_DECLS
 
-gboolean tracker_albumart_init     (TrackerConfig  *config,
-				    TrackerStorage *hal);
+gboolean tracker_albumart_init     (void);
 void     tracker_albumart_shutdown (void);
+gboolean tracker_albumart_process  (const unsigned char *buffer,
+				    size_t               len,
+				    const gchar         *mime,
+				    const gchar         *artist,
+				    const gchar         *album,
+				    const gchar         *filename);
 
 G_END_DECLS
 
-#endif /* __TRACKER_MINER_FS_ALBUMART_H__ */
+#endif /* __TRACKER_MINER_EXTRACT_H__ */
diff --git a/src/tracker-extract/tracker-extract-gstreamer.c b/src/tracker-extract/tracker-extract-gstreamer.c
index aeae8df..3ae0fae 100644
--- a/src/tracker-extract/tracker-extract-gstreamer.c
+++ b/src/tracker-extract/tracker-extract-gstreamer.c
@@ -38,9 +38,9 @@
 #include <libtracker-common/tracker-ontology.h>
 #include <libtracker-common/tracker-utils.h>
 
+#include "tracker-albumart.h"
 #include "tracker-main.h"
 #include "tracker-dbus.h"
-#include "tracker-extract.h"
 
 /* We wait this long (seconds) for NULL state before freeing */
 #define TRACKER_EXTRACT_GUARD_TIMEOUT 3
@@ -904,26 +904,20 @@ tracker_extract_gstreamer (const gchar *uri,
 
 	/* Save embedded art */
 	if (extractor->album_art_data && extractor->album_art_size) {
-		GObject *object;
-
-		object = tracker_dbus_get_object (TRACKER_TYPE_EXTRACT);
-
 #ifdef HAVE_GDKPIXBUF
-		tracker_extract_process_albumart (TRACKER_EXTRACT (object),
-						  extractor->album_art_data, 
-						  extractor->album_art_size, 
-						  extractor->album_art_mime,
-						  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
-						  album,
-						  uri);
+		tracker_albumart_process (extractor->album_art_data, 
+					  extractor->album_art_size, 
+					  extractor->album_art_mime,
+					  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
+					  album,
+					  uri);
 #else
-		tracker_extract_process_albumart (TRACKER_EXTRACT (object),
-						  NULL,
-						  0, 
-						  NULL,
-						  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
-						  album,
-						  uri);
+		tracker_albumart_process (NULL,
+					  0, 
+					  NULL,
+					  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
+					  album,
+					  uri);
 		
 #endif /* HAVE_GDKPIXBUF */
 	}
diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index 70802da..af1386d 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -49,9 +49,9 @@
 #include <libtracker-common/tracker-ontology.h>
 #include <libtracker-common/tracker-utils.h>
 
+#include "tracker-albumart.h"
 #include "tracker-main.h"
 #include "tracker-dbus.h"
-#include "tracker-extract.h"
 
 /* We mmap the beginning of the file and read separately the last 128 bytes
    for id3v1 tags. While these are probably cornercases the rationale is that
@@ -1810,7 +1810,6 @@ static void
 extract_mp3 (const gchar *uri,
 	     TrackerSparqlBuilder  *metadata)
 {
-	GObject *object;
 	gchar *filename;
 	int fd;
 	void *buffer;
@@ -1967,25 +1966,20 @@ extract_mp3 (const gchar *uri,
 	g_free (info.trackno);
 	g_free (info.genre);
 
-	/* TODO */
-	object = tracker_dbus_get_object (TRACKER_TYPE_EXTRACT);
-
 #ifdef HAVE_GDKPIXBUF
-	tracker_extract_process_albumart (TRACKER_EXTRACT (object),
-					  filedata.albumartdata, 
-					  filedata.albumartsize, 
-					  filedata.albumartmime,
-					  /* tracker_statement_list_find (metadata, NMM_PREFIX "performer") */ NULL,
-					  filedata.title, 
-					  filename);
+	tracker_albumart_process (filedata.albumartdata, 
+				  filedata.albumartsize, 
+				  filedata.albumartmime,
+				  /* tracker_statement_list_find (metadata, NMM_PREFIX "performer") */ NULL,
+				  filedata.title, 
+				  filename);
 #else
-	tracker_extract_process_albumart (TRACKER_EXTRACT (object),
-					  NULL, 
-					  0, 
-					  NULL,
-					  /* tracker_statement_list_find (metadata, NMM_PREFIX "performer") */ NULL,
-					  filedata.title, 
-					  filename);
+	tracker_albumart_process (NULL, 
+				  0, 
+				  NULL,
+				  /* tracker_statement_list_find (metadata, NMM_PREFIX "performer") */ NULL,
+				  filedata.title, 
+				  filename);
 
 #endif /* HAVE_GDKPIXBUF */
 
@@ -2007,3 +2001,4 @@ tracker_get_extract_data (void)
 {
 	return extract_data;
 }
+
diff --git a/src/tracker-extract/tracker-extract.c b/src/tracker-extract/tracker-extract.c
index 6ca88bc..22aba44 100644
--- a/src/tracker-extract/tracker-extract.c
+++ b/src/tracker-extract/tracker-extract.c
@@ -40,8 +40,6 @@
 
 #define MAX_EXTRACT_TIME 10
 
-#define DBUS_TYPE_UCHAR_ARRAY (dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR))
-
 #define TRACKER_EXTRACT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_EXTRACT, TrackerExtractPrivate))
 
 extern gboolean debug;
@@ -57,7 +55,7 @@ typedef struct {
 }  ModuleData;
 
 enum {
-	PROCESS_ALBUM_ART,
+	QUEUE_THUMBNAIL,
 	LAST_SIGNAL
 };
 
@@ -76,18 +74,15 @@ tracker_extract_class_init (TrackerExtractClass *klass)
 
 	object_class->finalize = tracker_extract_finalize;
 
-	signals[PROCESS_ALBUM_ART] =
-		g_signal_new ("process-album-art",
+	signals[QUEUE_THUMBNAIL] =
+		g_signal_new ("queue-thumbnail",
 			      G_TYPE_FROM_CLASS (klass),
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      tracker_marshal_VOID__POINTER_STRING_STRING_STRING_STRING,
+			      tracker_marshal_VOID__STRING_STRING,
 			      G_TYPE_NONE,
-			      5,
-			      DBUS_TYPE_UCHAR_ARRAY,
-			      G_TYPE_STRING,
-			      G_TYPE_STRING,
+			      2,
 			      G_TYPE_STRING,
 			      G_TYPE_STRING);
 
@@ -483,37 +478,3 @@ tracker_extract_get_metadata (TrackerExtract	     *object,
 		alarm (0);
 	}
 }
-
-void
-tracker_extract_process_albumart (TrackerExtract      *object, 
-				  const unsigned char *buffer,
-				  size_t               len,
-				  const gchar         *mime,
-				  const gchar         *artist,
-				  const gchar         *album,
-				  const gchar         *filename)
-{
-	g_return_if_fail (buffer != NULL);
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (mime != NULL);
-	g_return_if_fail (filename != NULL);
-
-	GArray *array;
-
-	array = g_array_sized_new (FALSE,
-				   FALSE,
-				   sizeof (guchar),
-				   len);
-	g_array_append_vals (array, buffer, len);
-
-	g_signal_emit (object,
-		       signals[PROCESS_ALBUM_ART],
-		       0,
-		       array,
-		       mime,
-		       artist,
-		       album,
-		       filename);
-
-	g_array_free (array, TRUE);
-}
diff --git a/src/tracker-extract/tracker-extract.h b/src/tracker-extract/tracker-extract.h
index 0b90cd4..769b26a 100644
--- a/src/tracker-extract/tracker-extract.h
+++ b/src/tracker-extract/tracker-extract.h
@@ -64,13 +64,6 @@ void            tracker_extract_get_metadata            (TrackerExtract
 void            tracker_extract_get_metadata_by_cmdline (TrackerExtract         *object,
 							 const gchar            *path,
 							 const gchar            *mime);
-void            tracker_extract_process_albumart        (TrackerExtract         *object,
-							 const unsigned char    *buffer,
-							 size_t                  len,
-							 const gchar            *mime,
-							 const gchar            *artist,
-							 const gchar            *album,
-							 const gchar            *filename);
 
 G_END_DECLS
 
diff --git a/src/tracker-extract/tracker-main.c b/src/tracker-extract/tracker-main.c
index 97734c3..b09784c 100644
--- a/src/tracker-extract/tracker-main.c
+++ b/src/tracker-extract/tracker-main.c
@@ -49,6 +49,7 @@
 #include <libtracker-common/tracker-thumbnailer.h>
 #include <libtracker-common/tracker-ioprio.h>
 
+#include "tracker-albumart.h"
 #include "tracker-config.h"
 #include "tracker-main.h"
 #include "tracker-dbus.h"
@@ -381,6 +382,8 @@ main (int argc, char *argv[])
 		return EXIT_FAILURE;
 	}
 
+	tracker_albumart_init ();
+
 	/* Main loop */
 	main_loop = g_main_loop_new (NULL, FALSE);
 	tracker_main_quit_timeout_reset ();
@@ -390,6 +393,7 @@ main (int argc, char *argv[])
 	g_message ("Shutdown started");
 
 	/* Shutdown subsystems */
+	tracker_albumart_shutdown ();
 	tracker_dbus_shutdown ();
 	tracker_log_shutdown ();
 
diff --git a/src/tracker-extract/tracker-marshal.list b/src/tracker-extract/tracker-marshal.list
index e4d6982..72f9937 100644
--- a/src/tracker-extract/tracker-marshal.list
+++ b/src/tracker-extract/tracker-marshal.list
@@ -1 +1 @@
-VOID:POINTER,STRING,STRING,STRING,STRING
+VOID:STRING,STRING
diff --git a/src/tracker-miner-fs/Makefile.am b/src/tracker-miner-fs/Makefile.am
index 61dbe55..92a13ce 100644
--- a/src/tracker-miner-fs/Makefile.am
+++ b/src/tracker-miner-fs/Makefile.am
@@ -13,7 +13,6 @@ INCLUDES =								\
 	-DTRACKER_COMPILATION						\
 	-I$(top_srcdir)/src						\
 	$(WARN_CFLAGS)							\
-	$(GDKPIXBUF_CFLAGS)						\
 	$(GMODULE_CFLAGS)						\
 	$(PANGO_CFLAGS)							\
 	$(DBUS_CFLAGS)							\
@@ -41,8 +40,6 @@ libtracker_module_la_LIBADD = $(GCOV_LIBS)
 libexec_PROGRAMS = tracker-miner-fs
 
 tracker_miner_fs_SOURCES =						\
-	tracker-albumart.c						\
-	tracker-albumart.h						\
 	tracker-config.c						\
 	tracker-config.h						\
 	tracker-crawler.c						\
@@ -78,7 +75,6 @@ tracker_miner_fs_LDADD =						\
 	$(top_builddir)/src/libinotify/libinotify.la			\
 	$(tracker_store_win_libs)					\
 	$(DBUS_LIBS)							\
-	$(GDKPIXBUF_LIBS)						\
 	$(GMODULE_LIBS)							\
 	$(GTHREAD_LIBS)							\
 	$(PANGO_LIBS)							\
diff --git a/src/tracker-miner-fs/tracker-main.c b/src/tracker-miner-fs/tracker-main.c
index da71ad2..811b438 100644
--- a/src/tracker-miner-fs/tracker-main.c
+++ b/src/tracker-miner-fs/tracker-main.c
@@ -48,7 +48,6 @@
 
 #include <libtracker-data/tracker-turtle.h>
 
-#include "tracker-albumart.h"
 #include "tracker-dbus.h"
 #include "tracker-config.h"
 #include "tracker-indexer.h"
@@ -67,7 +66,7 @@
 	"  http://www.gnu.org/licenses/gpl.txt\n";
 
 static GMainLoop    *main_loop;
-
+static DBusGProxy   *proxy_for_extractor;
 static gboolean      version;
 static gint	     verbosity = -1;
 static gint	     initial_sleep = -1;
@@ -220,6 +219,92 @@ daemon_availability_changed_cb (const gchar *name,
         }
 }
 
+static void
+albumart_queue_thumbnail_cb (DBusGProxy  *proxy,
+                             const gchar *filename,
+                             const gchar *mime,
+                             gpointer     user_data)
+{
+        TrackerConfig *config;
+
+        g_message ("Album art received for thumbnail queue for uri:'%s' with mime:'%s'",
+                   filename, 
+                   mime);
+        
+        config = TRACKER_CONFIG (user_data);
+
+        if (tracker_config_get_enable_thumbnails (config)) {
+                tracker_thumbnailer_queue_add (filename, mime);
+        }
+}
+
+static gboolean 
+albumart_init (TrackerConfig *config)
+{
+	DBusGConnection *connection;
+	GError *error = NULL;
+
+        g_message ("Setting up album art queue handler for thumbnails");
+
+	/* Signal handler for new album art from the extractor */
+	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+	if (!connection) {
+		g_critical ("Could not connect to the DBus session bus, %s",
+			    error ? error->message : "no error given.");
+		g_clear_error (&error);
+		return FALSE;
+	}
+
+	/* Get proxy for Service / Path / Interface of the indexer */
+	proxy_for_extractor = 
+                dbus_g_proxy_new_for_name (connection,
+                                           "org.freedesktop.Tracker.Extract",
+                                           "/org/freedesktop/Tracker/Extract",
+                                           "org.freedesktop.Tracker.Extract");
+
+	if (!proxy_for_extractor) {
+		g_critical ("Could not create a DBusGProxy to the extract service");
+                return FALSE;
+	}
+
+        dbus_g_object_register_marshaller (tracker_marshal_VOID__STRING_STRING,
+                                           G_TYPE_NONE,
+                                           G_TYPE_STRING,
+                                           G_TYPE_STRING,
+                                           G_TYPE_INVALID);
+	
+        dbus_g_proxy_add_signal (proxy_for_extractor,
+                                 "QueueThumbnail",
+                                 G_TYPE_STRING,
+                                 G_TYPE_STRING,
+                                 G_TYPE_INVALID);
+        			
+        dbus_g_proxy_connect_signal (proxy_for_extractor,
+                                     "QueueThumbnail",
+                                     G_CALLBACK (albumart_queue_thumbnail_cb),
+                                     g_object_ref (config),
+                                     NULL);
+
+        return TRUE;
+}
+
+static void 
+albumart_shutdown (TrackerConfig *config)
+{
+        dbus_g_proxy_disconnect_signal (proxy_for_extractor,
+                                        "QueueThumbnail",
+                                        G_CALLBACK (albumart_queue_thumbnail_cb),
+                                        config);
+
+        g_object_unref (config);
+
+        if (proxy_for_extractor) {
+                g_object_unref (proxy_for_extractor);
+                proxy_for_extractor = NULL;
+        }
+}
+
 int
 main (gint argc, gchar *argv[])
 {
@@ -343,7 +428,7 @@ main (gint argc, gchar *argv[])
 
 	/* Set up connections to the thumbnailer if supported */
 	tracker_thumbnailer_init ();
-        tracker_albumart_init (config, storage);
+        albumart_init (config);
 
 	if (process_all) {
 		/* Tell the indexer to process all configured modules */
@@ -363,6 +448,12 @@ main (gint argc, gchar *argv[])
 
 	tracker_turtle_shutdown ();
 
+        albumart_shutdown (config);
+	tracker_thumbnailer_shutdown ();
+	tracker_dbus_shutdown ();
+	tracker_module_config_shutdown ();
+	tracker_log_shutdown ();
+
 	g_main_loop_unref (main_loop);
 	g_object_unref (indexer);
 	g_object_unref (miner);
@@ -372,12 +463,6 @@ main (gint argc, gchar *argv[])
                 g_object_unref (storage);
         }
 
-        tracker_albumart_shutdown ();
-	tracker_thumbnailer_shutdown ();
-	tracker_dbus_shutdown ();
-	tracker_module_config_shutdown ();
-	tracker_log_shutdown ();
-
 	g_print ("\nOK\n\n");
 
 	return EXIT_SUCCESS;
diff --git a/src/tracker-miner-fs/tracker-marshal.list b/src/tracker-miner-fs/tracker-marshal.list
index 5bba08b..71edec1 100644
--- a/src/tracker-miner-fs/tracker-marshal.list
+++ b/src/tracker-miner-fs/tracker-marshal.list
@@ -5,4 +5,4 @@ VOID:STRING,OBJECT,OBJECT,BOOLEAN,BOOLEAN
 VOID:STRING,BOOL
 VOID:STRING,OBJECT
 VOID:STRING,UINT,UINT,UINT,UINT
-VOID:POINTER,STRING,STRING,STRING,STRING
+VOID:STRING,STRING



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]