diff options
author | Juan A. Suarez Romero <jasuarez@igalia.com> | 2010-02-15 11:18:08 +0100 |
---|---|---|
committer | Juan A. Suarez Romero <jasuarez@igalia.com> | 2010-02-15 16:58:28 +0100 |
commit | 04cff85a7b33dc0397ba4320fbe567fe4c36f11a (patch) | |
tree | 0e61ff36ff4ff97889172fee23126a7fb342fe65 | |
parent | 6ddb0b211cf7fa4feaa9142a413c79a0322b0773 (diff) | |
download | grilo-plugins-04cff85a7b33dc0397ba4320fbe567fe4c36f11a.tar.gz |
[flickr] Use GFlickr object when searching images
-rw-r--r-- | src/flickr/gflickr.c | 102 | ||||
-rw-r--r-- | src/flickr/gflickr.h | 8 | ||||
-rw-r--r-- | src/flickr/grl-flickr.c | 148 |
3 files changed, 189 insertions, 69 deletions
diff --git a/src/flickr/gflickr.c b/src/flickr/gflickr.c index aacfcbc..e596ad3 100644 --- a/src/flickr/gflickr.c +++ b/src/flickr/gflickr.c @@ -17,12 +17,13 @@ #define FLICKR_PHOTOS_SEARCH_METHOD "flickr.photos.search" #define FLICKR_PHOTOS_GETINFO_METHOD "flickr.photos.getInfo" -#define FLICKR_PHOTOS_SEARCH \ - FLICKR_ENDPOINT \ - "api_key=" API_KEY \ - "&auth_token=" AUTH_TOKEN \ - "&api_sig=%s" \ - "&method=" FLICKR_PHOTOS_SEARCH_METHOD \ +#define FLICKR_PHOTOS_SEARCH \ + FLICKR_ENDPOINT \ + "api_key=" API_KEY \ + "&auth_token=" AUTH_TOKEN \ + "&api_sig=%s" \ + "&method=" FLICKR_PHOTOS_SEARCH_METHOD \ + "&extras=media,date_taken,owner_name,url_o,url_t" \ "&text=%s" #define FLICKR_PHOTOS_GETINFO \ @@ -38,25 +39,31 @@ typedef void (*ParseXML) (const gchar *xml_result, gpointer user_data); typedef struct { ParseXML parse_xml; GFlickrPhotoCb get_info_cb; + GFlickrPhotoListCb search_cb; gpointer user_data; } GFlickrData; /* -------------------- PRIVATE API -------------------- */ -/* static gchar * */ -/* get_api_sig_photos_search (const gchar *text) { */ -/* gchar *signature; */ -/* gchar *text_to_sign; */ +static gchar * +get_api_sig_photos_search (const gchar *text) { + gchar *signature; + gchar *text_to_sign; -/* text_to_sign = g_strdup_printf (AUTH_SECRET */ -/* "method" */ -/* FLICKR_PHOTOS_SEARCH_METHOD */ -/* "text%s", text); */ -/* signature = g_compute_checksum_for_string (G_CHECKSUM_MD5, text_to_sign, -1); */ -/* g_free (text_to_sign); */ + text_to_sign = g_strdup_printf (AUTH_SECRET + "api_key" + API_KEY + "auth_token" + AUTH_TOKEN + "extrasmedia,date_taken,owner_name,url_o,url_t" + "method" + FLICKR_PHOTOS_SEARCH_METHOD + "text%s", text); + signature = g_compute_checksum_for_string (G_CHECKSUM_MD5, text_to_sign, -1); + g_free (text_to_sign); -/* return signature; */ -/* } */ + return signature; +} static gchar * get_api_sig_photos_getInfo (glong photo_id) @@ -178,6 +185,40 @@ process_photo_result (const gchar *xml_result, gpointer user_data) } static void +process_photolist_result (const gchar *xml_result, gpointer user_data) +{ + GFlickrData *data = (GFlickrData *) user_data; + GList *photolist = NULL; + xmlDocPtr doc; + xmlNodePtr node; + + doc = xmlRecoverDoc ((xmlChar *) xml_result); + node = xmlDocGetRootElement (doc); + + /* Check result is ok */ + if (!node || !result_is_correct (node)) { + data->search_cb (NULL, NULL, data->user_data); + } else { + node = node->xmlChildrenNode; + skip_garbage_nodes (&node); + + /* Now we're at "photo pages" node */ + node = node->xmlChildrenNode; + skip_garbage_nodes (&node); + while (node) { + photolist = g_list_prepend (photolist, get_photo (node)); + node = node->next; + skip_garbage_nodes (&node); + } + + data->search_cb (NULL, g_list_reverse (photolist), data->user_data); + g_list_foreach (photolist, (GFunc) g_hash_table_unref, NULL); + g_list_free (photolist); + } + xmlFreeDoc (doc); +} + +static void read_done_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) @@ -238,6 +279,31 @@ g_flickr_photos_getInfo (gpointer f, g_free (request); } +void +g_flickr_photos_search (gpointer f, + const gchar *text, + GFlickrPhotoListCb callback, + gpointer user_data) +{ + //g_return_if_fail (G_IS_FLICKR (f)); + + gchar *api_sig = get_api_sig_photos_search (text); + + /* Build the request */ + gchar *request = g_strdup_printf (FLICKR_PHOTOS_SEARCH, + api_sig, + text); + g_free (api_sig); + + GFlickrData *gfd = g_new (GFlickrData, 1); + gfd->parse_xml = process_photolist_result; + gfd->search_cb = callback; + gfd->user_data = user_data; + + read_url_async (request, gfd); + g_free (request); +} + gchar * g_flickr_photo_url_original (gpointer f, GHashTable *photo) { diff --git a/src/flickr/gflickr.h b/src/flickr/gflickr.h index eaf3cf8..5310193 100644 --- a/src/flickr/gflickr.h +++ b/src/flickr/gflickr.h @@ -29,12 +29,20 @@ typedef void (*GFlickrPhotoCb) (gpointer f, GHashTable *photo, gpointer user_data); +typedef void (*GFlickrPhotoListCb) (gpointer f, GList *photolist, gpointer user_data); + void g_flickr_photos_getInfo (gpointer f, glong photo_id, GFlickrPhotoCb callback, gpointer user_data); +void +g_flickr_photos_search (gpointer f, + const gchar *text, + GFlickrPhotoListCb callback, + gpointer user_data); + gchar * g_flickr_photo_url_original (gpointer f, GHashTable *photo); diff --git a/src/flickr/grl-flickr.c b/src/flickr/grl-flickr.c index 5e8c9f3..320f4b4 100644 --- a/src/flickr/grl-flickr.c +++ b/src/flickr/grl-flickr.c @@ -156,6 +156,7 @@ G_DEFINE_TYPE (GrlFlickrSource, grl_flickr_source, GRL_TYPE_MEDIA_SOURCE); /* ======================= Utilities ==================== */ +#if 0 static void update_media (GrlContentMedia *media, flickcurl_photo *fc_photo) { @@ -179,7 +180,9 @@ update_media (GrlContentMedia *media, flickcurl_photo *fc_photo) fc_photo->fields[PHOTO_FIELD_dates_taken].string); } } +#endif +#if 0 static GrlContentMedia * get_content_image (flickcurl_photo *fc_photo) { @@ -196,24 +199,9 @@ get_content_image (flickcurl_photo *fc_photo) return media; } +#endif -static gboolean -search_cb (gpointer data) -{ - SearchData *search_data = (SearchData *) data; - - search_data->ss->callback(search_data->ss->source, - search_data->ss->search_id, - search_data->media, - search_data->remaining, - search_data->ss->user_data, - NULL); - - g_free (data); - - return FALSE; -} - +#if 0 /* Make get_url TRUE if url has been requested. * Make get_others TRUE if other (supported) keys has been requested */ @@ -246,6 +234,7 @@ check_keys (GList *keys, gboolean *get_url, gboolean *get_others) *get_others = others; } } +#endif #if 0 static gpointer @@ -327,6 +316,7 @@ grl_flickr_source_metadata_main (gpointer data) } #endif +#if 0 static gpointer grl_flickr_source_search_main (gpointer data) { @@ -453,54 +443,115 @@ grl_flickr_source_search_main (gpointer data) return NULL; } +#endif static void -getInfo_cb (gpointer f, GHashTable *photo, gpointer user_data) +update_media (GrlContentMedia *media, GHashTable *photo) { - GrlMediaSourceMetadataSpec *ms = (GrlMediaSourceMetadataSpec *) user_data; gchar *author; gchar *date; gchar *description; + gchar *id; gchar *thumbnail; gchar *title; gchar *url; - if (photo) { - author = g_hash_table_lookup (photo, "owner_realname"); - title = g_hash_table_lookup (photo, "title"); - description = g_hash_table_lookup (photo, "description"); - date = g_hash_table_lookup (photo, "dates_taken"); - url = g_flickr_photo_url_original (f, photo); - thumbnail = g_flickr_photo_url_thumbnail (f, photo); - - if (author) { - grl_content_media_set_author (ms->media, author); - } + author = g_hash_table_lookup (photo, "owner_realname"); + if (!author) { + author = g_hash_table_lookup (photo, "photo_ownername"); + } + date = g_hash_table_lookup (photo, "dates_taken"); + if (!date) { + date = g_hash_table_lookup (photo, "photo_datetaken"); + } + description = g_hash_table_lookup (photo, "description"); + id = g_hash_table_lookup (photo, "photo_id"); + thumbnail = g_hash_table_lookup (photo, "photo_url_t"); + if (!thumbnail) { + thumbnail = g_flickr_photo_url_thumbnail (NULL, photo); + } + title = g_hash_table_lookup (photo, "title"); + url = g_hash_table_lookup (photo, "photo_url_o"); + if (!url) { + url = g_flickr_photo_url_original (NULL, photo); + } - if (title) { - grl_content_media_set_title (ms->media, title); - } + if (author) { + grl_content_media_set_author (media, author); + } - if (description) { - grl_content_media_set_description (ms->media, description); - } + if (date) { + grl_content_media_set_date (media, date); + } - if (date) { - grl_content_media_set_date (ms->media, date); - } + if (description) { + grl_content_media_set_description (media, description); + } - if (url) { - grl_content_media_set_url (ms->media, url); - } + if (id) { + grl_content_media_set_id (media, id); + } - if (thumbnail) { - grl_content_media_set_thumbnail (ms->media, thumbnail); - } + if (thumbnail) { + grl_content_media_set_thumbnail (media, thumbnail); + } + + if (title) { + grl_content_media_set_title (media, title); + } + + if (url) { + grl_content_media_set_url (media, url); + } +} + +static void +getInfo_cb (gpointer f, GHashTable *photo, gpointer user_data) +{ + GrlMediaSourceMetadataSpec *ms = (GrlMediaSourceMetadataSpec *) user_data; + + if (photo) { + update_media (ms->media, photo); } ms->callback (ms->source, ms->media, ms->user_data, NULL); } +static void +search_cb (gpointer f, GList *photolist, gpointer user_data) +{ + GrlContentMedia *media; + GrlMediaSourceSearchSpec *ss = (GrlMediaSourceSearchSpec *) user_data; + gchar *media_type; + + if (!photolist) { + ss->callback (ss->source, + ss->search_id, + NULL, + 0, + ss->user_data, + NULL); + return; + } + + while (photolist) { + media_type = g_hash_table_lookup (photolist->data, "photo_media"); + if (strcmp (media_type, "photo") == 0) { + media = grl_content_image_new (); + } else { + media = grl_content_video_new (); + } + update_media (media, photolist->data); + ss->callback (ss->source, + ss->search_id, + media, + -1, + ss->user_data, + NULL); + photolist = g_list_next (photolist); + } +} + /* ================== API Implementation ================ */ static const GList * @@ -538,10 +589,5 @@ static void grl_flickr_source_search (GrlMediaSource *source, GrlMediaSourceSearchSpec *ss) { - if (!g_thread_create (grl_flickr_source_search_main, - ss, - FALSE, - NULL)) { - g_critical ("Unable to create thread"); - } + g_flickr_photos_search (NULL, ss->text, search_cb, ss); } |