summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan A. Suarez Romero <jasuarez@igalia.com>2010-02-15 11:18:08 +0100
committerJuan A. Suarez Romero <jasuarez@igalia.com>2010-02-15 16:58:28 +0100
commit04cff85a7b33dc0397ba4320fbe567fe4c36f11a (patch)
tree0e61ff36ff4ff97889172fee23126a7fb342fe65
parent6ddb0b211cf7fa4feaa9142a413c79a0322b0773 (diff)
downloadgrilo-plugins-04cff85a7b33dc0397ba4320fbe567fe4c36f11a.tar.gz
[flickr] Use GFlickr object when searching images
-rw-r--r--src/flickr/gflickr.c102
-rw-r--r--src/flickr/gflickr.h8
-rw-r--r--src/flickr/grl-flickr.c148
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);
}