PHP: Clase simple para obtener información de videos de YouTube

Standard

Hace poco, me puse a hacer la sección de Videos de esta pagina y por supuesto la quise integrar con el gigante de los videos YouTube.

Me dirijo a la API de Datos de Youtube y me encuentro con muuuuuuuucho para leer y nada rápido para probar.

Para utilizar la API con PHP se necesita Zend Framework un framework demasiado pesadito para mi gusto (por lo poco que necesitaba), por lo que me puse a investigar y desarrolle una pequeña clase para obtener la información de los videos utilizando CURL con PHP.

En esta primera versión, podemos obtener los siguientes datos de un video:

  • Titulo
  • Fecha de Publicación
  • Descripción
  • Meta Tags
  • URL en Youtube
  • Imágenes
  • Código del Reproductor

youtube.class.php

<?php
/* 
 * Name: Simple Class Info YouTube 
 * Description: Get Information of video YouTube
 * Development: Chuecko
 * Site: http://www.zarpele.com.ar
 * License: GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/gpl.html)
 * Version: 1.0
 */

class youtube
{
    var $data = '';
    var $id = '';

    public function youtube($id)
    {
        if (strlen($id) >=22)
        {
            parse_str( parse_url( $id, PHP_URL_QUERY ) );
            $this->id = $v;
        }
        else
        {
            $this->id=$id;
        }

        $url = "http://gdata.youtube.com/feeds/videos/".$this->id;
        $browser_id = "none";
        $curl_handle = curl_init();
        $options = array
        (
            CURLOPT_URL=>$url,
            CURLOPT_HEADER=>false,
            CURLOPT_RETURNTRANSFER=>true,
            CURLOPT_USERAGENT=>$browser_id
        );
        curl_setopt_array($curl_handle,$options);
        $server_output = curl_exec($curl_handle);
        curl_close($curl_handle);

        $this->data=$server_output;
    }

    public function getTitle()
    {
        $startString = "<media:title type='plain'>";
        $endString = "</media:title>";

        $tempString = strstr($this->data, $startString);

        $endLocation = strpos($tempString, $endString);
        $title = substr($tempString, 0, $endLocation);

        if (empty($title))
        {
            $title=false;
        }
        else
        {
            $title=substr($title,strlen($startString));
        }

        return $title;
    }

    public function getPublished()
    {
        $startString = "<published>";
        $endString = "</published>";

        $starLocation = strpos($this->data, $startString);
        $tempString = substr($this->data, $starLocation);

        $endLocation = strpos($tempString, $endString);
        $published = substr($tempString, 0, $endLocation);

        if (empty($published))
        {
            $published=false;
        }
        else
        {
            $published=substr($published,strlen($startString));
            $published=substr($published,0,10);
        }

        return $published;
    }

    public function getDescription()
    {
        $startString = "<media:description type='plain'>";
        $endString = "</media:description>";

        $starLocation = strpos($this->data, $startString);
        $tempString = substr($this->data, $starLocation);

        $endLocation = strpos($tempString, $endString);
        $description = substr($tempString, 0, $endLocation);

        if (empty($description))
        {
            $description=false;
        }
        else
        {
            $description=substr($description,strlen($startString));
        }

        return $description;
    }

    public function getMetaTags()
    {
        $startString = "<media:keywords>";
        $endString = "</media:keywords>";

        $starLocation = strpos($this->data, $startString);
        $tempString = substr($this->data, $starLocation);

        $endLocation = strpos($tempString, $endString);
        $metaTags = substr($tempString, 0, $endLocation);

        if (empty($metaTags))
        {
            $metaTags=false;
        }
        else
        {
            $metaTags=substr($metaTags,strlen($startString));
        }

        return $metaTags;
    }

    public function getUrl()
    {
        return "http://www.youtube.com/watch?v=".$this->id;
    }

    public function getUrlImage($option)
    {
        if($option=='default')
        {
            return 'http://i.ytimg.com/vi/'.$this->id.'/default.jpg';
        }
        if($option=='grande')
        {
            return 'http://i.ytimg.com/vi/'.$this->id.'/0.jpg';
        }
        if($option==1)
        {
            return 'http://i.ytimg.com/vi/'.$this->id.'/1.jpg';
        }
        if($option==2)
        {
            return 'http://i.ytimg.com/vi/'.$this->id.'/2.jpg';
        }
        if($option==3)
        {
            return 'http://i.ytimg.com/vi/'.$this->id.'/3.jpg';
        }
    }

    public function getEmbeb($width, $height)
    {
        $autoplay = 1;
        return '<iframe class="youtube-player" type="text/html" width="'.$width.'" height="'.$height.'" src="http://www.youtube.com/embed/'.$this->id.'?autoplay='.$autoplay.'" frameborder="0">
        </iframe>';
    }


}

?>

Descargar Fichero PHP

Obviamente, hay muchas cosas que mejorar, pero lo hice en pocas horas y me sirvió para lo que yo necesitaba.

Como lo utilizo?, bueno es una clase no hay nada extraño, pero les dejo un ejemplito…

ejemplo.php

