YouTube Data API v3 con PHP

La YouTube Data API v3 ha dejado de estar en fase beta por lo que he realizado algunas pruebas en PHP para cuando vaya a implementar esta versión en mi plugin Youtube Channel Gallery. Mi intención es hacer otra prueba con JavaScript, más adelante, para valorar cuál es la opción más interesante para integrar en mi plugin.

Acceder a demo Descargar

La principales características de esta prueba con la YouTube Data API v3 son:

  • Mostrar vídeos de una playlist, subidos por un usuario, favoritos, marcados como me gusta y el resultado de una búsqueda.
  • En lugar de usar OAuth, he usado la API key directamente ya que no he planteado hacer accesos que requieran autorización.
  • He implementado paginación usando los atributos prevPageToken nextPageToken.
  • Control de los vídeos privados para que funcione con resultados en los que aparezcan vídeos privados. Se mostrará la miniatura del vídeo con un icono superpuesto que advierte de que es un vídeo privado.

El código del PHP de la demo es el siguiente:

<?php
	// url
	$url = 'https://www.googleapis.com/youtube/v3/';
	//key
	$key = 'key=' . 'AIzaSyA6oW5D-ZlSIG-OHSBOR25TMd3YDRU7HdU';
	//defaults
	$_POST['resource'] = isset( $_POST['resource'] ) ? $_POST['resource'] : 'playlistItems';
	$_POST['resource_param'] = isset( $_POST['resource_param'] ) ? $_POST['resource_param'] : 'PLD428BE966FF3B1E9';
	$_POST['maxResults'] = isset( $_POST['maxResults'] ) ? $_POST['maxResults'] : '8';
	$_POST['pageToken'] = isset( $_POST['pageToken'] ) ? $_POST['pageToken'] : '';
	$_POST['page'] = isset( $_POST['page'] ) ? $_POST['page'] : '0';
	$_POST['title'] = isset( $_POST['title'] ) ? $_POST['title'] : '';
	$_POST['description'] = isset( $_POST['description'] ) ? $_POST['description'] : '';
	$channels_type = array( 'likes', 'favorites', 'uploads' );
	//resource
	if ( in_array( $_POST['resource'], $channels_type ) || $_POST['resource'] == 'playlistItems' ) {
		$resource = 'playlistItems?';
	} else {
		$resource = 'search?';
	}
	//Required parameters
	$part = 'part=snippet&';
	//Main resource parameter: playlistId / q
	//-------------------------------
	//playlists ID
	if ( $_POST['resource'] == 'playlistItems' ) {
		// Playlist ID
		$resource_param = 'playlistId=' . $_POST['resource_param'] . '&';
	}
	//user likes, favorites or uploads ID
	if ( in_array( $_POST['resource'], $channels_type ) ) {
		$user_resource = 'channels?';
		$user_part = 'part=contentDetails&';
		$user_name = 'forUsername=' . $_POST['resource_param'] . '&';
		$user_fields = 'fields=items(contentDetails)&';
		$user_str_datos = file_get_contents( $url . $user_resource . $user_part . $user_name . $user_fields . $key );
		$user_datos = json_decode( $user_str_datos, true );
		$resource_param = 'playlistId=' . $user_datos["items"][0]["contentDetails"]["relatedPlaylists"][$_POST['resource']] . '&';
	}
	//search query
	if ( $_POST['resource'] == 'search' ) {
		$resource_param = 'q=' . urlencode( $_POST['resource_param'] ) . '&type=video&';
	}
	//Optional parameters
	$maxResults = 'maxResults=' .  $_POST['maxResults'] . '&';
	if ( empty( $_POST['pageToken'] ) ) {
		$pageToken = '';
	} else {
		$pageToken = 'pageToken=' .  $_POST['pageToken'] . '&';
	}
	$fields = 'fields=items(snippet),nextPageToken,prevPageToken,pageInfo';
	$request = $url . $resource . $part . $resource_param . $maxResults . $pageToken . $key ;
	$str_datos = file_get_contents( $request );
	$datos = json_decode( $str_datos, true );
	//Video gallery
	//-------------------------------
	$youtube_videos = '';
	//gallery title
	if ( $_POST['resource'] == 'search' ) {
		$gallery_title = $_POST['resource_param'];
	}else {
		$gallery_title = $datos["items"][0]["snippet"]["channelTitle"];
	}
	$youtube_videos .= '<h2>' . $gallery_title . '</h2>';
	//gallery
	$youtube_videos .= '<ul>';
	foreach ( $datos["items"] as $items ) {
		$youtube_videos .= '<li>';
		//video id
		if ( $_POST['resource'] == 'search' ) {
			$videoId = $items["id"]["videoId"];
		} else {
			$videoId = $items["snippet"]["resourceId"]["videoId"];
		}
		//check private thumbnail videos
		if ( !isset( $items["snippet"]["thumbnails"] ) && $items["snippet"]["title"] == 'Private video' ) {
			//get private thumbnail videos
			$thumbnail_url = 'https://i1.ytimg.com/vi/' . $items["snippet"]["resourceId"]["videoId"] . '/default.jpg';
			$video_state = 'private';
		} else {
			$thumbnail_url = $items["snippet"]["thumbnails"]["default"]["url"];
			$video_state = 'public';
		}
		//thumbnail
		$youtube_videos .= '<div class="' . $video_state . '"><a href="https://www.youtube.com/watch?v=' . $videoId . '"><img src="' . $thumbnail_url . '"></a></div>';
		//title
		if ( !empty( $_POST['title'] ) ) {
			$youtube_videos .= '<h3><a href="https://www.youtube.com/watch?v=' . $videoId . '">' . $items["snippet"]["title"] . '</a></h3>';
		}
		//description
		if ( !empty( $_POST['description'] ) ) {
			$youtube_videos .= '<p>' . $items["snippet"]["description"] . '</p>';
		}
		$youtube_videos .= '</li>';
	}
	$youtube_videos .= '</ul>';
	//Pagination
	//-------------------------------
	//previous page link
	$youtube_videos .= '<div class="pagination">';
	$youtube_videos .= '<div>';
	if ( isset( $datos["prevPageToken"] ) ) {
		$youtube_videos .= '<a data-prev="' .$datos["prevPageToken"]. '" class="prev-button">Previous</a>';
	}
	$youtube_videos .= '</div>';
	//current and total pages
	$youtube_videos .= '<div>';
	$current_page = $_POST['page'];
	$total_pages = ceil( $datos["pageInfo"]["totalResults"] / $datos["pageInfo"]["resultsPerPage"] );
	$youtube_videos .= $current_page . '/' . $total_pages;
	$youtube_videos .= '</div>';
	//next page link
	$youtube_videos .= '<div>';
	if ( isset( $datos["nextPageToken"] ) ) {
		$youtube_videos .= '<a data-next="' .$datos["nextPageToken"]. '" class="next-button">Next</a>';
	}
	$youtube_videos .= '</div>';
	$youtube_videos .= '</div>';
	echo $youtube_videos;
?>
Tags: , , , , ,

3 comentarios en “YouTube Data API v3 con PHP”

  1. Rafael dice:

    Hola

    ¿Vas a cambiar el código del plugin para que siga funcionando? Me parecía muy funcional y fácil de usar, pero ya ha dejado de funcionar y se han adelantado otras alternativas …. no dejes que te dejen atrás!!

  2. John W dice:

    HUGE Thank you!!!!!!!!!!! I’ve been playing around with a javascript version but couldn’t get it to do what I needed… THIS is perfect!!!

  3. gabriel dice:

    Hola, tengo una duda y es algo muy parecido a lo que haces. como puedo ver los tags o etiquetas de un video o videos asi como tu haces para ver el titulo y la descripción.
    que debería modificar a tu código.

Deja un comentario