[grilo-plugins] vimeo: Use quvi to get the URL
- From: Juan A. Suarez Romero <jasuarez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo-plugins] vimeo: Use quvi to get the URL
- Date: Thu, 29 Nov 2012 14:16:19 +0000 (UTC)
commit 55c048c28dbbce7849ac70123d8d63f46c4c900b
Author: Juan A. Suarez Romero <jasuarez igalia com>
Date: Thu Nov 29 14:12:14 2012 +0000
vimeo: Use quvi to get the URL
Rely on libquvi to fetch the URL video to play.
configure.ac | 11 +++--
src/vimeo/grl-vimeo.c | 2 +-
src/vimeo/gvimeo.c | 112 +++++++++++++++++-------------------------------
src/vimeo/gvimeo.h | 2 +-
4 files changed, 49 insertions(+), 78 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 2938204..bfebbb1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -720,14 +720,17 @@ AC_ARG_ENABLE(vimeo,
if test "x$HAVE_XML" = "xno"; then
AC_MSG_ERROR([xml2 not found, install it or use --disable-vimeo])
fi
- if test "x$HAVE_GCRYPT" = "xno"; then
+ if test "x$HAVE_GCRYPT" = "xno"; then
AC_MSG_ERROR([libgcrypt not found, install it or use --disable-vimeo])
fi
+ if test "x$HAVE_QUVI" = "xno"; then
+ AC_MSG_ERROR([libquvi not found, install it or use --disable-vimeo])
+ fi
;;
esac
],
[
- if test "x$HAVE_GRLNET" = "xyes" -a "x$HAVE_XML" = "xyes" -a "x$HAVE_GCRYPT" = "xyes"; then
+ if test "x$HAVE_GRLNET" = "xyes" -a "x$HAVE_XML" = "xyes" -a "x$HAVE_GCRYPT" = "xyes" -a "x$HAVE_QUVI" = "xyes"; then
enable_vimeo=yes
else
enable_vimeo=no
@@ -745,9 +748,9 @@ VIMEO_PLUGIN_ID="grl-vimeo"
AC_SUBST(VIMEO_PLUGIN_ID)
AC_DEFINE_UNQUOTED([VIMEO_PLUGIN_ID], ["$VIMEO_PLUGIN_ID"], [Vimeo plugin ID])
-DEPS_VIMEO_CFLAGS="$DEPS_CFLAGS $GRLNET_CFLAGS $XML_CFLAGS $LIBGCRYPT_CFLAGS"
+DEPS_VIMEO_CFLAGS="$DEPS_CFLAGS $GRLNET_CFLAGS $XML_CFLAGS $LIBGCRYPT_CFLAGS $QUVI_CFLAGS"
AC_SUBST(DEPS_VIMEO_CFLAGS)
-DEPS_VIMEO_LIBS="$DEPS_LIBS $GRLNET_LIBS $XML_LIBS $LIBGCRYPT_LIBS"
+DEPS_VIMEO_LIBS="$DEPS_LIBS $GRLNET_LIBS $XML_LIBS $LIBGCRYPT_LIBS $QUVI_LIBS"
AC_SUBST(DEPS_VIMEO_LIBS)
# ----------------------------------------------------------
diff --git a/src/vimeo/grl-vimeo.c b/src/vimeo/grl-vimeo.c
index 1d0b970..0cad2d5 100644
--- a/src/vimeo/grl-vimeo.c
+++ b/src/vimeo/grl-vimeo.c
@@ -343,7 +343,7 @@ search_cb (GVimeo *vimeo, GList *video_list, gpointer user_data)
}
static void
-video_get_play_url_cb (gchar *url, gpointer user_data)
+video_get_play_url_cb (const gchar *url, gpointer user_data)
{
GrlSourceResolveSpec *rs = (GrlSourceResolveSpec *) user_data;
diff --git a/src/vimeo/gvimeo.c b/src/vimeo/gvimeo.c
index 9b96438..e8f595d 100644
--- a/src/vimeo/gvimeo.c
+++ b/src/vimeo/gvimeo.c
@@ -28,6 +28,7 @@
#include <net/grl-net.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
+#include <quvi/quvi.h>
#define G_VIMEO_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE((object), \
@@ -36,9 +37,10 @@
#define PLUGIN_USER_AGENT "Grilo Vimeo Plugin"
-#define VIMEO_ENDPOINT "http://vimeo.com/api/rest/v2"
-#define VIMEO_VIDEO_LOAD_URL "http://vimeo.com/moogaloop/load/clip:"
-#define VIMEO_VIDEO_PLAY_URL "http://vimeo.com/moogaloop/play/clip:"
+#define VIMEO_HOST "http://vimeo.com"
+#define VIMEO_ENDPOINT VIMEO_HOST "/api/rest/v2"
+#define VIMEO_VIDEO_LOAD_URL VIMEO_HOST "/moogaloop/load/clip:"
+#define VIMEO_VIDEO_PLAY_URL VIMEO_HOST "/moogaloop/play/clip:"
#define VIMEO_VIDEO_SEARCH_METHOD "vimeo.videos.search"
#define VIMEO_API_OAUTH_SIGN_METHOD "HMAC-SHA1"
@@ -64,7 +66,7 @@ typedef struct {
typedef struct {
GVimeo *vimeo;
- gint video_id;
+ gchar *vimeo_url;
GVimeoURLCb callback;
gpointer user_data;
} GVimeoVideoURLData;
@@ -74,6 +76,7 @@ struct _GVimeoPrivate {
gchar *auth_token;
gchar *auth_secret;
gint per_page;
+ quvi_t quvi_handler;
GrlNetWc *wc;
};
@@ -118,6 +121,11 @@ g_vimeo_init (GVimeo *vimeo)
{
vimeo->priv = G_VIMEO_GET_PRIVATE (vimeo);
vimeo->priv->per_page = 50;
+ if (quvi_init (&(vimeo->priv->quvi_handler)) != QUVI_OK) {
+ vimeo->priv->quvi_handler = NULL;
+ } else {
+ quvi_setopt (vimeo->priv->quvi_handler, QUVIOPT_NOVERIFY);
+ }
vimeo->priv->wc = grl_net_wc_new ();
g_object_set (vimeo->priv->wc, "user-agent", PLUGIN_USER_AGENT, NULL);
}
@@ -141,6 +149,9 @@ g_vimeo_finalize (GObject *object)
GVimeo *vimeo = G_VIMEO (object);
g_free (vimeo->priv->api_key);
g_free (vimeo->priv->auth_secret);
+ if (vimeo->priv->quvi_handler) {
+ quvi_close (&(vimeo->priv->quvi_handler));
+ }
G_OBJECT_CLASS (g_vimeo_parent_class)->finalize (object);
}
@@ -272,21 +283,6 @@ xpath_get_node (xmlXPathContextPtr context, gchar *xpath_expr)
return node;
}
-static gchar *
-get_node_text (xmlXPathContextPtr context, gchar *xpath_expr)
-{
- xmlNodePtr node;
- gchar *node_text = NULL;
-
- node = xpath_get_node (context, xpath_expr);
- if (node)
- {
- node_text = (gchar *) xmlNodeGetContent (node);
- }
-
- return node_text;
-}
-
static GHashTable *
get_video (xmlNodePtr node)
{
@@ -391,53 +387,33 @@ search_videos_complete_cb (GObject *source_object,
process_video_search_result (content, search_data);
}
-static gchar *
-get_play_url_from_vimeo_xml (const gchar *xml, gint video_id)
-{
- xmlDocPtr doc = xmlRecoverDoc ((xmlChar *) xml);
- xmlXPathContextPtr context = xmlXPathNewContext (doc);
- gchar *request_signature = get_node_text (context,
- "/xml/request_signature[1]");
- gchar *signature_expires = get_node_text (context,
- "/xml/request_signature_expires[1]");
-
- gchar *url = g_strdup_printf ("%s%d/%s/%s/?q=sd",
- VIMEO_VIDEO_PLAY_URL,
- video_id,
- request_signature,
- signature_expires);
-
- g_free (request_signature);
- g_free (signature_expires);
- xmlXPathFreeContext (context);
- xmlFreeDoc (doc);
-
- return url;
-}
-
-static void
-get_video_play_url_complete_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer data)
+static gboolean
+get_video_play_url_cb (GVimeoVideoURLData *url_data)
{
- GVimeoVideoURLData *url_data;
+ QUVIcode rc;
gchar *url = NULL;
- gchar *content = NULL;
-
- url_data = (GVimeoVideoURLData *) data;
-
- if (grl_net_wc_request_finish (GRL_NET_WC (source_object),
- res,
- &content,
- NULL,
- NULL)) {
- url = get_play_url_from_vimeo_xml (content,
- url_data->video_id);
+ quvi_media_t v;
+
+ if (url_data->vimeo->priv->quvi_handler) {
+ rc = quvi_parse (url_data->vimeo->priv->quvi_handler,
+ url_data->vimeo_url,
+ &v);
+ if (rc == QUVI_OK) {
+ rc = quvi_getprop (v, QUVIPROP_MEDIAURL, &url);
+ url_data->callback (url, url_data->user_data);
+ quvi_parse_close (&v);
+ } else {
+ url_data->callback (NULL, url_data->user_data);
+ }
+ } else {
+ url_data->callback (NULL, url_data->user_data);
}
- url_data->callback (url, url_data->user_data);
-
+ g_object_unref (url_data->vimeo);
+ g_free (url_data->vimeo_url);
g_slice_free (GVimeoVideoURLData, url_data);
+
+ return FALSE;
}
static gchar *
@@ -523,20 +499,12 @@ g_vimeo_video_get_play_url (GVimeo *vimeo,
gpointer user_data)
{
GVimeoVideoURLData *data;
- gchar *url = g_strdup_printf ("%s%d",
- VIMEO_VIDEO_LOAD_URL,
- id);
data = g_slice_new (GVimeoVideoURLData);
- data->video_id = id;
- data->vimeo = vimeo;
+ data->vimeo = g_object_ref (vimeo);
+ data->vimeo_url = g_strdup_printf (VIMEO_HOST "/%d", id);
data->callback = callback;
data->user_data = user_data;
- grl_net_wc_request_async (vimeo->priv->wc,
- url,
- NULL,
- get_video_play_url_complete_cb,
- data);
- g_free (url);
+ g_idle_add ((GSourceFunc) get_video_play_url_cb, data);
}
diff --git a/src/vimeo/gvimeo.h b/src/vimeo/gvimeo.h
index 34e17a3..3fd7ad2 100644
--- a/src/vimeo/gvimeo.h
+++ b/src/vimeo/gvimeo.h
@@ -90,7 +90,7 @@ typedef void (*GVimeoVideoSearchCb) (GVimeo *vimeo,
GList *videolist,
gpointer user_data);
-typedef void (*GVimeoURLCb) (gchar *url, gpointer user_data);
+typedef void (*GVimeoURLCb) (const gchar *url, gpointer user_data);
GType g_vimeo_get_type (void);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]