Index: configure.in =================================================================== RCS file: /cvs/gnome/tracker/configure.in,v retrieving revision 1.24 diff -u -p -r1.24 configure.in --- configure.in 11 Oct 2006 23:59:54 -0000 1.24 +++ configure.in 12 Oct 2006 21:12:02 -0000 @@ -361,20 +361,6 @@ AC_SUBST(VORBIS_LIBS) test "$have_vorbis" = "yes" && AC_DEFINE(HAVE_VORBIS, [], [Define if we have libvorbis]) ################################################################## -# check for ogg/theora -################################################################## - -THEORA_REQUIRED=1.1 - -PKG_CHECK_MODULES(THEORA, [theora >= $THEORA_REQUIRED], [have_theora=yes] , [have_theora=no]) - -AM_CONDITIONAL(HAVE_THEORA, test "$have_theora" = "yes") -AC_SUBST(THEORA_CFLAGS) -AC_SUBST(THEORA_LIBS) -test "$have_theora" = "yes" && AC_DEFINE(HAVE_THEORA, [], [Define if we have libtheora]) - - -################################################################## # check for libpng ################################################################## @@ -481,7 +467,6 @@ Metadata extractors: pdf : $have_poppler ogg/vorbis : $have_vorbis - ogg/theora : $have_theora png : $have_libpng exif (jpeg) : $have_libexif gsf : $have_libgsf Index: src/tracker-extract/Makefile.am =================================================================== RCS file: /cvs/gnome/tracker/src/tracker-extract/Makefile.am,v retrieving revision 1.9 diff -u -p -r1.9 Makefile.am --- src/tracker-extract/Makefile.am 9 Oct 2006 14:26:02 -0000 1.9 +++ src/tracker-extract/Makefile.am 12 Oct 2006 21:12:17 -0000 @@ -18,7 +18,8 @@ tracker_extract_SOURCES = tracker-extrac tracker-extract-png.c \ tracker-extract-exif.c \ tracker-extract-msoffice.c \ - tracker-extract-imagemagick.c + tracker-extract-imagemagick.c \ + tracker-extract-mplayer.c tracker_extract_LDADD = $(GLIB2_LIBS) \ Index: src/trackerd/tracker-metadata.c =================================================================== RCS file: /cvs/gnome/tracker/src/trackerd/tracker-metadata.c,v retrieving revision 1.17 diff -u -p -r1.17 tracker-metadata.c --- src/trackerd/tracker-metadata.c 11 Oct 2006 23:30:55 -0000 1.17 +++ src/trackerd/tracker-metadata.c 12 Oct 2006 21:12:37 -0000 @@ -143,7 +143,7 @@ tracker_get_metadata_type (const char *m } else if (g_str_has_prefix (mime, "video")) { /* don't bother with video metadata - its really really slow to extract + there's bugger all metadata anyhow! */ - return IGNORE_METADATA; + return VIDEO_METADATA; } else if (g_str_has_prefix (mime, "audio") || (strcmp (mime, "application/ogg") == 0)) { return AUDIO_METADATA; @@ -413,7 +413,7 @@ tracker_metadata_get_embedded (const cha meta_type = tracker_get_metadata_type (mime); - if (meta_type == DOC_METADATA || meta_type == IMAGE_METADATA || meta_type == AUDIO_METADATA) { + if (meta_type == DOC_METADATA || meta_type == IMAGE_METADATA || meta_type == AUDIO_METADATA || meta_type == VIDEO_METADATA) { char *argv[4]; char *value; Index: src/tracker-extract/tracker-extract.c =================================================================== RCS file: /cvs/gnome/tracker/src/tracker-extract/tracker-extract.c,v retrieving revision 1.14 diff -u -p -r1.14 tracker-extract.c --- src/tracker-extract/tracker-extract.c 9 Oct 2006 14:16:00 -0000 1.14 +++ src/tracker-extract/tracker-extract.c 12 Oct 2006 21:12:53 -0000 @@ -70,45 +70,45 @@ void tracker_extract_png (gchar *, GHa void tracker_extract_exif (gchar *, GHashTable *); #endif void tracker_extract_imagemagick (gchar *, GHashTable *); +void tracker_extract_mplayer (gchar *, GHashTable *); MimeToExtractor extractors[] = { - /* Document extractors */ - { "application/vnd.oasis.opendocument.*", tracker_extract_oasis }, - { "application/postscript", tracker_extract_ps }, + /* Document extractors */ + { "application/vnd.oasis.opendocument.*", tracker_extract_oasis }, + { "application/postscript", tracker_extract_ps }, #ifdef HAVE_POPPLER - { "application/pdf", tracker_extract_pdf }, + { "application/pdf", tracker_extract_pdf }, #endif - { "application/x-abiword", tracker_extract_abw }, + { "application/x-abiword", tracker_extract_abw }, #ifdef HAVE_LIBGSF - { "application/msword", tracker_extract_msoffice }, - { "application/vnd.ms-*", tracker_extract_msoffice }, + { "application/msword", tracker_extract_msoffice }, + { "application/vnd.ms-*", tracker_extract_msoffice }, #endif - /* Video extractors */ -#ifdef HAVE_THEORA - { "video/x-theora+ogg", tracker_extract_theora }, -#endif + /* Video extractors */ + { "video/*", tracker_extract_mplayer }, - /* Audio extractors */ - { "audio/mpeg", tracker_extract_mp3 }, - { "audio/x-mp3", tracker_extract_mp3 }, - { "audio/x-mpeg", tracker_extract_mp3 }, + /* Audio extractors */ + { "audio/mpeg", tracker_extract_mp3 }, + { "audio/x-mp3", tracker_extract_mp3 }, + { "audio/x-mpeg", tracker_extract_mp3 }, #ifdef HAVE_VORBIS - { "audio/x-vorbis+ogg", tracker_extract_vorbis }, + { "audio/x-vorbis+ogg", tracker_extract_vorbis }, #endif + { "audio/*", tracker_extract_mplayer }, /* Image extractors */ #ifdef HAVE_LIBPNG - { "image/png", tracker_extract_png }, + { "image/png", tracker_extract_png }, #endif #ifdef HAVE_LIBEXIF - { "image/jpeg", tracker_extract_exif }, + { "image/jpeg", tracker_extract_exif }, #endif - { "image/*", tracker_extract_imagemagick }, - { "", NULL } + { "image/*", tracker_extract_imagemagick }, + { "", NULL } }; static MetadataFileType @@ -125,7 +125,7 @@ get_metadata_type (const char *mime) return IMAGE_METADATA; } else { if (g_str_has_prefix (mime, "video")) { - return IGNORE_METADATA; + return VIDEO_METADATA; } else { if (g_str_has_prefix (mime, "audio")) { return AUDIO_METADATA; @@ -174,6 +174,8 @@ tracker_get_file_metadata (const char *u for (p = extractors; p->extractor; ++p) { if (g_pattern_match_simple (p->mime, mime)) { (*p->extractor)(uri_in_locale, meta_table); + if (g_hash_table_size (meta_table) == 0) + continue; g_free (uri_in_locale); g_free (mime); return meta_table; --- /dev/null 2006-08-05 19:53:54.000000000 -0400 +++ src/tracker-extract/tracker-extract-mplayer.c 2006-10-12 16:25:37.000000000 -0400 @@ -0,0 +1,102 @@ + +#include "config.h" + +#include +#include +#include + +gchar *video_tags[][2] = { + { "ID_VIDEO_HEIGHT", "Video.Height" }, + { "ID_VIDEO_WIDTH", "Video.Width" }, + { "ID_VIDEO_FPS", "Video.FrameRate" }, + { "ID_VIDEO_CODEC", "Video.Codec" }, + { "ID_VIDEO_BITRATE", "Video.Bitrate" }, + { NULL, NULL } + }; + +gchar *audio_tags[][2] = { + { "ID_AUDIO_BITRATE", "Audio.Bitrate" }, + { "ID_AUDIO_RATE", "Audio.Samplerate" }, + { "ID_AUDIO_CODEC", "Audio.Codec" }, + { "ID_AUDIO_NCH", "Audio.Channels" }, + { NULL, NULL } + }; + +gchar *info_tags[][2] = { + { "comments", "Video.Comment" }, + { "name", "Video.Title" }, + { "author", "Video.Author" }, + { "copyright", "Video.Copyright" }, + { NULL, NULL } + }; + +void +tracker_extract_mplayer (gchar *filename, GHashTable *metadata) +{ + gchar *argv[10]; + gchar *mplayer; + gchar **lines, **line; + gchar **tag; + gint n; + + argv[0] = g_strdup ("mplayer"); + argv[1] = g_strdup ("-identify"); + argv[2] = g_strdup ("-frames"); + argv[3] = g_strdup ("0"); + argv[4] = g_strdup ("-vo"); + argv[5] = g_strdup ("null"); + argv[6] = g_strdup ("-ao"); + argv[7] = g_strdup ("null"); + argv[8] = g_strdup (filename); + argv[9] = NULL; + + if(g_spawn_sync (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL, + NULL, + NULL, + &mplayer, + NULL, + NULL, + NULL)) { + + + lines = g_strsplit (mplayer, "\n", -1); + + for (line = lines; *line; ++line) { + + if (g_pattern_match_simple ("ID_VIDEO*=*", *line)) { + for (tag = video_tags; *tag; ++tag) { + if (g_str_has_prefix (*line, tag[0])) { + g_hash_table_insert (metadata, + g_strdup (tag[1]), + g_strdup ((*line) + strlen (tag[0]) + 1)); + } + } + } + + if (g_pattern_match_simple ("ID_AUDIO*=*", *line)) { + for (tag = audio_tags; *tag; ++tag) { + if (g_str_has_prefix (*line, tag[0])) { + g_hash_table_insert (metadata, + g_strdup (tag[1]), + g_strdup ((*line) + strlen (tag[0]) + 1)); + } + } + } + + if (g_pattern_match_simple ("ID_CLIP_INFO_NAME*=*", *line)) { + for (tag = info_tags; *tag; ++tag) { + n = strlen(*line) - strlen(tag[0]); + if (strcasecmp (*line + n, tag[0]) == 0) { + g_hash_table_insert (metadata, + g_strdup (tag[1]), + g_strdup (strstr (line[1], "=") + 1)); + } + } + } + } + } +} + Index: data/sqlite-tracker.sql =================================================================== RCS file: /cvs/gnome/tracker/data/sqlite-tracker.sql,v retrieving revision 1.8 diff -u -p -r1.8 sqlite-tracker.sql --- data/sqlite-tracker.sql 6 Oct 2006 11:33:03 -0000 1.8 +++ data/sqlite-tracker.sql 12 Oct 2006 21:13:36 -0000 @@ -25,7 +25,7 @@ insert Into ServiceTypes (TypeID, TypeNa insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (2, 'Documents', 'Doc, File', 'documents only', 1); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (3, 'Images', 'Image, File', 'image files only', 1); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (4, 'Music', 'Audio, File', 'music files only', 1); -insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (5, 'Videos', 'File', 'video and movie files only', 1); +insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (5, 'Videos', 'File, Audio, Video', 'video and movie files only', 1); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (6, 'Text Files', 'File', 'text files only', 1); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (7, 'Development Files', 'File', 'development and source code files only', 1); insert Into ServiceTypes (TypeID, TypeName, MetadataClass, Description, MainService) values (8, 'Other Files', 'File', 'all other uncategorized files', 1); @@ -305,6 +305,16 @@ insert Into MetaDataTypes (MetaName, Dat insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Image.MeteringMode', 1, 1, 0, 0); insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Image.WhiteBalance', 1, 1, 0, 0); insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Image.Copyright', 4, 1, 0, 1); + +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Title', 0, 1, 0, 1); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Author', 0, 1, 0, 1); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Comment', 0, 1, 0, 1); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Copyright', 0, 1, 0, 1); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Height', 2, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Width', 2, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.FrameRate', 2, 1, 0, 100); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Codec', 0, 1, 0, 10); +insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Video.Bitrate', 2, 1, 0, 100); insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Email.Date', 3, 1, 0, 0); insert Into MetaDataTypes (MetaName, DatatypeID, Embedded, Writeable, Weight) values ('Email.Sender', 4, 1, 0, 10);