YouTube API调用时如何同时使用snippet和contentDetails参数
YouTube API 同时获取视频基础信息、时长、频道头像的正确实现方式
核心问题原因
gapi.client.youtube.search.list 接口本身的设计就不支持返回contentDetails字段,你就算在part参数里加上该字段也不会返回对应数据,这是API的固有约束,不是传参格式的问题。
正确实现步骤
- 第一步:先调用
search.list接口,part参数仅保留snippet即可,获取返回结果中所有视频的id.videoId,将所有ID拼接为逗号分隔的字符串 - 第二步:调用
gapi.client.youtube.videos.list接口,设置part为snippet,contentDetails,把第一步拿到的ID字符串传给id参数,该接口会返回你需要的核心字段:- 视频时长:在返回结果的
contentDetails.duration字段中,为ISO 8601时间格式,比如PT1M30S就代表1分30秒,可自行转换为常规时分秒格式 - 频道ID:在返回结果的
snippet.channelId字段中,用该ID调用channels.list接口,part设置为snippet即可获取频道头像信息
- 视频时长:在返回结果的
修改后的代码示例
$(function(){ $("#formen").on("submit",function(e){ e.preventDefault(); $("#result").html(''); var request = gapi.client.youtube.search.list({ order: "viewCount", part: "snippet", type: "video", q: encodeURIComponent($("#search").val()).replace(/%20/g, "+"), maxResults: 15 }); request.execute(function(searchResponse) { // 收集所有视频ID const videoIds = searchResponse.result.items.map(item => item.id.videoId).join(','); // 调用videos接口获取时长等额外字段 const videoRequest = gapi.client.youtube.videos.list({ part: "snippet,contentDetails", id: videoIds }); videoRequest.execute(function(videoResponse) { const videoItems = videoResponse.result.items; $.each(videoItems, function(index, item) { $.get("item.php", function(data) { $("#result").append(tplawesome(data, [{ "title": item.snippet.title, "yturl": item.snippet.thumbnails.high.url, "videoid": item.id, "channelTitle": item.snippet.channelTitle, "duration": item.contentDetails.duration, // 新增视频时长字段 "channelId": item.snippet.channelId // 如需频道头像可拿该ID再查询channels接口 }])); }); }); }); }); }); });
补充说明
- 你之前写的
part: "snippet, contentDetails"里逗号后的空格不影响参数解析,不是问题根源 - 批量传ID调用
videos.list仅消耗1个API配额,和单条查询消耗一致,不会额外增加配额开销
内容的提问来源于stack exchange,提问作者Furious Mountain
相关产品推荐
相关产品推荐

