如果存在超过50个播放列表项,如何搜索带有视频ID的播放列表项

时间:2014-07-29 07:48:53

标签: youtube-api google-api-php-client

在搜索具有特定视频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客户端打开了一个问题,但这似乎不是客户端的问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你说得对,问题不在于客户;所有客户以及API资源管理器都会展示它。我的猜测是,这是playlistItems与API可以访问的大多数对象相反的事实的副产品,因此这种行为意味着底层逻辑是顺序迭代的逻辑播放列表。

但是,这里有几点需要考虑。首先,如果你所做的只是抓取contentDetails,我不确定我是否理解代码片段的目的,因为playlistItem对象的contentDetails部分只返回videoId(你已经拥有)。当然,你可能只是简化了这篇文章的内容,而你实际上是要检索其他部分。但是有什么独特之处需要你使用playlistItems端点吗?既然你已经有了videoId,你可以使用videos-> list endpoint并获得几乎所有你用playlistItems获得的信息......事实上,你唯一缺少的就是视频的位置在播放列表中(但如果这就是你所追求的,那么你上面的第二个例子可能是你现在最好的选择)。