Autor Tema: [Clase] Cargar videos a YouTube desde su aplicación o sitio Web.  (Leído 1521 veces)

Desconectado glabs

  • PHPerit@
  • *
  • Mensajes: 2
  • Karma: 1
  • Sexo: Masculino
  • Nuev@ PHPer@
    • Ver Perfil
    • Blog de Gilberto Pineda
[Clase] Cargar videos a YouTube desde su aplicación o sitio Web.
« en: 15 de Octubre de 2010, 21:09:37 pm »
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.html

Labs_yTube.php
Código: [Seleccionar]
<?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=&#39;&#39;;
    
private $local_url=&#39;&#39;;
    
private $developer_key=&#39;&#39;;
    
    
private $id=&#39;&#39;;
    
private $url=array();
    
/**
    * Método constructor.
    * @return Sin retorno.
    */
    
public function __construct()
    {
        
$this->token=&#39;your_token_here&#39;;
        
$this->local_url=&#39;your_local_url_here&#39;;
        
$this->developer_key=&#39;your_developer_key_here&#39;;
        
        
$this->id=&#39;your_user_or_video_id_here&#39;;
        
$this->url=array(&#39;uploads&#39;=>&#39;http://gdata.youtube.com/action/GetUploadToken&#39;,
                         
&#39;users&#39;=>&#39;http://gdata.youtube.com/feeds/api/users/%id%/uploads&#39;,
                         
&#39;videos&#39;=>&#39;http://gdata.youtube.com/feeds/api/videos/%id%/comments&#39;);
    
}
    
/**
    * 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=&#39;&#39;, $tipo=&#39;feed&#39;)
    
{
        
$init=curl_init($url);
        
curl_setopt($initCURLOPT_RETURNTRANSFERtrue);
        
curl_setopt($initCURLOPT_FAILONERRORtrue);
        
        if(
$tipo==&#39;video&#39;)
        
{
            
$cabecera=array(&#39;Authorization: AuthSub token=&#39;.$this->token,
                            
&#39;X-GData-Key: key=&#39;.$this->developer_key,
                            
&#39;Content-Length:&#39;.strlen($peticion),
                            
&#39;Content-Type: application/atom+xml; charset=UTF-8&#39;);
            
            
curl_setopt($initCURLOPT_POSTtrue);
            
curl_setopt($initCURLOPT_HTTPHEADER$cabecera);
            
curl_setopt($initCURLOPT_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=&#39;&#39;, $descripcion=&#39;&#39;, $categoria=&#39;People&#39;, $tags=&#39;&#39;)
    
{
        
$peticion=&#39;<?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
Código: [Seleccionar]
<!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[&#39;status&#39;]))
{
?>

    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(&#39;Labs_yTube.class.php&#39;);
$miLabsyTube=new Labs_yTube();

$miLabsyTube->setLocalUrl(&#39;your_local_url_here&#39;);
$miLabsyTube->setDeveloperKey(&#39;your_developer_key_here&#39;);

if(isset($_GET[&#39;id&#39;]))
{
    
$miLabsyTube->setId($_GET[&#39;id&#39;]);
}
else
{
    
$miLabsyTube->setId(&#39;your_video_id_here&#39;);
}
?>

<div id="status">
<?php
if(isset($_GET[&#39;status&#39;]))
{
    if(
$_GET[&#39;status&#39;]==&#39;200&#39;)
    
{
?>

  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[&#39;token&#39;]))
{
    if(isset(
$_POST[&#39;metadatos&#39;]))
    
{
        
$miLabsyTube->setToken($_GET[&#39;token&#39;]);
        
$array=$miLabsyTube->cargarDatosVideo($_POST[&#39;titulo&#39;], $_POST[&#39;descripcion&#39;], $_POST[&#39;categoria&#39;], $_POST[&#39;tags&#39;]);
?>

    <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(&#39;your_user_id_here&#39;);

$videos=$miLabsyTube->obtenerDetalles();
$miniaturas=$miLabsyTube->obtenerMiniaturas();

for(
$i=0$i<3$i++)
{
    echo &
#39;<a href="?id=&#39;.$videos[$i][1].&#39;"><img src="&#39;.$miniaturas[$i][2].&#39;"></a><br /><br />&#39;;
}
?>

  </div>
  <div id="comments">
    <p><span>Comentarios</span></p>
<?php
if(isset($_GET[&#39;id&#39;]))
{
    
$miLabsyTube->setId($_GET[&#39;id&#39;]);
}
else
{
    
$miLabsyTube->setId(&#39;your_video_id_here&#39;);
}

foreach(
$miLabsyTube->obtenerComentarios() as $comentarios)
{
    foreach(
$comentarios as $comentario)
    {
        echo &
#39;<hr />&#39;.$comentario; 
    
}
}
?>

  </div>
</div>
</body>
</html>
« Última modificación: 16 de Octubre de 2010, 23:09:23 pm por glabs »

Comunidad PHPeros

[Clase] Cargar videos a YouTube desde su aplicación o sitio Web.
« en: 15 de Octubre de 2010, 21:09:37 pm »

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[Clase] Cargar videos a YouTube desde su aplicación o sitio Web.
« Respuesta #1 en: 17 de Octubre de 2010, 12:45:17 pm »

¡Muy buen aporte! Gracias por tu esfuerzo ;). +K

#Fdo. Physlet