Мне нужно встроить видео с YouTube из списка воспроизведения, а также отобразить viewCount, YouTube API v3 для playlistitems не имеет viewCount, поэтому мне нужно сделать еще один запрос, используя API v3 для видео, которое дает статистику viewCount, но вам нужно добавить разделенный запятыми список идентификаторов видео YouTube в запросе https://www.googleapis.com/youtube/v3/videos?part=statistics&id='.$listofvideoIDfromPlaylistItems.'&key={YOUR_API_KEY}
Это то, что у меня есть для 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; }
print_r
дает мне
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 ) ) )
Как создать разделяемые запятой идентификаторы видео?
После долгих чтений 🙂
Вот что я в итоге
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; }
Возвращает $ stats-> items var_dump
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)
Как объединить две петли foreach или я делаю это правильно?
Наконец, удалось заставить его работать, не уверен, что это правильный метод, но я могу показать видео встраивания и количество просмотров видео. Придется делать 2 отдельные функции.
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; }
на странице просмотра мне просто нужно проверить, соответствует ли видеоид идентификатору статистики.