Movie Info Provider: Added XML parsing
[maevies] / src / mvs-minfo-provider.c
index 5e4289f..9b22675 100644 (file)
 
 #include "mvs-minfo-provider.h"
 
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+
 #define TMDB_API_KEY "249e1a42df9bee09fac5e92d3a51396b"
 #define TMDB_LANGUAGE "en"
 #define TMDB_FORMAT "xml"
 #define TMDB_METHOD "Movie.search"
 #define TMDB_BASE_URL "http://api.themoviedb.org/2.1/%s/%s/%s/%s/%s"
+#define TMDB_MOVIE_XPATH "/OpenSearchDescription/movies/movie"
 
 G_DEFINE_TYPE (MvsMInfoProvider, mvs_minfo_provider, G_TYPE_OBJECT)
 
@@ -130,7 +134,58 @@ mvs_minfo_provider_new (void)
 }
 
 static void
-parse_response (SoupSession *session, SoupMessage *message,
+display_movie_info (xmlNodePtr node)
+{
+        xmlNodePtr cur_node = NULL;
+
+        for (cur_node = node; cur_node; cur_node = cur_node->next) {
+                if (cur_node->type == XML_ELEMENT_NODE) {
+                        gchar *value = xmlNodeGetContent (cur_node);
+                        g_print ("[%s] = %s\n", cur_node->name, value);
+                }
+        }
+}
+
+static void
+iterate_list (xmlNodeSetPtr node_set)
+{
+        int i = 0;
+
+        for (i = 0; i < node_set->nodeNr; i++) {
+                xmlNodePtr node = node_set->nodeTab[i];
+                if (node->type == XML_ELEMENT_NODE) {
+                        display_movie_info (node->children);
+                }
+        }
+}
+
+static void
+parse_xml (const char *xml_data, goffset length)
+{
+        xmlDocPtr document = xmlReadMemory (xml_data, length,
+                        NULL,
+                        NULL,
+                        XML_PARSE_NOBLANKS | XML_PARSE_RECOVER);
+        g_return_if_fail (document);
+
+        xmlXPathContextPtr context_ptr = xmlXPathNewContext (document);
+
+        xmlXPathObjectPtr xpath_obj =
+                        xmlXPathEvalExpression (TMDB_MOVIE_XPATH, context_ptr);
+
+        xmlNodeSetPtr nodeset = xpath_obj->nodesetval;
+
+        if (nodeset->nodeNr > 0) {
+                iterate_list (nodeset);
+        }
+
+        xmlXPathFreeNodeSetList (xpath_obj);
+        xmlXPathFreeContext (context_ptr);
+        xmlFreeDoc (document);
+}
+
+static void
+response_callback (SoupSession *session, SoupMessage *message,
                     gpointer user_data)
 {
         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (user_data);
@@ -146,8 +201,8 @@ parse_response (SoupSession *session, SoupMessage *message,
                 mime = soup_message_headers_get_content_type
                                 (message->response_headers, NULL);
 
-                g_print ("Response OK. Mime type: %s\n", mime);
-                g_print ("Content:\n%s\n", message->response_body->data);
+                parse_xml (message->response_body->data,
+                           message->response_body->length);
         }
 
         g_signal_emit (self, signals[RESPONSE_RECEIVED], 0);
@@ -185,7 +240,7 @@ mvs_minfo_provider_query (MvsMInfoProvider *self,
 
         if (message) {
                 soup_session_queue_message (session, message,
-                                parse_response, self);
+                                response_callback, self);
                 message_queued = TRUE;
         }