问题
I need to embed youtube videos from a playlist and also display the viewCount, the YouTube API v3 for playlistitems does not have the viewCount so, i need to do another query using the API v3 for videos which gives the statistics viewCount but need to add a comma-separated list of the YouTube video ID(s) in the query
https://www.googleapis.com/youtube/v3/videos?part=statistics&id='.$listofvideoIDfromPlaylistItems.'&key={YOUR_API_KEY}
This is what I have for the playlistItems
public function loadPlaylist($maxVideos){
if($this->_key && $this->_playlist) {
$this->_url = filter_var(
$this->_apiUrl.'playlistItems?part=id,snippet,contentDetails,status&maxResults='.$maxVideos.'&playlistId='.$this->_playlist.'&key='.$this->_key,
FILTER_SANITIZE_URL
);
$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $this->_url);
curl_setopt($curlObj, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlObj, CURLOPT_HTTPGET, true);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json','Accept: application/json'));
curl_setopt($curlObj,CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curlObj);
curl_close($curlObj);
$json = json_decode($response, true);
print("<pre>".print_r($json['items'],true)."</pre>");
}
return FALSE;
}
The print_r
gives me
Array
(
[0] => Array
(
[kind] => youtube#playlistItem
[etag] => "xxx"
[id] => xxx
[snippet] => Array
(
[publishedAt] => xxx
[channelId] => xxx
[title] => xxx
[description] => xxx
[thumbnails] => Array
(
[default] => Array
(
[url] => xxx
[width] => 120
[height] => 90
)
[medium] => Array
(
[url] => xxx
[width] => 320
[height] => 180
)
[high] => Array
(
[url] => xxx
[width] => 480
[height] => 360
)
[standard] => Array
(
[url] => xxx
[width] => 640
[height] => 480
)
[maxres] => Array
(
[url] => xxx
[width] => 1280
[height] => 720
)
)
[channelTitle] => xxx
[playlistId] => xxx
[position] => 0
[resourceId] => Array
(
[kind] => youtube#video
[videoId] => videoID
)
)
[contentDetails] => Array
(
[videoId] => videoID
)
[status] => Array
(
[privacyStatus] => public
)
)
[1] => Array
(
[kind] => youtube#playlistItem
[etag] => "xxx"
[id] => xxx
[snippet] => Array
(
[publishedAt] => xxx
[channelId] => xxx
[title] => xxx
[description] => xxx
[thumbnails] => Array
(
[default] => Array
(
[url] => xxx
[width] => 120
[height] => 90
)
[medium] => Array
(
[url] => xxx
[width] => 320
[height] => 180
)
[high] => Array
(
[url] => xxx
[width] => 480
[height] => 360
)
[standard] => Array
(
[url] => xxx
[width] => 640
[height] => 480
)
[maxres] => Array
(
[url] => xxx
[width] => 1280
[height] => 720
)
)
[channelTitle] => xxx
[playlistId] => xxx
[position] => 0
[resourceId] => Array
(
[kind] => youtube#video
[videoId] => videoID
)
)
[contentDetails] => Array
(
[videoId] => videoID
)
[status] => Array
(
[privacyStatus] => public
)
)
)
How can I create the comma-separated videoIDs?
After much reading :)
This is what i end up with
public static function getVideos($params) {
$key = $params->get('apiKey');
$list = $params->get('playlistID');
$maxVideos = $params->get('maxVideos');
if($key && $list){
function get_data($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json','Accept: application/json'));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$apiPlaylist = get_data("https://www.googleapis.com/youtube/v3/playlistItems?part=id,snippet,contentDetails,status&maxResults=".$maxVideos."&playlistId=".$list."&key=".$key."");
$video = json_decode($apiPlaylist);
$video2 = json_decode($apiPlaylist);
//To display video statistics viewCount
foreach ($video2->items as $statsitem) {
$videoids = $statsitem->contentDetails->videoId. ",";
$apiVideostats = get_data("https://www.googleapis.com/youtube/v3/videos?part=id,statistics&id=".$videoids."&key=".$key."");
$stats = json_decode($apiVideostats);
var_dump($stats->items);
}
$videolist = array();
//To display embed code, title and description
foreach ($video->items as $videoitem) {
$videolist[] = $videoitem;
}
return $videolist;
}
return false;
}
the $stats->items var_dump returns
array (size=1)
0 =>
object(stdClass)[686]
public 'kind' => string 'youtube#video' (length=13)
public 'etag' => string '"xxx"' (length=57)
public 'id' => string 'xxx' (length=11)
public 'statistics' =>
object(stdClass)[687]
public 'viewCount' => string '465' (length=3)
public 'likeCount' => string '1' (length=1)
public 'dislikeCount' => string '0' (length=1)
public 'favoriteCount' => string '0' (length=1)
public 'commentCount' => string '0' (length=1)
array (size=1)
0 =>
object(stdClass)[690]
public 'kind' => string 'youtube#video' (length=13)
public 'etag' => string '"xxx"' (length=57)
public 'id' => string 'xxx' (length=11)
public 'statistics' =>
object(stdClass)[691]
public 'viewCount' => string '439' (length=3)
public 'likeCount' => string '2' (length=1)
public 'dislikeCount' => string '0' (length=1)
public 'favoriteCount' => string '0' (length=1)
public 'commentCount' => string '1' (length=1)
How to combine the 2 foreach loops or am i doing this correctly ?
回答1:
Finally, managed to get it working, not sure if this is the proper method but i get to display the embed video and the video view count. Had to do 2 separate functions.
public static function getVideos($params) {
$key = $params->get('apiKey');
$list = $params->get('playlistID');
$maxVideos = $params->get('maxVideos');
if($key && $list){
function get_data($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json','Accept: application/json'));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$apiPlaylist = get_data("https://www.googleapis.com/youtube/v3/playlistItems?part=id,snippet,contentDetails,status&maxResults=".$maxVideos."&playlistId=".$list."&key=".$key."");
$video = json_decode($apiPlaylist);
$videolist = array();
//To display embed code, title and description
foreach ($video->items as $videoitem) {
$videolist[] = $videoitem;
}
return $videolist;
}
return false;
}
public static function getStats($params) {
$key = $params->get('apiKey');
$list = $params->get('playlistID');
$maxVideos = $params->get('maxVideos');
if($key && $list){
function get_data2($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json','Accept: application/json'));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$apiPlaylist = get_data2("https://www.googleapis.com/youtube/v3/playlistItems?part=id,snippet,contentDetails,status&maxResults=".$maxVideos."&playlistId=".$list."&key=".$key."");
$video2 = json_decode($apiPlaylist);
$videoids = '';
//To get all videoId from playlist
foreach ($video2->items as $statsitem) {
$videoids .= $statsitem->contentDetails->videoId. ",";
}
$apiVideostats = get_data2("https://www.googleapis.com/youtube/v3/videos?part=id,statistics&id=".$videoids."&key=".$key."");
$stats = json_decode($apiVideostats);
$statslist = array();
//To display video statistics viewCount
foreach ($stats->items as $statitem) {
$statslist[] = $statitem;
}
return $statslist;
}
return false;
}
in the view page, i just have to check if the videoid is equal to the statistics id.
来源:https://stackoverflow.com/questions/32315987/getting-the-list-of-videoid-in-array-using-youtube-api-v3-playlistitems-and-buil