[grilo-plugins] vimeo: Use quvi to get the URL



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]