NB: Make sure you do a back up of your theme, files and database before attempting the tutorials
Last modified : Jul 22 2023
Estimated reading time : 7 minutes, 2 seconds - 123 words
Share the post "Class PHP – API You Tube – Version 3"
We have created a basic PHP class that will let you connect to YouTube’s API and display a video or a channel based on its ID and matching data.
Here are the video’s data available:
- Title
- Description
- Thumbnail
- Views
- Likes
- Dislikes
- Comments
- Date Published
- Channel Title
- Tags
- Default Language
Class PHP - API You Tube
/////////////////////////// Requires and includes admin theme /////////////////////////
class WPVYouTubeAPI {
private $apiKey;
public function __construct($apiKey)
{
$this->apiKey = $apiKey;
}
/**
* Retrieves videos by channel ID.
* @param string $channelId The ID of the channel.
* @param int $maxResults The maximum number of videos to retrieve.
* @return array An array containing the channel name and videos.
*/
public function wpvgetVideosByChannel($channelId, $maxResults = 10) {
$url = "https://www.googleapis.com/youtube/v3/search?part=snippet&channelId={$channelId}&maxResults={$maxResults}&key={$this->apiKey}";
$response = $this->wpvsendRequest($url);
$videos = array();
foreach ($response['items'] as $item) {
$videoId = $item['id']['videoId'];
$video = $this->getVideoDetails($videoId);
$videos[] = $video;
}
// Retrieve the channel name from the first item in the response
$channelName = $response['items'][0]['snippet']['channelTitle'];
return array(
'channelName' => $channelName,
'videos' => $videos
);
}
/**
* Retrieves video details by video ID.
* @param string $videoId The ID of the video.
* @return array An array containing the video details.
*/
public function wpvgetVideoDetails($videoId)
{
$url = "https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&id={$videoId}&key={$this->apiKey}";
$response = $this->wpvsendRequest($url);
$video = array(
'title' => $response['items'][0]['snippet']['title'],
'description' => $response['items'][0]['snippet']['description'],
'thumbnail' => $response['items'][0]['snippet']['thumbnails']['default']['url'],
'views' => $response['items'][0]['statistics']['viewCount'],
'likes' => $response['items'][0]['statistics']['likeCount'],
'dislikes' => $response['items'][0]['statistics']['dislikeCount'],
'comments' => $response['items'][0]['statistics']['commentCount'],
'publishedAt' => $response['items'][0]['snippet']['publishedAt'],
'duration' => $response['items'][0]['contentDetails']['duration'],
'channelTitle' => $response['items'][0]['snippet']['channelTitle'],
'tags' => $response['items'][0]['snippet']['tags'],
'categoryId' => $response['items'][0]['snippet']['categoryId'],
'defaultLanguage' => $response['items'][0]['snippet']['defaultLanguage'],
'liveBroadcastContent' => $response['items'][0]['snippet']['liveBroadcastContent'],
'license' => $response['items'][0]['status']['license'],
'embedHtml' => $response['items'][0]['player']['embedHtml'],
'allowedRegions' => $response['items'][0]['contentDetails']['regionRestriction']['allowed'],
'blockedRegions' => $response['items'][0]['contentDetails']['regionRestriction']['blocked'],
// Add any other data you want to retrieve
);
return $video;
}
/**
* Sends a request to the specified URL using cURL.
* @param string $url The URL to send the request to.
* @return array The JSON response as an associative array.
* @throws Exception If cURL encounters an error.
*/
private function wpvsendRequest($url)
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => "",
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
throw new Exception("cURL Error #:" . $err);
}
return json_decode($response, true);
}
/**
* Retrieves the comments of a video by its video ID.
* @param string $videoId The ID of the video.
* @return array An array containing the video comments.
*/
public function wpvgetVideoComments($videoId) {
$url = 'https://www.googleapis.com/youtube/v3/commentThreads?videoId=' . $videoId . '&part=snippet&maxResults=10&key=' . $this->apiKey;
$response = $this->wpvsendRequest($url);
$comments = array();
if (isset($response['items'])) {
foreach ($response['items'] as $item) {
$comment = $item['snippet']['topLevelComment']['snippet']['textDisplay'];
$comments[] = $comment;
}
}
return $comments;
}
/**
* Retrieves the channel ID from a video by its video ID.
* @param string $videoId The ID of the video.
* @return string|null The channel ID, or null if not found.
*/
public function wpvgetChannelIdFromVideo($videoId){
$url = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id={$videoId}&key={$this->apiKey}";
$response = $this->wpvsendRequest($url);
if (!empty($response['items'])) {
$channelId = $response['items'][0]['snippet']['channelId'];
return $channelId;
}
return null;
}
/**
* Formats the number of views to a human-readable format.
* @param int $views The number of views.
* @return string The formatted views.
*/
public function wpvformatViews($views) {
if ($views >= 1000000000) {
return round($views / 1000000000, 1) . ' billion';
} elseif ($views >= 1000000) {
return round($views / 1000000, 1) . ' million';
} elseif ($views >= 1000) {
return round($views / 1000, 1) . ' thousand';
} else {
return $views;
}
}
}We will now call the PHP class and display the data. You need to update your API key in the $apiKey variable and then make call dynamically your video’s ID in the $videoId variable.
// API Call Class PHP
$apiKey = 'YOUR API KEY HERE';
$youtube = new WPVYouTubeAPI($apiKey);
$videoId = 'YOUR VIDEO ID HERE';
// Get video details
$videoDetails = $youtube->wpvgetVideoDetails($videoId);
$channelId = $youtube->wpvgetChannelIdFromVideo($videoId);
$publishedDate = date('Y-m-d', strtotime($videoDetails['publishedAt']));
// Echo the title of the video
echo 'Titre : ' . $videoDetails['title'] . '<br>';
//echo 'Description : ' . $videoDetails['description'] . '<br>';
echo '<img src="' . $videoDetails['thumbnail'] . '" alt="Thumbnail de la vidéo"><br>';
// Display the formatted duration
//echo 'Durée : ' . $formattedDuration . '<br>';
// Echo the channel title
echo 'Channel : ' . $videoDetails['channelTitle'] . '<br>';
// Echo the published date of the video
echo 'Publié le : ' . $publishedDate . '<br>';
// Check if default language is available
if (!empty($videoDetails['defaultLanguage'])) {
echo 'Language : ' . $videoDetails['defaultLanguage'] . '<br>';
} else {
echo 'Language : Undefined<br>';
}
// Display license
if (!empty($videoDetails['license'])) {
echo 'License : ' . $videoDetails['license'] . '<br>';
} else {
echo 'License : Not specified<br>';
}
// Display the Channel Name of the video
if (!empty($videoDetails['channelId'])) {
$maxResults = 10; // Maximum number of videos to retrieve
$videosData = $youtube->wpvgetVideosByChannel($channelId, $maxResults);
$channelName = $videosData['channelName'];
$videos = $videosData['videos'];
echo "Channel Name: $channelName<br>";
} else {
echo "No channel found for the video.<br>";
}
// Display the tags
if (isset($videoDetails['tags'])) {
if (is_array($videoDetails['tags'])) {
$formattedTags = array_map('ucfirst', $videoDetails['tags']); // Apply ucfirst to each tag
$tags = implode(', ', $formattedTags);
echo 'Tags: ' . $tags . '<br>';
} else {
$tags = ucfirst($videoDetails['tags']); // Capitalize the first letter
echo 'Mots-clés : ' . $tags . '<br>';
}
} else {
echo 'Mots-clés : None<br>';
}
// Display the Views of the video
echo 'Vues : ' . $youtube->wpvformatViews($videoDetails['views']) . '<br>';
// Display the Likes of the video
echo 'Passioné(e)s : ' . $videoDetails['likes'] . '<br>';
// Display the Dislikes of the video
$dislikes = $videoDetails['dislikes'];
if ($dislikes > 0) {
echo 'Dislikes : ' . $dislikes . '<br>';
} else {
echo 'Dislikes : 0<br>';
}
// Display the Favorites of the video
$favorites = $videoDetails['favorites'];
if ($favorites > 0) {
echo 'Favorites : ' . $favorites . '<br>';
} else {
echo 'Favorites : 0<br>';
}
// Display the Comments of the video
echo 'Comments : ' . $videoDetails['comments'] . '<br>';You can also include Font Awesome Version 5 icons by creating an enqueue script or add it in the Class PHP WPVYouTubeAPI class.
// Enqueue Font Awesome 5 in WordPress
function themespress_load_font_awesome() {
// You can find the current URL for the latest version here: https://fontawesome.com/start
wp_enqueue_style( 'font-awesome-free', '//use.fontawesome.com/releases/v5.6.3/css/all.css' );
}
add_action( 'wp_enqueue_scripts', 'themespress_load_font_awesome' );