gpt4 book ai didi

.net - 如何在.Net中使用YoutubeApi v3向YouTube视频添加字幕

转载 作者:行者123 更新时间:2023-12-03 05:31:50 25 4
gpt4 key购买 nike

我在将字幕添加到上传到我公司的youtube channel 的视频时遇到问题。我想用.Net中的Google的Youtube Api v3做到这一点。我能够成功将视频上传到 channel ,但是在尝试发送字幕时出现以下错误:
“System.Net.Http.HttpRequestException:响应状态代码不指示成功:403(禁止)。”

据我所知,我的凭据不会禁止我上传字幕。我可以顺利上传视频。

我使用以下说明创建了刷新 token :
Youtube API single-user scenario with OAuth (uploading videos)

这是我用来创建YouTubeService对象的代码:

    private YouTubeService GetYouTubeService()
{
string clientId = "clientId";
string clientSecret = "clientSecret";
string refreshToken = "refreshToken";
try
{
ClientSecrets secrets = new ClientSecrets()
{
ClientId = clientId,
ClientSecret = clientSecret
};

var token = new TokenResponse { RefreshToken = refreshToken };
var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = secrets,
Scopes = new[] { YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeUpload, YouTubeService.Scope.YoutubeForceSsl }
}),
"user",
token);

var service = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = "TestProject"
});

service.HttpClient.Timeout = TimeSpan.FromSeconds(360);
return service;
}
catch (Exception ex)
{
Log.Error("YouTube.GetYouTubeService() => Could not get youtube service. Ex: " + ex);
return null;
}

}

这是我用于上传字幕文件的代码:
    private void UploadCaptionFile(String videoId)
{
try
{
Caption caption = new Caption();
caption.Snippet = new CaptionSnippet();
caption.Snippet.Name = videoId + "_Caption";
caption.Snippet.Language = "en";
caption.Snippet.VideoId = videoId;
caption.Snippet.IsDraft = false;

WebRequest req = WebRequest.Create(_urlCaptionPath);
using (Stream stream = req.GetResponse().GetResponseStream())
{
CaptionsResource.InsertMediaUpload captionInsertRequest = _youtubeService.Captions.Insert(caption, "snippet", stream, "*/*");
captionInsertRequest.Sync = true;
captionInsertRequest.ProgressChanged += captionInsertRequest_ProgressChanged;
captionInsertRequest.ResponseReceived += captionInsertRequest_ResponseReceived;

IUploadProgress result = captionInsertRequest.Upload();
}
}
catch (Exception ex)
{
Log.Error("YouTube.UploadCaptionFile() => Unable to upload caption file. Ex: " + ex);
}
}

void captionInsertRequest_ResponseReceived(Caption obj)
{
Log.Info("YouTube.captionInsertRequest_ResponseReceived() => Caption ID " + obj.Id + " was successfully uploaded for this clip.");
Utility.UpdateClip(_videoClip);
}

void captionInsertRequest_ProgressChanged(IUploadProgress obj)
{
switch (obj.Status)
{
case UploadStatus.Uploading:
Console.WriteLine("{0} bytes sent.", obj.BytesSent);
break;

case UploadStatus.Failed:
Log.Error("YouTube.UploadCaptionFile() => An error prevented the upload from completing. " + obj.Exception);
break;
}
}

在过去的几天里,我一直在致力于解决这个问题,但是我一直无法取得任何进展。 YouTubeApi v3没有太多有关添加字幕的信息。我只能找到v2的一些旧信息,这需要一些POST调用,这些调用需要我没有的键。我希望能够使用API​​的内置方法添加字幕。

如果有人有处理此问题的经验,我将不胜感激您能提供的任何帮助。

编辑:

