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 字幕

YouTube API v3 中的隐藏式字幕

没有用户 OAuth 过程的 YouTube API

通过 YouTube 数据 API [Python] 下载非自有视频的隐藏式字幕

如何使用 Youtube API 为 Youtube 视频添加字幕?