无需遍历播放列表,能否用YouTube API查询视频是否在指定列表中?
如何通过YouTube API直接查询视频是否在指定播放列表中
问题描述
我有一个YouTube视频数组,想要确认这些视频是否已存在于某个指定播放列表里。目前使用的代码能正常运行,但每次都需要拉取目标播放列表的所有视频并遍历,当播放列表较长时效率特别低下。想咨询:是否可以通过YouTube API直接查询「视频X是否在播放列表Y中」,无需获取整个播放列表再遍历所有视频?
当前使用的代码
var targetPlaylistId = "some_playlist_id"; var targetPlaylist = YouTube.Playlists.list("snippet", {id: targetPlaylistId}); var targetPlaylistTitle = targetPlaylist.items[0].snippet.title var targetVideos = YouTube.PlaylistItems.list("snippet", {playlistId: targetPlaylistId, maxResults: 50}); for (var i = 0; i < sourceVideos.length; i++) { var sourceVideoId = sourceVideos[i].snippet.resourceId.videoId; var sourceVideoTitle = sourceVideos[i].snippet.title var isAlreadyAdded = false; for (var j = 0; j < targetVideos.items.length; j++) { var targetVideoId = targetVideos.items[j].snippet.resourceId.videoId; if (sourceVideoId == targetVideoId) { isAlreadyAdded = true; break; } } if (!isAlreadyAdded) { var resource = { snippet: { playlistId: targetPlaylistId, resourceId: { kind: "youtube#video", videoId: sourceVideoId } } }; YouTube.PlaylistItems.insert(resource, "snippet"); Logger.log("Added video " + sourceVideoTitle + " with ID " + sourceVideoId + " to playlist " + targetPlaylistTitle); } }
解决方案
可以直接通过YouTube Data API的PlaylistItems.list接口,结合playlistId和videoId参数实现精准查询,无需拉取整个播放列表的内容。
核心思路
调用PlaylistItems.list时,同时传入目标播放列表的playlistId和要检查的视频videoId:
- 如果视频存在于该播放列表,接口会返回对应的播放列表条目(只需请求
id字段即可,减少数据传输) - 如果返回结果为空数组,说明视频不在播放列表中,执行添加操作
优化后的代码示例
var targetPlaylistId = "some_playlist_id"; var targetPlaylist = YouTube.Playlists.list("snippet", {id: targetPlaylistId}); var targetPlaylistTitle = targetPlaylist.items[0].snippet.title; for (var i = 0; i < sourceVideos.length; i++) { var sourceVideoId = sourceVideos[i].snippet.resourceId.videoId; var sourceVideoTitle = sourceVideos[i].snippet.title; // 直接查询视频是否在目标播放列表中 var existingEntry = YouTube.PlaylistItems.list("id", { playlistId: targetPlaylistId, videoId: sourceVideoId, maxResults: 1 // 仅需判断存在性,限制返回1条结果即可 }); if (existingEntry.items.length === 0) { // 视频未在播放列表中,执行添加 var resource = { snippet: { playlistId: targetPlaylistId, resourceId: { kind: "youtube#video", videoId: sourceVideoId } } }; YouTube.PlaylistItems.insert(resource, "snippet"); Logger.log("Added video " + sourceVideoTitle + " with ID " + sourceVideoId + " to playlist " + targetPlaylistTitle); } }
注意事项
- 效率提升:当目标播放列表条目较多时,这种方式避免了拉取大量无关数据和本地遍历,效率提升明显。
- API配额权衡:每个
PlaylistItems.list查询会消耗1个API配额单位。如果源视频数量远大于播放列表的条目数,原方式(拉取一次播放列表再遍历)会更节省配额;反之,优化后的方式在效率上更有优势。根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者mondeca
相关产品推荐
相关产品推荐

