Youtube v3 API 字幕下载
Posted
技术标签:
【中文标题】Youtube v3 API 字幕下载【英文标题】:Youtube v3 API captions downloading 【发布时间】:2018-02-25 14:42:43 【问题描述】:我正在尝试使用他们的 nuget 包从 Youtube 上的一些视频中下载字幕。这是一些代码:
var request = _youtube.Search.List("snippet,id");
request.Q = "Bill Gates";
request.MaxResults = 50;
request.Type = "video";
var results = request.Execute();
foreach (var result in results.Items)
var captionListRequest = _youtube.Captions.List("id,snippet", result.Id.VideoId);
var captionListResponse = captionListRequest.Execute();
var russianCaptions =
captionListResponse.Items.FirstOrDefault(c => c.Snippet.Language.ToLower() == "ru");
if (russianCaptions != null)
var downloadRequest = _youtube.Captions.Download(russianCaptions.Id);
downloadRequest.Tfmt = CaptionsResource.DownloadRequest.TfmtEnum.Srt;
var ms = new MemoryStream();
downloadRequest.Download(ms);
当调用 Download 方法时,我得到一个奇怪的 Newtonsoft.JSON 异常,上面写着:
Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: T. Path '', line 0, position 0.'
at Newtonsoft.Json.JsonTextReader.ParseValue()
我已经阅读了有关字幕下载问题的其他一些主题,并尝试更改我的授权工作流程:首先我尝试仅使用 ApiKey,但随后也尝试了 OAuth。这是它现在的样子:
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
ClientId = "CLIENT_ID",
ClientSecret = "CLIENT_SECRET"
,
new[] YouTubeService.Scope.YoutubeForceSsl ,
"user",
CancellationToken.None,
new FileDataStore("Youtube.CaptionsCrawler")).Result;
_youtube = new YouTubeService(new BaseClientService.Initializer
ApplicationName = "LKS Captions downloader",
HttpClientInitializer = credential
);
那么,是否有可能实现我想要实现的目标?
附:我能够深入挖掘 youtube nuget 包,如我所见,我得到的实际消息(Newtonsoft.JSON 正在尝试反序列化,呵呵!)是“与请求相关的权限不够下载字幕轨道。该请求可能未得到正确授权,或者视频订单可能未启用第三方对此字幕的贡献。"
那么,我必须是视频所有者才能下载字幕吗?但如果是这样,其他程序如Google2SRT 是如何工作的?
【问题讨论】:
基于此thread,请注意JObject.Parse()
需要实际的 JSON 内容(字符串),而不是路径。此外,将 JSON 字符串转换为 JObject
然后返回 ToString()
实际上并没有在此处添加任何“值”。您也可以查看以下链接:1 和 2。
这个 Parse 方法被称为 INSIDE google 的 nuget 包,所以我们对此无能为力。但真正的问题是字幕没有正确下载。
我的问题是将 CC 变成一个字符串。
【参考方案1】:
找到这个帖子How to get "transcript" in youtube-api v3
您可以通过 GET 请求获取它们:http://video.google.com/timedtext?lang=LANG&v=VIDEOID
示例: http://video.google.com/timedtext?lang=en&v=-osCkzoL53U
请注意,它们应该添加字幕,如果自动生成将不起作用。
【讨论】:
至于我,我最终从google2srt.sourceforge.net/en 获得了 Google2SRT 的源代码。在那里我可以找到所有必需的 url 和查询字符串。 您也可以通过在 URL 中附加&track=asr
来获得自动生成的字幕,但对于某些视频,我也没有得到响应。
是否可以使用 API v3 nuget 本身而不是进行 http 调用来获取它?
@AmirNo-Family 不这么认为,如果您不是视频的所有者
是否可以通过他们的 API 下载自动生成的 YouTube 字幕?以上是关于Youtube v3 API 字幕下载的主要内容,如果未能解决你的问题,请参考以下文章
PHP:使用同步标志上传 YouTube v3 API 字幕
如何在 YouTube api v3 中获取 YouTube 视频的 cc 字幕