[libgdata] Bug 594814 — Handle GeoRSS for YouTube videos
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata] Bug 594814 — Handle GeoRSS for YouTube videos
- Date: Thu, 16 Dec 2010 12:21:26 +0000 (UTC)
commit 8baf76c36876bd46c4ebe3399bf52d1775078293
Author: Philip Withnall <philip tecnocode co uk>
Date: Thu Dec 16 12:19:52 2010 +0000
Bug 594814 â?? Handle GeoRSS for YouTube videos
Add support for getting and setting the latitude and longitude for YouTube
videos. This adds the following new API:
â?¢ GDataYouTubeVideo:latitude
â?¢ GDataYouTubeVideo:longitude
â?¢ gdata_youtube_video_get_coordinates()
â?¢ gdata_youtube_video_set_coordinates()
Closes: bgo#594814
docs/reference/gdata-sections.txt | 2 +
gdata/gdata.symbols | 2 +
gdata/services/youtube/gdata-youtube-video.c | 122 ++++++++++++++++++++++-
gdata/services/youtube/gdata-youtube-video.h | 2 +
gdata/tests/youtube.c | 135 +++++++++++++++++++++++++-
5 files changed, 257 insertions(+), 6 deletions(-)
---
diff --git a/docs/reference/gdata-sections.txt b/docs/reference/gdata-sections.txt
index 911ee4c..34d0235 100644
--- a/docs/reference/gdata-sections.txt
+++ b/docs/reference/gdata-sections.txt
@@ -256,6 +256,8 @@ gdata_youtube_video_get_video_id
gdata_youtube_video_get_video_id_from_uri
gdata_youtube_video_get_aspect_ratio
gdata_youtube_video_set_aspect_ratio
+gdata_youtube_video_get_coordinates
+gdata_youtube_video_set_coordinates
<SUBSECTION Standard>
GDATA_IS_YOUTUBE_VIDEO
GDATA_IS_YOUTUBE_VIDEO_CLASS
diff --git a/gdata/gdata.symbols b/gdata/gdata.symbols
index 77a1070..1d05b77 100644
--- a/gdata/gdata.symbols
+++ b/gdata/gdata.symbols
@@ -860,3 +860,5 @@ gdata_contacts_contact_get_photo_async
gdata_contacts_contact_get_photo_finish
gdata_contacts_contact_set_photo_async
gdata_contacts_contact_set_photo_finish
+gdata_youtube_video_get_coordinates
+gdata_youtube_video_set_coordinates
diff --git a/gdata/services/youtube/gdata-youtube-video.c b/gdata/services/youtube/gdata-youtube-video.c
index 5bc7929..a381195 100644
--- a/gdata/services/youtube/gdata-youtube-video.c
+++ b/gdata/services/youtube/gdata-youtube-video.c
@@ -78,6 +78,7 @@
#include "gdata-types.h"
#include "gdata-youtube-control.h"
#include "gdata-youtube-enums.h"
+#include "georss/gdata-georss-where.h"
static GObject *gdata_youtube_video_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params);
static void gdata_youtube_video_dispose (GObject *object);
@@ -107,6 +108,9 @@ struct _GDataYouTubeVideoPrivate {
/* media:group */
GDataMediaGroup *media_group; /* is actually a GDataYouTubeGroup */
+ /* georss:where */
+ GDataGeoRSSWhere *georss_where;
+
/* Other properties */
GDataYouTubeControl *youtube_control;
gint64 recorded;
@@ -132,7 +136,9 @@ enum {
PROP_IS_DRAFT,
PROP_STATE,
PROP_RECORDED,
- PROP_ASPECT_RATIO
+ PROP_ASPECT_RATIO,
+ PROP_LATITUDE,
+ PROP_LONGITUDE
};
G_DEFINE_TYPE (GDataYouTubeVideo, gdata_youtube_video, GDATA_TYPE_ENTRY)
@@ -445,6 +451,40 @@ gdata_youtube_video_class_init (GDataYouTubeVideoClass *klass)
"Aspect Ratio", "The aspect ratio of the video.",
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GDataYouTubeVideo:latitude:
+ *
+ * The location as a latitude coordinate associated with this video. Valid latitudes range from <code class="literal">-90.0</code>
+ * to <code class="literal">90.0</code> inclusive.
+ *
+ * For more information, see the <ulink type="http" url="http://code.google.com/apis/youtube/2.0/reference.html#GeoRSS_elements_reference">
+ * GeoRSS specification</ulink>.
+ *
+ * Since: 0.8.0
+ **/
+ g_object_class_install_property (gobject_class, PROP_LATITUDE,
+ g_param_spec_double ("latitude",
+ "Latitude", "The location as a latitude coordinate associated with this video.",
+ -90.0, 90.0, 0.0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GDataYouTubeVideo:longitude:
+ *
+ * The location as a longitude coordinate associated with this video. Valid longitudes range from <code class="literal">-180.0</code>
+ * to <code class="literal">180.0</code> inclusive.
+ *
+ * For more information, see the <ulink type="http" url="http://code.google.com/apis/youtube/2.0/reference.html#GeoRSS_elements_reference">
+ * GeoRSS specification</ulink>.
+ *
+ * Since: 0.8.0
+ **/
+ g_object_class_install_property (gobject_class, PROP_LONGITUDE,
+ g_param_spec_double ("longitude",
+ "Longitude", "The location as a longitude coordinate associated with this video.",
+ -180.0, 180.0, 0.0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static void
@@ -461,6 +501,7 @@ gdata_youtube_video_init (GDataYouTubeVideo *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_YOUTUBE_VIDEO, GDataYouTubeVideoPrivate);
self->priv->recorded = -1;
self->priv->access_controls = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, NULL);
+ self->priv->georss_where = g_object_new (GDATA_TYPE_GEORSS_WHERE, NULL);
/* The video's title is duplicated between atom:title and media:group/media:title, so listen for change notifications on atom:title
* and propagate them to media:group/media:title accordingly. Since the media group isn't publically accessible, we don't need to
@@ -495,6 +536,10 @@ gdata_youtube_video_dispose (GObject *object)
g_object_unref (priv->media_group);
priv->media_group = NULL;
+ if (priv->georss_where != NULL)
+ g_object_unref (priv->georss_where);
+ priv->georss_where = NULL;
+
if (priv->youtube_control != NULL)
g_object_unref (priv->youtube_control);
priv->youtube_control = NULL;
@@ -581,6 +626,12 @@ gdata_youtube_video_get_property (GObject *object, guint property_id, GValue *va
case PROP_ASPECT_RATIO:
g_value_set_string (value, gdata_youtube_group_get_aspect_ratio (GDATA_YOUTUBE_GROUP (priv->media_group)));
break;
+ case PROP_LATITUDE:
+ g_value_set_double (value, gdata_georss_where_get_latitude (priv->georss_where));
+ break;
+ case PROP_LONGITUDE:
+ g_value_set_double (value, gdata_georss_where_get_longitude (priv->georss_where));
+ break;
default:
/* We don't have any other property... */
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -618,6 +669,14 @@ gdata_youtube_video_set_property (GObject *object, guint property_id, const GVal
case PROP_ASPECT_RATIO:
gdata_youtube_video_set_aspect_ratio (self, g_value_get_string (value));
break;
+ case PROP_LATITUDE:
+ gdata_youtube_video_set_coordinates (self, g_value_get_double (value),
+ gdata_georss_where_get_longitude (self->priv->georss_where));
+ break;
+ case PROP_LONGITUDE:
+ gdata_youtube_video_set_coordinates (self, gdata_georss_where_get_latitude (self->priv->georss_where),
+ g_value_get_double (value));
+ break;
default:
/* We don't have any other property... */
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -639,6 +698,10 @@ parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_da
gdata_parser_object_from_element (node, "control", P_REQUIRED | P_NO_DUPES, GDATA_TYPE_YOUTUBE_CONTROL,
&(self->priv->youtube_control), &success, error) == TRUE) {
return success;
+ } else if (gdata_parser_is_namespace (node, "http://www.georss.org/georss") == TRUE &&
+ gdata_parser_object_from_element (node, "where", P_REQUIRED, GDATA_TYPE_GEORSS_WHERE,
+ &(self->priv->georss_where), &success, error) == TRUE) {
+ return success;
} else if (gdata_parser_is_namespace (node, "http://gdata.youtube.com/schemas/2007") == TRUE) {
if (gdata_parser_string_from_element (node, "location", P_NONE, &(self->priv->location), &success, error) == TRUE) {
return success;
@@ -818,9 +881,11 @@ get_xml (GDataParsable *parsable, GString *xml_string)
/* app:control */
_gdata_parsable_get_xml (GDATA_PARSABLE (priv->youtube_control), xml_string, FALSE);
- /* TODO:
- * - georss:where
- */
+ /* georss:where */
+ if (priv->georss_where != NULL && gdata_georss_where_get_latitude (priv->georss_where) != G_MAXDOUBLE &&
+ gdata_georss_where_get_longitude (priv->georss_where) != G_MAXDOUBLE) {
+ _gdata_parsable_get_xml (GDATA_PARSABLE (priv->georss_where), xml_string, FALSE);
+ }
}
static void
@@ -833,9 +898,10 @@ get_namespaces (GDataParsable *parsable, GHashTable *namespaces)
g_hash_table_insert (namespaces, (gchar*) "yt", (gchar*) "http://gdata.youtube.com/schemas/2007");
- /* Add the media:group and app:control namespaces */
+ /* Add the media:group, app:control and georss:where namespaces */
GDATA_PARSABLE_GET_CLASS (priv->media_group)->get_namespaces (GDATA_PARSABLE (priv->media_group), namespaces);
GDATA_PARSABLE_GET_CLASS (priv->youtube_control)->get_namespaces (GDATA_PARSABLE (priv->youtube_control), namespaces);
+ GDATA_PARSABLE_GET_CLASS (priv->georss_where)->get_namespaces (GDATA_PARSABLE (priv->georss_where), namespaces);
}
static gchar *
@@ -1463,3 +1529,49 @@ gdata_youtube_video_set_aspect_ratio (GDataYouTubeVideo *self, const gchar *aspe
gdata_youtube_group_set_aspect_ratio (GDATA_YOUTUBE_GROUP (self->priv->media_group), aspect_ratio);
g_object_notify (G_OBJECT (self), "aspect-ratio");
}
+
+/**
+ * gdata_youtube_video_get_coordinates:
+ * @self: a #GDataYouTubeVideo
+ * @latitude: (out caller-allocates) (allow-none): return location for the latitude, or %NULL
+ * @longitude: (out caller-allocates) (allow-none): return location for the longitude, or %NULL
+ *
+ * Gets the #GDataYouTubeVideo:latitude and #GDataYouTubeVideo:longitude properties, setting the out parameters to them. If either latitude or
+ * longitude is %NULL, that parameter will not be set. If the coordinates are unset, @latitude and @longitude will be set to %G_MAXDOUBLE.
+ *
+ * Since: 0.8.0
+ **/
+void
+gdata_youtube_video_get_coordinates (GDataYouTubeVideo *self, gdouble *latitude, gdouble *longitude)
+{
+ g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
+
+ if (latitude != NULL)
+ *latitude = gdata_georss_where_get_latitude (self->priv->georss_where);
+ if (longitude != NULL)
+ *longitude = gdata_georss_where_get_longitude (self->priv->georss_where);
+}
+
+/**
+ * gdata_youtube_video_set_coordinates:
+ * @self: a #GDataYouTubeVideo
+ * @latitude: the video's new latitude coordinate, or %G_MAXDOUBLE
+ * @longitude: the video's new longitude coordinate, or %G_MAXDOUBLE
+ *
+ * Sets the #GDataYouTubeVideo:latitude and #GDataYouTubeVideo:longitude properties to @latitude and @longitude respectively.
+ *
+ * Since: 0.8.0
+ **/
+void
+gdata_youtube_video_set_coordinates (GDataYouTubeVideo *self, gdouble latitude, gdouble longitude)
+{
+ g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
+
+ gdata_georss_where_set_latitude (self->priv->georss_where, latitude);
+ gdata_georss_where_set_longitude (self->priv->georss_where, longitude);
+
+ g_object_freeze_notify (G_OBJECT (self));
+ g_object_notify (G_OBJECT (self), "latitude");
+ g_object_notify (G_OBJECT (self), "longitude");
+ g_object_thaw_notify (G_OBJECT (self));
+}
diff --git a/gdata/services/youtube/gdata-youtube-video.h b/gdata/services/youtube/gdata-youtube-video.h
index cb29a55..6fbce5e 100644
--- a/gdata/services/youtube/gdata-youtube-video.h
+++ b/gdata/services/youtube/gdata-youtube-video.h
@@ -179,6 +179,8 @@ gint64 gdata_youtube_video_get_recorded (GDataYouTubeVideo *self);
void gdata_youtube_video_set_recorded (GDataYouTubeVideo *self, gint64 recorded);
const gchar *gdata_youtube_video_get_aspect_ratio (GDataYouTubeVideo *self) G_GNUC_PURE;
void gdata_youtube_video_set_aspect_ratio (GDataYouTubeVideo *self, const gchar *aspect_ratio);
+void gdata_youtube_video_get_coordinates (GDataYouTubeVideo *self, gdouble *latitude, gdouble *longitude);
+void gdata_youtube_video_set_coordinates (GDataYouTubeVideo *self, gdouble latitude, gdouble longitude);
gchar *gdata_youtube_video_get_video_id_from_uri (const gchar *video_uri) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
diff --git a/gdata/tests/youtube.c b/gdata/tests/youtube.c
index d94c4bf..2056fec 100644
--- a/gdata/tests/youtube.c
+++ b/gdata/tests/youtube.c
@@ -542,6 +542,8 @@ test_parsing_yt_recorded (void)
"xmlns:gd='http://schemas.google.com/g/2005' "
"xmlns:yt='http://gdata.youtube.com/schemas/2007' "
"xmlns:app='http://www.w3.org/2007/app' "
+ "xmlns:georss='http://www.georss.org/georss' "
+ "xmlns:gml='http://www.opengis.net/gml' "
"gd:etag='W/\"CEMFSX47eCp7ImA9WxVUGEw.\"'>"
"<title type='text'>Judas Priest - Painkiller</title>"
"<id>tag:youtube.com,2008:video:JAagedeKdcQ</id>"
@@ -628,6 +630,8 @@ test_parsing_yt_access_control (void)
"xmlns:gd='http://schemas.google.com/g/2005' "
"xmlns:yt='http://gdata.youtube.com/schemas/2007' "
"xmlns:app='http://www.w3.org/2007/app' "
+ "xmlns:georss='http://www.georss.org/georss' "
+ "xmlns:gml='http://www.opengis.net/gml' "
"gd:etag='W/\"CEMFSX47eCp7ImA9WxVUGEw.\"'>"
"<title type='text'>Judas Priest - Painkiller</title>"
"<id>tag:youtube.com,2008:video:JAagedeKdcQ</id>"
@@ -764,6 +768,133 @@ test_parsing_comments_feed_link (void)
}*/
static void
+test_parsing_georss_where (void)
+{
+ GDataYouTubeVideo *video;
+ gdouble latitude, longitude;
+ GError *error = NULL;
+
+ video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_xml (GDATA_TYPE_YOUTUBE_VIDEO,
+ "<entry xmlns='http://www.w3.org/2005/Atom' "
+ "xmlns:media='http://search.yahoo.com/mrss/' "
+ "xmlns:yt='http://gdata.youtube.com/schemas/2007' "
+ "xmlns:gd='http://schemas.google.com/g/2005' "
+ "xmlns:georss='http://www.georss.org/georss' "
+ "xmlns:gml='http://www.opengis.net/gml'>"
+ "<id>tag:youtube.com,2008:video:JAagedeKdcQ</id>"
+ "<published>2006-05-16T14:06:37.000Z</published>"
+ "<updated>2009-03-23T12:46:58.000Z</updated>"
+ "<category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>"
+ "<title>Some video somewhere</title>"
+ "<link rel='http://www.iana.org/assignments/relation/alternate' type='text/html' href='http://www.youtube.com/watch?v=JAagedeKdcQ'/>"
+ "<link rel='http://www.iana.org/assignments/relation/self' type='application/atom+xml' href='http://gdata.youtube.com/feeds/api/videos/JAagedeKdcQ?client=ytapi-google-jsdemo'/>"
+ "<author>"
+ "<name>Foo</name>"
+ "<uri>http://gdata.youtube.com/feeds/api/users/Foo</uri>"
+ "</author>"
+ "<media:group>"
+ "<media:title type='plain'>Some video somewhere</media:title>"
+ "<media:credit role='uploader' scheme='urn:youtube'>Foo</media:credit>"
+ "<media:category label='Music' scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>Music</media:category>"
+ "</media:group>"
+ "<georss:where>"
+ "<gml:Point>"
+ "<gml:pos>41.14556884765625 -8.63525390625</gml:pos>"
+ "</gml:Point>"
+ "</georss:where>"
+ "</entry>", -1, &error));
+ g_assert_no_error (error);
+ g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
+ g_clear_error (&error);
+
+ /* Test the coordinates */
+ gdata_youtube_video_get_coordinates (video, &latitude, &longitude);
+ g_assert_cmpfloat (latitude, ==, 41.14556884765625);
+ g_assert_cmpfloat (longitude, ==, -8.63525390625);
+
+ /* Update them and see if they're set OK and the XML's written out OK */
+ gdata_youtube_video_set_coordinates (video, 5.5, 6.5);
+
+ g_object_get (G_OBJECT (video),
+ "latitude", &latitude,
+ "longitude", &longitude,
+ NULL);
+
+ g_assert_cmpfloat (latitude, ==, 5.5);
+ g_assert_cmpfloat (longitude, ==, 6.5);
+
+ /* Check the XML */
+ gdata_test_assert_xml (video,
+ "<?xml version='1.0' encoding='UTF-8'?>"
+ "<entry xmlns='http://www.w3.org/2005/Atom' "
+ "xmlns:app='http://www.w3.org/2007/app' "
+ "xmlns:media='http://search.yahoo.com/mrss/' "
+ "xmlns:yt='http://gdata.youtube.com/schemas/2007' "
+ "xmlns:gd='http://schemas.google.com/g/2005' "
+ "xmlns:georss='http://www.georss.org/georss' "
+ "xmlns:gml='http://www.opengis.net/gml'>"
+ "<title type='text'>Some video somewhere</title>"
+ "<id>tag:youtube.com,2008:video:JAagedeKdcQ</id>"
+ "<updated>2009-03-23T12:46:58Z</updated>"
+ "<published>2006-05-16T14:06:37Z</published>"
+ "<category term='http://gdata.youtube.com/schemas/2007#video' scheme='http://schemas.google.com/g/2005#kind'/>"
+ "<link href='http://www.youtube.com/watch?v=JAagedeKdcQ' rel='http://www.iana.org/assignments/relation/alternate' type='text/html'/>"
+ "<link href='http://gdata.youtube.com/feeds/api/videos/JAagedeKdcQ?client=ytapi-google-jsdemo' rel='http://www.iana.org/assignments/relation/self' type='application/atom+xml'/>"
+ "<author>"
+ "<name>Foo</name>"
+ "<uri>http://gdata.youtube.com/feeds/api/users/Foo</uri>"
+ "</author>"
+ "<media:group>"
+ "<media:category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' label='Music'>Music</media:category>"
+ "<media:title type='plain'>Some video somewhere</media:title>"
+ "</media:group>"
+ "<app:control><app:draft>no</app:draft></app:control>"
+ "<georss:where>"
+ "<gml:Point>"
+ "<gml:pos>5.5 6.5</gml:pos>"
+ "</gml:Point>"
+ "</georss:where>"
+ "</entry>");
+
+ /* Unset the properties and ensure they're removed from the XML */
+ gdata_youtube_video_set_coordinates (video, G_MAXDOUBLE, G_MAXDOUBLE);
+
+ gdata_youtube_video_get_coordinates (video, &latitude, &longitude);
+ g_assert_cmpfloat (latitude, ==, G_MAXDOUBLE);
+ g_assert_cmpfloat (longitude, ==, G_MAXDOUBLE);
+
+ /* Check the XML */
+ gdata_test_assert_xml (video,
+ "<?xml version='1.0' encoding='UTF-8'?>"
+ "<entry xmlns='http://www.w3.org/2005/Atom' "
+ "xmlns:app='http://www.w3.org/2007/app' "
+ "xmlns:media='http://search.yahoo.com/mrss/' "
+ "xmlns:yt='http://gdata.youtube.com/schemas/2007' "
+ "xmlns:gd='http://schemas.google.com/g/2005' "
+ "xmlns:georss='http://www.georss.org/georss' "
+ "xmlns:gml='http://www.opengis.net/gml'>"
+ "<title type='text'>Some video somewhere</title>"
+ "<id>tag:youtube.com,2008:video:JAagedeKdcQ</id>"
+ "<updated>2009-03-23T12:46:58Z</updated>"
+ "<published>2006-05-16T14:06:37Z</published>"
+ "<category term='http://gdata.youtube.com/schemas/2007#video' scheme='http://schemas.google.com/g/2005#kind'/>"
+ "<link href='http://www.youtube.com/watch?v=JAagedeKdcQ' rel='http://www.iana.org/assignments/relation/alternate' type='text/html'/>"
+ "<link href='http://gdata.youtube.com/feeds/api/videos/JAagedeKdcQ?client=ytapi-google-jsdemo' rel='http://www.iana.org/assignments/relation/self' type='application/atom+xml'/>"
+ "<author>"
+ "<name>Foo</name>"
+ "<uri>http://gdata.youtube.com/feeds/api/users/Foo</uri>"
+ "</author>"
+ "<media:group>"
+ "<media:category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' label='Music'>Music</media:category>"
+ "<media:title type='plain'>Some video somewhere</media:title>"
+ "</media:group>"
+ "<app:control><app:draft>no</app:draft></app:control>"
+ "</entry>");
+
+ g_object_unref (video);
+}
+
+static void
test_video_escaping (void)
{
GDataYouTubeVideo *video;
@@ -781,7 +912,8 @@ test_video_escaping (void)
"<?xml version='1.0' encoding='UTF-8'?>"
"<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' "
"xmlns:gd='http://schemas.google.com/g/2005' "
- "xmlns:yt='http://gdata.youtube.com/schemas/2007' xmlns:app='http://www.w3.org/2007/app'>"
+ "xmlns:yt='http://gdata.youtube.com/schemas/2007' xmlns:app='http://www.w3.org/2007/app' "
+ "xmlns:georss='http://www.georss.org/georss' xmlns:gml='http://www.opengis.net/gml'>"
"<title type='text'></title>"
"<category term='http://gdata.youtube.com/schemas/2007#video' scheme='http://schemas.google.com/g/2005#kind'/>"
"<media:group>"
@@ -1264,6 +1396,7 @@ main (int argc, char *argv[])
g_test_add_func ("/youtube/parsing/yt:accessControl", test_parsing_yt_access_control);
g_test_add_func ("/youtube/parsing/yt:category", test_parsing_yt_category);
g_test_add_func ("/youtube/parsing/video_id_from_uri", test_parsing_video_id_from_uri);
+ g_test_add_func ("/youtube/parsing/georss:where", test_parsing_georss_where);
g_test_add_func ("/youtube/video/escaping", test_video_escaping);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]