Search code examples
c#google-oauthyoutube-data-apigoogle-api-dotnet-clientyoutube-livestreaming-api

Youtube Live API - Broadcast premission denied using OAuth


I am trying to broadcast live from my .Net application using Youtube.Data.Api v3. I have set up OAuth and downloaded the .JSON file, and that works fine. I know that, because I have already successfully obtained a list of channels resp. videos on my account, i.e., following code works:

var channelsRequest = ytService.Channels.List("contentDetails, snippet");
channelsRequest.Mine = true;
var channelsListResponse = channelsRequest.Execute();

But if I try to execute a insert request (for completeness I show you the whole method),

public static LiveBroadcast CreateImmediateBroadcast(string title = "DefaultBroadcast") {
    var snippet = new LiveBroadcastSnippet();
    snippet.Title = title;
    snippet.ScheduledStartTime = DateTime.Now;
    snippet.ScheduledEndTime = DateTime.Now + TimeSpan.FromMinutes(60);

    var status = new LiveBroadcastStatus();
    status.PrivacyStatus = "unlisted";

    var broadcast = new LiveBroadcast();
    broadcast.Kind = "youtube#liveBroadcast";
    broadcast.Snippet = snippet;
    broadcast.Status = status;

    var insertBroadcastRequest = ytService.LiveBroadcasts.Insert(broadcast, "snippet, status");
    insertBroadcastRequest.Execute();
    return broadcast;
}

I get an exception when calling insertBroadcastRequest.Execute(), namely:

Google.GoogleApiException was unhandled

HResult=-2146233088 Message=Google.Apis.Requests.RequestError

Insufficient Permission [403] Errors [ Message[Insufficient Permission] Location[ - ] Reason[insufficientPermissions] Domain[global] ] ServiceName=youtube

Source=Google.Apis

StackTrace: at Google.Apis.Requests.ClientServiceRequest`1.Execute() in C:\Users\cloudsharp\Documents\GitHub\google-api-dotnet-client\Src\Support\GoogleApis\Apis\Requests\ClientServiceRequest.cs:line 96 at YoutubeConsole.YouTubeAPI.CreateImmediateStream(String title) in C:\Users\bussg\Source\Workspaces\OwnExperimental\YoutubeConsole\YoutubeConsole\YouTubeAPI.cs:line 87 at YoutubeConsole.YouTubeAPI.Test() in ...

Also, for completeness, here is my authorization,

using (var stream = new FileStream(Directory.GetCurrentDirectory() + @"\GoogleAuthOtherApplication.json", FileMode.Open, FileAccess.Read)) {
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        new[] { YouTubeService.Scope.YoutubeForceSsl},
        "user",
        CancellationToken.None,
        new FileDataStore("YouTubeAPI")
    ).Result;
}

Also, For the YouTubeService.Scope I have tried all options. The insert method should work with ForceSsl according to the documentation.

Also this documentation page sais

Note: A channel must be approved to use the YouTube Live feature, which enables the channel owner to stream live content to that channel. If you send API requests on behalf of an authenticated user whose channel is not enabled or eligible to stream live content, the API will return an insufficientPermissions error.

But all my channels are approved for Youtube Live. Any ideas how to get this to work?


Solution

  • Ok after some testing between us over Email.

    1. You need to have the correct scope "YouTubeService.Scope.YoutubeForceSsl" by changing "user" we forced it to request permissions again. My tutorial on how filedata store works in the Google .net client library

    2. remove the space "snippet, status" by sending "snippet,status" it worked for me.

    For the fun of it: Issue 8568:LiveBroadcasts: insert - spaces in part