1

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.

JeffS
  • 11
  • 2

0 Answers0