使用Ruby调用YouTube Data API v3插入字幕始终返回invalidMetadata错误
解决YouTube Ruby SDK插入字幕的invalidMetadata错误
问题根源
你碰到的这个invalidMetadata错误,连传nil当body都触发,说明问题根本不在字段值本身,而是请求体的构造方式不符合Ruby SDK的要求——直接用原生哈希没法被SDK正确序列化,导致API认为元数据无效。
修复步骤
google-apis-youtube_v3 gem要求用它内置的模型类来构建请求体,不能直接用普通哈希。改法如下:
替换哈希为SDK内置模型实例
把原来的哈希body换成Google::Apis::YoutubeV3::Caption对象,同时用CaptionSnippet构造片段信息:
require 'googleauth' require 'googleauth/stores/file_token_store' require 'google-apis-youtube_v3' def authorize [... auth code omitted ...] end def get_service service = Google::Apis::YoutubeV3::YouTubeService.new service.key = API_KEY service.client_options.application_name = APPLICATION_NAME service.authorization = authorize service end # 用SDK提供的Snippet模型构造元数据 snippet = Google::Apis::YoutubeV3::CaptionSnippet.new( video_id: 'XYZ123', language: 'en', name: 'English' ) # 构造完整的Caption请求体 body = Google::Apis::YoutubeV3::Caption.new(snippet: snippet) s = get_service # 第一个参数指定返回的字段集合,这里必须包含"snippet" s.insert_caption('snippet', body, upload_source: '/path/to/my-captions.vtt')
额外需要检查的点
- 字幕文件格式:
.vtt要符合WebVTT规范,比如开头要有WEBVTT标识,时间格式正确 - 账号权限:授权的Google账号必须是目标视频的所有者,或者有编辑权限
- 语言代码:确保用的是标准ISO 639-1代码(比如
en是合法的,别写错)
为什么原来的写法不行?
Ruby SDK的序列化逻辑只认自己内置的模型类,普通哈希没法被转换成YouTube API需要的合法JSON结构。哪怕你传了正确的字段,SDK也没把它们正确传递给API,导致API判定元数据无效——这也是传nil会得到同样错误的原因:请求体从一开始就没被正确构造。
内容的提问来源于stack exchange,提问作者EK0
相关产品推荐
相关产品推荐

