Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - glabs

Páginas: [1]
1
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>

2
Los Retos PHPeros / Re:[RETO] Comunidad Social en Web
« en: 13 de Junio de 2010, 15:45:35 pm »
No me parece mala idea adelantar este tipo de proyecto, pues lo único que hace falta es mucha voluntad y creatividad. No debemos pensar que siempre tenemos que empezar todo desde cero para que algo salga bien, si buscamos un poco por la Red podemos encontrar aplicaciones de código abierto que tienen un largo trayecto y que han mejorado muchísimo como lo puede ser http://www.elgg.org, basta con desarrollar un Template bien divertido y seguro podría funcionar, yo tengo cierta experiencia en el desarrollo de este tipo de plugins para Elgg y cualquier colaboración aquí me encontrarán.

Páginas: [1]