Desde abril de 2015 YouTube cambió la estructura de su API y de sus Feeds y muchos scripts antiguos dejaron de funcionar. Con la siguiente función actualizada de PHP podrás tomar el último video publicado en tu canal de YouTube.

Lo único que necesitamos tener es el Feed RSS del canal que desde hace un tiempo ya no está tan a la vista en la interfaz de YouTube, ignoro si estará por ahí escondido el pequeño icono anaranjado pero por si a caso no está por ningun lado lo puedes sacar desde el código fuente de la página de inicio de tu usuario de YouTube, es decir, de aquí: https://www.youtube.com/user/tunombredeusuario

Ahí dentro de las etiquetas del <header> busca la siguiente:


La parte que nos interesa es el valor del atributo HREF. Ese es el Feed RSS del canal:

https://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxx

Si analizamos el código fuente del Feed, veremos la siguiente estructura:


	
		
		yt:channel:xxxxxxxxxxxxxx
		xxxxxxxxxxxxxx
		El titulo de tu canal
		
		
			tunombredeusuario
			http://www.youtube.com/channel/xxxxxxxxxxxxxx
		
		2012-11-06T00:45:25+00:00
		2015-04-10T21:25:56+00:00
		
		
			yt:video:ag44LUcPGIE
			ag44LUcPGIE
			xxxxxxxxxxxxxx
			Titulo de tu ultimo video
			
			
				tunombredeusuario
				http://www.youtube.com/channel/xxxxxxxxxxxxxx
			
			2015-04-10T21:25:56+00:00
			2015-04-10T21:25:56+00:00
			
				Titulo de tu ultimo video
				
				
				Descripcion de tu ultimo video
				
					
					
				
			
		
		
			yt:video:Xuq9bm2IBzk
			Xuq9bm2IBzk
			xxxxxxxxxxxxxx
			....
			....
			....
		
	

En cada nodo se encuentra la información de un video. Los Feed RSS de YouTube contienen 15 entries, lo que significa que podemos ver los últimos 15 videos subidos al canal. Como en nuestro caso solo nos interesa el último video, nos enfocaremos en el primer entry, o dicho de otro modo, el [0].

Para acceder a la información del entry cero, podemos usar la clase SimpleXMLElement. Quedaría así:

$youtube = new SimpleXMLElement('https://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxx', 0, true);
$entry = $youtube->entry[0];

Como ya hemos analizado en otras ocasiones, el primer parámetro del constructor es un string que contiene una cadena XML o la ruta a un archivo XML. El segundo parámetro es un Integer de opciones (en este caso no lo necesitamos) y el tercer parámetro es un Boolean para indicar si el primer parámetro es un ruta de archivo o no (como en este caso sí es, enviamos un true).

De ese modo en la variable $youtube creamos un objeto que contiene todo el documento XML. Y en la variable $entry guardamos el valor del primer .

En este primer podemos encontrar toda la información del último video (título, descripción, número de reproducciones, fecha de publicación, etc), pero lo que es más importante, podemos ver su ID que es en realidad lo único que necesitamos para poder incrustar el reproductor.

Pero hay un problema, el ID del video se encuentra en un nodo con el namespace yt:

ag44LUcPGIE

Si tratamos de obtener el valor de forma directa, no tendremos resultado, por lo que la siguiente línea no funcionará:

$videoID = $entry->videoID;

La solución a esto está en cargar los namespaces del documento y guardarlos en otra variable para poder acceder a sus nodos mediante ella. Algo así:

$ns = $entry->getNameSpaces(true);

La función SimpleXMLElement::getNameSpaces retorna en un Array los namespaces usados en el documento. En este caso, como el documento XML contiene 3 namespaces, esta función retornará lo siguiente:

Array
(
    [] => http://www.w3.org/2005/Atom
    [yt] => http://www.youtube.com/xml/schemas/2015
    [media] => http://search.yahoo.com/mrss/
)

Lo que haremos ahora será obtener los hijos del nodo entry que pertenezcan al namespace yt

$yt = $entry->children($ns['yt']);

La función SimpleXMLElement::children sin parámetros regresa todos los nodos hijos que no tengan namespace. Pero como le enviamos de prámetros un namespace, entonces nos regresará todos los hijos que pertenezcan a ese namespace. En este caso, sería algo así:

SimpleXMLElement Object
(
    [videoId] => ag44LUcPGIE
    [channelId] => xxxxxxxxxxxxxx
)

Ahora sí podemos sacar directamente el ID del video del siguiente modo:

$v = $yt->videoId;

Bien, teniendo claro todo lo anterior, pasamos a desarrollar la función completa.

entry[0];
		$ns = $entry->getNameSpaces(true);
		$yt = $entry->children($ns['yt']);
		$v = $yt->videoId;
		echo
			'';
	} catch(Exception $e){}
}
?>

En esta función únicamente cambiarías la ruta del Feed RSS por la de tu canal y opcionalmente los parámetros del reproductor (width y height). Todo está dentro de un bloque try-catch para evitar errores a la hora de leer la fuente XML. Si notamos, la función imprime el código de embed de YouTube. De manera que para poder usarlo, basta con llamar a la función:


Listo, con eso basta para poder mostrar el último video publicado en tu canal (o bueno, en cualquier canal) dentro de tu página web o blog.