Hola a todos, aprovecho el momento para dejarles una clase que desarrolle hace poco y que tiene como propósito manipular el API de datos de YouTube. Para trabajar con esta API y PHP existe ZF pero lo hice desde cero más por aprender que por necesidad. Espero le sea útil y sobre todo me hagan caer en cuenta de cualquier error. Gracias y ¡Hasta la próxima!
La clase ha funcionado perfecto con PHP 5.3.0 y la configuración de parametros los explico con un poco más de detalles aquí:
http://www.gilbertopineda.com/2010/08/api-de-datos-de-youtube-y-php.htmlLabs_yTube.php<?php
/**
* Clase Labs_yTube. Listar videos, comentarios y datos asocidos al canal de usuario en YouTube.com
* Derechos de autor © 2009 Gilberto Pineda Vanegas <gilberto.pineda@gmail.com>
*
* Este programa es software libre: usted puede redistribuirlo y/o modificarlo bajo los términos de
* la GNU General Public License publicada por la Free Software Foundation, bien de la versión 3 de
* la Licencia, o (a su elección) cualquier versión posterior.
*
* Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA, incluso
* sin la garantía implícita de COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte
* la GNU General Public License para más detalles.
*
* Usted debería haber recibido una copia de la GNU General Public License junto con este programa.
* De lo contrario, véase <http://www.gnu.org/licenses/>.
**/
class Labs_yTube
{
private $token='';
private $local_url='';
private $developer_key='';
private $id='';
private $url=array();
/**
* Método constructor.
* @return Sin retorno.
*/
public function __construct()
{
$this->token='your_token_here';
$this->local_url='your_local_url_here';
$this->developer_key='your_developer_key_here';
$this->id='your_user_or_video_id_here';
$this->url=array('uploads'=>'http://gdata.youtube.com/action/GetUploadToken',
'users'=>'http://gdata.youtube.com/feeds/api/users/%id%/uploads',
'videos'=>'http://gdata.youtube.com/feeds/api/videos/%id%/comments');
}
/**
* Método que conecta al Host solicitado y realiza las peticiones de acuerdo al tipo de conexión.
* @param url Host al que se realiza la petición.
* @param peticion Datos que se enviarán al Host.
* @param tipo Conexión solicitada.
* @return Respuesta del Host en XML.
*/
private function conectar($url, $peticion='', $tipo='feed')
{
$init=curl_init($url);
curl_setopt($init, CURLOPT_RETURNTRANSFER, true);
curl_setopt($init, CURLOPT_FAILONERROR, true);
if($tipo=='video')
{
$cabecera=array('Authorization: AuthSub token='.$this->token,
'X-GData-Key: key='.$this->developer_key,
'Content-Length:'.strlen($peticion),
'Content-Type: application/atom+xml; charset=UTF-8');
curl_setopt($init, CURLOPT_POST, true);
curl_setopt($init, CURLOPT_HTTPHEADER, $cabecera);
curl_setopt($init, CURLOPT_POSTFIELDS, $peticion);
}
return curl_exec($init);
}
/**
* Método que crea un objeto DOM desde un XML.
* @param xml Contenidos del archivo XML.
* @param etiqueta Elemento a buscar en el XML.
* @return Matriz de nodos con el nombre de etiqueta dado.
*/
private function iniciarDOM($xml, $etiqueta)
{
$dom=domxml_open_mem($xml);
$raiz=$dom->document_element();
return $raiz->get_elements_by_tagname($etiqueta);
}
/**
* Método que prepara el envío de datos asociados al video.
* @param titulo Título del video.
* @param descripcion Descripción del video.
* @param categoria Categoría del video.
* @param tags Palabras clave del video.
* @return Matriz con la URL y el token de autorización para cargar el video.
*/
public function cargarDatosVideo($titulo='', $descripcion='', $categoria='People', $tags='')
{
$peticion='<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">
<media:group>
<media:title type="plain">'.$titulo.'</media:title>
<media:description type="plain">'.$descripcion.'</media:description>
<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">'.$categoria.'</media:category>
<media:keywords>'.$tags.'</media:keywords>
</media:group>
</entry>';
$xml=$this->conectar($this->url['uploads'], $peticion, 'video');
return $this->prepararDatosVideo($xml);
}
/**
* Método que obtiene los datos asociados a los videos subidos por un usuario específico.
* @return Matriz con los datos asociados a cada video.
*/
public function obtenerDetalles()
{
$url=$this->prepararUrl('users');
$xml=$this->conectar($url);
$matriz=$this->iniciarDOM($xml, 'group');
$salida=array();
$indice=0;
$contador=0;
foreach($matriz as $nodo)
{
foreach($nodo->child_nodes() as $nodo)
{
switch($nodo->node_name())
{
case 'title':
$salida[$indice][$contador]=$nodo->get_content();
$contador++;
break;
case 'description':
$salida[$indice][$contador]=$nodo->get_content();
$contador++;
break;
case 'player':
$salida[$indice][$contador]=$this->prepararCodigo($nodo->get_attribute('url'));
$contador++;
}
}
$indice++;
$contador=0;
}
return $salida;
}
/**
* Método que obtiene las imágenes previas de los videos subidos por un usuario específico.
* @return Matriz con las URL de las imágenes previas de cada video.
*/
public function obtenerMiniaturas()
{
$url=$this->prepararUrl('users');
$xml=$this->conectar($url);
$matriz=$this->iniciarDOM($xml, 'group');
$salida=array();
$indice=0;
$contador=0;
foreach($matriz as $nodo)
{
foreach($nodo->child_nodes() as $nodo)
{
if($nodo->node_name()=='thumbnail')
{
$salida[$indice][$contador]=$nodo->get_attribute('url');
$contador++;
}
}
$indice++;
$contador=0;
}
return $salida;
}
/**
* Método que obtiene los datos necesarios para embeber los videos subidos por un usuario específico.
* @return Matriz con las URL y tipos de cada video.
*/
public function obtenerVideos()
{
$url=$this->prepararUrl('users');
$xml=$this->conectar($url);
$matriz=$this->iniciarDOM($xml, 'group');
$salida=array();
$contador=0;
foreach($matriz as $nodo)
{
foreach($nodo->child_nodes() as $nodo)
{
if($nodo->get_attribute('format')==5)
{
$salida[$contador][0]=$nodo->get_attribute('url');
$salida[$contador][1]=$nodo->get_attribute('type');
}
}
$contador++;
}
return $salida;
}
/**
* Método que obtiene los comentarios de un video específico.
* @return Matriz con los datos asociados a cada comentario.
*/
public function obtenerComentarios()
{
$url=$this->prepararUrl('videos');
$xml=$this->conectar($url);
$matriz=$this->iniciarDOM($xml, 'entry');
$salida=array();
$indice=0;
$contador=0;
foreach($matriz as $nodo)
{
foreach($nodo->child_nodes() as $nodo)
{
switch($nodo->node_name())
{
case 'content':
$salida[$indice][$contador]=$nodo->get_content();
$contador++;
break;
case 'author':
foreach($nodo->child_nodes() as $nodo)
{
if($nodo->node_name()=='name')
{
$salida[$indice][$contador]=$nodo->get_content();
$contador++;
}
}
}
}
$indice++;
$contador=0;
}
return $salida;
}
/**
* Método que prepara los datos necesarios para cargar el video.
* @param xml Contenidos del archivo XML.
* @return Matriz con la URL y el token de autorización para cargar el video.
*/
private function prepararDatosVideo($xml)
{
preg_match('~<url>(.*)</url>~', $xml, $url);
preg_match('~<token>(.*)</token>~', $xml, $token);
return array($url[1], $token[1]);
}
/**
* Método que prepara la URL del Host al que se realizará la petición.
* @param tipo Tipo de URL del Host.
* @return Cadena con la URL del Host incluyendo el identificador de usurio o video.
*/
private function prepararUrl($tipo)
{
$salida=str_replace('%id%', $this->id, $this->url[$tipo]);
return $salida;
}
/**
* Método que prepara el identificador del video.
* @param url URL del video.
* @return Cadena con el identificador del video.
*/
private function prepararCodigo($url)
{
$inicio=strpos($url, '=')+1;
$longitud=strpos($url, '&')-$inicio;
return substr($url, $inicio, $longitud);
}
public function setToken($token)
{
$this->token=$token;
}
public function setLocalUrl($local_url)
{
$this->local_url=$local_url;
}
public function setDeveloperKey($developer_key)
{
$this->developer_key=$developer_key;
}
public function setId($id)
{
$this->id=$id;
}
public function getLocalUrl()
{
return $this->local_url;
}
public function getId()
{
return $this->id;
}
}
?>
demo.php<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Labs_yTube PHP class</title>
<style type="text/css">
<!--
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
margin: 0px;
}
p {
margin-top: 0px;
}
img {
border-top-width: 0px;
border-right-width: 0px;
border-bottom-width: 0px;
border-left-width: 0px;
}
span {
font-size: 16px;
font-weight: bold;
color: #000;
}
input {
margin-bottom: 5px;
}
select {
margin-bottom: 5px;
}
textarea {
margin-bottom: 5px;
}
#status {
background-color: #FFF1A8;
text-align: center;
width: 200px;
padding: 5px;
margin-right: auto;
margin-left: auto;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-style: none;
border-right-style: solid;
border-bottom-style: solid;
border-left-style: solid;
border-right-color: #FFCC33;
border-bottom-color: #FFCC33;
border-left-color: #FFCC33;
<?php
if(isset($_GET['status']))
{
?>
display: block;
<?php
}
else
{
?>
display: none;
<?php
}
?>
}
#container {
width: 942px;
margin-right: auto;
margin-left: auto;
}
#container div {
background-color: #EFF4FC;
float: left;
padding: 5px;
margin-top: 10px;
margin-right: 10px;
border: 1px solid #A1B4D9;
}
#container #upload {
width: 276px;
}
#container #upload form #titulo {
width: 236px;
}
#container #upload form #descripcion {
width: 272px;
}
#container #upload form #categoria {
width: 276px;
}
#container #upload form #tags {
width: 214px;
}
#container #player {
height: 385px;
width: 480px;
}
#container #more {
width: 120px;
padding-bottom: 0px;
}
#container #comments {
width: 480px;
margin-bottom: 10px;
margin-left: 298px;
}
-->
</style>
</head>
<body>
<?php
require('Labs_yTube.class.php');
$miLabsyTube=new Labs_yTube();
$miLabsyTube->setLocalUrl('your_local_url_here');
$miLabsyTube->setDeveloperKey('your_developer_key_here');
if(isset($_GET['id']))
{
$miLabsyTube->setId($_GET['id']);
}
else
{
$miLabsyTube->setId('your_video_id_here');
}
?>
<div id="status">
<?php
if(isset($_GET['status']))
{
if($_GET['status']=='200')
{
?>
El video fue subido correctamente.
<?php
}
else
{
?>
Ocurrió un error al cargar el video.
<?php
}
}
?>
</div>
<div id="container">
<div id="upload">
<p><span>Cargar video</span></p>
<?php
if(isset($_GET['token']))
{
if(isset($_POST['metadatos']))
{
$miLabsyTube->setToken($_GET['token']);
$array=$miLabsyTube->cargarDatosVideo($_POST['titulo'], $_POST['descripcion'], $_POST['categoria'], $_POST['tags']);
?>
<form action="<?php echo $array[0]?>?nexturl=<?php echo $miLabsyTube->getLocalUrl()?>" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" size="27">
<input type="hidden" name="token" id="token" value="<?php echo $array[1]?>">
<input type="submit" name="cargar" id="cargar" value="Cargar video">
</form>
<?php
}
else
{
?>
<form name="form1" method="post" action="#">
Título: <input type="text" name="titulo" id="titulo">
Descripción:
<textarea name="descripcion" id="descripcion" cols="45" rows="5"></textarea>
<select name="categoria" id="categoria">
<option selected="" value="">-- Selecciona una categoría. --</option>
<option value="Film">Cine y animación</option>
<option value="Autos">Automoción</option>
<option value="Music">Música</option>
<option value="Animals">Mascotas y animales</option>
<option value="Sports">Deportes</option>
<option value="Travel">Viajes y eventos</option>
<option value="Games">Juegos</option>
<option value="Comedy">Comedia</option>
<option value="People">Gente y blogs</option>
<option value="News">Noticias y política</option>
<option value="Entertainment">Ocio</option>
<option value="Education">Educación</option>
<option value="Howto">Instrucc. varias y estilo</option>
<option value="Nonprofit">ONGs y activismo</option>
<option value="Tech">Ciencia y tecnología</option>
</select>
<br>
Etiquetas: <input type="text" name="tags" id="tags">
<input type="hidden" name="metadatos" id="metadatos" value="metadatos">
<input type="submit" name="enviar" id="enviar" value="Enviar datos">
</form>
<?php
}
}
else
{
?>
<p><a href="https://www.google.com/accounts/AuthSubRequest?next=<?php echo $miLabsyTube->getLocalUrl()?>&scope=http://gdata.youtube.com&session=0&secure=0">Identificarse en YouTube</a></p>
<?php
}
?>
</div>
<div id="player">
<object width="480" height="385">
<param name="movie" value="http://www.youtube.com/v/<?php echo $miLabsyTube->getId()?>?f=user_uploads&app=youtube_gdata"></param>
<embed src="http://www.youtube.com/v/<?php echo $miLabsyTube->getId()?>?f=user_uploads&app=youtube_gdata" type="application/x-shockwave-flash" width="480" height="385"></embed>
</object>
</div>
<div id="more">
<p><span>Otros videos</span></p>
<?php
$miLabsyTube->setId('your_user_id_here');
$videos=$miLabsyTube->obtenerDetalles();
$miniaturas=$miLabsyTube->obtenerMiniaturas();
for($i=0; $i<3; $i++)
{
echo '<a href="?id='.$videos[$i][1].'"><img src="'.$miniaturas[$i][2].'"></a><br /><br />';
}
?>
</div>
<div id="comments">
<p><span>Comentarios</span></p>
<?php
if(isset($_GET['id']))
{
$miLabsyTube->setId($_GET['id']);
}
else
{
$miLabsyTube->setId('your_video_id_here');
}
foreach($miLabsyTube->obtenerComentarios() as $comentarios)
{
foreach($comentarios as $comentario)
{
echo '<hr />'.$comentario;
}
}
?>
</div>
</div>
</body>
</html>