I am trying to upload a youtube video from a .NET C# windows console app. I get an exception during the Google.Apis.Upload.IUploadProgress progress:
Exception {"Error:"unauthorized_client", Description:"Unauthorized", Uri:"""} System.Exception {Google.Apis.Auth.OAuth2.Responses.TokenResponseException}
My code:
//...
using System.IO;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Upload;
using Google.Apis.Util.Store;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
//...
private void btnTest_Click(object sender, EventArgs e)
{
if (Path.GetFileName((@"D:\testdata\test.avi")) != "")
{
string vID = "none";
string sfilename = @"D:\testdata\test.avi";
string svideoName = "My Video Name";
string svideoDesc = "My Video Description";
string[] stags = new String[2];
stags[0] = "my tag 1";
stags[1] = "my tag 2";
string sSecret = "My Client Secret";
//**Obtained From https://console.cloud.google.com/apis/credentials**
string sClient_ID = "My Client ID";
//**Obtained From https://console.cloud.google.com/apis/credentials**
string sRefresh_Token = "My Refresh Token";
// **Obtained From OAuth 2.0 Playground**,
// **For scope I used "https://www.googleapis.com/auth/youtube.upload"**
FileStream fs = new FileStream(sfilename, FileMode.Open);
YouTubeUtilities ytU = new YouTubeUtilities(sRefresh_Token, sSecret, sClient_ID);
{
vID = ytU.UploadVideo(fs, svideoName, svideoDesc, stags, "22", false);
}
//Response.Write(vID);
}
}
public class YouTubeUtilities
{
private String CLIENT_ID { get; set; }
private String CLIENT_SECRET { get; set; }
private String REFRESH_TOKEN { get; set; }
private String UploadedVideoId { get; set; }
private YouTubeService youtube;
public YouTubeUtilities(String refresh_token, String client_secret, String client_id)
{
CLIENT_ID = client_id;
CLIENT_SECRET = client_secret;
REFRESH_TOKEN = refresh_token;
youtube = BuildService();
}
private YouTubeService BuildService()
{
ClientSecrets secrets = new ClientSecrets()
{
ClientId = CLIENT_ID,
ClientSecret = CLIENT_SECRET
};
var token = new Google.Apis.Auth.OAuth2.Responses.TokenResponse { RefreshToken = REFRESH_TOKEN };
var credentials = new UserCredential(new Google.Apis.Auth.OAuth2.Flows.GoogleAuthorizationCodeFlow(
new Google.Apis.Auth.OAuth2.Flows.GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = secrets
}),
"My Email Address", // Used to log in to google APIs and services
token);
var service = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = "My Project Name" // The name of my OAuth 2.0 client
});
//service.HttpClient.Timeout = TimeSpan.FromSeconds(360); // Choose a timeout to your liking
return service;
}
public String UploadVideo(Stream stream, String title, String desc, String[] tags, String categoryId, Boolean isPublic)
{
var video = new Video();
video.Snippet = new VideoSnippet();
video.Snippet.Title = title;
video.Snippet.Description = desc;
video.Snippet.Tags = tags;
video.Snippet.CategoryId = categoryId; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
video.Status = new VideoStatus();
video.Status.PrivacyStatus = isPublic ? "public" : "unlisted"; // "private" or "public" or unlisted
//var videosInsertRequest = youtube.Videos.Insert(video, "snippet,status", stream, "video/*");
var videosInsertRequest = youtube.Videos.Insert(video, "snippet,status", stream, "video/*");
videosInsertRequest.ProgressChanged += insertRequest_ProgressChanged;
videosInsertRequest.ResponseReceived += insertRequest_ResponseReceived;
videosInsertRequest.Upload();
return UploadedVideoId;
}
public void DeleteVideo(String videoId)
{
var videoDeleteRequest = youtube.Videos.Delete(videoId);
videoDeleteRequest.Execute();
}
void insertRequest_ResponseReceived(Video video)
{
UploadedVideoId = video.Id;
// video.ID gives you the ID of the Youtube video.
// you can access the video from
// http://www.youtube.com/watch?v={video.ID}
}
void insertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
{
// You can handle several status messages here.
switch (progress.Status)
{
case UploadStatus.Failed:
UploadedVideoId = "FAILED";
break;
case UploadStatus.Completed:
break;
default:
break;
}
}
}
I am using code that I found online here: Upload video to youtube with mvc application (all code behind)
and other various posts - but could not get it working.