|
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) 2015 Philip Withnall <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 |
#include <gdata/gdata.h>
|
|
Packit |
4b6dd7 |
#include <locale.h>
|
|
Packit |
4b6dd7 |
#include <string.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#define CLIENT_ID "1074795795536-necvslvs0pchk65nf6ju4i6mniogg8fr.apps.googleusercontent.com"
|
|
Packit |
4b6dd7 |
#define CLIENT_SECRET "8totRi50eo2Zfr3SD2DeNAzo"
|
|
Packit |
4b6dd7 |
#define REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob"
|
|
Packit |
4b6dd7 |
#define DEVELOPER_KEY "AIzaSyCENhl8yDxDZbyhTF6p-ok-RefK07xdXUg"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
print_usage (char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Usage — %s <subcommand>\n"
|
|
Packit |
4b6dd7 |
"Subcommands:\n"
|
|
Packit |
4b6dd7 |
" search <query string>\n"
|
|
Packit |
4b6dd7 |
" info <video ID>\n"
|
|
Packit |
4b6dd7 |
" standard-feed <feed name>\n"
|
|
Packit |
4b6dd7 |
" categories\n"
|
|
Packit |
4b6dd7 |
" related <video ID>\n"
|
|
Packit |
4b6dd7 |
" upload <filename> <title> [description]\n",
|
|
Packit |
4b6dd7 |
argv[0], argv[0]);
|
|
Packit |
4b6dd7 |
return -1;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
print_video (GDataYouTubeVideo *video)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *title, *player_uri, *id, *description;
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataMediaThumbnail>*/ *thumbnails;
|
|
Packit |
4b6dd7 |
GTimeVal date_published_tv = { 0, };
|
|
Packit |
4b6dd7 |
gchar *date_published = NULL; /* owned */
|
|
Packit |
4b6dd7 |
guint duration; /* seconds */
|
|
Packit |
4b6dd7 |
guint rating_min = 0, rating_max = 0, rating_count = 0;
|
|
Packit |
4b6dd7 |
gdouble rating_average = 0.0;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
title = gdata_entry_get_title (GDATA_ENTRY (video));
|
|
Packit |
4b6dd7 |
player_uri = gdata_youtube_video_get_player_uri (video);
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (video));
|
|
Packit |
4b6dd7 |
description = gdata_youtube_video_get_description (video);
|
|
Packit |
4b6dd7 |
thumbnails = gdata_youtube_video_get_thumbnails (video);
|
|
Packit |
4b6dd7 |
date_published_tv.tv_sec = gdata_entry_get_published (GDATA_ENTRY (video));
|
|
Packit |
4b6dd7 |
date_published = g_time_val_to_iso8601 (&date_published_tv);
|
|
Packit |
4b6dd7 |
duration = gdata_youtube_video_get_duration (video);
|
|
Packit |
4b6dd7 |
gdata_youtube_video_get_rating (video, &rating_min, &rating_max,
|
|
Packit |
4b6dd7 |
&rating_count, &rating_average);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("%s — %s\n", player_uri, title);
|
|
Packit |
4b6dd7 |
g_print (" ID: %s\n", id);
|
|
Packit |
4b6dd7 |
g_print (" Published: %s\n", date_published);
|
|
Packit |
4b6dd7 |
g_print (" Duration: %us\n", duration);
|
|
Packit |
4b6dd7 |
g_print (" Rating: %.2f (min: %u, max: %u, count: %u)\n",
|
|
Packit |
4b6dd7 |
rating_average, rating_min, rating_max, rating_count);
|
|
Packit |
4b6dd7 |
g_print (" Description:\n %s\n", description);
|
|
Packit |
4b6dd7 |
g_print (" Thumbnails:\n");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (; thumbnails != NULL; thumbnails = thumbnails->next) {
|
|
Packit |
4b6dd7 |
GDataMediaThumbnail *thumbnail;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
thumbnail = GDATA_MEDIA_THUMBNAIL (thumbnails->data);
|
|
Packit |
4b6dd7 |
g_print (" • %s\n",
|
|
Packit |
4b6dd7 |
gdata_media_thumbnail_get_uri (thumbnail));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("\n");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (date_published);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
print_category (GDataCategory *category)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *term, *label;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
term = gdata_category_get_term (category);
|
|
Packit |
4b6dd7 |
label = gdata_category_get_label (category);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("%s — %s\n", term, label);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static GDataAuthorizer *
|
|
Packit |
4b6dd7 |
create_authorizer (GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataOAuth2Authorizer *authorizer = NULL; /* owned */
|
|
Packit |
4b6dd7 |
gchar *uri = NULL;
|
|
Packit |
4b6dd7 |
gchar code[100];
|
|
Packit |
4b6dd7 |
GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Go through the interactive OAuth dance. */
|
|
Packit |
4b6dd7 |
authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET,
|
|
Packit |
4b6dd7 |
REDIRECT_URI,
|
|
Packit |
4b6dd7 |
GDATA_TYPE_YOUTUBE_SERVICE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Get an authentication URI */
|
|
Packit |
4b6dd7 |
uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer,
|
|
Packit |
4b6dd7 |
NULL, FALSE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Wait for the user to retrieve and enter the verifier. */
|
|
Packit |
4b6dd7 |
g_print ("Please navigate to the following URI and grant access:\n"
|
|
Packit |
4b6dd7 |
" %s\n", uri);
|
|
Packit |
4b6dd7 |
g_print ("Enter verifier (EOF to abort): ");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (scanf ("%100s", code) != 1) {
|
|
Packit |
4b6dd7 |
/* User chose to abort. */
|
|
Packit |
4b6dd7 |
g_print ("\n");
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Authorise the token. */
|
|
Packit |
4b6dd7 |
gdata_oauth2_authorizer_request_authorization (authorizer, code, NULL,
|
|
Packit |
4b6dd7 |
&child_error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
g_propagate_error (error, child_error);
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return GDATA_AUTHORIZER (authorizer);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Search for videos given a simple query string. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_search (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataYouTubeQuery *query = NULL;
|
|
Packit |
4b6dd7 |
GDataFeed *feed = NULL;
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataYouTubeVideo>*/ *entries;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
const gchar *query_string;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 3) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
query_string = argv[2];
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_youtube_service_new (DEVELOPER_KEY, NULL);
|
|
Packit |
4b6dd7 |
query = gdata_youtube_query_new (query_string);
|
|
Packit |
4b6dd7 |
feed = gdata_youtube_service_query_videos (service, GDATA_QUERY (query),
|
|
Packit |
4b6dd7 |
NULL, NULL, NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
for (entries = gdata_feed_get_entries (feed); entries != NULL;
|
|
Packit |
4b6dd7 |
entries = entries->next) {
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *video;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video = GDATA_YOUTUBE_VIDEO (entries->data);
|
|
Packit |
4b6dd7 |
print_video (video);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("Total of %u results.\n", gdata_feed_get_total_results (feed));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&feed);
|
|
Packit |
4b6dd7 |
g_clear_object (&query);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Display information about a single video. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_info (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataEntry *result = NULL;
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *video; /* unowned */
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
const gchar *entry_id;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 3) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
entry_id = argv[2];
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_youtube_service_new (DEVELOPER_KEY, NULL);
|
|
Packit |
4b6dd7 |
result = gdata_service_query_single_entry (GDATA_SERVICE (service),
|
|
Packit |
4b6dd7 |
NULL, entry_id, NULL,
|
|
Packit |
4b6dd7 |
GDATA_TYPE_YOUTUBE_VIDEO,
|
|
Packit |
4b6dd7 |
NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
video = GDATA_YOUTUBE_VIDEO (result);
|
|
Packit |
4b6dd7 |
print_video (video);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&result);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
standard_feed_type_from_name (const gchar *name,
|
|
Packit |
4b6dd7 |
GDataYouTubeStandardFeedType *out)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* Indexed by GDataYouTubeStandardFeedType. */
|
|
Packit |
4b6dd7 |
const gchar *feed_type_names[] = {
|
|
Packit |
4b6dd7 |
"top-rated",
|
|
Packit |
4b6dd7 |
"top-favorites",
|
|
Packit |
4b6dd7 |
"most-viewed",
|
|
Packit |
4b6dd7 |
"most-popular",
|
|
Packit |
4b6dd7 |
"most-recent",
|
|
Packit |
4b6dd7 |
"most-discussed",
|
|
Packit |
4b6dd7 |
"most-linked",
|
|
Packit |
4b6dd7 |
"most-responded",
|
|
Packit |
4b6dd7 |
"recently-featured",
|
|
Packit |
4b6dd7 |
"watch-on-mobile",
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_STATIC_ASSERT (G_N_ELEMENTS (feed_type_names) ==
|
|
Packit |
4b6dd7 |
GDATA_YOUTUBE_WATCH_ON_MOBILE_FEED + 1);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < G_N_ELEMENTS (feed_type_names); i++) {
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (feed_type_names[i], name) == 0) {
|
|
Packit |
4b6dd7 |
*out = (GDataYouTubeStandardFeedType) i;
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* List all videos in a standard feed. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_standard_feed (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataFeed *feed = NULL;
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataYouTubeVideo>*/ *entries;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
GDataYouTubeStandardFeedType feed_type;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 3) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!standard_feed_type_from_name (argv[2], &feed_type)) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Invalid feed type ‘%s’.\n", argv[0], argv[2]);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_youtube_service_new (DEVELOPER_KEY, NULL);
|
|
Packit |
4b6dd7 |
feed = gdata_youtube_service_query_standard_feed (service, feed_type,
|
|
Packit |
4b6dd7 |
NULL, NULL, NULL,
|
|
Packit |
4b6dd7 |
NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
for (entries = gdata_feed_get_entries (feed); entries != NULL;
|
|
Packit |
4b6dd7 |
entries = entries->next) {
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *video;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video = GDATA_YOUTUBE_VIDEO (entries->data);
|
|
Packit |
4b6dd7 |
print_video (video);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("Total of %u results.\n", gdata_feed_get_total_results (feed));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&feed);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* List videos related to a given one. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_related (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataFeed *feed = NULL;
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataYouTubeVideo>*/ *entries;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
const gchar *entry_id;
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *query_video = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 3) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
entry_id = argv[2];
|
|
Packit |
4b6dd7 |
query_video = gdata_youtube_video_new (entry_id);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_youtube_service_new (DEVELOPER_KEY, NULL);
|
|
Packit |
4b6dd7 |
feed = gdata_youtube_service_query_related (service, query_video, NULL,
|
|
Packit |
4b6dd7 |
NULL, NULL, NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
for (entries = gdata_feed_get_entries (feed); entries != NULL;
|
|
Packit |
4b6dd7 |
entries = entries->next) {
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *video;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video = GDATA_YOUTUBE_VIDEO (entries->data);
|
|
Packit |
4b6dd7 |
print_video (video);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("Total of %u results.\n", gdata_feed_get_total_results (feed));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&query_video);
|
|
Packit |
4b6dd7 |
g_clear_object (&feed);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* List all available video categories. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_categories (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataAPPCategories *app_categories = NULL;
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataCategory>*/ *categories;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_youtube_service_new (DEVELOPER_KEY, NULL);
|
|
Packit |
4b6dd7 |
app_categories = gdata_youtube_service_get_categories (service, NULL,
|
|
Packit |
4b6dd7 |
&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
for (categories = gdata_app_categories_get_categories (app_categories);
|
|
Packit |
4b6dd7 |
categories != NULL;
|
|
Packit |
4b6dd7 |
categories = categories->next) {
|
|
Packit |
4b6dd7 |
GDataCategory *category;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
category = GDATA_CATEGORY (categories->data);
|
|
Packit |
4b6dd7 |
print_category (category);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("Total of %u results.\n",
|
|
Packit |
4b6dd7 |
g_list_length (gdata_app_categories_get_categories (app_categories)));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&app_categories);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Upload a video. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_upload (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataYouTubeService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataUploadStream *upload_stream = NULL;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
const gchar *filename;
|
|
Packit |
4b6dd7 |
GFile *video_file = NULL;
|
|
Packit |
4b6dd7 |
GFileInputStream *video_file_stream = NULL;
|
|
Packit |
4b6dd7 |
GFileInfo *video_file_info = NULL;
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *video = NULL;
|
|
Packit |
4b6dd7 |
GDataYouTubeVideo *uploaded_video = NULL;
|
|
Packit |
4b6dd7 |
gssize transfer_size;
|
|
Packit |
4b6dd7 |
const gchar *content_type, *slug;
|
|
Packit |
4b6dd7 |
GDataAuthorizer *authorizer = NULL;
|
|
Packit |
4b6dd7 |
const gchar *title, *description;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 3) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
filename = argv[2];
|
|
Packit |
4b6dd7 |
title = (argc > 3) ? argv[3] : NULL;
|
|
Packit |
4b6dd7 |
description = (argc > 4) ? argv[4] : NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Load the file and query its details. */
|
|
Packit |
4b6dd7 |
video_file = g_file_new_for_commandline_arg (filename);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video_file_info = g_file_query_info (video_file,
|
|
Packit |
4b6dd7 |
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
|
|
Packit |
4b6dd7 |
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
|
|
Packit |
4b6dd7 |
G_FILE_QUERY_INFO_NONE, NULL,
|
|
Packit |
4b6dd7 |
&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error loading video information ‘%s’: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], filename, error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
content_type = g_file_info_get_content_type (video_file_info);
|
|
Packit |
4b6dd7 |
slug = g_file_info_get_display_name (video_file_info);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
video_file_stream = g_file_read (video_file, NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error loading video ‘%s’: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], filename, error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Build the video. */
|
|
Packit |
4b6dd7 |
video = gdata_youtube_video_new (NULL);
|
|
Packit |
4b6dd7 |
gdata_entry_set_title (GDATA_ENTRY (video), title);
|
|
Packit |
4b6dd7 |
gdata_entry_set_summary (GDATA_ENTRY (video), description);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Authenticate and create a service. */
|
|
Packit |
4b6dd7 |
authorizer = create_authorizer (&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error authenticating: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
} else if (authorizer == NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: User chose to abort authentication.\n",
|
|
Packit |
4b6dd7 |
argv[0]);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_youtube_service_new (DEVELOPER_KEY,
|
|
Packit |
4b6dd7 |
GDATA_AUTHORIZER (authorizer));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Start the upload. */
|
|
Packit |
4b6dd7 |
upload_stream = gdata_youtube_service_upload_video (service, video,
|
|
Packit |
4b6dd7 |
slug, content_type,
|
|
Packit |
4b6dd7 |
NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error initializing upload with YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Upload the video */
|
|
Packit |
4b6dd7 |
transfer_size = g_output_stream_splice (G_OUTPUT_STREAM (upload_stream),
|
|
Packit |
4b6dd7 |
G_INPUT_STREAM (video_file_stream),
|
|
Packit |
4b6dd7 |
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
|
|
Packit |
4b6dd7 |
G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
|
|
Packit |
4b6dd7 |
NULL, &error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error transferring file: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Finish off the upload */
|
|
Packit |
4b6dd7 |
uploaded_video = gdata_youtube_service_finish_video_upload (service,
|
|
Packit |
4b6dd7 |
upload_stream,
|
|
Packit |
4b6dd7 |
&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error finishing upload with YouTube: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print the uploaded video as confirmation. */
|
|
Packit |
4b6dd7 |
g_print ("Uploaded %" G_GSSIZE_FORMAT " bytes.\n", transfer_size);
|
|
Packit |
4b6dd7 |
print_video (uploaded_video);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
g_clear_object (&uploaded_video);
|
|
Packit |
4b6dd7 |
g_clear_object (&video);
|
|
Packit |
4b6dd7 |
g_clear_object (&video_file_info);
|
|
Packit |
4b6dd7 |
g_clear_object (&video_file_stream);
|
|
Packit |
4b6dd7 |
g_clear_object (&video_file);
|
|
Packit |
4b6dd7 |
g_clear_object (&upload_stream);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static const struct {
|
|
Packit |
4b6dd7 |
const gchar *command;
|
|
Packit |
4b6dd7 |
int (*handler_fn) (int argc, char **argv);
|
|
Packit |
4b6dd7 |
} command_handlers[] = {
|
|
Packit |
4b6dd7 |
{ "search", command_search },
|
|
Packit |
4b6dd7 |
{ "info", command_info },
|
|
Packit |
4b6dd7 |
{ "standard-feed", command_standard_feed },
|
|
Packit |
4b6dd7 |
{ "categories", command_categories },
|
|
Packit |
4b6dd7 |
{ "related", command_related },
|
|
Packit |
4b6dd7 |
{ "upload", command_upload },
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
int
|
|
Packit |
4b6dd7 |
main (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
gint retval = -1;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
setlocale (LC_ALL, "");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 2) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < G_N_ELEMENTS (command_handlers); i++) {
|
|
Packit |
4b6dd7 |
if (strcmp (argv[1], command_handlers[i].command) == 0) {
|
|
Packit |
4b6dd7 |
retval = command_handlers[i].handler_fn (argc, argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (retval == -1) {
|
|
Packit |
4b6dd7 |
retval = print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|