<?php
require_once 'youtube.class.php';
/* 
 * Name: Simple Class Info YouTube 
 * Description: Get Information of video YouTube
 * Development: Chuecko
 * Site: http://www.zarpele.com.ar
 * License: GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/gpl.html)
 * Version: 1.0
 */
/*
 * Tambien le pueden pasar como parametro solo el ID de youtube 
 * $youtube = new youtube('59PyU_7iqaU');
 */
$youtube = new youtube('http://www.youtube.com/watch?v=59PyU_7iqaU');

echo 'Titulo: '.$youtube->getTitle().'<br/>';
echo 'Publicado: '.$youtube->getPublished().'<br/>';
echo 'Descripcion: '.$youtube->getDescription().'<br/>';
echo 'Meta Tags: '.$youtube->getMetaTags().'<br/>';
echo 'Link: '.$youtube->getUrl().'<br/>';
echo 'Imagen: '.$youtube->getUrlImage('default').'<br/>';

echo $youtube->getEmbeb(640, 390);

?>

Descargar Fichero PHP
Ya que están de paso, se miran el video del ejemplo :D

Salut…


ACTUALIZACION 27-02-2011
Ya que esta clase tuvo mucho éxito, he creado un proyecto en Google Code http://code.google.com/p/simple-class-youtube/, con el objetivo de ir mejorando el codigo, esta liberado bajo licencia GPL/v2.


ACTUALIZACION 02-07-2011
Lanzada la versión 1.1

FB Comentarios

