搜索具有特定视频 ID 的播放列表项时,youtube-api 似乎仅在 50 个最新播放列表项中搜索。
我的播放列表中有超过 1000 个项目,并且搜索特定视频 ID 的项目没有结果。因此,我被迫获取播放列表上的所有项目并迭代它们以找到特定的项目。
// This only searches among the first 50 playlist items
$videoId = 'ASDFQWER';
$playlistId = 'ASDFASDFQWERQWER';
$part = "contentDetails";
$response = $youtube->playlistItems->listPlaylistItems(
$part,
array(
"playlistId" => $playlistId,
"videoId" => $videoId,
)
);
$playlistItem = reset($response->getItems());
// This works, but is slow and awkward
$videoId = 'ASDFQWER';
$playlistId = 'ASDFASDFQWERQWER';
$part = "contentDetails";
$playlistItems = array();
$nextPageToken = NULL;
do {
$response = $youtube->playlistItems->listPlaylistItems(
$part,
array(
"playlistId" => $playlistId,
"maxResults" => 50,
"pageToken" => $nextPageToken,
)
);
$nextPageToken = $response->getNextPageToken();
$playlistItems = array_merge($playlistItems, $response->getItems());
} while ($nextPageToken);
$hasVideoId = function($playlistItem) use ($videoId){
$idOnItem = $playlistItem->getContentDetails()->getVideoId();
return ($videoId == $idOnItem);
};
$playlistItem = reset(array_filter($playlistItems, $hasVideoId));
我更愿意使用视频的 ID 在 YouTube 端进行搜索,而不是以 50 个项目为一组获取所有项目并搜索所有这些项目。
这一切的重点是自动删除旧视频。如果我只删除视频,我的播放列表中将会出现无效项目。这就是为什么我需要找到这些播放列表项目,以便我可以将它们与视频一起删除。
我首先在 GitHub 上为 PHP 客户端打开了一个问题,但这似乎在客户端上确实不是问题。
非常感谢任何帮助。
你是对的,问题不在于客户;而是在于客户。所有客户端以及 API 浏览器也会展示它。我的猜测是,这是以下事实的副产品:与 API 可以访问的大多数对象相反,playlistItems 具有顺序,因此这种行为意味着底层逻辑是按顺序迭代的逻辑播放列表。
但是,这里有一些需要考虑的事情。首先,如果您所做的只是获取 contentDetails,我不确定我是否理解代码片段的用途,因为 playlistItem 对象的 contentDetails 部分仅返回 videoId(您已经拥有)。当然,您可能只是简化了本文的内容,而实际上您将检索其他部分。但是是否有一些独特的东西要求您使用 playlistItems 端点?由于您已经有了 videoId,因此您可以使用视频->列表端点并获取通过 playlistItems 获得的几乎所有信息...事实上,您唯一缺少的是视频的位置播放列表(但如果这就是您想要的,那么上面的第二个示例可能是您现在最好的选择)。