从频道中获取所有YouTube视频(缺少某些视频)

时间:2014-09-04 20:25:48

标签: php recursion youtube google-api

我正在使用适用于Youtube的v3 Google API:

$url = 'https://www.googleapis.com/youtube/v3/search?part=id&channelId=' . $channelID . '&maxResults=50&order=date&key=' . $API_key;

我已经设置了一个脚本,该脚本应该从给定的频道ID中提供所有视频。对于某些频道,我会收到所有视频,因为有些视频丢失(与Youtube中直接显示的视频数量相比),而对于更大的频道,我获得了最多。尽管还有更多的488个视频的结果。

pageToken是一件奇怪的事。例如,一个频道有955个视频。我得到18页,每页50个项目(即900个视频)。其中一些是播放列表,但如果我减去23个播放列表,我仍然有877个视频。如果我删除重复项,我只有488个结果! JSON输出中的totalResults向我显示了975个结果!?

这是我的递归函数:

function fetchAllVideos($parsed_json){
    $foundIds = array();
    if($parsed_json != ''){
        $foundIds = getVideoIds($parsed_json);
        $nextPageToken = getNextPageToken($parsed_json);
        $prevPageToken = getPrevPageToken($parsed_json);

        if($nextPageToken != ''){
            $new_parsed_json = getNextPage($nextPageToken);
            $foundIds = array_merge($foundIds, fetchAllVideos($new_parsed_json));
        }
        if($prevPageToken != ''){
            $new_parsed_json = getNextPage($prevPageToken);
            $foundIds = array_merge($foundIds, fetchAllVideos($new_parsed_json));
        }
    }

    return $foundIds;
}

我用$videoIds = fetchAllVideos($parsed_json);调用它,而$parsed_json是我检索的第一个网址的结果。你能在这里看到错误吗?

是否有人知道视频的数量是如何计算的,这些视频直接显示在Youtube中?有没有人设法获得与Youtube中的数字相对应的完整列表?

2 个答案:

答案 0 :(得分:3)

此脚本一次选择60天的时间段并检索其结果,然后将其添加到现有数据数组中。通过这样做,对允许的视频数量没有限制,尽管可能需要一些时间来浏览具有几千个视频的较大的YouTube频道。确保设置API_KEY,时区,用户名,开始日期(应该在频道上的第一个视频之前开始)和句点(默认设置为60 * 60 * 24 * 60,这是60天的秒数。这将需要如果视频的频率在60天内高于约50,则会更低。)(5184000秒)。

*所有这些都在剧本中进行了评论。

java.lang.UnsupportedOperationException: Schema for type java.lang.class[_] is not supported

答案 1 :(得分:2)

https://gdata.youtube.com/feeds/api/users/USERNAME_HERE/uploads?max-results=50&alt=json&start-index=1完成了这个伎俩。它是一个JSON提要,你必须循环,直到你得到少于50个结果。

修改

这应该是我使用的脚本:

ini_set('max_execution_time', 900);

function getVideos($channel){
    $ids = array();
    $start_index = 1;
    $still_have_results = true;

    if($channel == ""){
        return false;   
    }

    $url = 'https://gdata.youtube.com/feeds/api/users/' . $channel . '/uploads?max-results=50&alt=json&start-index=' . $start_index;
    $json = file_get_contents($url);
    $obj = json_decode($json);

    while($still_have_results){
        foreach($obj->feed->entry as $video){
            $video_url = $video->id->{'$t'};
            $last_pos = strrpos($video_url, '/');
            $video_id = substr($video_url, $last_pos+1, strlen($video_url) - $last_pos);
            array_push($ids, $video_id);
        }
        $number_of_items = count($obj->feed->entry);
        $start_index += count($obj->feed->entry);
        if($number_of_items < 50) {
            $still_have_results = false;
        }

        $url = 'https://gdata.youtube.com/feeds/api/users/' . $channel . '/uploads?max-results=50&alt=json&start-index=' . $start_index;
        $json = file_get_contents($url);
        $obj = json_decode($json);
    }

    return $ids;    
}

$videoIds = getVideos('youtube');
echo '<pre>';
print_r($videoIds);
echo '</pre>';

现在我做了一个测试,但我没有收集100%的视频。然而,我提出了最好的选择。