Update to that last patch with exif enabled.

On 9/26/06, Edward Duffy <[EMAIL PROTECTED]> wrote:
Here's the patch for moving everything to tracker-extract.

On 9/26/06, Jamie McCracken <[EMAIL PROTECTED]> wrote:
> Edward Duffy wrote:
> > Is there any advantage to keeping them internal?  Should we just stick
> > with tracker-extract for all types?
>
> I suppose it makes writing metadata easier having them internal although
> we could use pipes for that too.
>
> Its also nice to have a seperate app to extract as you might find it
> useful to use elsewhere or just for testing.
>
> Feel free to move your stuff to tracker-extract for the time being.
>
>
> --
> Mr Jamie McCracken
> http://jamiemcc.livejournal.com/
>



Index: configure.in
===================================================================
RCS file: /cvs/gnome/tracker/configure.in,v
retrieving revision 1.18
diff -u -p -r1.18 configure.in
--- configure.in	26 Sep 2006 00:52:38 -0000	1.18
+++ configure.in	27 Sep 2006 03:07:13 -0000
@@ -347,6 +347,34 @@ AC_SUBST(THEORA_LIBS)
 test "$have_theora" = "yes" && AC_DEFINE(HAVE_THEORA, [], [Define if we have libtheora])
 
 
+##################################################################
+# check for libpng
+##################################################################
+
+LIBPNG_REQUIRED=1.2
+
+PKG_CHECK_MODULES(LIBPNG, [libpng >= $LIBPNG_REQUIRED], [have_libpng=yes] , [have_png=no])
+
+AM_CONDITIONAL(HAVE_LIBPNG, test "$have_libpng" = "yes")
+AC_SUBST(LIBPNG_CFLAGS)
+AC_SUBST(LIBPNG_LIBS)
+test "$have_libpng" = "yes" && AC_DEFINE(HAVE_LIBPNG, [], [Define if we have libpng])
+
+
+##################################################################
+# check for libexif
+##################################################################
+
+LIBEXIF_REQUIRED=0.6
+
+PKG_CHECK_MODULES(LIBEXIF, [libexif >= $LIBEXIF_REQUIRED], [have_libexif=yes] , [have_libexif=no])
+
+AM_CONDITIONAL(HAVE_LIBEXIF, test "$have_libexif" = "yes")
+AC_SUBST(LIBEXIF_CFLAGS)
+AC_SUBST(LIBEXIF_LIBS)
+test "$have_libexif" = "yes" && AC_DEFINE(HAVE_LIBEXIF, [], [Define if we have libexif])
+
+
 #####################################################
 
 AM_CONFIG_HEADER(src/trackerd/config.h)
@@ -395,5 +423,7 @@ Metadata extractors:
 	pdf :					$have_poppler
 	ogg/vorbis :				$have_vorbis
 	ogg/theora :				$have_theora
+	png :					$have_libpng
+	exif (jpeg) :				$have_libexif
 "
 
Index: src/trackerd/Makefile.am
===================================================================
RCS file: /cvs/gnome/tracker/src/trackerd/Makefile.am,v
retrieving revision 1.11
diff -u -p -r1.11 Makefile.am
--- src/trackerd/Makefile.am	26 Sep 2006 00:52:39 -0000	1.11
+++ src/trackerd/Makefile.am	27 Sep 2006 03:07:25 -0000
@@ -15,9 +15,6 @@ INCLUDES =				\
 	$(FAM_CFLAGS)			\
 	$(DBUS_CFLAGS)			\
 	$(MYSQL_CFLAGS)			\
-	$(POPPLER_GLIB_CFLAGS)			\
-	$(VORBIS_CFLAGS)			\
-	$(THEORA_CFLAGS)			\
 	$(additional_mysql_flags)	\
 	$(CFLAGS) 			\
 	-g 
@@ -101,11 +98,6 @@ trackerd_SOURCES =		\
 	tracker-mbox.h		\
 	tracker-metadata.c	\
 	tracker-metadata.h	\
-	tracker-metadata-oasis.c	\
-	tracker-metadata-ps.c	\
-	tracker-metadata-pdf.c	\
-	tracker-metadata-abw.c	\
-	tracker-metadata-vorbis.c	\
 	tracker-rdf-query.c	\
 	tracker-rdf-query.h	\
 	tracker-stemmer-english.c	\
@@ -138,9 +130,6 @@ trackerd_LDADD = $(GLIB2_LIBS) 	\
 		 $(GMIME_LIBS)	\
 		 $(QDBM_LIBS) 	\
 		 $(SQLITE3_LIBS) \
- 		 $(POPPLER_GLIB_LIBS) \
- 		 $(VORBIS_LIBS) \
- 		 $(THEORA_LIBS) \
 		 -lbz2		\
 		 -lstdc++
 
