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 -r1.18 configure.in
349a350,377
> ##################################################################
> # 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])
> 
> 
397a426,427
> 	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 -r1.11 Makefile.am
18,20d17
< 	$(POPPLER_GLIB_CFLAGS)			\
< 	$(VORBIS_CFLAGS)			\
< 	$(THEORA_CFLAGS)			\
104,108d100
< 	tracker-metadata-oasis.c	\
< 	tracker-metadata-ps.c	\
< 	tracker-metadata-pdf.c	\
< 	tracker-metadata-abw.c	\
< 	tracker-metadata-vorbis.c	\
141,143d132
<  		 $(POPPLER_GLIB_LIBS) \
<  		 $(VORBIS_LIBS) \
<  		 $(THEORA_LIBS) \
Index: src/trackerd/trackerd.c
===================================================================
RCS file: /cvs/gnome/tracker/src/trackerd/trackerd.c,v
retrieving revision 1.38
diff -r1.38 trackerd.c
1956,1957d1955
< 	g_type_init ();
< 
Index: src/trackerd/tracker-metadata.c
===================================================================
RCS file: /cvs/gnome/tracker/src/trackerd/tracker-metadata.c,v
retrieving revision 1.11
diff -r1.11 tracker-metadata.c
130,162d129
< 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                           }
< };
< 
434,438d400
< static void log_metadata_cb (gpointer key, gpointer value, gpointer user_data)
< {
< 	tracker_log ("%s = %s", (gchar *)key, (gchar *)value);
< }
< 
442d403
< 	MimeToExtractor  *p;
444d404
< 	gboolean         found;
449,459d408
< 
< 	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;
Index: src/tracker-extract/Makefile.am
===================================================================
RCS file: /cvs/gnome/tracker/src/tracker-extract/Makefile.am,v
retrieving revision 1.4
diff -r1.4 Makefile.am
1c1,6
< INCLUDES = $(GLIB2_CFLAGS) $(CFLAGS) -g 
---
> INCLUDES = $(GLIB2_CFLAGS) $(CFLAGS) -g \
> 	$(POPPLER_GLIB_CFLAGS)			\
> 	$(VORBIS_CFLAGS)			\
> 	$(THEORA_CFLAGS)			\
> 	$(LIBPNG_CFLAGS)			\
> 	$(LIBEXIF_CFLAGS)
5c10,16
< 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
13c24,29
< 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 -r1.10 tracker-extract.c
32a33
> #include "config.h"
118a120,171
> 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
> 
> 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
> #endif
> 	{ "",                                                NULL                           }
> };
388a442,456
> 	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 */
413,414d480
< 	meta_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);	
< 
480a547
> 	g_set_application_name ("tracker-extract");
--- /dev/null	2006-08-05 19:53:54.000000000 -0400
+++ src/tracker-extract/tracker-extract-abw.c	2006-09-26 18:10:59.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:11:06.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-pdf.c	2006-09-26 18:11:10.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:11:15.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:11:18.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:13:25.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