53 thoughts on “PHP: Clase simple para obtener información de videos de YouTube

  1. Hola Muchisimas gracias por el código, lo he buscado hace algún tiempo y como tu mismo dices el Zend Framework no es de mi agrado tampoco.

    Aunque digas que hay muchas cosas por mejorar, es gracias a ti que se podrá hacer, ya que sin tu ayuda muy pocos nos animaríamos por utilizar ésta API.

  2. Mmmm.. me falto actualizar el codigo de la entrada, fijate que en Descargar archivo esta esto…

            if (strlen($id) >=22)
            {
                parse_str( parse_url( $id, PHP_URL_QUERY ) );
                $this->id = $v;
            }
            else
            {
                $this->id=$id;
            }
    

    Ahora arreglo la entrada…
    Gracias.

  3. joe

    saludos, me da un error como este, me podrias ayudar:
    Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\uxu\_private\cla_youtube.php on line 23
    supongo que no encuentra definida la funcion curl_init(); y en definitiva no esta declarado en la clase, me pregunto si es una funcion propia de php o debíara ser declarado en otro lugar.

  4. joe

    Solucionado

    Lo he solucionado,
    Si le dan en siguiente error:
    Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\uxu\_private\cla_youtube.php on line 23
    Para lo que usan la distribución xampp
    deben modificar el archivo php.ini de php y php.ini de apache en la linea donde dice
    ;curl_library o algo parececido
    quitar la ” ; ”
    quedaría así
    curl_library
    :-)
    a mi me funciona de palos…
    Gracias por compartirla…

    • Juan Pablo

      Hola amigo me da el mismo error:

      Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\PJ2013\class\youtube.class.php on line 30

      busque esa variable en los archivos que mencionaste pero lo mas parecido que encontré fue
      extensión= “php_curl.dll” al cual le quite “;” el punto y coma. Tanto en el php.ini de la carpeta PHP como tambien el la carpeta apache/bin.
      El problema sigue. Si tenes alguna idea te lo voy a agradecer.

  5. Hola estuve checando el script pero me arroja este error alguien tiene idea de como solucionarlo?

    Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in

  6. Hola
    Muy interesante tu code ;)
    Gracias por compartirlo con todos ;)
    Una consulta por alli sabes.
    Como se puede obtener:
    1- El usuario que subio el video a youtube.
    2- La cantidad de reproducciones del video.
    3- Obtener y listar los comentarios en youtube de ese video.

    mmmm Creo que es medio complicado

    Gracias y saludos

  7. Muchas gracias por responder ;)

    Muy bueno tu código anda de 10.

    Y como hago un var_dump del xml ?
    algún codiogo tenes a mano?

    Lo único que pude agregar fue para obtener solo el ID
    Se los dejo por si alguien lo necesita y ademas para retribuir un poquito aunque sea ;)

    en: youtube.class.php agegamos

        public function getID()
        {
            return $this-&gt;id;
        }

    en: ejemplo.php agregamos

    echo 'ID: '.$youtube-&gt;getID().'';

    Y ademas pueden poner que no sea autoplay el video

    en: youtube.class.php modificamos

       public function getEmbeb($width, $height)
        {
            $autoplay = 1; // 0= desactivado, 1=  activado
            return 'id.'?autoplay='.$autoplay.'" frameborder="0"&gt;
            ';
        }

    $autoplay = 1; por $autoplay = 0;

    Espero que les sirva a alguien.

    La verdad que el código que nos regalo amablemente Zarpele es escalable.

    Espero que me puedan ayudar en mi solicitud.

    Gracias y saludos

    • el XML que nos devuelve los amigos de Youtube se guarda en $data, podes agregar una función…

      getData{
          return $this->data;
      }

      luego en ejemplo.php agregar

      var_dump($youtube->getData());

      Si quieres informacion de var_dump, te aconsejo que mires el manual ofical

      Espero que te haya servido y gracias por comentar…

      Salut!

  8. nico

    Yo tengo una duda, todo el manejo de string para obtener la descripcion, el titulo, etc. en vez de hacer tantas funciones, no se podria reemplazar por una regex??

    saludos! :)

    • Claro, esta función, es mejorable. Voy a ver si en estos días trato de mejorarla, ya sea agregando funcionalidad así como optimizando su uso.

      Su cada uno aporta su parte, podemos hacer la clase mucho mas funcional.

      SaluT

  9. Sergio

    Hola buenas sigo esto activo?
    Este codigo esta perfecto, gracias por compartirlo.
    Les pregunto se puede sacar una serie de videos? Es decir si el cliente sube sus videos a su canal de youtube. Que automaticamente coja la url del video y la muestre en la web

    • Si sigue activo, actualmente estoy desarrollando una nueva versión.

      Gracias a vos por comentar..

      No entiendo bien lo ultimo que me pusiste, lo que si se puede hacer es obtener los ultimos videos de un usuario y consultarlo con esta clase. Es facil…

      • Sergio

        Perfecto que sigue activo :D
        Le comento, yo tengo un canal de youtube donde tengo 10 videos subidos.
        Y mediante esta clase quiero mostrar los 10 videos en mi pagina web.

        Pero que dichos enlaces de los videos no tenga yo indicarselos, sino que los coja automaticamente de alguna manera, nose si es mediante RSS o algo.

        Porque este canal ira aumentando de videos, y quiero que si subo un video a youtube, pues automaticamente esta clase lea el enlace (del documento o como sea) y me lo muestre en mi web.

        Solo consigo mostrar 1 video e indicandole yo el enlace.
        Un Saludo y muchas gracias!!

  10. kike

    Hola me parece fantástico tu trabajo, me ilusione al encontrarlo, pero necesito preguntartea algo, mi caso es que necesito que puedan acceder a una cuenta privada, es decir que yo les pase la url del video que está en privado y puedan verlo desde la web, he modificado la dirección del video de tu script y me sale “que debo tener acceso ya que se trata de un video…”

    Puedes ayudarme??
    Mil gracias

  11. tavitooo

    Hola muy bueno tu codito pero veo que en donde se pone el link en tu ejemplo de sample.php en la seccion:

    $url = ‘http://www.youtube.com/watch?v=5ocq6_3-nEw’;

    ahi especificas una url, pero que pasa si es por busqueda es decir si quiero poner una banda de rock nose.. “Metallica” como hago para que salga esa busqueda?. Y que cree un playlist. Estoy que quiero hacer algo asi pero tengo unas mejores ideas y quiero mejorarla: http://www.tubalr.com/

    espero tu ayuda amigo.

    Saludos dede PERU!
    Tavitooo

  12. Se que para sacar la dureccion del video esta en segundos ejemplo un video de 1 minuto en su xml esta en 60 que es 60 segundos. como saco ese numero. osea los 60… ya para que uno pueda tener una funcion en convertirlo en minutos . solo necesito eso.. sacar los segundos del video!!

  13. De maravillas, excelente esto, un pequeño aporte: Ver los comentarios de los videos y quien comentó:
    Código: youtuble.class
    public function getComment()
    {
    if ($this->valid()){
    $this->come = ‘http://gdata.youtube.com/feeds/api/videos/’.$this->id.’/comments’;
    $this->xmlcome = new SimpleXMLElement($this->come, NULL, TRUE);

    //return $this->xmlcome->entry->content ;//ver comentarios
    return $this->xmlcome->entry->author->name ;//ver autor comentario

    }else{
    return false;
    }
    }

    Código: sample.php

    Coments:
    getComment()?>

    ->Saludos.

  14. Está genial . Muchas gracias por compartir . Lo he probado y funciona bien … sólo hay un problema … No me recoge los acentos y las ñ … ufff … ¿ Alguien sabe como arreglarlo ? claro que se puede crear un patrón y sustituir todas las letras pero es algo farragoso …

    • Deuris

      Me Dio Ese Mismo Error Pero En xamp Lo Solucione De La Siguiente Manera:
      1) C:\Program Files\xampp\php\php.ini

      2)Elimina el comentario de la siguiente línea en tu archivo php.ini quitando el punto y coma.

      ;extension=php_curl.dll

      3) Reinicie el servidor apache.

  15. Alejandro Valdivia

    Estimados no me funciona el codigo para los comentarios del video

    public function getComment()
    {
    if ($this->valid()){
    $this->come = ‘http://gdata.youtube.com/feeds/api/videos/’.$this->id.’/comments’;
    $this->xmlcome = new SimpleXMLElement($this->come, NULL, TRUE);

    //return $this->xmlcome->entry->content ;//ver comentarios
    return $this->xmlcome->entry->author->name ;//ver autor comentario

    }else{
    return false;
    }
    }

    Código: sample.php

    Coments:
    getComment()?>

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>