Quantcast
Channel: ...Microplagio... » SimpleXMLElement
Viewing all articles
Browse latest Browse all 5

Cómo mostrar el último video de tu canal de YouTube con PHP

$
0
0

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:

<link rel="alternate" type="application/rss+xml" title="RSS" href="https://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxx"/>

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:

<?xml version="1.0" encoding="UTF-8"?>
	<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
		<link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxx"/>
		<id>yt:channel:xxxxxxxxxxxxxx</id>
		<yt:channelId>xxxxxxxxxxxxxx</yt:channelId>
		<title>El titulo de tu canal</title>
		<link rel="alternate" href="http://www.youtube.com/user/tunombredeusuario"/>
		<author>
			<name>tunombredeusuario</name>
			<uri>http://www.youtube.com/channel/xxxxxxxxxxxxxx</uri>
		</author>
		<published>2012-11-06T00:45:25+00:00</published>
		<updated>2015-04-10T21:25:56+00:00</updated>
		
		<entry>
			<id>yt:video:ag44LUcPGIE</id>
			<yt:videoId>ag44LUcPGIE</yt:videoId>
			<yt:channelId>xxxxxxxxxxxxxx</yt:channelId>
			<title>Titulo de tu ultimo video</title>
			<link rel="alternate" href="http://www.youtube.com/watch?v=ag44LUcPGIE"/>
			<author>
				<name>tunombredeusuario</name>
				<uri>http://www.youtube.com/channel/xxxxxxxxxxxxxx</uri>
			</author>
			<published>2015-04-10T21:25:56+00:00</published>
			<updated>2015-04-10T21:25:56+00:00</updated>
			<media:group>
				<media:title>Titulo de tu ultimo video</media:title>
				<media:content url="https://www.youtube.com/v/ag44LUcPGIE?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
				<media:thumbnail url="https://i2.ytimg.com/vi/ag44LUcPGIE/hqdefault.jpg" width="480" height="360"/>
				<media:description>Descripcion de tu ultimo video</media:description>
				<media:community>
					<media:starRating count="0" average="0.00" min="1" max="5"/>
					<media:statistics views="10"/>
				</media:community>
			</media:group>
		</entry>
		<entry>
			<id>yt:video:Xuq9bm2IBzk</id>
			<yt:videoId>Xuq9bm2IBzk</yt:videoId>
			<yt:channelId>xxxxxxxxxxxxxx</yt:channelId>
			....
			....
			....
		</entry>
	</feed>

En cada nodo <entry> 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 <entry>[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 <entry>.

En este primer <entry> 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:

<yt:videoId>ag44LUcPGIE</yt:videoId>

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.

<?php
function youtube(){
	try{
		$youtube = new SimpleXMLElement('https://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxx', 0, true);
		$entry = $youtube->entry[0];
		$ns = $entry->getNameSpaces(true);
		$yt = $entry->children($ns['yt']);
		$v = $yt->videoId;
		echo
			'<object width="278">
			  <param name="movie" value="http://www.youtube.com/v/'.$v.'?version=3&amp;autohide=1&amp;showinfo=0"/>
			  <param name="allowScriptAccess" value="always"/>
			  <embed src="http://www.youtube.com/v/'.$v.'?version=3&amp;autohide=1&amp;showinfo=0" type="application/x-shockwave-flash" allowscriptaccess="always" width="278" height="210"/>
			</object>';
	} 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:

<?php youtube() ?>

Listo, con eso basta para poder mostrar el último video publicado en tu canal (o bueno, en cualquier canal). Un ejemplo de uso lo pueden ver en este portal: http://afondo.mx en la pestaña AFondo TV


Viewing all articles
Browse latest Browse all 5

Latest Images

Trending Articles





Latest Images