From 950828f2cb83e9fff90ec096f03074ad1788a0bc Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Sun, 19 Apr 2015 18:24:22 +0100 Subject: youtube: Add a GDataYouTubeFeed helper class for parsing feeds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This parses YouTube-specific properties of the feed — specifically, the total-results and items-per-page, which were previously handled in a service-agnostic manner by GDataFeed, but YouTube doesn’t conform to that. This adds the following new API: • GDataYouTubeFeed --- Makefile.am | 4 +- docs/reference/gdata-docs.xml | 1 + docs/reference/gdata-sections.txt | 17 +++++ gdata/gdata.h | 1 + gdata/gdata.symbols | 1 + gdata/services/youtube/gdata-youtube-feed.c | 102 +++++++++++++++++++++++++ gdata/services/youtube/gdata-youtube-feed.h | 74 ++++++++++++++++++ gdata/services/youtube/gdata-youtube-service.c | 2 + 8 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 gdata/services/youtube/gdata-youtube-feed.c create mode 100644 gdata/services/youtube/gdata-youtube-feed.h diff --git a/Makefile.am b/Makefile.am index 964ac4b6..1e1e0096 100644 --- a/Makefile.am +++ b/Makefile.am @@ -321,7 +321,8 @@ gdata_youtube_headers = \ gdata/services/youtube/gdata-youtube-query.h \ gdata/services/youtube/gdata-youtube-state.h \ gdata/services/youtube/gdata-youtube-category.h \ - gdata/services/youtube/gdata-youtube-comment.h + gdata/services/youtube/gdata-youtube-comment.h \ + gdata/services/youtube/gdata-youtube-feed.h private_headers += \ gdata/services/youtube/gdata-youtube-group.h \ gdata/services/youtube/gdata-youtube-control.h @@ -453,6 +454,7 @@ gdata_sources = \ gdata/services/youtube/gdata-youtube-control.c \ gdata/services/youtube/gdata-youtube-category.c \ gdata/services/youtube/gdata-youtube-comment.c \ + gdata/services/youtube/gdata-youtube-feed.c \ \ gdata/services/tasks/gdata-tasks-service.c \ gdata/services/tasks/gdata-tasks-tasklist.c \ diff --git a/docs/reference/gdata-docs.xml b/docs/reference/gdata-docs.xml index 2e4e0771..5233faa1 100644 --- a/docs/reference/gdata-docs.xml +++ b/docs/reference/gdata-docs.xml @@ -128,6 +128,7 @@ YouTube API + diff --git a/docs/reference/gdata-sections.txt b/docs/reference/gdata-sections.txt index 0c109c21..22f78693 100644 --- a/docs/reference/gdata-sections.txt +++ b/docs/reference/gdata-sections.txt @@ -2795,3 +2795,20 @@ gdata_oauth2_authorizer_get_type GDataOAuth2AuthorizerPrivate + +
+gdata-youtube-feed +GDataYouTubeFeed +GDataYouTubeFeed +GDataYouTubeFeedClass + +gdata_youtube_feed_get_type +GDATA_YOUTUBE_FEED +GDATA_YOUTUBE_FEED_CLASS +GDATA_YOUTUBE_FEED_GET_CLASS +GDATA_IS_YOUTUBE_FEED +GDATA_IS_YOUTUBE_FEED_CLASS +GDATA_TYPE_YOUTUBE_FEED + +GDataYouTubeFeedPrivate +
diff --git a/gdata/gdata.h b/gdata/gdata.h index fe7a4c3a..e74dd06c 100644 --- a/gdata/gdata.h +++ b/gdata/gdata.h @@ -91,6 +91,7 @@ /* YouTube */ #include +#include #include #include #include diff --git a/gdata/gdata.symbols b/gdata/gdata.symbols index 7ae3e955..830f0bf3 100644 --- a/gdata/gdata.symbols +++ b/gdata/gdata.symbols @@ -95,6 +95,7 @@ gdata_query_set_max_results gdata_query_get_etag gdata_query_set_etag gdata_youtube_standard_feed_type_get_type +gdata_youtube_feed_get_type gdata_youtube_service_error_get_type gdata_youtube_service_error_quark gdata_youtube_service_get_type diff --git a/gdata/services/youtube/gdata-youtube-feed.c b/gdata/services/youtube/gdata-youtube-feed.c new file mode 100644 index 00000000..469c5ae4 --- /dev/null +++ b/gdata/services/youtube/gdata-youtube-feed.c @@ -0,0 +1,102 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * GData Client + * Copyright (C) Philip Withnall 2015 + * + * GData Client is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * GData Client 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GData Client. If not, see . + */ + +/** + * SECTION:gdata-youtube-feed + * @short_description: GData YouTube feed object + * @stability: Stable + * @include: gdata/services/youtube/gdata-youtube-feed.h + * + * #GDataYouTubeFeed is a list of entries (#GDataYouTubeVideo subclasses) + * returned as the result of a query to a #GDataYouTubeService, or given as the + * input to another operation on the online service. + * + * Each #GDataYouTubeVideo represents a single video on YouTube, and the + * #GDataYouTubeFeed represents a collection of those objects. + * + * Since: UNRELEASED + */ + +#include +#include +#include +#include + +#include "gdata-youtube-feed.h" +#include "gdata-youtube-video.h" +#include "gdata-types.h" +#include "gdata-private.h" +#include "gdata-service.h" + +static gboolean +parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, + GError **error); + +G_DEFINE_TYPE (GDataYouTubeFeed, gdata_youtube_feed, GDATA_TYPE_FEED) + +static void +gdata_youtube_feed_class_init (GDataYouTubeFeedClass *klass) +{ + GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass); + parsable_class->parse_json = parse_json; +} + +static void +gdata_youtube_feed_init (GDataYouTubeFeed *self) +{ + /* Move along now. */ +} + +static gboolean +parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, + GError **error) +{ + if (g_strcmp0 (json_reader_get_member_name (reader), "pageInfo") == 0) { + guint total_results, items_per_page; + const GError *child_error = NULL; + + /* Check this is an object. */ + if (!json_reader_is_object (reader)) { + return gdata_parser_error_required_json_content_missing (reader, error); + } + + /* https://developers.google.com/youtube/v3/docs/playlists/list/ */ + json_reader_read_member (reader, "totalResults"); + total_results = json_reader_get_int_value (reader); + json_reader_end_member (reader); + + json_reader_read_member (reader, "resultsPerPage"); + items_per_page = json_reader_get_int_value (reader); + json_reader_end_member (reader); + + child_error = json_reader_get_error (reader); + if (child_error != NULL) { + return gdata_parser_error_from_json_error (reader, + child_error, + error); + } + + _gdata_feed_set_page_info (GDATA_FEED (parsable), total_results, + items_per_page); + + return TRUE; + } else { + return GDATA_PARSABLE_CLASS (gdata_youtube_feed_parent_class)->parse_json (parsable, reader, user_data, error); + } +} diff --git a/gdata/services/youtube/gdata-youtube-feed.h b/gdata/services/youtube/gdata-youtube-feed.h new file mode 100644 index 00000000..0ab173b8 --- /dev/null +++ b/gdata/services/youtube/gdata-youtube-feed.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * GData Client + * Copyright (C) Philip Withnall 2015 + * + * GData Client is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * GData Client 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GData Client. If not, see . + */ + +#ifndef GDATA_YOUTUBE_FEED_H +#define GDATA_YOUTUBE_FEED_H + +#include +#include +#include + +G_BEGIN_DECLS + +#define GDATA_TYPE_YOUTUBE_FEED (gdata_youtube_feed_get_type ()) +#define GDATA_YOUTUBE_FEED(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDATA_TYPE_YOUTUBE_FEED, GDataYouTubeFeed)) +#define GDATA_YOUTUBE_FEED_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDATA_TYPE_YOUTUBE_FEED, GDataYouTubeFeedClass)) +#define GDATA_IS_YOUTUBE_FEED(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDATA_TYPE_YOUTUBE_FEED)) +#define GDATA_IS_YOUTUBE_FEED_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDATA_TYPE_YOUTUBE_FEED)) +#define GDATA_YOUTUBE_FEED_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDATA_TYPE_YOUTUBE_FEED, GDataYouTubeFeedClass)) + +typedef struct _GDataYouTubeFeedPrivate GDataYouTubeFeedPrivate; + +/** + * GDataYouTubeFeed: + * + * All the fields in the #GDataYouTubeFeed structure are private and should + * never be accessed directly. + * + * Since: UNRELEASED + */ +typedef struct { + /*< private >*/ + GDataFeed parent; + GDataYouTubeFeedPrivate *priv; +} GDataYouTubeFeed; + +/** + * GDataYouTubeFeedClass: + * + * All the fields in the #GDataYouTubeFeedClass structure are private and should + * never be accessed directly. + * + * Since: UNRELEASED + */ +typedef struct { + /*< private >*/ + GDataFeedClass parent; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved0) (void); + void (*_g_reserved1) (void); +} GDataYouTubeFeedClass; + +GType gdata_youtube_feed_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* !GDATA_YOUTUBE_FEED_H */ diff --git a/gdata/services/youtube/gdata-youtube-service.c b/gdata/services/youtube/gdata-youtube-service.c index e1210ae4..7e54fafa 100644 --- a/gdata/services/youtube/gdata-youtube-service.c +++ b/gdata/services/youtube/gdata-youtube-service.c @@ -244,6 +244,7 @@ #include #include "gdata-youtube-service.h" +#include "gdata-youtube-feed.h" #include "gdata-service.h" #include "gdata-private.h" #include "gdata-parser.h" @@ -292,6 +293,7 @@ gdata_youtube_service_class_init (GDataYouTubeServiceClass *klass) gobject_class->get_property = gdata_youtube_service_get_property; gobject_class->finalize = gdata_youtube_service_finalize; + service_class->feed_type = GDATA_TYPE_YOUTUBE_FEED; service_class->append_query_headers = append_query_headers; service_class->parse_error_response = parse_error_response; service_class->get_authorization_domains = get_authorization_domains; -- cgit v1.2.1