diff -urpN tracker-1.0.4.orig/configure.ac tracker-1.0.4/configure.ac --- tracker-1.0.4.orig/configure.ac 2014-09-02 06:51:58.000000000 -0700 +++ tracker-1.0.4/configure.ac 2014-09-27 07:19:35.147011207 -0700 @@ -231,7 +231,7 @@ NETWORK_MANAGER_REQUIRED=0.8 GSTREAMER_REQUIRED=0.10.31 GUPNP_DLNA_REQUIRED=0.9.4 LIBPNG_REQUIRED=0.89 -LIBMEDIAART_REQUIRED=0.1.0 +LIBMEDIAART_REQUIRED=0.5.0 # 3.6.11 for sqlite_backup API # 3.6.16 to fix test failures @@ -1073,9 +1073,15 @@ if test "x$enable_libmediaart" != "xno" LIBTRACKER_MINER_CFLAGS="$LIBTRACKER_MINER_CFLAGS $LIBMEDIAART_CFLAGS" LIBTRACKER_MINER_LIBS="$LIBTRACKER_MINER_LIBS $LIBMEDIAART_LIBS" + LIBTRACKER_EXTRACT_CFLAGS="$LIBTRACKER_EXTRACT_CFLAGS $LIBMEDIAART_CFLAGS" + LIBTRACKER_EXTRACT_LIBS="$LIBTRACKER_EXTRACT_LIBS $LIBMEDIAART_LIBS" + TRACKER_EXTRACT_CFLAGS="$TRACKER_EXTRACT_CFLAGS $LIBMEDIAART_CFLAGS" TRACKER_EXTRACT_LIBS="$TRACKER_EXTRACT_LIBS $LIBMEDIAART_LIBS" + TRACKER_MINER_FS_CFLAGS="$TRACKER_MINER_FS_CFLAGS $LIBMEDIAART_CFLAGS" + TRACKER_MINER_FS_LIBS="$TRACKER_MINER_FS_LIBS $LIBMEDIAART_LIBS" + # Used for .pc file... LIBTRACKER_MINER_PC_REQUIRES="libmediaart-1.0" AC_SUBST(LIBTRACKER_MINER_PC_REQUIRES) @@ -1762,7 +1768,7 @@ PKG_CHECK_MODULES(AVCODEC, AC_SUBST(AVCODEC_CFLAGS) AC_SUBST(AVCODEC_LIBS) -PKG_CHECK_MODULES(AVCODEC, +PKG_CHECK_MODULES(AVUTIL, [libavutil >= 0.8.4], [have_libavutil=yes], [have_libavutil=no]) diff -urpN tracker-1.0.4.orig/src/libtracker-extract/tracker-extract-info.c tracker-1.0.4/src/libtracker-extract/tracker-extract-info.c --- tracker-1.0.4.orig/src/libtracker-extract/tracker-extract-info.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/libtracker-extract/tracker-extract-info.c 2014-09-27 07:19:35.147011207 -0700 @@ -19,6 +19,8 @@ * Author: Carlos Garnacho */ +#include "config.h" + #include "tracker-extract-info.h" /** @@ -46,6 +48,10 @@ struct _TrackerExtractInfo gchar *mimetype; gchar *graph; +#ifdef HAVE_LIBMEDIAART + MediaArtProcess *media_art_process; +#endif + gint ref_count; }; @@ -84,6 +90,10 @@ tracker_extract_info_new (GFile *f info->where_clause = NULL; +#ifdef HAVE_LIBMEDIAART + info->media_art_process = NULL; +#endif + info->ref_count = 1; return info; @@ -294,3 +304,49 @@ tracker_extract_info_set_where_clause (T g_free (info->where_clause); info->where_clause = g_strdup (where); } + +#ifdef HAVE_LIBMEDIAART + +/** + * tracker_extract_info_get_media_art_process: + * @info: a #TrackerExtractInfo + * + * Returns the #MediaArtProcess object that can be used to retrieve + * and store media art caches found in extracted content. + * + * Returns: (transfer none): The #MediaArtProcess. This object should + * not be unreferenced. + * + * Since: 1.2 + **/ +MediaArtProcess * +tracker_extract_info_get_media_art_process (TrackerExtractInfo *info) +{ + g_return_if_fail (info != NULL); + return info->media_art_process; +} + +/** + * tracker_extract_info_set_media_art_process: + * @info: a #TrackerExtractInfo + * @media_art_process: a #MediaArtProcess. + * + * Use @media_art_process for caching and looking up media art. + * + * Since: 1.2 + **/ +void +tracker_extract_info_set_media_art_process (TrackerExtractInfo *info, + MediaArtProcess *media_art_process) +{ + g_return_if_fail (info != NULL); + g_return_if_fail (MEDIA_ART_IS_PROCESS (media_art_process)); + + if (info->media_art_process) { + g_object_unref (info->media_art_process); + } + + info->media_art_process = g_object_ref (media_art_process); +} + +#endif /* HAVE_LIBMEDIAART */ diff -urpN tracker-1.0.4.orig/src/libtracker-extract/tracker-extract-info.h tracker-1.0.4/src/libtracker-extract/tracker-extract-info.h --- tracker-1.0.4.orig/src/libtracker-extract/tracker-extract-info.h 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/libtracker-extract/tracker-extract-info.h 2014-09-27 07:19:35.147011207 -0700 @@ -29,6 +29,10 @@ #include #include +#ifdef HAVE_LIBMEDIAART +#include +#endif + G_BEGIN_DECLS typedef struct _TrackerExtractInfo TrackerExtractInfo; @@ -50,6 +54,14 @@ const gchar * tracker_extract_in void tracker_extract_info_set_where_clause (TrackerExtractInfo *info, const gchar *where); +#ifdef HAVE_LIBMEDIAART + +MediaArtProcess * tracker_extract_info_get_media_art_process (TrackerExtractInfo *info); +void tracker_extract_info_set_media_art_process (TrackerExtractInfo *info, + MediaArtProcess *media_art_process); + +#endif /* HAVE_LIBMEDIAART */ + G_END_DECLS #endif /* __LIBTRACKER_EXTRACT_INFO_H__ */ diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-extract.c tracker-1.0.4/src/tracker-extract/tracker-extract.c --- tracker-1.0.4.orig/src/tracker-extract/tracker-extract.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-extract.c 2014-09-27 07:19:35.148011197 -0700 @@ -73,6 +73,10 @@ typedef struct { gchar *force_module; gint unhandled_count; + +#ifdef HAVE_LIBMEDIAART + MediaArtProcess *media_art_process; +#endif } TrackerExtractPrivate; typedef struct { @@ -131,6 +135,17 @@ tracker_extract_init (TrackerExtract *ob priv->thread_pool = g_thread_pool_new ((GFunc) get_metadata, NULL, 10, TRUE, NULL); +#ifdef HAVE_LIBMEDIAART + GError *error = NULL; + + priv->media_art_process = media_art_process_new (&error); + if (!priv->media_art_process || error) { + g_warning ("Could not initialize media art, %s", + error ? error->message : _("No error given")); + g_error_free (error); + } +#endif + g_mutex_init (&priv->task_mutex); } @@ -152,6 +167,12 @@ tracker_extract_finalize (GObject *objec g_hash_table_destroy (priv->statistics_data); +#ifdef HAVE_LIBMEDIAART + if (priv->media_art_process) { + g_object_unref (priv->media_art_process); + } +#endif + g_mutex_clear (&priv->task_mutex); G_OBJECT_CLASS (tracker_extract_parent_class)->finalize (object); @@ -280,6 +301,10 @@ get_file_metadata (TrackerExtractTask * info = tracker_extract_info_new (file, task->mimetype, task->graph); g_object_unref (file); +#ifdef HAVE_LIBMEDIAART + tracker_extract_info_set_media_art_process (info, tracker_extract_get_media_art_process (task->extract)); +#endif + if (task->mimetype && *task->mimetype) { /* We know the mime */ mime_used = g_strdup (task->mimetype); @@ -720,6 +745,22 @@ tracker_extract_file (TrackerExtract g_object_unref (res); } +#ifdef HAVE_LIBMEDIAART + +MediaArtProcess * +tracker_extract_get_media_art_process (TrackerExtract *extract) +{ + TrackerExtractPrivate *priv; + + g_return_val_if_fail (TRACKER_IS_EXTRACT (extract), NULL); + + priv = TRACKER_EXTRACT_GET_PRIVATE (extract); + + return priv->media_art_process; +} + +#endif + void tracker_extract_get_metadata_by_cmdline (TrackerExtract *object, const gchar *uri, diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-extract-gstreamer.c tracker-1.0.4/src/tracker-extract/tracker-extract-gstreamer.c --- tracker-1.0.4.orig/src/tracker-extract/tracker-extract-gstreamer.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-extract-gstreamer.c 2014-09-27 07:22:46.123153925 -0700 @@ -1558,18 +1558,27 @@ discoverer_init_and_run (MetadataExtract static void tracker_extract_gstreamer (const gchar *uri, - TrackerSparqlBuilder *preupdate, - TrackerSparqlBuilder *postupdate, - TrackerSparqlBuilder *metadata, + TrackerExtractInfo *info, ExtractMime type, const gchar *graph) { + TrackerSparqlBuilder *metadata, *preupdate, *postupdate; MetadataExtractor *extractor; GstBuffer *buffer; gchar *cue_sheet; gboolean success; +#ifdef HAVE_LIBMEDIAART + MediaArtProcess *media_art_process; +#endif + g_return_if_fail (uri); + + graph = tracker_extract_info_get_graph (info); + metadata = tracker_extract_info_get_metadata_builder (info); + preupdate = tracker_extract_info_get_preupdate_builder (info); + postupdate = tracker_extract_info_get_postupdate_builder (info); + g_return_if_fail (metadata); gst_init (NULL, NULL); @@ -1579,6 +1588,7 @@ tracker_extract_gstreamer (const gchar extractor->tagcache = gst_tag_list_new_empty (); #ifdef HAVE_LIBMEDIAART + media_art_process = tracker_extract_info_get_media_art_process (info); extractor->media_art_type = MEDIA_ART_NONE; #endif @@ -1608,13 +1618,36 @@ tracker_extract_gstreamer (const gchar #ifdef HAVE_LIBMEDIAART if (extractor->media_art_type != MEDIA_ART_NONE) { - media_art_process (extractor->media_art_buffer, - extractor->media_art_buffer_size, - extractor->media_art_buffer_mime, - extractor->media_art_type, - extractor->media_art_artist, - extractor->media_art_title, - uri); + GError *error = NULL; + gboolean success = TRUE; + + if (extractor->media_art_buffer) { + success = media_art_process_buffer (media_art_process, + extractor->media_art_type, + MEDIA_ART_PROCESS_FLAGS_NONE, + tracker_extract_info_get_file (info), + extractor->media_art_buffer, + extractor->media_art_buffer_size, + extractor->media_art_buffer_mime, + extractor->media_art_artist, + extractor->media_art_title, + &error); + } else { + success = media_art_process_file (media_art_process, + extractor->media_art_type, + MEDIA_ART_PROCESS_FLAGS_NONE, + tracker_extract_info_get_file (info), + extractor->media_art_artist, + extractor->media_art_title, + &error); + } + + if (!success || error) { + g_warning ("Could not process media art for '%s', %s", + uri, + error ? error->message : "No error given"); + g_clear_error (&error); + } } #endif } @@ -1646,41 +1679,36 @@ tracker_extract_gstreamer (const gchar G_MODULE_EXPORT gboolean tracker_extract_get_metadata (TrackerExtractInfo *info) { - TrackerSparqlBuilder *metadata, *preupdate, *postupdate; - const gchar *mimetype; GFile *file; gchar *uri; const gchar *graph; - - graph = tracker_extract_info_get_graph (info); - metadata = tracker_extract_info_get_metadata_builder (info); - preupdate = tracker_extract_info_get_preupdate_builder (info); - postupdate = tracker_extract_info_get_postupdate_builder (info); - mimetype = tracker_extract_info_get_mimetype (info); + const gchar *mimetype; file = tracker_extract_info_get_file (info); uri = g_file_get_uri (file); + graph = tracker_extract_info_get_graph (info); + mimetype = tracker_extract_info_get_mimetype (info); #if defined(GSTREAMER_BACKEND_GUPNP_DLNA) if (g_str_has_prefix (mimetype, "dlna/")) { - tracker_extract_gstreamer (uri, preupdate, postupdate, metadata, EXTRACT_MIME_GUESS, graph); + tracker_extract_gstreamer (uri, info, EXTRACT_MIME_GUESS, graph); } else #endif /* GSTREAMER_BACKEND_GUPNP_DLNA */ if (strcmp (mimetype, "image/svg+xml") == 0) { - tracker_extract_gstreamer (uri, preupdate, postupdate, metadata, EXTRACT_MIME_SVG, graph); + tracker_extract_gstreamer (uri, info, EXTRACT_MIME_SVG, graph); } else if (strcmp (mimetype, "video/3gpp") == 0 || strcmp (mimetype, "video/mp4") == 0 || strcmp (mimetype, "video/x-ms-asf") == 0 || strcmp (mimetype, "application/vnd.ms-asf") == 0 || strcmp (mimetype, "application/vnd.rn-realmedia") == 0) { - tracker_extract_gstreamer (uri, preupdate, postupdate, metadata, EXTRACT_MIME_GUESS, graph); + tracker_extract_gstreamer (uri, info, EXTRACT_MIME_GUESS, graph); } else if (g_str_has_prefix (mimetype, "audio/")) { - tracker_extract_gstreamer (uri, preupdate, postupdate, metadata, EXTRACT_MIME_AUDIO, graph); + tracker_extract_gstreamer (uri, info, EXTRACT_MIME_AUDIO, graph); } else if (g_str_has_prefix (mimetype, "video/")) { - tracker_extract_gstreamer (uri, preupdate, postupdate, metadata, EXTRACT_MIME_VIDEO, graph); + tracker_extract_gstreamer (uri, info, EXTRACT_MIME_VIDEO, graph); } else if (g_str_has_prefix (mimetype, "image/")) { - tracker_extract_gstreamer (uri, preupdate, postupdate, metadata, EXTRACT_MIME_IMAGE, graph); + tracker_extract_gstreamer (uri, info, EXTRACT_MIME_IMAGE, graph); } else { g_free (uri); return FALSE; diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-extract.h tracker-1.0.4/src/tracker-extract/tracker-extract.h --- tracker-1.0.4.orig/src/tracker-extract/tracker-extract.h 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-extract.h 2014-09-27 07:19:35.148011197 -0700 @@ -60,6 +60,11 @@ void tracker_extract_file GAsyncReadyCallback cb, gpointer user_data); +#ifdef HAVE_LIBMEDIAART +MediaArtProcess * + tracker_extract_get_media_art_process (TrackerExtract *extract); +#endif + void tracker_extract_dbus_start (TrackerExtract *extract); void tracker_extract_dbus_stop (TrackerExtract *extract); diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-extract-libav.c tracker-1.0.4/src/tracker-extract/tracker-extract-libav.c --- tracker-1.0.4.orig/src/tracker-extract/tracker-extract-libav.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-extract-libav.c 2014-09-27 07:19:35.148011197 -0700 @@ -330,13 +330,27 @@ tracker_extract_get_metadata (TrackerExt } #ifdef HAVE_LIBMEDIAART - media_art_process (NULL, - 0, - NULL, - MEDIA_ART_ALBUM, - album_artist, - album_title, - uri); + if (album_artist || album_title) { + MediaArtProcess *media_art_process; + GError *error = NULL; + gboolean success; + + media_art_process = tracker_extract_info_get_media_art_process (info); + success = media_art_process_file (media_art_process, + MEDIA_ART_ALBUM, + MEDIA_ART_PROCESS_FLAGS_NONE, + file, + album_artist, + album_title, + &error); + + if (!success || error) { + g_warning ("Could not process media art for '%s', %s", + uri, + error ? error->message : "No error given"); + g_clear_error (&error); + } + } #endif g_free(performer_uri); diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-extract-mp3.c tracker-1.0.4/src/tracker-extract/tracker-extract-mp3.c --- tracker-1.0.4.orig/src/tracker-extract/tracker-extract-mp3.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-extract-mp3.c 2014-09-27 07:19:35.148011197 -0700 @@ -2647,13 +2647,41 @@ tracker_extract_get_metadata (TrackerExt mp3_parse (buffer, buffer_size, audio_offset, uri, metadata, &md); #ifdef HAVE_LIBMEDIAART - media_art_process (md.media_art_data, - md.media_art_size, - md.media_art_mime, - MEDIA_ART_ALBUM, - md.performer, - md.album, - uri); + if (md.performer || md.title) { + MediaArtProcess *media_art_process; + GError *error = NULL; + gboolean success = TRUE; + + media_art_process = tracker_extract_info_get_media_art_process (info); + + if (md.media_art_data) { + success = media_art_process_buffer (media_art_process, + MEDIA_ART_ALBUM, + MEDIA_ART_PROCESS_FLAGS_NONE, + file, + md.media_art_data, + md.media_art_size, + md.media_art_mime, + md.performer, + md.title, + &error); + } else { + success = media_art_process_file (media_art_process, + MEDIA_ART_ALBUM, + MEDIA_ART_PROCESS_FLAGS_NONE, + file, + md.performer, + md.title, + &error); + } + + if (!success || error) { + g_warning ("Could not process media art for '%s', %s", + uri, + error ? error->message : "No error given"); + g_clear_error (&error); + } + } #endif g_free (md.media_art_data); g_free (md.media_art_mime); diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-extract-vorbis.c tracker-1.0.4/src/tracker-extract/tracker-extract-vorbis.c --- tracker-1.0.4.orig/src/tracker-extract/tracker-extract-vorbis.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-extract-vorbis.c 2014-09-27 07:19:35.148011197 -0700 @@ -514,16 +514,31 @@ tracker_extract_get_metadata (TrackerExt } #ifdef HAVE_LIBMEDIAART - { - gchar *uri = g_file_get_uri (file); - media_art_process (NULL, - 0, - NULL, - MEDIA_ART_ALBUM, - vd.album_artist ? vd.album_artist : vd.artist, - vd.album, - uri); - g_free (uri); + if ((vd.album_artist || vd.artist) || vd.album) { + MediaArtProcess *media_art_process; + GError *error = NULL; + gboolean success; + + media_art_process = tracker_extract_info_get_media_art_process (info); + + success = media_art_process_file (media_art_process, + MEDIA_ART_ALBUM, + MEDIA_ART_PROCESS_FLAGS_NONE, + file, + vd.album_artist ? vd.album_artist : vd.artist, + vd.album, + &error); + + if (!success || error) { + gchar *uri; + + uri = g_file_get_uri (file); + g_warning ("Could not process media art for '%s', %s", + uri, + error ? error->message : "No error given"); + g_free (uri); + g_clear_error (&error); + } } #endif diff -urpN tracker-1.0.4.orig/src/tracker-extract/tracker-main.c tracker-1.0.4/src/tracker-extract/tracker-main.c --- tracker-1.0.4.orig/src/tracker-extract/tracker-main.c 2014-09-02 05:56:23.000000000 -0700 +++ tracker-1.0.4/src/tracker-extract/tracker-main.c 2014-09-27 07:19:35.148011197 -0700 @@ -262,12 +262,6 @@ run_standalone (TrackerConfig *config) tracker_locale_init (); -#ifdef HAVE_LIBMEDIAART - if (!media_art_init ()) { - g_warning ("Could not initialize media art, will not be available"); - } -#endif - /* This makes sure we don't steal all the system's resources */ initialize_priority_and_scheduling (tracker_config_get_sched_idle (config), tracker_db_manager_get_first_index_done () == FALSE); @@ -280,9 +274,6 @@ run_standalone (TrackerConfig *config) if (!object) { g_object_unref (file); g_free (uri); -#ifdef HAVE_LIBMEDIAART - media_art_shutdown (); -#endif tracker_locale_shutdown (); return EXIT_FAILURE; } @@ -295,9 +286,6 @@ run_standalone (TrackerConfig *config) g_object_unref (file); g_free (uri); -#ifdef HAVE_LIBMEDIAART - media_art_shutdown (); -#endif tracker_locale_shutdown (); return EXIT_SUCCESS; @@ -404,12 +392,6 @@ main (int argc, char *argv[]) tracker_locale_init (); -#ifdef HAVE_LIBMEDIAART - if (!media_art_init ()) { - g_warning ("Could not initialize media art, will not be available"); - } -#endif - controller = tracker_extract_controller_new (decorator); tracker_miner_start (TRACKER_MINER (decorator)); @@ -424,9 +406,6 @@ main (int argc, char *argv[]) tracker_miner_stop (TRACKER_MINER (decorator)); /* Shutdown subsystems */ -#ifdef HAVE_LIBMEDIAART - media_art_shutdown (); -#endif tracker_locale_shutdown (); g_object_unref (extract);