Index: src/trackerd/trackerd.c
===================================================================
RCS file: /cvs/gnome/tracker/src/trackerd/trackerd.c,v
retrieving revision 1.38
diff -u -p -r1.38 trackerd.c
--- src/trackerd/trackerd.c	26 Sep 2006 00:52:39 -0000	1.38
+++ src/trackerd/trackerd.c	27 Sep 2006 03:08:05 -0000
@@ -1953,8 +1953,6 @@ main (int argc, char **argv)
 	sigaction (SIGUSR1, &act, NULL);
 	sigaction (SIGINT,  &act, NULL);
 
-	g_type_init ();
-
 	if (!g_thread_supported ()) {
 		g_thread_init (NULL);
 	}
Index: src/trackerd/tracker-metadata.c
===================================================================
RCS file: /cvs/gnome/tracker/src/trackerd/tracker-metadata.c,v
retrieving revision 1.11
diff -u -p -r1.11 tracker-metadata.c
--- src/trackerd/tracker-metadata.c	26 Sep 2006 10:28:53 -0000	1.11
+++ src/trackerd/tracker-metadata.c	27 Sep 2006 03:08:21 -0000
@@ -127,39 +127,6 @@ char *development_mime_types[] = {
 };
 
 
-typedef void (*MetadataExtractFunc)(gchar *, GHashTable *);
-typedef struct {
-	char                 *mime;
-	MetadataExtractFunc  extractor;
-} MimeToExtractor;
-
-void tracker_metadata_extract_oasis (gchar *, GHashTable *);
-void tracker_metadata_extract_ps    (gchar *, GHashTable *);
-#ifdef HAVE_POPPLER
-void tracker_metadata_extract_pdf   (gchar *, GHashTable *);
-#endif
-void tracker_metadata_extract_abw   (gchar *, GHashTable *);
-void tracker_metadata_extract_vorbis   (gchar *, GHashTable *);
-
-MimeToExtractor internal_metadata_extractors[] = {
-   /* Document extractors */
-	{ "application/vnd.oasis.opendocument.text",         tracker_metadata_extract_oasis },
-	{ "application/vnd.oasis.opendocument.spreadsheet",  tracker_metadata_extract_oasis },
-	{ "application/vnd.oasis.opendocument.graphics",     tracker_metadata_extract_oasis },
-	{ "application/vnd.oasis.opendocument.presentation", tracker_metadata_extract_oasis },
-	{ "application/postscript",                          tracker_metadata_extract_ps    },
-#ifdef HAVE_POPPLER
-	{ "application/pdf",                                 tracker_metadata_extract_pdf   },
-#endif
-	{ "application/x-abiword",                           tracker_metadata_extract_abw   },
-   /* Video extractors */
-	//{ "video/x-theora+ogg",                              tracker_metadata_extract_theora   },
-   /* Audio extractors */
-	{ "audio/x-vorbis+ogg",                              tracker_metadata_extract_vorbis   },
-   /* Image extractors */
-	{ "",                                                NULL                           }
-};
-
 static MetadataFileType
 tracker_get_metadata_type (const char *mime)
 {
@@ -431,32 +398,14 @@ tracker_metadata_get_thumbnail (const ch
 	return NULL;
 }
 
-static void log_metadata_cb (gpointer key, gpointer value, gpointer user_data)
-{
-	tracker_log ("%s = %s", (gchar *)key, (gchar *)value);
-}
-
 void
 tracker_metadata_get_embedded (const char *uri, const char *mime, GHashTable *table)
 {
-	MimeToExtractor  *p;
 	MetadataFileType meta_type;
-	gboolean         found;
 
 	if (!uri || !mime || !table) {
 		return;
 	}
-
-	found = FALSE;
-	for (p = internal_metadata_extractors; p->extractor; ++p) {
-		if (strcmp (p->mime, mime) == 0) {
-			found = TRUE;
-			(*p->extractor)(uri, table);
-			g_hash_table_foreach (table, log_metadata_cb, NULL);
-		}
-	}
-	if (found)
-		return;
 
 	meta_type = tracker_get_metadata_type (mime);
 
Index: src/tracker-extract/Makefile.am
===================================================================
RCS file: /cvs/gnome/tracker/src/tracker-extract/Makefile.am,v
retrieving revision 1.4
diff -u -p -r1.4 Makefile.am
--- src/tracker-extract/Makefile.am	21 Aug 2006 20:18:26 -0000	1.4
+++ src/tracker-extract/Makefile.am	27 Sep 2006 03:08:39 -0000
@@ -1,8 +1,20 @@
-INCLUDES = $(GLIB2_CFLAGS) $(CFLAGS) -g 
+INCLUDES = $(GLIB2_CFLAGS) $(CFLAGS) -g \
+	$(POPPLER_GLIB_CFLAGS)			\
+	$(VORBIS_CFLAGS)			\
+	$(THEORA_CFLAGS)			\
+	$(LIBPNG_CFLAGS)			\
+	$(LIBEXIF_CFLAGS)
 
 bin_PROGRAMS = tracker-extract
 
-tracker_extract_SOURCES = tracker-extract.c
+tracker_extract_SOURCES = tracker-extract.c \
+	tracker-extract-oasis.c	\
+	tracker-extract-ps.c	\
+	tracker-extract-pdf.c	\
+	tracker-extract-abw.c	\
+	tracker-extract-vorbis.c	\
+	tracker-extract-png.c \
+	tracker-extract-exif.c
 
 if USING_INTERNAL_LIBEXTRACTOR
 extractor_ldadd = $(top_builddir)/src/libextractor/src/main/libextractor.la
@@ -10,4 +22,9 @@ else
 extractor_ldadd = -lextractor
 endif
 
-tracker_extract_LDADD = $(GLIB2_LIBS) $(extractor_ldadd)
+tracker_extract_LDADD = $(GLIB2_LIBS) $(extractor_ldadd) \
+ 		 $(POPPLER_GLIB_LIBS) \
+ 		 $(VORBIS_LIBS) \
+ 		 $(THEORA_LIBS) \
+ 		 $(LIBPNG_LIBS) \
+ 		 $(LIBEXIF_LIBS)
Index: src/tracker-extract/tracker-extract.c
===================================================================
RCS file: /cvs/gnome/tracker/src/tracker-extract/tracker-extract.c,v
retrieving revision 1.10
diff -u -p -r1.10 tracker-extract.c
--- src/tracker-extract/tracker-extract.c	20 Sep 2006 23:40:50 -0000	1.10
+++ src/tracker-extract/tracker-extract.c	27 Sep 2006 03:09:19 -0000
@@ -30,6 +30,7 @@
 #   include "../libextractor/src/include/extractor.h"
 #endif
 
+#include "config.h"
 
 typedef enum {
 	IGNORE_METADATA,
@@ -116,6 +117,62 @@ static struct metadata_format image_keyw
 	{"EOF", EXTRACTOR_UNKNOWN}
 };
 
+typedef void (*MetadataExtractFunc)(gchar *, GHashTable *);
+typedef struct {
+	char                 *mime;
+	MetadataExtractFunc  extractor;
+} MimeToExtractor;
+
+void tracker_extract_oasis (gchar *, GHashTable *);
+void tracker_extract_ps    (gchar *, GHashTable *);
+#ifdef HAVE_POPPLER
+void tracker_extract_pdf   (gchar *, GHashTable *);
+#endif
+void tracker_extract_abw   (gchar *, GHashTable *);
+#ifdef HAVE_VORBIS
+void tracker_extract_vorbis   (gchar *, GHashTable *);
+#endif
+#ifdef HAVE_LIBPNG
+void tracker_extract_png   (gchar *, GHashTable *);
+#endif
+#ifdef HAVE_LIBEXIF
+void tracker_extract_exif   (gchar *, GHashTable *);
+#endif
+
+MimeToExtractor extractors[] = {
+   /* Document extractors */
+	{ "application/vnd.oasis.opendocument.text",         tracker_extract_oasis },
+	{ "application/vnd.oasis.opendocument.spreadsheet",  tracker_extract_oasis },
+	{ "application/vnd.oasis.opendocument.graphics",     tracker_extract_oasis },
+	{ "application/vnd.oasis.opendocument.presentation", tracker_extract_oasis },
+	{ "application/postscript",                          tracker_extract_ps    },
+#ifdef HAVE_POPPLER
+	{ "application/pdf",                                 tracker_extract_pdf   },
+#endif
+	{ "application/x-abiword",                           tracker_extract_abw   },
+
+
+   /* Video extractors */
+#ifdef HAVE_THEORA
+	{ "video/x-theora+ogg",                              tracker_extract_theora   },
+#endif
+
+
+   /* Audio extractors */
+#ifdef HAVE_VORBIS
+	{ "audio/x-vorbis+ogg",                              tracker_extract_vorbis   },
+#endif
+
+
+   /* Image extractors */
+#ifdef HAVE_LIBPNG
+	{ "image/png",                                       tracker_extract_png   },
+#endif
+#ifdef HAVE_LIBEXIF
+	{ "image/jpeg",                                       tracker_extract_exif   },
+#endif
+	{ "",                                                NULL                           }
+};
 
 static MetadataFileType
 get_metadata_type (const char *mime)
@@ -386,6 +443,21 @@ tracker_get_file_metadata (const char *u
 		return NULL;
 	}
 
+	meta_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);	
+
+	if (mime) {
+		MimeToExtractor  *p;
+		for (p = extractors; p->extractor; ++p) {
+			if (strcmp (p->mime, mime) == 0) {
+				(*p->extractor)(uri_in_locale, meta_table);
+				return meta_table;
+			}
+		}
+		fprintf (stderr, "Mime %s not found, falling back on libextractor\n", mime);
+	}
+
+
+	/* Fallback to libextractor */
 	keywords = EXTRACTOR_getKeywords (plugins, uri_in_locale);
 
 	g_free (uri_in_locale);
@@ -410,8 +482,6 @@ tracker_get_file_metadata (const char *u
 
 
 
-	meta_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);	
-
 	while (keywords != NULL) {
  
 		value = g_locale_to_utf8 (keywords->keyword, -1, NULL, NULL, NULL);
@@ -478,6 +548,7 @@ main (int argc, char **argv) 
 	GHashTable *meta;
 	char *filename;
 
+	g_set_application_name ("tracker-extract");
 	setlocale (LC_ALL, "");
 
 	if ((argc == 1) || (argc > 3)) {
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-abw.c	2006-09-26 18:35:58.000000000 -0400
@@ -0,0 +1,47 @@
+
+#include <string.h>
+#include <stdio.h>
+#include <glib.h>
+
+void tracker_extract_abw (gchar *filename, GHashTable *metadata)
+{
+	FILE    *f;
+	gchar   *line;
+	gsize    length = 0;
+   
+	if(f = fopen (filename, "r")) {
+		line = NULL;
+		getline (&line, &length, f);
+		while (!feof (f)) {
+			if (g_str_has_suffix (line, "</m>\n")) {
+				line[strlen(line) - 5] = '\0';
+			}
+			if (g_str_has_prefix (line, "<m key=\"dc.title\">")) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Title"), g_strdup (line+18));
+			}
+			else if (g_str_has_prefix (line, "<m key=\"dc.subject\">")) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Subject"), g_strdup (line+20));
+			}
+			else if (g_str_has_prefix (line, "<m key=\"dc.creator\">")) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Author"), g_strdup (line+20));
+			}
+			else if (g_str_has_prefix (line, "<m key=\"abiword.keywords\">")) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Keywords"), g_strdup (line+26));
+			}
+			else if (g_str_has_prefix (line, "<m key=\"dc.description\">")) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Comments"), g_strdup (line+24));
+			}
+			g_free (line);
+			line = NULL;
+			getline (&line, &length, f);
+		}
+		g_free (line);
+	}
+	fclose (f);
+}
+
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-oasis.c	2006-09-26 18:35:58.000000000 -0400
@@ -0,0 +1,181 @@
+
+#include <string.h>
+#include <glib.h>
+
+typedef enum {
+		READ_TITLE,
+		READ_SUBJECT,
+		READ_AUTHOR,
+		READ_KEYWORDS,
+		READ_COMMENTS,
+		READ_STATS,
+		READ_CREATED,
+		READ_FILE_OTHER
+	} tag_type;
+
+typedef struct {
+	GHashTable *metadata;
+	tag_type current;
+} ODTParseInfo;
+
+static void start_element_handler (GMarkupParseContext *context,
+                                   const gchar *element_name,
+                                   const gchar **attribute_names,
+                                   const gchar **attribute_values,
+                                   gpointer user_data,
+                                   GError **error);
+
+static void end_element_handler (GMarkupParseContext *context,
+                                 const gchar *element_name,
+                                 gpointer user_data,
+                                 GError **error);
+
+static void text_handler (GMarkupParseContext *context,
+                          const gchar *text,
+                          gsize text_len,
+                          gpointer user_data,
+                          GError **error);
+
+void tracker_extract_oasis (gchar *filename, GHashTable *metadata)
+{
+
+	gchar         *argv[5];
+	gchar         *xml;
+	ODTParseInfo   info = { metadata, -1 };
+
+	argv[0] = g_strdup ("unzip");
+	argv[1] = g_strdup ("-p");
+	argv[2] = g_strdup (filename);
+	argv[3] = g_strdup ("meta.xml");
+	argv[4] = NULL;
+
+	if(g_spawn_sync (NULL,
+                    argv,
+                    NULL,
+                    G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
+                    NULL,
+                    NULL,
+                    &xml,
+                    NULL,
+                    NULL,
+                    NULL)) {
+
+		GMarkupParseContext  *context;
+		GMarkupParser         parser = {
+				start_element_handler,
+				end_element_handler,
+				text_handler,
+				NULL,
+				NULL
+			};
+
+		context = g_markup_parse_context_new (&parser, 0, &info, NULL);
+		g_markup_parse_context_parse (context, xml, -1, NULL);
+
+		g_markup_parse_context_free (context);
+		g_free (xml);
+	}
+
+	g_free (argv[3]);
+	g_free (argv[2]);
+	g_free (argv[1]);
+	g_free (argv[0]);
+
+}
+
+void start_element_handler (GMarkupParseContext *context,
+                            const gchar *element_name,
+                            const gchar **attribute_names,
+                            const gchar **attribute_values,
+                            gpointer user_data,
+                            GError **error)
+{
+	if(strcmp(element_name, "dc:title") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_TITLE;
+	}
+	else if(strcmp(element_name, "dc:subject") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_SUBJECT;
+	}
+	else if(strcmp(element_name, "dc:creator") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_AUTHOR;
+	}
+	else if(strcmp(element_name, "meta:keyword") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_KEYWORDS;
+	}
+	else if(strcmp(element_name, "dc:description") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_COMMENTS;
+	}
+	else if(strcmp(element_name, "meta:document-statistic") == 0) {
+		GHashTable *metadata = ((ODTParseInfo *)user_data)->metadata;
+		const gchar **a, **v;
+		for(a=attribute_names,v=attribute_values; *a; ++a,++v) {
+			if (strcmp (*a, "meta:word-count") == 0) {
+				g_hash_table_insert (metadata,
+					g_strdup("Doc.WordCount"), g_strdup (*v));
+			}
+			else if (strcmp (*a, "meta:page-count") == 0) {
+				g_hash_table_insert (metadata,
+					g_strdup("Doc.PageCount"), g_strdup (*v));
+			}
+		}
+		((ODTParseInfo *)user_data)->current = READ_STATS;
+	}
+	else if(strcmp(element_name, "meta:creation-date") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_CREATED;
+	}
+	else if(strcmp(element_name, "meta:generator") == 0) {
+		((ODTParseInfo *)user_data)->current = READ_FILE_OTHER;
+	}
+	else {
+		((ODTParseInfo *)user_data)->current = -1;
+	}
+}
+
+void end_element_handler (GMarkupParseContext *context,
+                          const gchar *element_name,
+                          gpointer user_data,
+                          GError **error)
+{
+	((ODTParseInfo *)user_data)->current = -1;
+}
+
+void text_handler (GMarkupParseContext *context,
+                   const gchar *text,
+                   gsize text_len,
+                   gpointer user_data,
+                   GError **error)
+{
+	GHashTable *metadata = ((ODTParseInfo *)user_data)->metadata;
+
+	switch(((ODTParseInfo *)user_data)->current) {
+		case READ_TITLE:
+			g_hash_table_insert (metadata, g_strdup("Doc.Title"), g_strdup (text));
+			break;
+		case READ_SUBJECT:
+			g_hash_table_insert (metadata, g_strdup("Doc.Subject"), g_strdup (text));
+			break;
+		case READ_AUTHOR:
+			g_hash_table_insert (metadata, g_strdup("Doc.Author"), g_strdup (text));
+			break;
+		case READ_KEYWORDS: {
+				gchar *keywords;
+				if (keywords = g_hash_table_lookup (metadata, "Doc.Keywords")) {
+					g_hash_table_replace (metadata, "Doc.Keywords",
+							g_strconcat (keywords, ",", text, NULL));
+				}
+				else {
+					g_hash_table_insert (metadata, g_strdup("Doc.Keywords"), g_strdup (text));
+				}
+			}
+			break;
+		case READ_COMMENTS:
+			g_hash_table_insert (metadata, g_strdup("Doc.Comments"), g_strdup (text));
+			break;
+		case READ_CREATED:
+			g_hash_table_insert (metadata, g_strdup("Doc.Created"), g_strdup (text));
+			break;
+		case READ_FILE_OTHER:
+			g_hash_table_insert (metadata, g_strdup("File.Other"), g_strdup (text));
+			break;
+	}
+}
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-exif.c	2006-09-26 23:03:09.000000000 -0400
@@ -0,0 +1,113 @@
+
+#include "config.h"
+
+#ifdef HAVE_LIBEXIF
+
+#include <exif-data.h>
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+
+static gchar *fix_focal_length (gchar *fl)
+{
+	return g_strndup (fl, (strstr (fl, "mm") - fl));
+}
+
+static gchar *fix_flash (gchar *flash)
+{
+	if (g_str_has_prefix (flash, "No"))
+		return g_strdup ("0");
+	else
+		return g_strdup ("1");
+}
+
+static gchar *fix_fnumber (gchar *fn)
+{
+	if (fn && fn[0] == 'F') {
+		fn[0] = ' ';
+	}
+	else if (fn && fn[0] == 'f' && fn[1] == '/') {
+		fn[0] = ' ', fn[1] = ' ';
+	}
+	return fn;
+}
+
+static gchar *fix_exposure_time (gchar *et)
+{
+	gchar *sep = strchr (et, '/');
+
+	if (sep) {
+		gdouble fraction = g_ascii_strtod (sep+1, NULL);
+			
+		if (fraction > 0) {	
+			gdouble val = 1.0f / fraction;
+			char str_value[30];
+	
+			g_ascii_dtostr (str_value, 30, val); 
+			return g_strdup (str_value);
+		}
+	}
+	return et;
+}
+
+typedef gchar *(*PostProcessor)(gchar *);
+
+typedef struct {
+	ExifTag        tag;
+	gchar         *name;
+	PostProcessor  post;
+} TagType;
+
+TagType tags[] = {
+	{ EXIF_TAG_PIXEL_Y_DIMENSION, "Image.Height", NULL },
+	{ EXIF_TAG_PIXEL_X_DIMENSION, "Image.Width", NULL },
+	{ EXIF_TAG_RELATED_IMAGE_WIDTH, "Image.Width", NULL },
+	{ EXIF_TAG_DOCUMENT_NAME, "Image.Title", NULL },
+	/* { -1, "Image.Album", NULL }, */
+	{ EXIF_TAG_DATE_TIME, "Image.Date", NULL },
+	/* { -1, "Image.Keywords", NULL }, */
+	{ EXIF_TAG_ARTIST, "Image.Creator", NULL },
+	{ EXIF_TAG_USER_COMMENT, "Image.Comments", NULL },
+	{ EXIF_TAG_IMAGE_DESCRIPTION, "Image.Description", NULL },
+	{ EXIF_TAG_SOFTWARE, "Image.Software", NULL },
+	{ EXIF_TAG_MAKE, "Image.CameraMake", NULL },
+	{ EXIF_TAG_MODEL, "Image.CameraModel", NULL },
+	{ EXIF_TAG_ORIENTATION, "Image.Orientation", NULL },
+	{ EXIF_TAG_EXPOSURE_PROGRAM, "Image.ExposureProgram", NULL },
+	{ EXIF_TAG_EXPOSURE_TIME, "Image.ExposureTime", fix_exposure_time },
+	{ EXIF_TAG_FNUMBER, "Image.Fnumber", fix_fnumber },
+	{ EXIF_TAG_FLASH, "Image.Flash", fix_flash },
+	{ EXIF_TAG_FOCAL_LENGTH, "Image.FocalLength", fix_focal_length },
+	{ EXIF_TAG_ISO_SPEED_RATINGS, "Image.ISOSpeed", NULL },
+	{ EXIF_TAG_METERING_MODE, "Image.MeteringMode", NULL },
+	{ EXIF_TAG_WHITE_BALANCE, "Image.WhiteBalance", NULL },
+	{ EXIF_TAG_COPYRIGHT, "Image.Copyright", NULL },
+	{ -1, NULL, NULL }
+};
+
+void
+tracker_extract_exif (gchar *filename, GHashTable *metadata)
+{
+	ExifData    *exif;
+	ExifEntry   *entry;
+	char         buffer[1024];
+	TagType     *p;
+
+	exif = exif_data_new_from_file (filename);
+	for (p = tags; p->name; ++p) {
+		entry = exif_data_get_entry (exif, p->tag);
+		if (entry) {
+			exif_entry_get_value (entry, buffer, 1024);
+			if (p->post)
+				g_hash_table_insert (metadata, g_strdup (p->name),
+				                     g_strdup ((*p->post)(buffer)));
+			else
+				g_hash_table_insert (metadata, g_strdup (p->name),
+				                     g_strdup (buffer));
+		}
+	}
+}
+
+#else
+#warning "Not building EXIF metadata extractor."
+#endif  /* HAVE_LIBEXIF */
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-pdf.c	2006-09-26 18:35:58.000000000 -0400
@@ -0,0 +1,64 @@
+
+#include "config.h"
+
+#ifdef HAVE_POPPLER
+
+#include <poppler.h>
+#include <string.h>
+#include <glib.h>
+
+void tracker_extract_pdf (gchar *filename, GHashTable *metadata)
+{
+	PopplerDocument *document;
+	gchar           *tmp;
+	gchar           *title;
+	gchar           *author;
+	gchar           *subject;
+	gchar           *keywords;
+	GTime            creation_date;
+	GError          *error = NULL;
+
+	tmp = g_strconcat ("file://", filename, NULL);
+	document = poppler_document_new_from_file (tmp, NULL, &error);
+	g_free (tmp);
+	if (document == NULL || error)
+		return;
+
+	g_object_get (document,
+		"title", &title,
+		"author", &author,
+		"subject", &subject,
+		"keywords", &keywords,
+		"creation-date", &creation_date,
+		NULL);
+
+	if (title && strlen (title))
+		g_hash_table_insert (metadata, g_strdup ("Doc.Title"), g_strdup (title));
+	if (author && strlen (author))
+		g_hash_table_insert (metadata, g_strdup ("Doc.Author"), g_strdup (author));
+	if (subject && strlen (subject))
+		g_hash_table_insert (metadata, g_strdup ("Doc.Subject"), g_strdup (subject));
+	if (keywords && strlen (keywords))
+		g_hash_table_insert (metadata, g_strdup ("Doc.Keywords"), g_strdup (keywords));
+
+#if 0
+	GTimeVal creation_date_val = { creation_date, 0 };
+	g_hash_table_insert (metadata, g_strdup ("Doc.Created"),
+		g_time_val_to_iso8601 (creation_date_val));
+#endif
+
+	g_hash_table_insert (metadata, g_strdup ("Doc.PageCount"),
+		g_strdup_printf ("%d", poppler_document_get_n_pages (document)));
+
+	g_free (title);
+	g_free (author);
+	g_free (subject);
+	g_free (keywords);
+	g_object_unref (document);
+}
+
+#else
+#warning "Not building PDF metadata extractor."
+#endif  /* HAVE_POPPLER */
+
+
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-png.c	2006-09-26 18:35:58.000000000 -0400
@@ -0,0 +1,51 @@
+
+#include "config.h"
+
+#ifdef HAVE_LIBPNG
+
+#include <stdio.h>
+#include <glib.h>
+#include <png.h>
+
+void
+tracker_extract_png (gchar *filename, GHashTable *metadata)
+{
+	FILE *png;
+	png_structp png_ptr;
+	png_infop info_ptr;
+	png_uint_32 width, height;
+
+	int bit_depth, color_type;
+	int interlace_type, compression_type, filter_type;
+
+	if(png = fopen(filename, "r")) {
+		png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
+		                                  NULL, NULL, NULL);
+		if (!png_ptr) {
+			fclose (png);
+			return;
+		}
+		info_ptr = png_create_info_struct (png_ptr);
+		if (!info_ptr) {
+			png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
+			fclose (png);
+			return;
+		}
+		png_init_io (png_ptr, png);
+		png_read_info (png_ptr, info_ptr);
+		if (png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
+		                 &color_type, &interlace_type, &compression_type, &filter_type)) {
+			g_hash_table_insert (metadata, g_strdup ("Image.Width"),
+			                     g_strdup_printf ("%d", width));
+			g_hash_table_insert (metadata, g_strdup ("Image.Height"),
+			                     g_strdup_printf ("%d", height));
+		}
+
+		png_destroy_read_struct (&png_ptr, &info_ptr, NULL);
+		fclose (png);
+	}
+}
+
+#else
+#warning "Not building PNG metadata extractor."
+#endif  /* HAVE_LIBPNG */
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-ps.c	2006-09-26 18:35:58.000000000 -0400
@@ -0,0 +1,58 @@
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+
+void tracker_extract_ps (gchar *filename, GHashTable *metadata)
+{
+	FILE        *f;
+	gchar       *line;
+	gsize        length = 0;
+	gboolean     pageno_atend = FALSE;
+	gboolean     header_finished = FALSE;
+   
+	if(f = fopen (filename, "r")) {
+		line = NULL;
+		getline (&line, &length, f);
+		while (!feof (f)) {
+			line[strlen(line) - 1] = '\0';  /* overwrite \n char */
+			if (!header_finished
+					&& strncmp (line, "%%Copyright:", 12) == 0) {
+				g_hash_table_insert (metadata,
+					g_strdup ("File.Other"), g_strdup (line+13));
+			}
+			else if (!header_finished
+					&& strncmp (line, "%%Title:", 8) == 0) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Title"), g_strdup (line+9));
+			}
+			else if (!header_finished
+					&& strncmp (line, "%%Creator:", 10) == 0) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Author"), g_strdup (line+11));
+			}
+			else if (!header_finished
+					&& strncmp (line, "%%CreationDate:", 15) == 0) {
+				g_hash_table_insert (metadata,
+					g_strdup ("Doc.Created"), g_strdup (line+16));
+			}
+			else if (strncmp (line, "%%Pages:", 8) == 0) {
+				if (strcmp (line+9, "(atend)") == 0)
+					pageno_atend = TRUE;
+				else
+					g_hash_table_insert (metadata,
+						g_strdup ("Doc.PageCount"), g_strdup (line+9));
+			}
+			else if (strncmp (line, "%%EndComments", 14) == 0) {
+				header_finished = TRUE;
+				if (!pageno_atend)
+					break;
+			}
+			g_free (line);
+			line = NULL;
+			getline (&line, &length, f);
+		}
+		g_free (line);
+	}
+	fclose (f);
+}
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-vorbis.c	2006-09-26 18:35:58.000000000 -0400
@@ -0,0 +1,170 @@
+
+#include "config.h"
+
+#ifdef HAVE_VORBIS
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <vorbis/vorbisfile.h>
+
+/*#include "tracker-utils.h"*/
+
+static struct {
+	char * name;
+	char *meta_name;
+	gboolean writable;
+} tags[] = {
+	 {"title", "Audio.Title", FALSE},
+	 {"artist", "Audio.Artist", FALSE},
+	 {"album", "Audio.Album", FALSE},
+	 {"albumartist", "Audio.AlbumArtist", FALSE},
+	 {"trackcount", "Audio.AlbumTrackCount", FALSE},
+	 {"tracknumber", "Audio.TrackNo", FALSE},
+	 {"DiscNo", "Audio.DiscNo", FALSE},
+	 {"Performer", "Audio.Performer", FALSE},
+	 {"TrackGain", "Audio.TrackGain", FALSE},
+	 {"TrackPeakGain", "Audio.TrackPeakGain", FALSE},
+	 {"AlbumGain", "Audio.AlbumGain", FALSE},
+	 {"AlbumPeakGain", "Audio.AlbumPeakGain", FALSE},
+	 {"date", "Audio.ReleaseDate", FALSE},
+	 {"comment", "Audio.Comment", FALSE},
+	 {"genre", "Audio.Genre", FALSE},
+	 {"Codec", "Audio.Codec", FALSE},
+	 {"CodecVersion", "Audio.CodecVersion", FALSE},
+	 {"Samplerate", "Audio.Samplerate", FALSE},
+	 {"Channels", "Audio.Channels", FALSE},
+	 {"MBAlbumID", "Audio.MBAlbumID", FALSE},
+	 {"MBArtistID", "Audio.MBArtistID", FALSE},
+	 {"MBAlbumArtistID", "Audio.MBAlbumArtistID", FALSE},
+	 {"MBTrackID", "Audio.MBTrackID", FALSE},
+	 {"Lyrics", "Audio.Lyrics", FALSE},
+	 {"Copyright", "File.Copyright", FALSE},
+	 {"License", "File.License", FALSE},
+	 {"Organization", "File.Organization", FALSE},
+	 {"Location", "File.Location", FALSE},
+	 {"Publisher", "File.Publisher", FALSE},
+	 {NULL, NULL, FALSE},
+};
+
+
+static char* 
+get_comment (vorbis_comment *vc, char *label)
+{
+	char *tag;
+	char *utf_tag;
+
+	if (vc && (tag = vorbis_comment_query (vc, label, 0)) != NULL) {
+
+		utf_tag = g_locale_to_utf8 (tag, -1, NULL, NULL, NULL);		
+
+		/*g_free (tag);*/
+
+		return utf_tag;
+
+	} else {
+		return NULL;
+	}
+
+}
+
+gboolean
+tracker_metadata_ogg_is_writable (const char *meta)
+{
+	int i;
+
+	i = 0;
+	while (tags[i].name != NULL) {
+		
+		if (strcmp (tags[i].meta_name, meta) == 0) {
+			return tags[i].writable;
+		}
+		
+		i++;
+	}
+
+	return FALSE;
+
+}
+
+
+gboolean
+tracker_metadata_ogg_write (const char *meta_name, const char *value) 
+{
+	/* to do */
+	return FALSE;
+}
+
+
+void 
+tracker_extract_vorbis (const char *filename, GHashTable *metadata)
+{
+	FILE *oggFile;
+	OggVorbis_File vf;
+	int i;
+
+	oggFile = fopen (filename,"r");
+	
+	if (!oggFile) {
+		return;
+	}
+
+	if ( ov_open (oggFile, &vf, NULL, 0) < 0 ) {
+		fclose (oggFile);
+		return;
+	}
+	
+	char *tmpComment;
+
+	vorbis_comment *comment;
+
+	if ((comment  = ov_comment (&vf, -1)) == NULL) {
+		ov_clear (&vf);	
+		return;
+	}
+
+	i = 0;
+	while (tags[i].name != NULL) {
+		tmpComment = get_comment (comment, tags[i].name);
+		
+		if (tmpComment) {
+			g_hash_table_insert (metadata, g_strdup (tags[i].meta_name), tmpComment);
+		}
+
+		i++;
+	}
+
+	vorbis_comment_clear(comment);
+
+	/* Bitrate */
+
+	vorbis_info *vi;
+	unsigned int bitrate;
+	char *str_bitrate;
+
+	if ( ( vi = ov_info(&vf, 0)) != NULL ) {
+		bitrate = vi->bitrate_nominal/1000;
+		str_bitrate = g_strdup_printf ("%d", bitrate);
+		g_hash_table_insert (metadata, g_strdup ("Audio.Bitrate"), str_bitrate);
+	}
+
+	
+		
+	/* Duration */
+
+	int time;
+	char *str_time;
+	if ( ( time = ov_time_total(&vf, -1) ) != OV_EINVAL ) {
+		str_time = g_strdup_printf ("%d", time);
+		g_hash_table_insert (metadata, g_strdup ("Audio.Duration"), str_time);
+	}
+
+	g_hash_table_insert (metadata, g_strdup ("Audio.Codec"), g_strdup ("vorbis"));
+
+	ov_clear(&vf);	
+	
+}
+
+#else
+#warning "Not building ogg/vorbis metadata extractor"
+#endif  /* HAVE_VORBIS */
_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list

Reply via email to