5e4289f988245202e8f79a33be3d8be2da5fee6e
[maevies] / src / mvs-minfo-provider.c
1 /*
2  * mvs-minfo-provider.c
3  *
4  * This file is part of maevies
5  * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  */
18
19 #include "mvs-minfo-provider.h"
20
21 #define TMDB_API_KEY "249e1a42df9bee09fac5e92d3a51396b"
22 #define TMDB_LANGUAGE "en"
23 #define TMDB_FORMAT "xml"
24 #define TMDB_METHOD "Movie.search"
25 #define TMDB_BASE_URL "http://api.themoviedb.org/2.1/%s/%s/%s/%s/%s"
26
27 G_DEFINE_TYPE (MvsMInfoProvider, mvs_minfo_provider, G_TYPE_OBJECT)
28
29 enum {
30         PROP_0,
31         PROP_FORMAT,
32 };
33
34 #define GET_PRIVATE(o) \
35   (G_TYPE_INSTANCE_GET_PRIVATE ((o), MVS_TYPE_MINFO_PROVIDER, MvsMInfoProviderPrivate))
36
37 struct _MvsMInfoProviderPrivate {
38         gchar *format;
39 };
40
41 enum {
42         RESPONSE_RECEIVED,
43         LAST_SIGNAL
44 };
45
46 static guint
47 signals[LAST_SIGNAL] = { 0 };
48
49
50 static void
51 mvs_minfo_provider_get_property (GObject *object, guint property_id,
52                          GValue *value, GParamSpec *pspec)
53 {
54         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (object);
55
56         switch (property_id) {
57         case PROP_FORMAT:
58                 g_value_set_string (value, self->priv->format);
59                 break;
60         default:
61                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
62         }
63 }
64
65 static void
66 mvs_minfo_provider_set_property (GObject *object, guint property_id,
67                          const GValue *value, GParamSpec *pspec)
68 {
69         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (object);
70
71         switch (property_id) {
72         case PROP_FORMAT:
73                 mvs_minfo_provider_set_format (self,
74                                 g_value_get_string (value));
75                 break;
76         default:
77                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
78         }
79 }
80
81 static void
82 mvs_minfo_provider_finalize (GObject *object)
83 {
84         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (object);
85
86         g_free (self->priv->format);
87
88         G_OBJECT_CLASS (mvs_minfo_provider_parent_class)->finalize (object);
89 }
90
91 static void
92 mvs_minfo_provider_class_init (MvsMInfoProviderClass *klass)
93 {
94         GObjectClass *object_class = G_OBJECT_CLASS (klass);
95
96         g_type_class_add_private (klass, sizeof (MvsMInfoProviderPrivate));
97
98         object_class->get_property = mvs_minfo_provider_get_property;
99         object_class->set_property = mvs_minfo_provider_set_property;
100         object_class->finalize = mvs_minfo_provider_finalize;
101
102         g_object_class_install_property
103                 (object_class, PROP_FORMAT,
104                  g_param_spec_string ("format", "The format", "The format",
105                                       TMDB_FORMAT,
106                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
107
108         signals[RESPONSE_RECEIVED] = g_signal_new ("response-received", MVS_TYPE_MINFO_PROVIDER,
109                         G_SIGNAL_RUN_LAST,
110                         0,
111                         NULL,
112                         NULL,
113                         g_cclosure_marshal_VOID__VOID,
114                         G_TYPE_NONE,
115                         0,
116                         NULL);
117 }
118
119 static void
120 mvs_minfo_provider_init (MvsMInfoProvider *self)
121 {
122         self->priv = GET_PRIVATE (self);
123         self->priv->format = NULL;
124 }
125
126 MvsMInfoProvider*
127 mvs_minfo_provider_new (void)
128 {
129         return g_object_new (MVS_TYPE_MINFO_PROVIDER, NULL);
130 }
131
132 static void
133 parse_response (SoupSession *session, SoupMessage *message,
134                     gpointer user_data)
135 {
136         MvsMInfoProvider *self = MVS_MINFO_PROVIDER (user_data);
137         const gchar *mime = NULL;
138
139         if (!SOUP_STATUS_IS_SUCCESSFUL (message->status_code) ||
140                         message->response_body->length <= 0) {
141
142                 g_print ("%s\n", message->reason_phrase);
143         }
144         else {
145
146                 mime = soup_message_headers_get_content_type
147                                 (message->response_headers, NULL);
148
149                 g_print ("Response OK. Mime type: %s\n", mime);
150                 g_print ("Content:\n%s\n", message->response_body->data);
151         }
152
153         g_signal_emit (self, signals[RESPONSE_RECEIVED], 0);
154 }
155
156 static gchar *
157 get_query_uri (MvsMInfoProvider *self, const char *query)
158 {
159         /* METHOD/LANGUAGE/FORMAT/APIKEY/MOVIENAME */
160         gchar *uri = g_strdup_printf (TMDB_BASE_URL, TMDB_METHOD,
161                         TMDB_LANGUAGE,
162                         self->priv->format,
163                         TMDB_API_KEY,
164                         query);
165
166         return uri;
167 }
168
169 gboolean
170 mvs_minfo_provider_query (MvsMInfoProvider *self,
171                           const gchar *query)
172 {
173         g_return_val_if_fail (MVS_IS_MINFO_PROVIDER (self), FALSE);
174
175         SoupSession *session = NULL;
176         SoupMessage *message = NULL;
177         gboolean message_queued = FALSE;
178
179         gchar *uri = get_query_uri (self, query);
180
181         g_return_val_if_fail (uri, FALSE);
182
183         session = soup_session_async_new ();
184         message = soup_message_new ("GET", uri);
185
186         if (message) {
187                 soup_session_queue_message (session, message,
188                                 parse_response, self);
189                 message_queued = TRUE;
190         }
191
192         g_free (uri);
193
194         return message_queued;
195 }
196
197 gboolean
198 mvs_minfo_provider_set_format (MvsMInfoProvider *self,
199                                const gchar *format)
200 {
201         g_return_val_if_fail (MVS_IS_MINFO_PROVIDER (self), FALSE);
202
203         g_free (self->priv->format);
204
205         self->priv->format = g_strdup (format);
206
207         return TRUE;
208 }