Movie Info Provider: Added XML parsing
authorSimón Pena <spenap@gmail.com>
Sun, 16 May 2010 19:00:05 +0000 (21:00 +0200)
committerSimón Pena <spenap@gmail.com>
Mon, 17 May 2010 00:02:28 +0000 (02:02 +0200)
src/mvs-minfo-provider.c
src/mvs-movie-info.c [deleted file]
src/mvs-movie-info.h [deleted file]
src/mvs-tmdb-movie.c [new file with mode: 0644]
src/mvs-tmdb-movie.h [new file with mode: 0644]
test/mvs-info-provider-test.c [deleted file]
test/mvs-minfo-provider-test.c [new file with mode: 0644]

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;
         }
 
diff --git a/src/mvs-movie-info.c b/src/mvs-movie-info.c
deleted file mode 100644 (file)
index 26d25fb..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * mvs-movie-info.c
- *
- * This file is part of maevies
- * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- */
-
-#include "mvs-movie-info.h"
-
-G_DEFINE_TYPE (MvsMovieInfo, mvs_movie_info, G_TYPE_OBJECT)
-
-enum {
-        PROP_0,
-        PROP_HAS_STINGERS,
-        PROP_TITLE,
-        PROP_DIRECTOR,
-        PROP_CAST,
-        PROP_RANKING,
-        PROP_RELEASE_DATE,
-        PROP_OVERVIEW,
-        PROP_URL,
-        PROP_SCHEDULE,
-};
-
-#define GET_PRIVATE(o) \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((o), MVS_TYPE_MOVIE_INFO, MvsMovieInfoPrivate))
-
-struct _MvsMovieInfoPrivate {
-        gboolean has_stingers;
-        gchar *title;
-        gchar *director;
-        gchar *cast;
-        gfloat ranking;
-        gchar *release_date;
-        gchar *overview;
-        gchar *url;
-        gchar *schedule;
-};
-
-static void
-mvs_movie_info_get_property (GObject *object, guint property_id,
-                         GValue *value, GParamSpec *pspec)
-{
-        MvsMovieInfo *self = MVS_MOVIE_INFO (object);
-
-        switch (property_id) {
-        case PROP_HAS_STINGERS:
-                g_value_set_boolean (value, self->priv->has_stingers);
-                break;
-        case PROP_TITLE:
-                g_value_set_string (value, self->priv->title);
-                break;
-        case PROP_DIRECTOR:
-                g_value_set_string (value, self->priv->director);
-                break;
-        case PROP_CAST:
-                g_value_set_string (value, self->priv->cast);
-                break;
-        case PROP_RANKING:
-                g_value_set_float (value, self->priv->ranking);
-                break;
-        case PROP_RELEASE_DATE:
-                g_value_set_string (value, self->priv->release_date);
-                break;
-        case PROP_OVERVIEW:
-                g_value_set_string (value, self->priv->overview);
-                break;
-        case PROP_URL:
-                g_value_set_string (value, self->priv->url);
-                break;
-        case PROP_SCHEDULE:
-                g_value_set_string (value, self->priv->schedule);
-                break;
-        default:
-                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-        }
-}
-
-static void
-mvs_movie_info_set_property (GObject *object, guint property_id,
-                         const GValue *value, GParamSpec *pspec)
-{
-        MvsMovieInfo *self = MVS_MOVIE_INFO (object);
-        GDate *date = NULL;
-
-        switch (property_id) {
-        case PROP_HAS_STINGERS:
-                mvs_movie_info_set_stingers (self, g_value_get_boolean (value));
-                break;
-        case PROP_TITLE:
-                mvs_movie_info_set_title (self, g_value_get_string (value));
-                break;
-        case PROP_DIRECTOR:
-                mvs_movie_info_set_director (self, g_value_get_string (value));
-                break;
-        case PROP_CAST:
-                mvs_movie_info_set_cast (self, g_value_get_string (value));
-                break;
-        case PROP_RANKING:
-                mvs_movie_info_set_ranking (self, g_value_get_float (value));
-                break;
-        case PROP_RELEASE_DATE:
-                mvs_movie_info_set_release_date (self, g_value_get_string (value));
-                break;
-        case PROP_OVERVIEW:
-                mvs_movie_info_set_overview (self, g_value_get_string (value));
-                break;
-        case PROP_URL:
-                mvs_movie_info_set_url (self, g_value_get_string (value));
-                break;
-        case PROP_SCHEDULE:
-                mvs_movie_info_set_schedule (self, g_value_get_string (value));
-                break;
-        default:
-                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-        }
-}
-
-static void
-mvs_movie_info_finalize (GObject *object)
-{
-        MvsMovieInfo *self = MVS_MOVIE_INFO (object);
-
-        g_free (self->priv->cast);
-        g_free (self->priv->director);
-        g_free (self->priv->overview);
-        g_free (self->priv->release_date);
-        g_free (self->priv->schedule);
-        g_free (self->priv->title);
-        g_free (self->priv->url);
-
-        G_OBJECT_CLASS (mvs_movie_info_parent_class)->finalize (object);
-}
-
-static void
-mvs_movie_info_class_init (MvsMovieInfoClass *klass)
-{
-        GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-        g_type_class_add_private (klass, sizeof (MvsMovieInfoPrivate));
-
-        object_class->get_property = mvs_movie_info_get_property;
-        object_class->set_property = mvs_movie_info_set_property;
-        object_class->finalize = mvs_movie_info_finalize;
-
-
-        g_object_class_install_property
-                (object_class, PROP_CAST,
-                 g_param_spec_string ("cast", "Movie cast", "The movie cast",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_DIRECTOR,
-                 g_param_spec_string ("director", "Movie director", "The movie director",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_HAS_STINGERS,
-                 g_param_spec_boolean ("stingers", "Has stingers", "The movie has stingers",
-                                 FALSE,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_OVERVIEW,
-                 g_param_spec_string ("overview", "Movie overview", "The movie overview",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_RANKING,
-                 g_param_spec_float ("ranking", "Movie ranking", "The movie ranking",
-                                 0.0,
-                                 10.0,
-                                 5.0,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_RELEASE_DATE,
-                 g_param_spec_string ("release", "Movie release date", "The movie release date",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_SCHEDULE,
-                 g_param_spec_string ("schedule", "Movie schedule", "The movie schedule",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_TITLE,
-                 g_param_spec_string ("title", "Movie title", "The movie title",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-        g_object_class_install_property
-                (object_class, PROP_URL,
-                 g_param_spec_string ("url", "Movie URL", "The movie url",
-                                 NULL,
-                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-}
-
-static void
-mvs_movie_info_init (MvsMovieInfo *self)
-{
-        self->priv = GET_PRIVATE (self);
-        self->priv->cast = NULL;
-        self->priv->director = NULL;
-        self->priv->has_stingers = FALSE;
-        self->priv->overview = NULL;
-        self->priv->ranking = 5;
-        self->priv->release_date = NULL;
-        self->priv->schedule = NULL;
-        self->priv->title = NULL;
-        self->priv->url = NULL;
-}
-
-MvsMovieInfo*
-mvs_movie_info_new (void)
-{
-        return g_object_new (MVS_TYPE_MOVIE_INFO, NULL);
-}
-
-gboolean
-mvs_movie_info_set_stingers (MvsMovieInfo *self, gboolean has_stingers)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        self->priv->has_stingers = has_stingers;
-
-        return TRUE;
-}
-
-gboolean
-mvs_movie_info_set_title (MvsMovieInfo *self, const gchar *title)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->title);
-
-        self->priv->title = g_strdup (title);
-
-        return TRUE;
-}
-
-gboolean
-mvs_movie_info_set_director (MvsMovieInfo *self, const gchar *director)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->director);
-
-        self->priv->director = g_strdup (director);
-
-        return TRUE;
-}
-
-gboolean
-mvs_movie_info_set_cast (MvsMovieInfo *self, const gchar *cast)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->cast);
-
-        self->priv->cast = g_strdup (cast);
-
-        return TRUE;
-}
-
-gboolean
-mvs_movie_info_set_ranking (MvsMovieInfo *self, gfloat ranking)
-{
-        g_return_val_if_fail (self, FALSE);
-        g_return_val_if_fail (ranking < 10 && ranking > 0, FALSE);
-
-        self->priv->ranking = ranking;
-
-        return FALSE;
-}
-
-gboolean
-mvs_movie_info_set_release_date (MvsMovieInfo *self,
-                                          const gchar *released)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->release_date);
-
-        self->priv->release_date = g_strdup (released);
-
-        return TRUE;
-}
-gboolean
-mvs_movie_info_set_overview (MvsMovieInfo *self,
-                                      const gchar *overview)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->overview);
-
-        self->priv->overview = g_strdup (overview);
-
-        return TRUE;
-}
-
-gboolean
-mvs_movie_info_set_url (MvsMovieInfo *self, const gchar *url)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->url);
-
-        self->priv->url = g_strdup (url);
-
-        return TRUE;
-}
-
-gboolean
-mvs_movie_info_set_schedule (MvsMovieInfo *self,
-                                      const gchar *schedule)
-{
-        g_return_val_if_fail (self, FALSE);
-
-        g_free (self->priv->schedule);
-
-        self->priv->schedule = g_strdup (schedule);
-
-        return TRUE;
-}
diff --git a/src/mvs-movie-info.h b/src/mvs-movie-info.h
deleted file mode 100644 (file)
index c6b002b..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * mvs-movie-info.h
- *
- * This file is part of maevies
- * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- */
-
-#ifndef _MVS_MOVIE_INFO
-#define _MVS_MOVIE_INFO
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define MVS_TYPE_MOVIE_INFO mvs_movie_info_get_type()
-#define MVS_MOVIE_INFO(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MVS_TYPE_MOVIE_INFO, MvsMovieInfo))
-#define MVS_MOVIE_INFO_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), MVS_TYPE_MOVIE_INFO, MvsMovieInfoClass))
-#define IS_MVS_MOVIE_INFO(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MVS_TYPE_MOVIE_INFO))
-#define IS_MVS_MOVIE_INFO_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), MVS_TYPE_MOVIE_INFO))
-#define MVS_MOVIE_INFO_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), MVS_TYPE_MOVIE_INFO, MvsMovieInfoClass))
-
-typedef struct _MvsMovieInfoPrivate MvsMovieInfoPrivate;
-
-typedef struct {
-        GObject parent;
-
-        /* <private> */
-        MvsMovieInfoPrivate *priv;
-} MvsMovieInfo;
-
-typedef struct {
-        GObjectClass parent_class;
-} MvsMovieInfoClass;
-
-GType mvs_movie_info_get_type (void);
-MvsMovieInfo* mvs_movie_info_new (void);
-
-gboolean mvs_movie_info_set_stingers (MvsMovieInfo *self,
-                                      gboolean has_stingers);
-gboolean mvs_movie_info_set_title (MvsMovieInfo *self, const gchar *title);
-gboolean mvs_movie_info_set_director (MvsMovieInfo *self,
-                                      const gchar *director);
-gboolean mvs_movie_info_set_cast (MvsMovieInfo *self, const gchar *cast);
-gboolean mvs_movie_info_set_ranking (MvsMovieInfo *self, gfloat ranking);
-gboolean mvs_movie_info_set_release_date (MvsMovieInfo *self,
-                                          const gchar *released);
-gboolean mvs_movie_info_set_overview (MvsMovieInfo *self,
-                                      const gchar *overview);
-gboolean mvs_movie_info_set_url (MvsMovieInfo *self, const gchar *url);
-gboolean mvs_movie_info_set_schedule (MvsMovieInfo *self,
-                                      const gchar *schedule);
-
-G_END_DECLS
-
-#endif /* _MVS_MOVIE_INFO */
diff --git a/src/mvs-tmdb-movie.c b/src/mvs-tmdb-movie.c
new file mode 100644 (file)
index 0000000..26d25fb
--- /dev/null
@@ -0,0 +1,341 @@
+/*
+ * mvs-movie-info.c
+ *
+ * This file is part of maevies
+ * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ */
+
+#include "mvs-movie-info.h"
+
+G_DEFINE_TYPE (MvsMovieInfo, mvs_movie_info, G_TYPE_OBJECT)
+
+enum {
+        PROP_0,
+        PROP_HAS_STINGERS,
+        PROP_TITLE,
+        PROP_DIRECTOR,
+        PROP_CAST,
+        PROP_RANKING,
+        PROP_RELEASE_DATE,
+        PROP_OVERVIEW,
+        PROP_URL,
+        PROP_SCHEDULE,
+};
+
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), MVS_TYPE_MOVIE_INFO, MvsMovieInfoPrivate))
+
+struct _MvsMovieInfoPrivate {
+        gboolean has_stingers;
+        gchar *title;
+        gchar *director;
+        gchar *cast;
+        gfloat ranking;
+        gchar *release_date;
+        gchar *overview;
+        gchar *url;
+        gchar *schedule;
+};
+
+static void
+mvs_movie_info_get_property (GObject *object, guint property_id,
+                         GValue *value, GParamSpec *pspec)
+{
+        MvsMovieInfo *self = MVS_MOVIE_INFO (object);
+
+        switch (property_id) {
+        case PROP_HAS_STINGERS:
+                g_value_set_boolean (value, self->priv->has_stingers);
+                break;
+        case PROP_TITLE:
+                g_value_set_string (value, self->priv->title);
+                break;
+        case PROP_DIRECTOR:
+                g_value_set_string (value, self->priv->director);
+                break;
+        case PROP_CAST:
+                g_value_set_string (value, self->priv->cast);
+                break;
+        case PROP_RANKING:
+                g_value_set_float (value, self->priv->ranking);
+                break;
+        case PROP_RELEASE_DATE:
+                g_value_set_string (value, self->priv->release_date);
+                break;
+        case PROP_OVERVIEW:
+                g_value_set_string (value, self->priv->overview);
+                break;
+        case PROP_URL:
+                g_value_set_string (value, self->priv->url);
+                break;
+        case PROP_SCHEDULE:
+                g_value_set_string (value, self->priv->schedule);
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        }
+}
+
+static void
+mvs_movie_info_set_property (GObject *object, guint property_id,
+                         const GValue *value, GParamSpec *pspec)
+{
+        MvsMovieInfo *self = MVS_MOVIE_INFO (object);
+        GDate *date = NULL;
+
+        switch (property_id) {
+        case PROP_HAS_STINGERS:
+                mvs_movie_info_set_stingers (self, g_value_get_boolean (value));
+                break;
+        case PROP_TITLE:
+                mvs_movie_info_set_title (self, g_value_get_string (value));
+                break;
+        case PROP_DIRECTOR:
+                mvs_movie_info_set_director (self, g_value_get_string (value));
+                break;
+        case PROP_CAST:
+                mvs_movie_info_set_cast (self, g_value_get_string (value));
+                break;
+        case PROP_RANKING:
+                mvs_movie_info_set_ranking (self, g_value_get_float (value));
+                break;
+        case PROP_RELEASE_DATE:
+                mvs_movie_info_set_release_date (self, g_value_get_string (value));
+                break;
+        case PROP_OVERVIEW:
+                mvs_movie_info_set_overview (self, g_value_get_string (value));
+                break;
+        case PROP_URL:
+                mvs_movie_info_set_url (self, g_value_get_string (value));
+                break;
+        case PROP_SCHEDULE:
+                mvs_movie_info_set_schedule (self, g_value_get_string (value));
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        }
+}
+
+static void
+mvs_movie_info_finalize (GObject *object)
+{
+        MvsMovieInfo *self = MVS_MOVIE_INFO (object);
+
+        g_free (self->priv->cast);
+        g_free (self->priv->director);
+        g_free (self->priv->overview);
+        g_free (self->priv->release_date);
+        g_free (self->priv->schedule);
+        g_free (self->priv->title);
+        g_free (self->priv->url);
+
+        G_OBJECT_CLASS (mvs_movie_info_parent_class)->finalize (object);
+}
+
+static void
+mvs_movie_info_class_init (MvsMovieInfoClass *klass)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+        g_type_class_add_private (klass, sizeof (MvsMovieInfoPrivate));
+
+        object_class->get_property = mvs_movie_info_get_property;
+        object_class->set_property = mvs_movie_info_set_property;
+        object_class->finalize = mvs_movie_info_finalize;
+
+
+        g_object_class_install_property
+                (object_class, PROP_CAST,
+                 g_param_spec_string ("cast", "Movie cast", "The movie cast",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_DIRECTOR,
+                 g_param_spec_string ("director", "Movie director", "The movie director",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_HAS_STINGERS,
+                 g_param_spec_boolean ("stingers", "Has stingers", "The movie has stingers",
+                                 FALSE,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_OVERVIEW,
+                 g_param_spec_string ("overview", "Movie overview", "The movie overview",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_RANKING,
+                 g_param_spec_float ("ranking", "Movie ranking", "The movie ranking",
+                                 0.0,
+                                 10.0,
+                                 5.0,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_RELEASE_DATE,
+                 g_param_spec_string ("release", "Movie release date", "The movie release date",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_SCHEDULE,
+                 g_param_spec_string ("schedule", "Movie schedule", "The movie schedule",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_TITLE,
+                 g_param_spec_string ("title", "Movie title", "The movie title",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+        g_object_class_install_property
+                (object_class, PROP_URL,
+                 g_param_spec_string ("url", "Movie URL", "The movie url",
+                                 NULL,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+}
+
+static void
+mvs_movie_info_init (MvsMovieInfo *self)
+{
+        self->priv = GET_PRIVATE (self);
+        self->priv->cast = NULL;
+        self->priv->director = NULL;
+        self->priv->has_stingers = FALSE;
+        self->priv->overview = NULL;
+        self->priv->ranking = 5;
+        self->priv->release_date = NULL;
+        self->priv->schedule = NULL;
+        self->priv->title = NULL;
+        self->priv->url = NULL;
+}
+
+MvsMovieInfo*
+mvs_movie_info_new (void)
+{
+        return g_object_new (MVS_TYPE_MOVIE_INFO, NULL);
+}
+
+gboolean
+mvs_movie_info_set_stingers (MvsMovieInfo *self, gboolean has_stingers)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        self->priv->has_stingers = has_stingers;
+
+        return TRUE;
+}
+
+gboolean
+mvs_movie_info_set_title (MvsMovieInfo *self, const gchar *title)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->title);
+
+        self->priv->title = g_strdup (title);
+
+        return TRUE;
+}
+
+gboolean
+mvs_movie_info_set_director (MvsMovieInfo *self, const gchar *director)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->director);
+
+        self->priv->director = g_strdup (director);
+
+        return TRUE;
+}
+
+gboolean
+mvs_movie_info_set_cast (MvsMovieInfo *self, const gchar *cast)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->cast);
+
+        self->priv->cast = g_strdup (cast);
+
+        return TRUE;
+}
+
+gboolean
+mvs_movie_info_set_ranking (MvsMovieInfo *self, gfloat ranking)
+{
+        g_return_val_if_fail (self, FALSE);
+        g_return_val_if_fail (ranking < 10 && ranking > 0, FALSE);
+
+        self->priv->ranking = ranking;
+
+        return FALSE;
+}
+
+gboolean
+mvs_movie_info_set_release_date (MvsMovieInfo *self,
+                                          const gchar *released)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->release_date);
+
+        self->priv->release_date = g_strdup (released);
+
+        return TRUE;
+}
+gboolean
+mvs_movie_info_set_overview (MvsMovieInfo *self,
+                                      const gchar *overview)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->overview);
+
+        self->priv->overview = g_strdup (overview);
+
+        return TRUE;
+}
+
+gboolean
+mvs_movie_info_set_url (MvsMovieInfo *self, const gchar *url)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->url);
+
+        self->priv->url = g_strdup (url);
+
+        return TRUE;
+}
+
+gboolean
+mvs_movie_info_set_schedule (MvsMovieInfo *self,
+                                      const gchar *schedule)
+{
+        g_return_val_if_fail (self, FALSE);
+
+        g_free (self->priv->schedule);
+
+        self->priv->schedule = g_strdup (schedule);
+
+        return TRUE;
+}
diff --git a/src/mvs-tmdb-movie.h b/src/mvs-tmdb-movie.h
new file mode 100644 (file)
index 0000000..c6b002b
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * mvs-movie-info.h
+ *
+ * This file is part of maevies
+ * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ */
+
+#ifndef _MVS_MOVIE_INFO
+#define _MVS_MOVIE_INFO
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define MVS_TYPE_MOVIE_INFO mvs_movie_info_get_type()
+#define MVS_MOVIE_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MVS_TYPE_MOVIE_INFO, MvsMovieInfo))
+#define MVS_MOVIE_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), MVS_TYPE_MOVIE_INFO, MvsMovieInfoClass))
+#define IS_MVS_MOVIE_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MVS_TYPE_MOVIE_INFO))
+#define IS_MVS_MOVIE_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), MVS_TYPE_MOVIE_INFO))
+#define MVS_MOVIE_INFO_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), MVS_TYPE_MOVIE_INFO, MvsMovieInfoClass))
+
+typedef struct _MvsMovieInfoPrivate MvsMovieInfoPrivate;
+
+typedef struct {
+        GObject parent;
+
+        /* <private> */
+        MvsMovieInfoPrivate *priv;
+} MvsMovieInfo;
+
+typedef struct {
+        GObjectClass parent_class;
+} MvsMovieInfoClass;
+
+GType mvs_movie_info_get_type (void);
+MvsMovieInfo* mvs_movie_info_new (void);
+
+gboolean mvs_movie_info_set_stingers (MvsMovieInfo *self,
+                                      gboolean has_stingers);
+gboolean mvs_movie_info_set_title (MvsMovieInfo *self, const gchar *title);
+gboolean mvs_movie_info_set_director (MvsMovieInfo *self,
+                                      const gchar *director);
+gboolean mvs_movie_info_set_cast (MvsMovieInfo *self, const gchar *cast);
+gboolean mvs_movie_info_set_ranking (MvsMovieInfo *self, gfloat ranking);
+gboolean mvs_movie_info_set_release_date (MvsMovieInfo *self,
+                                          const gchar *released);
+gboolean mvs_movie_info_set_overview (MvsMovieInfo *self,
+                                      const gchar *overview);
+gboolean mvs_movie_info_set_url (MvsMovieInfo *self, const gchar *url);
+gboolean mvs_movie_info_set_schedule (MvsMovieInfo *self,
+                                      const gchar *schedule);
+
+G_END_DECLS
+
+#endif /* _MVS_MOVIE_INFO */
diff --git a/test/mvs-info-provider-test.c b/test/mvs-info-provider-test.c
deleted file mode 100644 (file)
index 10a63f7..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * mvs-info-provider-test.c
- *
- * This file is part of maevies
- * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- */
-
-#include <stdio.h>
-#include <glib.h>
-
-#include "mvs-minfo-provider.h"
-#include "mvs-movie-info.h"
-
-static GMainLoop *loop = NULL;
-
-static void
-response_received_callback (MvsMInfoProvider minfo_provider,
-                            gpointer user_data)
-{
-        g_main_loop_quit (loop);
-}
-
-int
-main (int argc, char **argv)
-{
-        MvsMInfoProvider *minfo_provider = NULL;
-        MvsMovieInfo *movie_info = NULL;
-
-        g_type_init ();
-
-        g_thread_init (NULL);
-
-        minfo_provider = mvs_minfo_provider_new ();
-        g_signal_connect (minfo_provider, "response-received",
-                          G_CALLBACK (response_received_callback), NULL);
-
-        movie_info = mvs_movie_info_new ();
-        loop = g_main_loop_new (NULL, FALSE);
-
-        mvs_minfo_provider_query (minfo_provider, "Zombieland");
-
-        g_main_loop_run (loop);
-
-        g_object_unref (minfo_provider);
-        g_object_unref (movie_info);
-        g_main_loop_unref (loop);
-
-        return 0;
-}
diff --git a/test/mvs-minfo-provider-test.c b/test/mvs-minfo-provider-test.c
new file mode 100644 (file)
index 0000000..10a63f7
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * mvs-info-provider-test.c
+ *
+ * This file is part of maevies
+ * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ */
+
+#include <stdio.h>
+#include <glib.h>
+
+#include "mvs-minfo-provider.h"
+#include "mvs-movie-info.h"
+
+static GMainLoop *loop = NULL;
+
+static void
+response_received_callback (MvsMInfoProvider minfo_provider,
+                            gpointer user_data)
+{
+        g_main_loop_quit (loop);
+}
+
+int
+main (int argc, char **argv)
+{
+        MvsMInfoProvider *minfo_provider = NULL;
+        MvsMovieInfo *movie_info = NULL;
+
+        g_type_init ();
+
+        g_thread_init (NULL);
+
+        minfo_provider = mvs_minfo_provider_new ();
+        g_signal_connect (minfo_provider, "response-received",
+                          G_CALLBACK (response_received_callback), NULL);
+
+        movie_info = mvs_movie_info_new ();
+        loop = g_main_loop_new (NULL, FALSE);
+
+        mvs_minfo_provider_query (minfo_provider, "Zombieland");
+
+        g_main_loop_run (loop);
+
+        g_object_unref (minfo_provider);
+        g_object_unref (movie_info);
+        g_main_loop_unref (loop);
+
+        return 0;
+}