|
Packit |
4b6dd7 |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
4b6dd7 |
/*
|
|
Packit |
4b6dd7 |
* GData Client
|
|
Packit |
4b6dd7 |
* Copyright (C) Philip Withnall 2008–2010, 2015 <philip@tecnocode.co.uk>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is free software; you can redistribute it and/or
|
|
Packit |
4b6dd7 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License as published by the Free Software Foundation; either
|
|
Packit |
4b6dd7 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is distributed in the hope that it will be useful,
|
|
Packit |
4b6dd7 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4b6dd7 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4b6dd7 |
* Lesser General Public License for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License along with GData Client. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* SECTION:gdata-youtube-video
|
|
Packit |
4b6dd7 |
* @short_description: GData YouTube video object
|
|
Packit |
4b6dd7 |
* @stability: Stable
|
|
Packit |
4b6dd7 |
* @include: gdata/services/youtube/gdata-youtube-video.h
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataYouTubeVideo is a subclass of #GDataEntry to represent a single video on YouTube, either when uploading or querying.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataYouTubeVideo implements #GDataCommentable, allowing comments on videos
|
|
Packit |
4b6dd7 |
* to be queried and added.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details of YouTube’s GData API, see the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/youtube/v3/docs/">
|
|
Packit |
4b6dd7 |
* online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Getting Basic Video Data</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo *video;
|
|
Packit |
4b6dd7 |
* const gchar *video_id, *title, *player_uri, *description, *video_uri = NULL;
|
|
Packit |
4b6dd7 |
* gint64 updated, published;
|
|
Packit |
4b6dd7 |
* GDataMediaContent *content;
|
|
Packit |
4b6dd7 |
* GList *thumbnails;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* video = gdata_youtube_service_query_single_video (service, NULL, "R-9gzmQHoe0", NULL, NULL);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* video_id = gdata_entry_get_id (GDATA_ENTRY (video)); /* e.g. "R-9gzmQHoe0" */
|
|
Packit |
4b6dd7 |
* title = gdata_entry_get_title (GDATA_ENTRY (video)); /* e.g. "Korpiklaani Vodka (official video 2009)" */
|
|
Packit |
4b6dd7 |
* player_uri = gdata_youtube_video_get_player_uri (video); /* e.g. "http://www.youtube.com/watch?v=ZTUVgYoeN_b" */
|
|
Packit |
4b6dd7 |
* description = gdata_youtube_video_get_description (video); /* e.g. "Vodka is the first single from the album..." */
|
|
Packit |
4b6dd7 |
* published = gdata_entry_get_published (GDATA_ENTRY (video)); /* Date and time the video was originally published */
|
|
Packit |
4b6dd7 |
* updated = gdata_entry_get_updated (GDATA_ENTRY (video)); /* When the video was most recently updated by the author */
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Get a list of GDataMediaThumbnails for the video */
|
|
Packit |
4b6dd7 |
* for (thumbnails = gdata_youtube_video_get_thumbnails (video); thumbnails != NULL; thumbnails = thumbnails->next)
|
|
Packit |
4b6dd7 |
* download_and_do_something_with_thumbnail (gdata_media_thumbnail_get_uri (thumbnail));
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (video);
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <config.h>
|
|
Packit |
4b6dd7 |
#include <glib.h>
|
|
Packit |
4b6dd7 |
#include <glib/gi18n-lib.h>
|
|
Packit |
4b6dd7 |
#include <json-glib/json-glib.h>
|
|
Packit |
4b6dd7 |
#include <string.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include "gdata-youtube-video.h"
|
|
Packit |
4b6dd7 |
#include "gdata-private.h"
|
|
Packit |
4b6dd7 |
#include "gdata-service.h"
|
|
Packit |
4b6dd7 |
#include "gdata-parser.h"
|
|
Packit |
4b6dd7 |
#include "media/gdata-media-category.h"
|
|
Packit |
4b6dd7 |
#include "media/gdata-media-thumbnail.h"
|
|
Packit |
4b6dd7 |
#include "gdata-types.h"
|
|
Packit |
4b6dd7 |
#include "gdata-youtube-enums.h"
|
|
Packit |
4b6dd7 |
#include "gdata-commentable.h"
|
|
Packit |
4b6dd7 |
#include "gdata-youtube-comment.h"
|
|
Packit |
4b6dd7 |
#include "gdata-youtube-service.h"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void gdata_youtube_video_dispose (GObject *object);
|
|
Packit |
4b6dd7 |
static void gdata_youtube_video_finalize (GObject *object);
|
|
Packit |
4b6dd7 |
static void gdata_youtube_video_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static void gdata_youtube_video_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error);
|
|
Packit |
4b6dd7 |
static gboolean post_parse_json (GDataParsable *parsable, gpointer user_data, GError **error);
|
|
Packit |
4b6dd7 |
static void get_json (GDataParsable *parsable, JsonBuilder *builder);
|
|
Packit |
4b6dd7 |
static const gchar *get_content_type (void);
|
|
Packit |
4b6dd7 |
static gchar *get_entry_uri (const gchar *id) G_GNUC_WARN_UNUSED_RESULT;
|
|
Packit |
4b6dd7 |
static void gdata_youtube_video_commentable_init (GDataCommentableInterface *iface);
|
|
Packit |
4b6dd7 |
static GDataAuthorizationDomain *get_authorization_domain (GDataCommentable *self) G_GNUC_CONST;
|
|
Packit |
4b6dd7 |
static gchar *get_query_comments_uri (GDataCommentable *self) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
|
|
Packit |
4b6dd7 |
static gchar *get_insert_comment_uri (GDataCommentable *self, GDataComment *comment_) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
|
|
Packit |
4b6dd7 |
static gboolean is_comment_deletable (GDataCommentable *self, GDataComment *comment_);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct _GDataYouTubeVideoPrivate {
|
|
Packit |
4b6dd7 |
guint view_count;
|
|
Packit |
4b6dd7 |
guint favorite_count;
|
|
Packit |
4b6dd7 |
gchar *location;
|
|
Packit |
4b6dd7 |
GHashTable/*<owned utf8, GDataYouTubePermission>*/ *access_controls;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* gd:rating attributes */
|
|
Packit |
4b6dd7 |
struct {
|
|
Packit |
4b6dd7 |
guint min;
|
|
Packit |
4b6dd7 |
guint max;
|
|
Packit |
4b6dd7 |
guint count;
|
|
Packit |
4b6dd7 |
gdouble average;
|
|
Packit |
4b6dd7 |
} rating;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gchar **keywords;
|
|
Packit |
4b6dd7 |
gchar *player_uri;
|
|
Packit |
4b6dd7 |
gchar **region_restriction_allowed;
|
|
Packit |
4b6dd7 |
gchar **region_restriction_blocked;
|
|
Packit |
4b6dd7 |
GHashTable *content_ratings; /* owned string → owned string */
|
|
Packit |
4b6dd7 |
GList *thumbnails; /* GDataMediaThumbnail */
|
|
Packit |
4b6dd7 |
GDataMediaCategory *category;
|
|
Packit |
4b6dd7 |
guint duration;
|
|
Packit |
4b6dd7 |
gboolean is_private;
|
|
Packit |
4b6dd7 |
gchar *channel_id; /* owned */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Location. */
|
|
Packit |
4b6dd7 |
gdouble latitude;
|
|
Packit |
4b6dd7 |
gdouble longitude;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Other properties */
|
|
Packit |
4b6dd7 |
gchar *rejection_reason;
|
|
Packit |
4b6dd7 |
gchar *processing_status;
|
|
Packit |
4b6dd7 |
gchar *upload_status;
|
|
Packit |
4b6dd7 |
gchar *failure_reason;
|
|
Packit |
4b6dd7 |
GDataYouTubeState *upload_state; /* owned */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gint64 recorded;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* State for parse_json(). */
|
|
Packit |
4b6dd7 |
gboolean parsing_in_video_list_response;
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
enum {
|
|
Packit |
4b6dd7 |
PROP_VIEW_COUNT = 1,
|
|
Packit |
4b6dd7 |
PROP_FAVORITE_COUNT,
|
|
Packit |
4b6dd7 |
PROP_LOCATION,
|
|
Packit |
4b6dd7 |
PROP_MIN_RATING,
|
|
Packit |
4b6dd7 |
PROP_MAX_RATING,
|
|
Packit |
4b6dd7 |
PROP_RATING_COUNT,
|
|
Packit |
4b6dd7 |
PROP_AVERAGE_RATING,
|
|
Packit |
4b6dd7 |
PROP_KEYWORDS,
|
|
Packit |
4b6dd7 |
PROP_PLAYER_URI,
|
|
Packit |
4b6dd7 |
PROP_CATEGORY,
|
|
Packit |
4b6dd7 |
PROP_CREDIT,
|
|
Packit |
4b6dd7 |
PROP_DESCRIPTION,
|
|
Packit |
4b6dd7 |
PROP_DURATION,
|
|
Packit |
4b6dd7 |
PROP_IS_PRIVATE,
|
|
Packit |
4b6dd7 |
PROP_UPLOADED,
|
|
Packit |
4b6dd7 |
PROP_VIDEO_ID,
|
|
Packit |
4b6dd7 |
PROP_IS_DRAFT,
|
|
Packit |
4b6dd7 |
PROP_STATE,
|
|
Packit |
4b6dd7 |
PROP_RECORDED,
|
|
Packit |
4b6dd7 |
PROP_ASPECT_RATIO,
|
|
Packit |
4b6dd7 |
PROP_LATITUDE,
|
|
Packit |
4b6dd7 |
PROP_LONGITUDE
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_DEFINE_TYPE_WITH_CODE (GDataYouTubeVideo, gdata_youtube_video, GDATA_TYPE_ENTRY,
|
|
Packit |
4b6dd7 |
G_IMPLEMENT_INTERFACE (GDATA_TYPE_COMMENTABLE, gdata_youtube_video_commentable_init))
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_class_init (GDataYouTubeVideoClass *klass)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataEntryClass *entry_class = GDATA_ENTRY_CLASS (klass);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_type_class_add_private (klass, sizeof (GDataYouTubeVideoPrivate));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gobject_class->get_property = gdata_youtube_video_get_property;
|
|
Packit |
4b6dd7 |
gobject_class->set_property = gdata_youtube_video_set_property;
|
|
Packit |
4b6dd7 |
gobject_class->dispose = gdata_youtube_video_dispose;
|
|
Packit |
4b6dd7 |
gobject_class->finalize = gdata_youtube_video_finalize;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
parsable_class->parse_json = parse_json;
|
|
Packit |
4b6dd7 |
parsable_class->post_parse_json = post_parse_json;
|
|
Packit |
4b6dd7 |
parsable_class->get_json = get_json;
|
|
Packit |
4b6dd7 |
parsable_class->get_content_type = get_content_type;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
entry_class->get_entry_uri = get_entry_uri;
|
|
Packit |
4b6dd7 |
entry_class->kind_term = "youtube#video"; /* also: youtube#searchResult */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:view-count:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The number of times the video has been viewed.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#statistics.viewCount">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_VIEW_COUNT,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("view-count",
|
|
Packit |
4b6dd7 |
"View count", "The number of times the video has been viewed.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:favorite-count:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The number of users who have added the video to their favorites.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#statistics.favoriteCount">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_FAVORITE_COUNT,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("favorite-count",
|
|
Packit |
4b6dd7 |
"Favorite count", "The number of users who have added the video to their favorites.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:location:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Descriptive text about the location where the video was taken.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#recordingDetails.locationDescription">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_LOCATION,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("location",
|
|
Packit |
4b6dd7 |
"Location", "Descriptive text about the location where the video was taken.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:min-rating:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The minimum allowed rating for the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#statistics.likeCount">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_MIN_RATING,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("min-rating",
|
|
Packit |
4b6dd7 |
"Minimum rating", "The minimum allowed rating for the video.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 1, /* defaults to 1 */
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:max-rating:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The maximum allowed rating for the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#statistics.likeCount">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_MAX_RATING,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("max-rating",
|
|
Packit |
4b6dd7 |
"Maximum rating", "The maximum allowed rating for the video.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 5, /* defaults to 5 */
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:rating-count:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The number of times the video has been rated.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#statistics.likeCount">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_RATING_COUNT,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("rating-count",
|
|
Packit |
4b6dd7 |
"Rating count", "The number of times the video has been rated.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:average-rating:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The average rating of the video, over all the ratings it's received.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#statistics.likeCount">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_AVERAGE_RATING,
|
|
Packit |
4b6dd7 |
g_param_spec_double ("average-rating",
|
|
Packit |
4b6dd7 |
"Average rating", "The average rating of the video.",
|
|
Packit |
4b6dd7 |
0.0, G_MAXDOUBLE, 0.0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:keywords:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* A %NULL-terminated array of words associated with the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#snippet.tags[]">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_KEYWORDS,
|
|
Packit |
4b6dd7 |
g_param_spec_boxed ("keywords",
|
|
Packit |
4b6dd7 |
"Keywords", "A NULL-terminated array of words associated with the video.",
|
|
Packit |
4b6dd7 |
G_TYPE_STRV,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:player-uri:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* A URI for a browser-based media player for the full-length video (i.e. the video's page on YouTube).
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_PLAYER_URI,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("player-uri",
|
|
Packit |
4b6dd7 |
"Player URI", "A URI for a browser-based media player for the full-length video.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:category:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Specifies a genre or developer tag that describes the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#snippet.categoryId">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_CATEGORY,
|
|
Packit |
4b6dd7 |
g_param_spec_object ("category",
|
|
Packit |
4b6dd7 |
"Category", "Specifies a genre or developer tag that describes the video.",
|
|
Packit |
4b6dd7 |
GDATA_TYPE_MEDIA_CATEGORY,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:credit:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Identifies the owner of the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is no longer supported by Google, and
|
|
Packit |
4b6dd7 |
* will always be %NULL. There is no replacement.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_CREDIT,
|
|
Packit |
4b6dd7 |
g_param_spec_object ("credit",
|
|
Packit |
4b6dd7 |
"Credit", "Identifies the owner of the video.",
|
|
Packit |
4b6dd7 |
GDATA_TYPE_YOUTUBE_CREDIT,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS |
|
|
Packit |
4b6dd7 |
G_PARAM_DEPRECATED));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:description:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* A summary or description of the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#snippet.description">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_DESCRIPTION,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("description",
|
|
Packit |
4b6dd7 |
"Description", "A summary or description of the video.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:duration:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The duration of the video in seconds.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#contentDetails.duration">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_DURATION,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("duration",
|
|
Packit |
4b6dd7 |
"Duration", "The duration of the video in seconds.",
|
|
Packit |
4b6dd7 |
0, G_MAXINT, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:private:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Indicates whether the video is private, meaning that it will not be publicly visible on YouTube's website.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#status.privacyStatus">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_IS_PRIVATE,
|
|
Packit |
4b6dd7 |
g_param_spec_boolean ("is-private",
|
|
Packit |
4b6dd7 |
"Private?", "Indicates whether the video is private.",
|
|
Packit |
4b6dd7 |
FALSE,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:uploaded:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Specifies the time the video was originally uploaded to YouTube.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#snippet.publishedAt">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_UPLOADED,
|
|
Packit |
4b6dd7 |
g_param_spec_int64 ("uploaded",
|
|
Packit |
4b6dd7 |
"Uploaded", "Specifies the time the video was originally uploaded to YouTube.",
|
|
Packit |
4b6dd7 |
-1, G_MAXINT64, -1,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:video-id:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Specifies a unique ID which YouTube uses to identify the video. For example: <literal>qz8EfkS4KK0</literal>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#id">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is now equal to #GDataEntry:id.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_VIDEO_ID,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("video-id",
|
|
Packit |
4b6dd7 |
"Video ID", "Specifies a unique ID which YouTube uses to identify the video.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS |
|
|
Packit |
4b6dd7 |
G_PARAM_DEPRECATED));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:is-draft:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Indicates whether the video is in draft, or unpublished, status.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is now equal to
|
|
Packit |
4b6dd7 |
* #GDataYouTubeVideo:is-private.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_IS_DRAFT,
|
|
Packit |
4b6dd7 |
g_param_spec_boolean ("is-draft",
|
|
Packit |
4b6dd7 |
"Draft?", "Indicates whether the video is in draft, or unpublished, status.",
|
|
Packit |
4b6dd7 |
FALSE,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
|
Packit |
4b6dd7 |
G_PARAM_DEPRECATED));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:state:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Information describing the state of the video. If this is non-%NULL, the video is not playable.
|
|
Packit |
4b6dd7 |
* It points to a #GDataYouTubeState.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#status.uploadStatus">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_STATE,
|
|
Packit |
4b6dd7 |
g_param_spec_object ("state",
|
|
Packit |
4b6dd7 |
"State", "Information describing the state of the video.",
|
|
Packit |
4b6dd7 |
GDATA_TYPE_YOUTUBE_STATE,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:recorded:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Specifies the time the video was originally recorded.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#recordingDetails.recordingDate">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_RECORDED,
|
|
Packit |
4b6dd7 |
g_param_spec_int64 ("recorded",
|
|
Packit |
4b6dd7 |
"Recorded", "Specifies the time the video was originally recorded.",
|
|
Packit |
4b6dd7 |
-1, G_MAXINT64, -1,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:aspect-ratio:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The aspect ratio of the video. A %NULL value means the aspect ratio is unknown (it could still be a widescreen video). A value of
|
|
Packit |
4b6dd7 |
* %GDATA_YOUTUBE_ASPECT_RATIO_WIDESCREEN means the video is definitely widescreen.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_ASPECT_RATIO,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("aspect-ratio",
|
|
Packit |
4b6dd7 |
"Aspect Ratio", "The aspect ratio of the video.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:latitude:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The location as a latitude coordinate associated with this video. Valid latitudes range from -90.0
|
|
Packit |
4b6dd7 |
* to 90.0 inclusive. Set to a value
|
|
Packit |
4b6dd7 |
* outside this range to unset the location.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/youtube/v3/docs/videos#recordingDetails.location.latitude">
|
|
Packit |
4b6dd7 |
* online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_LATITUDE,
|
|
Packit |
4b6dd7 |
g_param_spec_double ("latitude",
|
|
Packit |
4b6dd7 |
"Latitude", "The location as a latitude coordinate associated with this video.",
|
|
Packit |
4b6dd7 |
G_MINDOUBLE, G_MAXDOUBLE, G_MAXDOUBLE,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataYouTubeVideo:longitude:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The location as a longitude coordinate associated with this video. Valid longitudes range from -180.0
|
|
Packit |
4b6dd7 |
* to 180.0 inclusive. Set to a value
|
|
Packit |
4b6dd7 |
* outside this range to unset the location.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/youtube/v3/docs/videos#recordingDetails.location.longitude">
|
|
Packit |
4b6dd7 |
* online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_LONGITUDE,
|
|
Packit |
4b6dd7 |
g_param_spec_double ("longitude",
|
|
Packit |
4b6dd7 |
"Longitude", "The location as a longitude coordinate associated with this video.",
|
|
Packit |
4b6dd7 |
G_MINDOUBLE, G_MAXDOUBLE, G_MAXDOUBLE,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_commentable_init (GDataCommentableInterface *iface)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
iface->comment_type = GDATA_TYPE_YOUTUBE_COMMENT;
|
|
Packit |
4b6dd7 |
iface->get_authorization_domain = get_authorization_domain;
|
|
Packit |
4b6dd7 |
iface->get_query_comments_uri = get_query_comments_uri;
|
|
Packit |
4b6dd7 |
iface->get_insert_comment_uri = get_insert_comment_uri;
|
|
Packit |
4b6dd7 |
iface->is_comment_deletable = is_comment_deletable;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_init (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_YOUTUBE_VIDEO, GDataYouTubeVideoPrivate);
|
|
Packit |
4b6dd7 |
self->priv->recorded = -1;
|
|
Packit |
4b6dd7 |
self->priv->access_controls = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, NULL);
|
|
Packit |
4b6dd7 |
self->priv->latitude = G_MAXDOUBLE;
|
|
Packit |
4b6dd7 |
self->priv->longitude = G_MAXDOUBLE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_dispose (GObject *object)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv = GDATA_YOUTUBE_VIDEO (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_clear_object (&priv->category);
|
|
Packit |
4b6dd7 |
g_list_free_full (priv->thumbnails, (GDestroyNotify) g_object_unref);
|
|
Packit |
4b6dd7 |
g_clear_object (&priv->upload_state);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
G_OBJECT_CLASS (gdata_youtube_video_parent_class)->dispose (object);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_finalize (GObject *object)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv = GDATA_YOUTUBE_VIDEO (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (priv->location);
|
|
Packit |
4b6dd7 |
g_hash_table_destroy (priv->access_controls);
|
|
Packit |
4b6dd7 |
g_strfreev (priv->keywords);
|
|
Packit |
4b6dd7 |
g_free (priv->channel_id);
|
|
Packit |
4b6dd7 |
g_free (priv->player_uri);
|
|
Packit |
4b6dd7 |
g_strfreev (priv->region_restriction_allowed);
|
|
Packit |
4b6dd7 |
g_strfreev (priv->region_restriction_blocked);
|
|
Packit |
4b6dd7 |
g_clear_pointer (&priv->content_ratings, (GDestroyNotify) g_hash_table_unref);
|
|
Packit |
4b6dd7 |
g_free (priv->rejection_reason);
|
|
Packit |
4b6dd7 |
g_free (priv->processing_status);
|
|
Packit |
4b6dd7 |
g_free (priv->upload_status);
|
|
Packit |
4b6dd7 |
g_free (priv->failure_reason);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
G_OBJECT_CLASS (gdata_youtube_video_parent_class)->finalize (object);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv = GDATA_YOUTUBE_VIDEO (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (property_id) {
|
|
Packit |
4b6dd7 |
case PROP_VIEW_COUNT:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->view_count);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_FAVORITE_COUNT:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->favorite_count);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_LOCATION:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->location);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_MIN_RATING:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->rating.min);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_MAX_RATING:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->rating.max);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_RATING_COUNT:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->rating.count);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_AVERAGE_RATING:
|
|
Packit |
4b6dd7 |
g_value_set_double (value, priv->rating.average);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_KEYWORDS:
|
|
Packit |
4b6dd7 |
g_value_set_boxed (value, priv->keywords);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_PLAYER_URI:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, gdata_youtube_video_get_player_uri (GDATA_YOUTUBE_VIDEO (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_CATEGORY:
|
|
Packit |
4b6dd7 |
g_value_set_object (value, priv->category);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_CREDIT:
|
|
Packit |
4b6dd7 |
g_value_set_object (value, NULL);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_DESCRIPTION:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, gdata_entry_get_summary (GDATA_ENTRY (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_DURATION:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->duration);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_IS_PRIVATE:
|
|
Packit |
4b6dd7 |
g_value_set_boolean (value, priv->is_private);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_UPLOADED:
|
|
Packit |
4b6dd7 |
g_value_set_int64 (value, gdata_entry_get_published (GDATA_ENTRY (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_VIDEO_ID:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, gdata_entry_get_id (GDATA_ENTRY (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_IS_DRAFT:
|
|
Packit |
4b6dd7 |
g_value_set_boolean (value, gdata_youtube_video_is_private (GDATA_YOUTUBE_VIDEO (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_STATE:
|
|
Packit |
4b6dd7 |
g_value_set_object (value, gdata_youtube_video_get_state (GDATA_YOUTUBE_VIDEO (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_RECORDED:
|
|
Packit |
4b6dd7 |
g_value_set_int64 (value, priv->recorded);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_ASPECT_RATIO:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, gdata_youtube_video_get_aspect_ratio (GDATA_YOUTUBE_VIDEO (object)));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_LATITUDE:
|
|
Packit |
4b6dd7 |
g_value_set_double (value, priv->latitude);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_LONGITUDE:
|
|
Packit |
4b6dd7 |
g_value_set_double (value, priv->longitude);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
/* We don't have any other property... */
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *self = GDATA_YOUTUBE_VIDEO (object);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (property_id) {
|
|
Packit |
4b6dd7 |
case PROP_LOCATION:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_location (self, g_value_get_string (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_KEYWORDS:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_keywords (self, g_value_get_boxed (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_CATEGORY:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_category (self, g_value_get_object (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_DESCRIPTION:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_description (self, g_value_get_string (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_IS_PRIVATE:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_is_private (self, g_value_get_boolean (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_IS_DRAFT:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_is_private (self, g_value_get_boolean (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_RECORDED:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_recorded (self, g_value_get_int64 (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_ASPECT_RATIO:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_aspect_ratio (self, g_value_get_string (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_LATITUDE:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_coordinates (self,
|
|
Packit |
4b6dd7 |
g_value_get_double (value),
|
|
Packit |
4b6dd7 |
self->priv->longitude);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_LONGITUDE:
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_coordinates (self,
|
|
Packit |
4b6dd7 |
self->priv->latitude,
|
|
Packit |
4b6dd7 |
g_value_get_double (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
/* We don't have any other property... */
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* https://developers.google.com/youtube/v3/docs/videos#contentDetails.duration
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Note that it can also include an ‘hours’ component, as specified in ISO 8601,
|
|
Packit |
4b6dd7 |
* but not in the Google documentation. */
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
duration_from_json_member (JsonReader *reader, const gchar *member_name,
|
|
Packit |
4b6dd7 |
GDataParserOptions options, guint *output,
|
|
Packit |
4b6dd7 |
gboolean *success, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gchar *duration_str = NULL, *i = NULL, *new_i = NULL;
|
|
Packit |
4b6dd7 |
guint64 seconds;
|
|
Packit |
4b6dd7 |
gboolean child_success = FALSE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!gdata_parser_string_from_json_member (reader, member_name, options,
|
|
Packit |
4b6dd7 |
&duration_str,
|
|
Packit |
4b6dd7 |
&child_success, error)) {
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
*success = child_success;
|
|
Packit |
4b6dd7 |
*output = 0;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!child_success) {
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse the string. Format: ‘PT(hH)?(mM)?(sS)?’, where ‘h’, ‘m’ and ‘s’
|
|
Packit |
4b6dd7 |
* are integer numbers of hours, minutes and seconds. Each element may
|
|
Packit |
4b6dd7 |
* not be present. */
|
|
Packit |
4b6dd7 |
i = duration_str;
|
|
Packit |
4b6dd7 |
if (strncmp (duration_str, "PT", 2) != 0) {
|
|
Packit |
4b6dd7 |
goto error;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
i += 2; /* PT */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
seconds = 0;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
while (*i != '\0') {
|
|
Packit |
4b6dd7 |
guint64 element;
|
|
Packit |
4b6dd7 |
gchar designator;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
element = g_ascii_strtoull (i, &new_i, 10);
|
|
Packit |
4b6dd7 |
if (new_i == i) {
|
|
Packit |
4b6dd7 |
goto error;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
i = new_i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
designator = i[0];
|
|
Packit |
4b6dd7 |
if (designator == 'H') {
|
|
Packit |
4b6dd7 |
seconds += 60 * 60 * element;
|
|
Packit |
4b6dd7 |
} else if (designator == 'M') {
|
|
Packit |
4b6dd7 |
seconds += 60 * element;
|
|
Packit |
4b6dd7 |
} else if (designator == 'S') {
|
|
Packit |
4b6dd7 |
seconds += element;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
goto error;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
i += 1;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
*output = seconds;
|
|
Packit |
4b6dd7 |
*success = child_success;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (duration_str);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
error:
|
|
Packit |
4b6dd7 |
gdata_parser_error_not_iso8601_format_json (reader, duration_str,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
g_free (duration_str);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* https://developers.google.com/youtube/v3/docs/videos#snippet.thumbnails */
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
thumbnails_from_json_member (JsonReader *reader, const gchar *member_name,
|
|
Packit |
4b6dd7 |
GDataParserOptions options, GList **output,
|
|
Packit |
4b6dd7 |
gboolean *success, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
guint i, len;
|
|
Packit |
4b6dd7 |
GList *thumbnails = NULL;
|
|
Packit |
4b6dd7 |
const GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check if there's such element */
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
member_name) != 0) {
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check if the output string has already been set. The JSON parser
|
|
Packit |
4b6dd7 |
* guarantees this can't happen. */
|
|
Packit |
4b6dd7 |
g_assert (!(options & P_NO_DUPES) || *output == NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
len = json_reader_count_members (reader);
|
|
Packit |
4b6dd7 |
child_error = json_reader_get_error (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
*success = gdata_parser_error_from_json_error (reader,
|
|
Packit |
4b6dd7 |
child_error,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < len; i++) {
|
|
Packit |
4b6dd7 |
GDataParsable *thumbnail = NULL; /* GDataMediaThumbnail */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, i);
|
|
Packit |
4b6dd7 |
thumbnail = _gdata_parsable_new_from_json_node (GDATA_TYPE_MEDIA_THUMBNAIL,
|
|
Packit |
4b6dd7 |
reader, NULL,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (thumbnail == NULL) {
|
|
Packit |
4b6dd7 |
*success = FALSE;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
thumbnails = g_list_prepend (thumbnails, thumbnail);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Success! */
|
|
Packit |
4b6dd7 |
*output = thumbnails;
|
|
Packit |
4b6dd7 |
thumbnails = NULL;
|
|
Packit |
4b6dd7 |
*success = TRUE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_list_free_full (thumbnails, (GDestroyNotify) g_object_unref);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* https://developers.google.com/youtube/v3/docs/videos#contentDetails.regionRestriction */
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
restricted_countries_from_json_member (JsonReader *reader,
|
|
Packit |
4b6dd7 |
const gchar *member_name,
|
|
Packit |
4b6dd7 |
GDataParserOptions options,
|
|
Packit |
4b6dd7 |
gchar ***output_allowed,
|
|
Packit |
4b6dd7 |
gchar ***output_blocked,
|
|
Packit |
4b6dd7 |
gboolean *success, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
guint i, len;
|
|
Packit |
4b6dd7 |
const GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check if there's such element */
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
member_name) != 0) {
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check if the output string has already been set. The JSON parser guarantees this can't happen. */
|
|
Packit |
4b6dd7 |
g_assert (!(options & P_NO_DUPES) ||
|
|
Packit |
4b6dd7 |
(*output_allowed == NULL && *output_blocked == NULL));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
len = json_reader_count_members (reader);
|
|
Packit |
4b6dd7 |
child_error = json_reader_get_error (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
*success = gdata_parser_error_from_json_error (reader,
|
|
Packit |
4b6dd7 |
child_error,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < len; i++) {
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, i);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_parser_strv_from_json_member (reader, "allowed",
|
|
Packit |
4b6dd7 |
P_DEFAULT,
|
|
Packit |
4b6dd7 |
output_allowed, success,
|
|
Packit |
4b6dd7 |
error) ||
|
|
Packit |
4b6dd7 |
gdata_parser_strv_from_json_member (reader, "blocked",
|
|
Packit |
4b6dd7 |
P_DEFAULT,
|
|
Packit |
4b6dd7 |
output_blocked, success,
|
|
Packit |
4b6dd7 |
error)) {
|
|
Packit |
4b6dd7 |
/* Nothing to do. */
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Success! */
|
|
Packit |
4b6dd7 |
*success = TRUE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* https://developers.google.com/youtube/v3/docs/videos#contentDetails.contentRating */
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
content_rating_from_json_member (JsonReader *reader,
|
|
Packit |
4b6dd7 |
const gchar *member_name,
|
|
Packit |
4b6dd7 |
GDataParserOptions options,
|
|
Packit |
4b6dd7 |
GHashTable **output,
|
|
Packit |
4b6dd7 |
gboolean *success, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
guint i, len;
|
|
Packit |
4b6dd7 |
const GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check if there's such element */
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
member_name) != 0) {
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check if the output string has already been set. The JSON parser
|
|
Packit |
4b6dd7 |
* guarantees this can't happen. */
|
|
Packit |
4b6dd7 |
g_assert (!(options & P_NO_DUPES) || *output == NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
len = json_reader_count_members (reader);
|
|
Packit |
4b6dd7 |
child_error = json_reader_get_error (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
*success = gdata_parser_error_from_json_error (reader,
|
|
Packit |
4b6dd7 |
child_error,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
*output = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
Packit |
4b6dd7 |
g_free, g_free);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < len; i++) {
|
|
Packit |
4b6dd7 |
const gchar *scheme, *rating;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, i);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
scheme = json_reader_get_member_name (reader);
|
|
Packit |
4b6dd7 |
rating = json_reader_get_string_value (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Ignore errors. */
|
|
Packit |
4b6dd7 |
if (rating != NULL) {
|
|
Packit |
4b6dd7 |
g_hash_table_insert (*output, g_strdup (scheme),
|
|
Packit |
4b6dd7 |
g_strdup (rating));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Success! */
|
|
Packit |
4b6dd7 |
*success = TRUE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static guint64
|
|
Packit |
4b6dd7 |
parse_uint64_from_json_string_member (JsonReader *reader,
|
|
Packit |
4b6dd7 |
const gchar *member_name,
|
|
Packit |
4b6dd7 |
GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *str_val, *end_ptr;
|
|
Packit |
4b6dd7 |
guint64 out;
|
|
Packit |
4b6dd7 |
const GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Grab the string. */
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, member_name);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
str_val = json_reader_get_string_value (reader);
|
|
Packit |
4b6dd7 |
child_error = json_reader_get_error (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
gdata_parser_error_from_json_error (reader, child_error, error);
|
|
Packit |
4b6dd7 |
out = 0;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Try and parse it as an integer. */
|
|
Packit |
4b6dd7 |
out = g_ascii_strtoull (str_val, (gchar **) &end_ptr, 10);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (*end_ptr != '\0') {
|
|
Packit |
4b6dd7 |
gdata_parser_error_required_json_content_missing (reader,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
out = 0;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return out;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gboolean success;
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *self = GDATA_YOUTUBE_VIDEO (parsable);
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv = self->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* HACK: When called with gdata_service_query_single_entry(), the video
|
|
Packit |
4b6dd7 |
* list endpoint returns a 0–1 item list of results as a normal feed.
|
|
Packit |
4b6dd7 |
* (See: https://developers.google.com/youtube/v3/docs/videos/list)
|
|
Packit |
4b6dd7 |
* This differs from the v2 API, which returned just the entry.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* So, we need a hack to extract the single entry from the feed without
|
|
Packit |
4b6dd7 |
* being able to invoke the parsing machinery in GDataFeed, because
|
|
Packit |
4b6dd7 |
* gdata_service_query_single_entry() can’t do that. Do that by checking
|
|
Packit |
4b6dd7 |
* the kind, and then ignoring all subsequent members until we reach the
|
|
Packit |
4b6dd7 |
* items member. Recursively parse in there, then break out again.
|
|
Packit |
4b6dd7 |
* This all assumes that we see the kind member before items. */
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (json_reader_get_member_name (reader), "kind") == 0 &&
|
|
Packit |
4b6dd7 |
g_strcmp0 (json_reader_get_string_value (reader),
|
|
Packit |
4b6dd7 |
"youtube#videoListResponse") == 0) {
|
|
Packit |
4b6dd7 |
priv->parsing_in_video_list_response = TRUE;
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader), "items") == 0 &&
|
|
Packit |
4b6dd7 |
priv->parsing_in_video_list_response) {
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Instead of a 404 when searching for an invalid ID, the server
|
|
Packit |
4b6dd7 |
* returns an empty results list. */
|
|
Packit |
4b6dd7 |
if (json_reader_count_elements (reader) != 1) {
|
|
Packit |
4b6dd7 |
g_set_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_NOT_FOUND,
|
|
Packit |
4b6dd7 |
/* Translators: the parameter is an error message returned by the server. */
|
|
Packit |
4b6dd7 |
_("The requested resource was not found: %s"),
|
|
Packit |
4b6dd7 |
"items");
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse the first (and only) array element. */
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, 0);
|
|
Packit |
4b6dd7 |
priv->parsing_in_video_list_response = FALSE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse all its properties. */
|
|
Packit |
4b6dd7 |
for (i = 0; i < (guint) json_reader_count_members (reader); i++) {
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (json_reader_read_element (reader, i), FALSE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (GDATA_PARSABLE_GET_CLASS (self)->parse_json (GDATA_PARSABLE (self), reader, user_data, error) == FALSE) {
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
g_object_unref (parsable);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->parsing_in_video_list_response = TRUE;
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE; /* handled */
|
|
Packit |
4b6dd7 |
} else if (priv->parsing_in_video_list_response) {
|
|
Packit |
4b6dd7 |
/* Ignore the member. */
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Actual video property parsing. */
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (json_reader_get_member_name (reader), "id") == 0) {
|
|
Packit |
4b6dd7 |
const gchar *id = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* If this is a youtube#searchResult, the id will be an object:
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/docs/search#resource
|
|
Packit |
4b6dd7 |
* If it is a youtube#video, the id will be a string:
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/docs/videos#resource
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (json_reader_is_value (reader)) {
|
|
Packit |
4b6dd7 |
id = json_reader_get_string_value (reader);
|
|
Packit |
4b6dd7 |
} else if (json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "videoId");
|
|
Packit |
4b6dd7 |
id = json_reader_get_string_value (reader);
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Empty ID? */
|
|
Packit |
4b6dd7 |
if (id == NULL || *id == '\0') {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
_gdata_entry_set_id (GDATA_ENTRY (parsable), id);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
"snippet") == 0) {
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check this is an object. */
|
|
Packit |
4b6dd7 |
if (!json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < (guint) json_reader_count_members (reader); i++) {
|
|
Packit |
4b6dd7 |
gint64 published_at;
|
|
Packit |
4b6dd7 |
gchar *title = NULL, *description = NULL;
|
|
Packit |
4b6dd7 |
gchar *category_id = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, i);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_parser_int64_time_from_json_member (reader, "publishedAt", P_DEFAULT, &published_at, &success, error)) {
|
|
Packit |
4b6dd7 |
if (success) {
|
|
Packit |
4b6dd7 |
_gdata_entry_set_published (GDATA_ENTRY (parsable),
|
|
Packit |
4b6dd7 |
published_at);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
} else if (gdata_parser_string_from_json_member (reader, "title", P_DEFAULT, &title, &success, error)) {
|
|
Packit |
4b6dd7 |
if (success) {
|
|
Packit |
4b6dd7 |
gdata_entry_set_title (GDATA_ENTRY (parsable),
|
|
Packit |
4b6dd7 |
title);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (title);
|
|
Packit |
4b6dd7 |
} else if (gdata_parser_string_from_json_member (reader, "description", P_DEFAULT, &description, &success, error)) {
|
|
Packit |
4b6dd7 |
if (success) {
|
|
Packit |
4b6dd7 |
gdata_entry_set_summary (GDATA_ENTRY (parsable),
|
|
Packit |
4b6dd7 |
description);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (description);
|
|
Packit |
4b6dd7 |
} else if (gdata_parser_strv_from_json_member (reader, "tags", P_DEFAULT, &priv->keywords, &success, error) ||
|
|
Packit |
4b6dd7 |
thumbnails_from_json_member (reader, "thumbnails", P_DEFAULT, &priv->thumbnails, &success, error) ||
|
|
Packit |
4b6dd7 |
gdata_parser_string_from_json_member (reader, "channelId", P_DEFAULT, &priv->channel_id, &success, error)) {
|
|
Packit |
4b6dd7 |
/* Fall through. */
|
|
Packit |
4b6dd7 |
} else if (gdata_parser_string_from_json_member (reader, "categoryId", P_DEFAULT, &category_id, &success, error)) {
|
|
Packit |
4b6dd7 |
if (success) {
|
|
Packit |
4b6dd7 |
priv->category = gdata_media_category_new (category_id,
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
NULL);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (category_id);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!success) {
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
"contentDetails") == 0) {
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check this is an object. */
|
|
Packit |
4b6dd7 |
if (!json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < (guint) json_reader_count_members (reader); i++) {
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, i);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (duration_from_json_member (reader, "duration", P_DEFAULT, &priv->duration, &success, error) ||
|
|
Packit |
4b6dd7 |
restricted_countries_from_json_member (reader, "regionRestriction", P_DEFAULT, &priv->region_restriction_allowed, &priv->region_restriction_blocked, &success, error) ||
|
|
Packit |
4b6dd7 |
content_rating_from_json_member (reader, "contentRating", P_DEFAULT, &priv->content_ratings, &success, error)) {
|
|
Packit |
4b6dd7 |
/* Fall through. */
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!success) {
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
"status") == 0) {
|
|
Packit |
4b6dd7 |
const gchar *privacy_status;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check this is an object. */
|
|
Packit |
4b6dd7 |
if (!json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "privacyStatus");
|
|
Packit |
4b6dd7 |
privacy_status = json_reader_get_string_value (reader);
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (privacy_status, "private") == 0) {
|
|
Packit |
4b6dd7 |
priv->is_private = TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (privacy_status, "public") == 0) {
|
|
Packit |
4b6dd7 |
priv->is_private = FALSE;
|
|
Packit |
4b6dd7 |
g_hash_table_insert (priv->access_controls,
|
|
Packit |
4b6dd7 |
g_strdup ("list"),
|
|
Packit |
4b6dd7 |
GINT_TO_POINTER (GDATA_YOUTUBE_PERMISSION_ALLOWED));
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (privacy_status, "unlisted") == 0) {
|
|
Packit |
4b6dd7 |
/* See: ‘list’ on
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/2.0/reference?csw=1#youtube_data_api_tag_yt:accessControl */
|
|
Packit |
4b6dd7 |
priv->is_private = FALSE;
|
|
Packit |
4b6dd7 |
g_hash_table_insert (priv->access_controls,
|
|
Packit |
4b6dd7 |
g_strdup ("list"),
|
|
Packit |
4b6dd7 |
GINT_TO_POINTER (GDATA_YOUTUBE_PERMISSION_DENIED));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "embeddable");
|
|
Packit |
4b6dd7 |
g_hash_table_insert (priv->access_controls,
|
|
Packit |
4b6dd7 |
g_strdup (GDATA_YOUTUBE_ACTION_EMBED),
|
|
Packit |
4b6dd7 |
GINT_TO_POINTER (json_reader_get_boolean_value (reader) ?
|
|
Packit |
4b6dd7 |
GDATA_YOUTUBE_PERMISSION_ALLOWED :
|
|
Packit |
4b6dd7 |
GDATA_YOUTUBE_PERMISSION_DENIED));
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "uploadStatus");
|
|
Packit |
4b6dd7 |
priv->upload_status = g_strdup (json_reader_get_string_value (reader));
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "failureReason");
|
|
Packit |
4b6dd7 |
priv->rejection_reason = g_strdup (json_reader_get_string_value (reader));
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "rejectionReason");
|
|
Packit |
4b6dd7 |
priv->rejection_reason = g_strdup (json_reader_get_string_value (reader));
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
"statistics") == 0) {
|
|
Packit |
4b6dd7 |
gint64 likes, dislikes;
|
|
Packit |
4b6dd7 |
GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check this is an object. */
|
|
Packit |
4b6dd7 |
if (!json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Views and favourites. For some unknown reason, the feed
|
|
Packit |
4b6dd7 |
* returns them as a string, even though they’re documented as
|
|
Packit |
4b6dd7 |
* being unsigned longs.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Reference: https://developers.google.com/youtube/v3/docs/videos#statistics */
|
|
Packit |
4b6dd7 |
priv->view_count = parse_uint64_from_json_string_member (reader, "viewCount", &child_error);
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
g_propagate_error (error, child_error);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->favorite_count = parse_uint64_from_json_string_member (reader, "favoriteCount", &child_error);
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
g_propagate_error (error, child_error);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* The new ratings API (total likes, total dislikes) doesn’t
|
|
Packit |
4b6dd7 |
* really match with the old API (collection of integer ratings
|
|
Packit |
4b6dd7 |
* between 1 and 5). Try and return something appropriate. */
|
|
Packit |
4b6dd7 |
likes = parse_uint64_from_json_string_member (reader, "likeCount", &child_error);
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
g_propagate_error (error, child_error);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
dislikes = parse_uint64_from_json_string_member (reader, "dislikeCount", &child_error);
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
g_propagate_error (error, child_error);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->rating.min = 0;
|
|
Packit |
4b6dd7 |
priv->rating.max = 1;
|
|
Packit |
4b6dd7 |
priv->rating.count = likes + dislikes;
|
|
Packit |
4b6dd7 |
if (likes + dislikes == 0) {
|
|
Packit |
4b6dd7 |
priv->rating.average = 0.0; /* basically undefined */
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
priv->rating.average = (gdouble) likes / (gdouble) (likes + dislikes);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
"processingDetails") == 0) {
|
|
Packit |
4b6dd7 |
/* Check this is an object. */
|
|
Packit |
4b6dd7 |
if (!json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "processingStatus");
|
|
Packit |
4b6dd7 |
priv->processing_status = g_strdup (json_reader_get_string_value (reader));
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader),
|
|
Packit |
4b6dd7 |
"recordingDetails") == 0) {
|
|
Packit |
4b6dd7 |
const gchar *recording_date;
|
|
Packit |
4b6dd7 |
const GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check this is an object. */
|
|
Packit |
4b6dd7 |
if (!json_reader_is_object (reader)) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_json_content_missing (reader, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "recordingDate");
|
|
Packit |
4b6dd7 |
recording_date = json_reader_get_string_value (reader);
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (recording_date != NULL &&
|
|
Packit |
4b6dd7 |
!gdata_parser_int64_from_date (recording_date,
|
|
Packit |
4b6dd7 |
&priv->recorded)) {
|
|
Packit |
4b6dd7 |
/* Error */
|
|
Packit |
4b6dd7 |
gdata_parser_error_not_iso8601_format_json (reader,
|
|
Packit |
4b6dd7 |
recording_date,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "locationDescription");
|
|
Packit |
4b6dd7 |
priv->location = g_strdup (json_reader_get_string_value (reader));
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (json_reader_read_member (reader, "location")) {
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "latitude");
|
|
Packit |
4b6dd7 |
priv->latitude = json_reader_get_double_value (reader);
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_member (reader, "longitude");
|
|
Packit |
4b6dd7 |
priv->longitude = json_reader_get_double_value (reader);
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_member (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
child_error = json_reader_get_error (reader);
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_from_json_error (reader,
|
|
Packit |
4b6dd7 |
child_error,
|
|
Packit |
4b6dd7 |
error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
return GDATA_PARSABLE_CLASS (gdata_youtube_video_parent_class)->parse_json (parsable, reader, user_data, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
post_parse_json (GDataParsable *parsable, gpointer user_data, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataLink *_link = NULL; /* owned */
|
|
Packit |
4b6dd7 |
const gchar *id;
|
|
Packit |
4b6dd7 |
gchar *uri = NULL; /* owned */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Set the self link, which is needed for
|
|
Packit |
4b6dd7 |
* gdata_service_delete_entry(). */
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (parsable));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (id == NULL) {
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
uri = _gdata_service_build_uri ("https://www.googleapis.com"
|
|
Packit |
4b6dd7 |
"/youtube/v3/videos"
|
|
Packit |
4b6dd7 |
"?id=%s", id);
|
|
Packit |
4b6dd7 |
_link = gdata_link_new (uri, GDATA_LINK_SELF);
|
|
Packit |
4b6dd7 |
gdata_entry_add_link (GDATA_ENTRY (parsable), _link);
|
|
Packit |
4b6dd7 |
g_object_unref (_link);
|
|
Packit |
4b6dd7 |
g_free (uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
get_json (GDataParsable *parsable, JsonBuilder *builder)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataEntry *entry = GDATA_ENTRY (parsable);
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv = GDATA_YOUTUBE_VIDEO (parsable)->priv;
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
gpointer permission_ptr;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
GDATA_PARSABLE_CLASS (gdata_youtube_video_parent_class)->get_json (parsable, builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Add the video-specific JSON.
|
|
Packit |
4b6dd7 |
* Reference:
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/docs/videos/insert#request_body */
|
|
Packit |
4b6dd7 |
/* snippet object. */
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "snippet");
|
|
Packit |
4b6dd7 |
json_builder_begin_object (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_entry_get_title (entry) != NULL) {
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "title");
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder,
|
|
Packit |
4b6dd7 |
gdata_entry_get_title (entry));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_entry_get_summary (entry) != NULL) {
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "description");
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder,
|
|
Packit |
4b6dd7 |
gdata_entry_get_summary (entry));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->keywords != NULL) {
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "tags");
|
|
Packit |
4b6dd7 |
json_builder_begin_array (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; priv->keywords[i] != NULL; i++) {
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder,
|
|
Packit |
4b6dd7 |
priv->keywords[i]);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_end_array (builder);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->category != NULL) {
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "categoryId");
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder,
|
|
Packit |
4b6dd7 |
gdata_media_category_get_category (priv->category));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_end_object (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* status object. */
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "status");
|
|
Packit |
4b6dd7 |
json_builder_begin_object (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "privacyStatus");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!priv->is_private &&
|
|
Packit |
4b6dd7 |
g_hash_table_lookup_extended (priv->access_controls,
|
|
Packit |
4b6dd7 |
"list", NULL,
|
|
Packit |
4b6dd7 |
&permission_ptr)) {
|
|
Packit |
4b6dd7 |
GDataYouTubePermission perm;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
perm = GPOINTER_TO_INT (permission_ptr);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* See the ‘list’ documentation on:
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/2.0/reference?csw=1#youtube_data_api_tag_yt:accessControl */
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder,
|
|
Packit |
4b6dd7 |
(perm == GDATA_YOUTUBE_PERMISSION_ALLOWED) ? "public" : "unlisted");
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder,
|
|
Packit |
4b6dd7 |
priv->is_private ? "private" : "public");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_hash_table_lookup_extended (priv->access_controls,
|
|
Packit |
4b6dd7 |
GDATA_YOUTUBE_ACTION_EMBED, NULL,
|
|
Packit |
4b6dd7 |
&permission_ptr)) {
|
|
Packit |
4b6dd7 |
GDataYouTubePermission perm;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
perm = GPOINTER_TO_INT (permission_ptr);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "embeddable");
|
|
Packit |
4b6dd7 |
json_builder_add_boolean_value (builder,
|
|
Packit |
4b6dd7 |
perm == GDATA_YOUTUBE_PERMISSION_ALLOWED);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* FIXME: add support for:
|
|
Packit |
4b6dd7 |
* publicStatsViewable
|
|
Packit |
4b6dd7 |
* publishAt
|
|
Packit |
4b6dd7 |
* license
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_end_object (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* recordingDetails object. */
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "recordingDetails");
|
|
Packit |
4b6dd7 |
json_builder_begin_object (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->location != NULL) {
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "locationDescription");
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder, priv->location);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->latitude >= -90.0 && priv->latitude <= 90.0 &&
|
|
Packit |
4b6dd7 |
priv->longitude >= -180.0 && priv->longitude <= 180.0) {
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "location");
|
|
Packit |
4b6dd7 |
json_builder_begin_object (builder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "latitude");
|
|
Packit |
4b6dd7 |
json_builder_add_double_value (builder, priv->latitude);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "longitude");
|
|
Packit |
4b6dd7 |
json_builder_add_double_value (builder, priv->longitude);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_end_object (builder);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->recorded != -1) {
|
|
Packit |
4b6dd7 |
gchar *recorded = gdata_parser_date_from_int64 (priv->recorded);
|
|
Packit |
4b6dd7 |
json_builder_set_member_name (builder, "recordingDate");
|
|
Packit |
4b6dd7 |
json_builder_add_string_value (builder, recorded);
|
|
Packit |
4b6dd7 |
g_free (recorded);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_builder_end_object (builder);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static const gchar *
|
|
Packit |
4b6dd7 |
get_content_type (void)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return "application/json";
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gchar *
|
|
Packit |
4b6dd7 |
get_entry_uri (const gchar *id)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *old_prefix = "tag:youtube.com,2008:video:";
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* For compatibility with previous video ID formats, strip off the v2
|
|
Packit |
4b6dd7 |
* ID prefix. */
|
|
Packit |
4b6dd7 |
if (g_str_has_prefix (id, old_prefix)) {
|
|
Packit |
4b6dd7 |
id += strlen (old_prefix);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Build the query URI for a single video. This is a bit of a pain,
|
|
Packit |
4b6dd7 |
* because it actually returns a list containing a single video, but
|
|
Packit |
4b6dd7 |
* there seems no other way to do it. See parsing_in_video_list_response
|
|
Packit |
4b6dd7 |
* in parse_json() for the fallout.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Reference: https://developers.google.com/youtube/v3/docs/videos/list#part */
|
|
Packit |
4b6dd7 |
return _gdata_service_build_uri ("https://www.googleapis.com/youtube/v3/videos"
|
|
Packit |
4b6dd7 |
"?part=contentDetails,id,"
|
|
Packit |
4b6dd7 |
"recordingDetails,snippet,"
|
|
Packit |
4b6dd7 |
"status,statistics"
|
|
Packit |
4b6dd7 |
"&id=%s", id);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static GDataAuthorizationDomain *
|
|
Packit |
4b6dd7 |
get_authorization_domain (GDataCommentable *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return gdata_youtube_service_get_primary_authorization_domain ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gchar *
|
|
Packit |
4b6dd7 |
get_query_comments_uri (GDataCommentable *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *video_id;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video_id = gdata_entry_get_id (GDATA_ENTRY (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* https://developers.google.com/youtube/v3/docs/commentThreads/list */
|
|
Packit |
4b6dd7 |
return _gdata_service_build_uri ("https://www.googleapis.com"
|
|
Packit |
4b6dd7 |
"/youtube/v3/commentThreads"
|
|
Packit |
4b6dd7 |
"?part=snippet"
|
|
Packit |
4b6dd7 |
"&videoId=%s", video_id);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_INTERNAL void
|
|
Packit |
4b6dd7 |
_gdata_youtube_comment_set_video_id (GDataYouTubeComment *self,
|
|
Packit |
4b6dd7 |
const gchar *video_id);
|
|
Packit |
4b6dd7 |
G_GNUC_INTERNAL void
|
|
Packit |
4b6dd7 |
_gdata_youtube_comment_set_channel_id (GDataYouTubeComment *self,
|
|
Packit |
4b6dd7 |
const gchar *channel_id);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gchar *
|
|
Packit |
4b6dd7 |
get_insert_comment_uri (GDataCommentable *self, GDataComment *comment_)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *video_id, *channel_id;
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv = GDATA_YOUTUBE_VIDEO (self)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video_id = gdata_entry_get_id (GDATA_ENTRY (self));
|
|
Packit |
4b6dd7 |
channel_id = priv->channel_id;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* https://developers.google.com/youtube/v3/docs/commentThreads/insert
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* We have to set the video ID on the @comment_. */
|
|
Packit |
4b6dd7 |
_gdata_youtube_comment_set_video_id (GDATA_YOUTUBE_COMMENT (comment_),
|
|
Packit |
4b6dd7 |
video_id);
|
|
Packit |
4b6dd7 |
_gdata_youtube_comment_set_channel_id (GDATA_YOUTUBE_COMMENT (comment_),
|
|
Packit |
4b6dd7 |
channel_id);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return _gdata_service_build_uri ("https://www.googleapis.com"
|
|
Packit |
4b6dd7 |
"/youtube/v3/commentThreads"
|
|
Packit |
4b6dd7 |
"?part=snippet"
|
|
Packit |
4b6dd7 |
"&shareOnGooglePlus=false");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
is_comment_deletable (GDataCommentable *self, GDataComment *comment_)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* FIXME: Currently unsupported:
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/migration-guide#to_be_migrated
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/guides/implementation/comments#comments-delete */
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_new:
|
|
Packit |
4b6dd7 |
* @id: (allow-none): the video's ID, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Creates a new #GDataYouTubeVideo with the given ID and default properties.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: a new #GDataYouTubeVideo; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_new (const gchar *id)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return g_object_new (GDATA_TYPE_YOUTUBE_VIDEO, "id", id, NULL);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_view_count:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:view-count property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the number of times the video has been viewed
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
guint
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_view_count (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->view_count;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_favorite_count:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:favorite-count property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the number of users who have added the video to their favorites list
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
guint
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_favorite_count (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->favorite_count;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_location:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:location property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: a string describing the video's location, or %NULL
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_location (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->location;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_location:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @location: (allow-none): a new location, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:location property to the new location string, @location.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Set @location to %NULL to unset the property in the video.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_location (GDataYouTubeVideo *self, const gchar *location)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (self->priv->location);
|
|
Packit |
4b6dd7 |
self->priv->location = g_strdup (location);
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "location");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_access_control:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @action: the action whose permission should be returned
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the permission associated with the given @action on the #GDataYouTubeVideo. If the given @action
|
|
Packit |
4b6dd7 |
* doesn't have a permission set on the video, %GDATA_YOUTUBE_PERMISSION_DENIED is returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the permission associated with @action, or %GDATA_YOUTUBE_PERMISSION_DENIED
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.7.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataYouTubePermission
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_access_control (GDataYouTubeVideo *self, const gchar *action)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gpointer value;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), GDATA_YOUTUBE_PERMISSION_DENIED);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (action != NULL, GDATA_YOUTUBE_PERMISSION_DENIED);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_hash_table_lookup_extended (self->priv->access_controls, action, NULL, &value) == FALSE)
|
|
Packit |
4b6dd7 |
return GDATA_YOUTUBE_PERMISSION_DENIED;
|
|
Packit |
4b6dd7 |
return GPOINTER_TO_INT (value);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_access_control:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @action: the action whose permission is being set
|
|
Packit |
4b6dd7 |
* @permission: the permission to give to the action
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the permission associated with @action on the #GDataYouTubeVideo, allowing restriction or derestriction of various
|
|
Packit |
4b6dd7 |
* operations on YouTube videos.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Note that only %GDATA_YOUTUBE_ACTION_RATE and %GDATA_YOUTUBE_ACTION_COMMENT actions can have the %GDATA_YOUTUBE_PERMISSION_MODERATED permission.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.7.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_access_control (GDataYouTubeVideo *self, const gchar *action, GDataYouTubePermission permission)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (action != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_hash_table_replace (self->priv->access_controls, g_strdup (action), GINT_TO_POINTER (permission));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_rating:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @min: (out caller-allocates) (allow-none): return location for the minimum rating value, or %NULL
|
|
Packit |
4b6dd7 |
* @max: (out caller-allocates) (allow-none): return location for the maximum rating value, or %NULL
|
|
Packit |
4b6dd7 |
* @count: (out caller-allocates) (allow-none): return location for the number of ratings, or %NULL
|
|
Packit |
4b6dd7 |
* @average: (out caller-allocates) (allow-none): return location for the average rating value, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets various properties of the ratings on the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Note that this property may not be retrieved when querying for multiple
|
|
Packit |
4b6dd7 |
* videos at once, but is guaranteed to be retrieved when querying with
|
|
Packit |
4b6dd7 |
* gdata_service_query_single_entry_async().
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_rating (GDataYouTubeVideo *self, guint *min, guint *max, guint *count, gdouble *average)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
if (min != NULL)
|
|
Packit |
4b6dd7 |
*min = self->priv->rating.min;
|
|
Packit |
4b6dd7 |
if (max != NULL)
|
|
Packit |
4b6dd7 |
*max = self->priv->rating.max;
|
|
Packit |
4b6dd7 |
if (count != NULL)
|
|
Packit |
4b6dd7 |
*count = self->priv->rating.count;
|
|
Packit |
4b6dd7 |
if (average != NULL)
|
|
Packit |
4b6dd7 |
*average = self->priv->rating.average;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_keywords:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:keywords property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of words associated with the video
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar * const *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_keywords (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return (const gchar * const *) self->priv->keywords;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_keywords:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @keywords: (array zero-terminated=1): a new %NULL-terminated array of keywords
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:keywords property to the new keyword list, @keywords.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* @keywords must not be %NULL. For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#snippet.tags[]">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_keywords (GDataYouTubeVideo *self, const gchar * const *keywords)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (keywords != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_strfreev (self->priv->keywords);
|
|
Packit |
4b6dd7 |
self->priv->keywords = g_strdupv ((gchar **) keywords);
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "keywords");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_player_uri:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:player-uri property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: a URI where the video is playable in a web browser, or %NULL
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_player_uri (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Generate and cache the player URI. */
|
|
Packit |
4b6dd7 |
if (priv->player_uri == NULL) {
|
|
Packit |
4b6dd7 |
priv->player_uri = _gdata_service_build_uri ("https://www.youtube.com/watch?v=%s",
|
|
Packit |
4b6dd7 |
gdata_entry_get_id (GDATA_ENTRY (self)));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return priv->player_uri;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
strv_contains (const gchar * const *strv, const gchar *key)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; strv != NULL && strv[i] != NULL; i++) {
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (strv[i], key) == 0) {
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_is_restricted_in_country:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @country: an ISO 3166 two-letter country code to check
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Checks whether viewing of the video is restricted in @country, either by its content rating, or by the request of the producer.
|
|
Packit |
4b6dd7 |
* The return value from this function is purely informational, and no obligation is assumed.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: %TRUE if the video is restricted in @country, %FALSE otherwise
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gboolean
|
|
Packit |
4b6dd7 |
gdata_youtube_video_is_restricted_in_country (GDataYouTubeVideo *self, const gchar *country)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv;
|
|
Packit |
4b6dd7 |
gboolean allowed_present, allowed_empty;
|
|
Packit |
4b6dd7 |
gboolean in_allowed, in_blocked;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), FALSE);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (country != NULL && *country != '\0', FALSE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
allowed_present = (priv->region_restriction_allowed != NULL);
|
|
Packit |
4b6dd7 |
allowed_empty = (allowed_present &&
|
|
Packit |
4b6dd7 |
priv->region_restriction_allowed[0] == NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
in_allowed = strv_contains ((const gchar * const *) priv->region_restriction_allowed, country);
|
|
Packit |
4b6dd7 |
in_blocked = strv_contains ((const gchar * const *) priv->region_restriction_blocked, country);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return ((allowed_present && !in_allowed) ||
|
|
Packit |
4b6dd7 |
allowed_empty ||
|
|
Packit |
4b6dd7 |
(in_blocked && !in_allowed));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* References:
|
|
Packit |
4b6dd7 |
* v2: https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_media:rating
|
|
Packit |
4b6dd7 |
* v3: https://developers.google.com/youtube/v3/docs/videos#contentDetails.contentRating.mpaaRating
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
static const gchar *
|
|
Packit |
4b6dd7 |
convert_mpaa_rating (const gchar *v3_rating)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (v3_rating, "mpaaG") == 0) {
|
|
Packit |
4b6dd7 |
return "g";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "mpaaNc17") == 0) {
|
|
Packit |
4b6dd7 |
return "nc-17";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "mpaaPg") == 0) {
|
|
Packit |
4b6dd7 |
return "pg";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "mpaaPg13") == 0) {
|
|
Packit |
4b6dd7 |
return "pg-13";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "mpaaR") == 0) {
|
|
Packit |
4b6dd7 |
return "r";
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* References:
|
|
Packit |
4b6dd7 |
* v2: https://developers.google.com/youtube/2.0/reference#youtube_data_api_tag_media:rating
|
|
Packit |
4b6dd7 |
* v3: https://developers.google.com/youtube/v3/docs/videos#contentDetails.contentRating.tvpgRating
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
static const gchar *
|
|
Packit |
4b6dd7 |
convert_tvpg_rating (const gchar *v3_rating)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (v3_rating, "pg14") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-14";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "tvpgG") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-g";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "tvpgMa") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-ma";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "tvpgPg") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-pg";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "tvpgY") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-y";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "tvpgY7") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-y7";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rating, "tvpgY7Fv") == 0) {
|
|
Packit |
4b6dd7 |
return "tv-y7-fv";
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_media_rating:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @rating_type: the type of rating to retrieve
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Returns the rating of the given type for the video, if one exists. For example, this could be a film rating awarded by the MPAA; or a simple
|
|
Packit |
4b6dd7 |
* rating specifying whether the video contains adult content.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The valid values for @rating_type are: %GDATA_YOUTUBE_RATING_TYPE_MPAA and %GDATA_YOUTUBE_RATING_TYPE_V_CHIP.
|
|
Packit |
4b6dd7 |
* Further values may be added in future; if an unknown rating type is passed to the function, %NULL will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The possible return values depend on what's passed to @rating_type. Valid values for each rating type are listed in the documentation for the
|
|
Packit |
4b6dd7 |
* rating types.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the rating of the video for the given @rating_type, or %NULL if the video isn't rated with that type (or the type is unknown)
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.10.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_media_rating (GDataYouTubeVideo *self, const gchar *rating_type)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *rating;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (rating_type != NULL && *rating_type != '\0', NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* All ratings are unknown. */
|
|
Packit |
4b6dd7 |
if (self->priv->content_ratings == NULL) {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Compatibility with the old API. */
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (rating_type, "simple") == 0) {
|
|
Packit |
4b6dd7 |
/* Not supported any more. */
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (rating_type, "mpaa") == 0) {
|
|
Packit |
4b6dd7 |
rating = g_hash_table_lookup (self->priv->content_ratings,
|
|
Packit |
4b6dd7 |
"mpaaRating");
|
|
Packit |
4b6dd7 |
return convert_mpaa_rating (rating);
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (rating_type, "v-chip") == 0) {
|
|
Packit |
4b6dd7 |
rating = g_hash_table_lookup (self->priv->content_ratings,
|
|
Packit |
4b6dd7 |
"tvpgRating");
|
|
Packit |
4b6dd7 |
return convert_tvpg_rating (rating);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_hash_table_lookup (self->priv->content_ratings, rating_type);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_category:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:category property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer none): a #GDataMediaCategory giving the video's single and mandatory category
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataMediaCategory *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_category (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->category;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_category:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @category: a new #GDataMediaCategory
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:category property to the new category, @category, and increments its reference count.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* @category must not be %NULL. For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#snippet.categoryId">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_category (GDataYouTubeVideo *self, GDataMediaCategory *category)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_MEDIA_CATEGORY (category));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_object_ref (category);
|
|
Packit |
4b6dd7 |
g_clear_object (&self->priv->category);
|
|
Packit |
4b6dd7 |
self->priv->category = category;
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "category");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_credit:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:credit property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer none): a #GDataMediaCredit giving information on whom to credit for the video, or %NULL
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is no longer supported by Google, and will
|
|
Packit |
4b6dd7 |
* always return %NULL. There is no replacement.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataYouTubeCredit *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_credit (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_description:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:description property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the video's long text description, or %NULL
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_description (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return gdata_entry_get_summary (GDATA_ENTRY (self));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_description:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @description: (allow-none): the video's new description, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:description property to the new description, @description.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Set @description to %NULL to unset the video's description.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_description (GDataYouTubeVideo *self, const gchar *description)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
gdata_entry_set_summary (GDATA_ENTRY (self), description);
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "description");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_look_up_content:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @type: the MIME type of the content desired
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Looks up a #GDataYouTubeContent from the video with the given MIME type. The video's list of contents is
|
|
Packit |
4b6dd7 |
* a list of URIs to various formats of the video itself, such as its SWF URI or RTSP stream.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer none): a #GDataYouTubeContent matching @type, or %NULL
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is no longer supported by Google, and will
|
|
Packit |
4b6dd7 |
* always return %NULL. To view a video, open the URI returned by
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_player_uri() in a web browser.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataYouTubeContent *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_look_up_content (GDataYouTubeVideo *self, const gchar *type)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (type != NULL, NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Not supported in the v3 API. */
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_thumbnails:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets a list of the thumbnails available for the video.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (element-type GData.MediaThumbnail) (transfer none): a #GList of #GDataMediaThumbnails, or %NULL
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GList *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_thumbnails (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->thumbnails;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_duration:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:duration property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the video duration in seconds, or 0 if unknown
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
guint
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_duration (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->duration;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_is_private:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:is-private property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: %TRUE if the video is private, %FALSE otherwise
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gboolean
|
|
Packit |
4b6dd7 |
gdata_youtube_video_is_private (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), FALSE);
|
|
Packit |
4b6dd7 |
return self->priv->is_private;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_is_private:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @is_private: whether the video is private
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:is-private property to decide whether the video is publicly viewable.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_is_private (GDataYouTubeVideo *self, gboolean is_private)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
self->priv->is_private = is_private;
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "is-private");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_uploaded:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:uploaded property. If the property is unset, -1 will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the UNIX timestamp for the time the video was uploaded, or -1
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gint64
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_uploaded (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), -1);
|
|
Packit |
4b6dd7 |
return gdata_entry_get_published (GDATA_ENTRY (self));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_video_id:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:video-id property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the video's unique and permanent ID
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is now equal to #GDataEntry:id.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_video_id (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
return gdata_entry_get_id (GDATA_ENTRY (self));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_is_draft:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:is-draft property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: %TRUE if the video is a draft, %FALSE otherwise
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is now equal to
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_is_private().
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gboolean
|
|
Packit |
4b6dd7 |
gdata_youtube_video_is_draft (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), FALSE);
|
|
Packit |
4b6dd7 |
return gdata_youtube_video_is_private (self);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_is_draft:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @is_draft: whether the video is a draft
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:is-draft property to decide whether the video is a draft.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Deprecated: 0.17.0: This is now equivalent to
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_is_private().
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_is_draft (GDataYouTubeVideo *self, gboolean is_draft)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_is_private (self, is_draft);
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "is-draft");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Convert from v3 to v2 API video upload state. References:
|
|
Packit |
4b6dd7 |
* v2: https://developers.google.com/youtube/2.0/reference?csw=1#youtube_data_api_tag_yt:state
|
|
Packit |
4b6dd7 |
* v3: https://developers.google.com/youtube/v3/docs/videos#processingDetails.processingStatus
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/docs/videos#status.uploadStatus
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
static const gchar *
|
|
Packit |
4b6dd7 |
convert_state_name (const gchar *v3_processing_status,
|
|
Packit |
4b6dd7 |
const gchar *v3_upload_status)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (v3_upload_status, "deleted") == 0 ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v3_upload_status, "failed") == 0 ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v3_upload_status, "rejected") == 0) {
|
|
Packit |
4b6dd7 |
return v3_upload_status;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_processing_status, "processing") == 0) {
|
|
Packit |
4b6dd7 |
return v3_processing_status;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* References:
|
|
Packit |
4b6dd7 |
* v2: https://developers.google.com/youtube/2.0/reference?csw=1#youtube_data_api_tag_yt:state
|
|
Packit |
4b6dd7 |
* v3: https://developers.google.com/youtube/v3/docs/videos#status.failureReason
|
|
Packit |
4b6dd7 |
* https://developers.google.com/youtube/v3/docs/videos#status.rejectionReason
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
static const gchar *
|
|
Packit |
4b6dd7 |
convert_state_reason_code (const gchar *v2_name,
|
|
Packit |
4b6dd7 |
const gchar *v3_failure_reason,
|
|
Packit |
4b6dd7 |
const gchar *v3_rejection_reason)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (v2_name == NULL ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v2_name, "processing") == 0 ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v2_name, "deleted") == 0) {
|
|
Packit |
4b6dd7 |
/* Explicitly unset if unknown, processing or deleted. */
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v2_name, "restricted") == 0) {
|
|
Packit |
4b6dd7 |
/* Unsupported conversion; convert_state_name() can never return
|
|
Packit |
4b6dd7 |
* ‘restricted’ anyway. */
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v2_name, "rejected") == 0) {
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (v3_rejection_reason, "claim") == 0 ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v3_rejection_reason, "copyright") == 0 ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v3_rejection_reason, "trademark") == 0) {
|
|
Packit |
4b6dd7 |
return "copyright";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rejection_reason, "duplicate") == 0) {
|
|
Packit |
4b6dd7 |
return "duplicate";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rejection_reason,
|
|
Packit |
4b6dd7 |
"inappropriate") == 0) {
|
|
Packit |
4b6dd7 |
return "inappropriate";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rejection_reason, "length") == 0) {
|
|
Packit |
4b6dd7 |
return "tooLong";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rejection_reason, "termsOfUse") == 0) {
|
|
Packit |
4b6dd7 |
return "termsOfUse";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_rejection_reason,
|
|
Packit |
4b6dd7 |
"uploaderAccountClosed") == 0 ||
|
|
Packit |
4b6dd7 |
g_strcmp0 (v3_rejection_reason,
|
|
Packit |
4b6dd7 |
"uploaderAccountSuspended") == 0) {
|
|
Packit |
4b6dd7 |
return "duplicate";
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
/* Generic fallback. */
|
|
Packit |
4b6dd7 |
return "termsOfUse";
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v2_name, "failed") == 0) {
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (v3_failure_reason, "codec") == 0) {
|
|
Packit |
4b6dd7 |
return "unsupportedCodec";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_failure_reason, "conversion") == 0) {
|
|
Packit |
4b6dd7 |
return "invalidFormat";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_failure_reason, "emptyFile") == 0) {
|
|
Packit |
4b6dd7 |
return "empty";
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (v3_failure_reason, "tooSmall") == 0) {
|
|
Packit |
4b6dd7 |
return "tooSmall";
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
return "cantProcess";
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_state:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:state property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/youtube/v3/docs/videos#status.uploadStatus">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer none): a #GDataYouTubeState showing the state of the video, or %NULL
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataYouTubeState *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_state (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeVideoPrivate *priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv = self->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Lazily create the state object. */
|
|
Packit |
4b6dd7 |
if (priv->upload_state == NULL) {
|
|
Packit |
4b6dd7 |
const gchar *name, *reason_code;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
name = convert_state_name (priv->processing_status,
|
|
Packit |
4b6dd7 |
priv->upload_status);
|
|
Packit |
4b6dd7 |
reason_code = convert_state_reason_code (name,
|
|
Packit |
4b6dd7 |
priv->failure_reason,
|
|
Packit |
4b6dd7 |
priv->rejection_reason);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->upload_state = g_object_new (GDATA_TYPE_YOUTUBE_STATE,
|
|
Packit |
4b6dd7 |
"name", name,
|
|
Packit |
4b6dd7 |
"reason-code", reason_code,
|
|
Packit |
4b6dd7 |
"help-uri", NULL,
|
|
Packit |
4b6dd7 |
"message", NULL,
|
|
Packit |
4b6dd7 |
NULL);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return priv->upload_state;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_recorded:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:recorded property. If the property is unset, -1 will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the UNIX timestamp for the time the video was recorded, or -1
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gint64
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_recorded (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), -1);
|
|
Packit |
4b6dd7 |
return self->priv->recorded;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_recorded:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @recorded: the video's new recorded time, or -1
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:recorded property to the new recorded time, @recorded.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Set @recorded to -1 to unset the video's recorded time.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_recorded (GDataYouTubeVideo *self, gint64 recorded)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (recorded >= -1);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
self->priv->recorded = recorded;
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "recorded");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_video_id_from_uri:
|
|
Packit |
4b6dd7 |
* @video_uri: a YouTube video player URI
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Extracts a video ID from a YouTube video player URI. The video ID is in the same form as returned by
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_video_id(), and the @video_uri should be in the same form as returned by
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_player_uri().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The function will validate whether the URI actually points to a hostname containing <literal>youtube</literal>
|
|
Packit |
4b6dd7 |
* (e.g. <literal>youtube.com</literal>), and will return %NULL if it doesn't.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For example:
|
|
Packit |
4b6dd7 |
* <informalexample><programlisting>
|
|
Packit |
4b6dd7 |
* video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.com/watch?v=BH_vwsyCrTc&feature=featured");
|
|
Packit |
4b6dd7 |
* g_message ("Video ID: %s", video_id); /* Should print: BH_vwsyCrTc */
|
|
Packit |
4b6dd7 |
* g_free (video_id);
|
|
Packit |
4b6dd7 |
* </programlisting></informalexample>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the video ID, or %NULL; free with g_free()
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_video_id_from_uri (const gchar *video_uri)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gchar *video_id = NULL;
|
|
Packit |
4b6dd7 |
SoupURI *uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (video_uri != NULL && *video_uri != '\0', NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Extract the query string from the URI */
|
|
Packit |
4b6dd7 |
uri = soup_uri_new (video_uri);
|
|
Packit |
4b6dd7 |
if (uri == NULL)
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
else if (uri->host == NULL || strstr (uri->host, "youtube") == NULL) {
|
|
Packit |
4b6dd7 |
soup_uri_free (uri);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Try the "v" parameter (e.g. format is: http://www.youtube.com/watch?v=ylLzyHk54Z0) */
|
|
Packit |
4b6dd7 |
if (uri->query != NULL) {
|
|
Packit |
4b6dd7 |
GHashTable *params = soup_form_decode (uri->query);
|
|
Packit |
4b6dd7 |
video_id = g_strdup (g_hash_table_lookup (params, "v"));
|
|
Packit |
4b6dd7 |
g_hash_table_destroy (params);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Try the "v" fragment component (e.g. format is: http://www.youtube.com/watch#!v=ylLzyHk54Z0).
|
|
Packit |
4b6dd7 |
* YouTube introduced this new URI format in March 2010:
|
|
Packit |
4b6dd7 |
* http://apiblog.youtube.com/2010/03/upcoming-change-to-youtube-video-page.html */
|
|
Packit |
4b6dd7 |
if (video_id == NULL && uri->fragment != NULL) {
|
|
Packit |
4b6dd7 |
gchar **components, **i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
components = g_strsplit (uri->fragment, "!", -1);
|
|
Packit |
4b6dd7 |
for (i = components; *i != NULL; i++) {
|
|
Packit |
4b6dd7 |
if (**i == 'v' && *((*i) + 1) == '=') {
|
|
Packit |
4b6dd7 |
video_id = g_strdup ((*i) + 2);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
g_strfreev (components);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
soup_uri_free (uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return video_id;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_aspect_ratio:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:aspect-ratio property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the aspect ratio property, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_aspect_ratio (GDataYouTubeVideo *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_YOUTUBE_VIDEO (self), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Permanently NULL for the moment, but let’s not deprecate the property
|
|
Packit |
4b6dd7 |
* because it looks like it might come in useful in future. */
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_aspect_ratio:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @aspect_ratio: (allow-none): the aspect ratio property, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:aspect-ratio property to specify the video's aspect ratio.
|
|
Packit |
4b6dd7 |
* If @aspect_ratio is %NULL, the property will be unset.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_aspect_ratio (GDataYouTubeVideo *self, const gchar *aspect_ratio)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Ignore it. See note in gdata_youtube_video_get_aspect_ratio(),
|
|
Packit |
4b6dd7 |
* above. */
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_get_coordinates:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @latitude: (out caller-allocates) (allow-none): return location for the latitude, or %NULL
|
|
Packit |
4b6dd7 |
* @longitude: (out caller-allocates) (allow-none): return location for the longitude, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataYouTubeVideo:latitude and #GDataYouTubeVideo:longitude properties, setting the out parameters to them. If either latitude or
|
|
Packit |
4b6dd7 |
* longitude is %NULL, that parameter will not be set. If the coordinates are unset, @latitude and @longitude will be set to %G_MAXDOUBLE.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_coordinates (GDataYouTubeVideo *self, gdouble *latitude, gdouble *longitude)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (latitude != NULL) {
|
|
Packit |
4b6dd7 |
*latitude = self->priv->latitude;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
if (longitude != NULL) {
|
|
Packit |
4b6dd7 |
*longitude = self->priv->longitude;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_youtube_video_set_coordinates:
|
|
Packit |
4b6dd7 |
* @self: a #GDataYouTubeVideo
|
|
Packit |
4b6dd7 |
* @latitude: the video's new latitude coordinate, or %G_MAXDOUBLE
|
|
Packit |
4b6dd7 |
* @longitude: the video's new longitude coordinate, or %G_MAXDOUBLE
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataYouTubeVideo:latitude and #GDataYouTubeVideo:longitude properties to @latitude and @longitude respectively.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_youtube_video_set_coordinates (GDataYouTubeVideo *self, gdouble latitude, gdouble longitude)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_YOUTUBE_VIDEO (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
self->priv->latitude = latitude;
|
|
Packit |
4b6dd7 |
self->priv->longitude = longitude;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_object_freeze_notify (G_OBJECT (self));
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "latitude");
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "longitude");
|
|
Packit |
4b6dd7 |
g_object_thaw_notify (G_OBJECT (self));
|
|
Packit |
4b6dd7 |
}
|