Regarding to TheMovieDB.org, I finished the parsing of 1 result (ignoring data if...
[maevies] / src / tmdb_movie.c
index d581ea8..150b1fd 100644 (file)
 
 #include "tmdb_movie.h"
 
-void query_tmdb(const gchar *name);
+static void do_get_info(TMDBMovie *movie);
 
-static void parse_child_element(gpointer key, gpointer element, gpointer data);
-
-RestXmlNode *get_xml(RestProxyCall *call);
+static void parse_xml_response(RestProxyCall *call, TMDBMovie *movie);
 
 TMDBMovie *tmdb_get_info(const gchar *name) {
 
        TMDBMovie *movie = g_new0(TMDBMovie, 1);
 
-       movie->rating = 10;
-       movie->released = g_date_new_dmy(1, G_DATE_FEBRUARY, 2009);
+       movie->name = g_strdup(name);
+
+       do_get_info(movie);
 
-       query_tmdb(name);
+       /*
+        * movie->rating = 10;
+        * movie->released = g_date_new_dmy(1, G_DATE_FEBRUARY, 2009);
+        */
 
        return movie;
 }
 
-void query_tmdb(const gchar *name) {
+static void do_get_info(TMDBMovie *movie) {
 
        RestProxy *proxy;
        RestProxyCall *call;
        gchar *tmdb_function;
-       const gchar *response;
-       RestXmlNode *root;
-       gssize len;
 
-       /* Provider initialization, should be refactored. Maybe it can be reused between calls */
        proxy = rest_proxy_new(TMDB_SERVICE_URL, FALSE);
        call = rest_proxy_new_call(proxy);
 
-       /* Generate the function string */
+       /* Generate the function string.
+        * It's METHOD/LANGUAGE/FORMAT/APIKEY/MOVIENAME,
+        * so the actual query puts that after the URL */
        tmdb_function = g_strdup_printf("%s/%s/%s/%s/%s", TMDB_SEARCH_METHOD,
-                       TMDB_LANGUAGE, TMDB_FORMAT, TMDB_API_KEY, name);
+                       TMDB_LANGUAGE, TMDB_FORMAT, TMDB_API_KEY, movie->name);
 
        rest_proxy_call_set_function(call, tmdb_function);
 
        /* The actual call */
        rest_proxy_call_run(call, NULL, NULL);
 
-       get_xml(call);
+       parse_xml_response(call, movie);
 
        /* Object disposal, should be refactored. */
        g_object_unref(call);
+       g_free(tmdb_function);
        g_object_unref(proxy);
 }
 
-RestXmlNode *get_xml(RestProxyCall *call) {
+static void parse_xml_response(RestProxyCall *call, TMDBMovie *movie) {
        RestXmlParser *parser;
        RestXmlNode *root;
-       GError *error = NULL;
+       RestXmlNode *tmp;
+       RestXmlNode *field;
+       gint total_results;
 
        parser = rest_xml_parser_new();
 
        root = rest_xml_parser_parse_from_data(parser, rest_proxy_call_get_payload(
                        call), rest_proxy_call_get_payload_length(call));
 
-       g_hash_table_foreach(root->children, (GHFunc) parse_child_element, NULL);
+       tmp = g_hash_table_lookup(root->children, g_intern_string(
+                       "opensearch:totalResults"));
 
-       g_object_unref(parser);
+       total_results = atof(tmp->content);
+
+       tmp = g_hash_table_lookup(root->children, g_intern_string("movies"));
+
+       tmp = g_hash_table_lookup(tmp->children, g_intern_string("movie"));
+
+       while (tmp != NULL) {
+
+               field = g_hash_table_lookup(tmp->children,
+                               g_intern_string("popularity"));
+               movie->popularity = atoi(field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string("name"));
+               movie->name = g_strdup(field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string(
+                               "alternative_name"));
+               movie->alternative_name = g_strdup(field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string("id"));
+               movie->id = atoi(field->content);
 
-       return root;
+               field = g_hash_table_lookup(tmp->children, g_intern_string("imdb_id"));
+               movie->imdb_id = g_strdup(field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string("url"));
+               movie->url = g_strdup(field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string("rating"));
+               movie->rating = atof(field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string("released"));
+               movie->released = g_date_new();
+               g_date_set_parse(movie->released, field->content);
+
+               field = g_hash_table_lookup(tmp->children, g_intern_string("overview"));
+               movie->overview = g_strdup(field->content);
+
+               /* tmp = tmp->next; */
+               tmp = NULL;
+       }
+
+       g_object_unref(parser);
+       rest_xml_node_unref(root);
 }
 
-static void parse_child_element(gpointer key, gpointer element, gpointer data) {
+void tmdb_movie_unref(TMDBMovie *movie) {
+
+       g_free(movie->alternative_name);
+       g_free(movie->imdb_id);
+       g_free(movie->name);
+       g_free(movie->overview);
+       g_free(movie->url);
 
-       RestXmlNode *node = (RestXmlNode*) element;
+       if (movie->released != NULL)
+               g_date_free(movie->released);
+
+       g_free(movie);
+}
 
-       g_print("%s: ", key);
-       if (g_hash_table_size(node->children) == 0) {
-               g_print("%s", node->content);
+void tmdb_movie_print(const TMDBMovie *movie) {
+
+       g_print("themoviedb.org - The Movie Database.\n");
+       g_print("Movie name: %s\n", GET_MESSAGE(movie->name));
+       g_print("Alternate name: %s\n", GET_MESSAGE(movie->alternative_name));
+       g_print("Rating: %f\n", movie->rating);
+       g_print("Overview:\n %s\n", GET_MESSAGE(movie->overview));
+       g_print("ID: %d\n", movie->id);
+       g_print("IMDB ID: %s\n", GET_MESSAGE(movie->imdb_id));
+       g_print("Popularity: %d\n", movie->popularity);
+       g_print("URL: %s\n", GET_MESSAGE(movie->url));
+       g_print("Runtime: %d\n", movie->runtime);
+       if (g_date_valid(movie->released)) {
+               g_print("Released: %d-%d-%d\n", g_date_get_year(movie->released),
+                               g_date_get_month(movie->released), g_date_get_day(
+                                               movie->released));
        }
-       g_print("\n");
-       g_hash_table_foreach(node->children, (GHFunc) parse_child_element, NULL);
 }