这是我将视频发送到YouTube的代码。
    public string UploadClipToYouTube()
{
try
{
var video = new Google.Apis.YouTube.v3.Data.Video();
video.Snippet = new VideoSnippet();
video.Snippet.Title = _videoClip.Name;
video.Snippet.Description = _videoClip.Description;
video.Snippet.Tags = GenerateTags();
video.Snippet.DefaultAudioLanguage = "en";
video.Snippet.DefaultLanguage = "en";
video.Snippet.CategoryId = "22";
video.Status = new VideoStatus();
video.Status.PrivacyStatus = "unlisted";

WebRequest req = WebRequest.Create(_videoPath);
using (Stream stream = req.GetResponse().GetResponseStream())
{
VideosResource.InsertMediaUpload insertRequest = _youtubeService.Videos.Insert(video, "snippet, status", stream, "video/*");
insertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
insertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;

insertRequest.Upload();
}
return UploadedVideoId;
}
catch (Exception ex)
{
Log.Error("YouTube.UploadClipToYoutube() => Error attempting to authenticate for YouTube. Ex: " + ex);
return "";
}
}

void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
{
switch (progress.Status)
{
case UploadStatus.Uploading:
Log.Info("YouTube.videosInsertRequest_ProgressChanged() => Uploading to Youtube. " + progress.BytesSent + " bytes sent.");
break;

case UploadStatus.Failed:
Log.Error("YouTube.videosInsertRequest_ProgressChanged() => An error prevented the upload from completing. Exception: " + progress.Exception);
break;
}
}

void videosInsertRequest_ResponseReceived(Google.Apis.YouTube.v3.Data.Video video)
{
Log.Info("YouTube.videosInsertRequest_ResponseReceived() => Video was successfully uploaded to YouTube. The YouTube id is " + video.Id);
UploadedVideoId = video.Id;
UploadCaptionFile(video.Id);
}

最佳答案

好了,我为您提供了从Java转换过来的非常快的内容(诚实地大约15分钟)。首先,您当前的代码中我注意到了很多东西,但这不是 CodeReview

The YouTubeApi v3 doesn't have much information on adding captions. All I was able to find was some old information for v2



您对此是正确的,但目前还没有(v3),但希望在不久的将来。这不会阻止我们修改v2,尽管这样做对我们有利,因为api非常相似...

代码尝试和测试
private async Task addVideoCaption(string videoID) //pass your video id here..
{
UserCredential credential;
//you should go out and get a json file that keeps your information... You can get that from the developers console...
using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { YouTubeService.Scope.YoutubeForceSsl, YouTubeService.Scope.Youtube, YouTubeService.Scope.Youtubepartner },
"ACCOUNT NAME HERE",
CancellationToken.None,
new FileDataStore(this.GetType().ToString())
);
}
//creates the service...
var youtubeService = new Google.Apis.YouTube.v3.YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = this.GetType().ToString(),
});

//create a CaptionSnippet object...
CaptionSnippet capSnippet = new CaptionSnippet();
capSnippet.Language = "en";
capSnippet.Name = videoID + "_Caption";
capSnippet.VideoId = videoID;
capSnippet.IsDraft = false;

//create new caption object
Caption caption = new Caption();

//set the completed snippet to the object now...
caption.Snippet = capSnippet;

//here we read our .srt which contains our subtitles/captions...
using (var fileStream = new FileStream("filepathhere", FileMode.Open))
{
//create the request now and insert our params...
var captionRequest = youtubeService.Captions.Insert(caption, "snippet",fileStream,"application/atom+xml");

//finally upload the request... and wait.
await captionRequest.UploadAsync();
}

}

如果您不知道外观或格式,请使用.srt文件示例。
1
00:00:00,599 --> 00:00:03,160
>> Caption Test zaggler@ StackOverflow

2
00:00:03,160 --> 00:00:05,770
>> If you're reading this it worked!

YouTube Video Proof。这是一个短片,大约5秒钟,只是为了向您展示它的工作原理和外观。 AND ...没有视频不是我的视频,而是抓取它来测试 :)

祝你好运,编程愉快!

关于.net - 如何在.Net中使用YoutubeApi v3向YouTube视频添加字幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com