martes, 5 de mayo de 2015

[PHP] Obtener información básica de un vídeo de YouTube

[Esta mierda esta obsoleta, no lo lean, en estos días lo actualizo a la versión 3 de la api (Puto de Google)]

Buenas buenas :)



Bueno, pues eso, necesitaba obtener la información básica de un vídeo de YouTube con PHP (titulo, descripción e imagen miniatura), entonces lo primero que se me ocurrió fue revisar el API (por aquí https://developers.google.com/youtube/2.0/developers_guide_php?csw=1), sin embargo de momento no necesitaba tanto, además de configurar todo, esto y aquello, que Zend, etc. naaa, no era lo que buscaba, así que revisé un poco más y me di cuenta que en la url (esa de arriba) mencionan mucho esta url https://gdata.youtube.com/feeds/api/ con múltiples terminaciones y por allí no tan abajo ni tan arriba vi esto:

https://developers.google.com/youtube/2.0/developers_guide_php#Retrieving_Video_Entry


Y pues eso, simplemente probé poniendo el valor de la variable GET v o sea esta (en negrita) https://www.youtube.com/watch?v=9R8L6D7nnxo armando la URL así https://gdata.youtube.com/feeds/api/XUu9SUevQwY y listo un lindo XML con lo que me interesaba.

Ahora si a lo que vamos, con PHP y su función de simple_xml_file se convierte ese xml en un objeto y obtenemos los valores que deseemos de ese objeto, pero para efectos prácticos, haremos el ejemplo usando dicha función y con curl (que ahi quienes aman curl, eso si que debes tener la libreria curl instalada y habilitada -> http://curl.haxx.se/libcurl/php/).

Vale para el ejemplo, supongamos que tenemos un form bien bonito con un input de tipo text (llamado txt_publicacion), los radio button para el modo de obtención (con curl o simplexml_load_file) y un botón que hace el submit del form hacia un archivo PHP que nos mostrara los datos (que describimos arriba) del vídeo.

index.html
<!DOCTYPE html>
<html>
    <head>
        <title>Info YT</title>
    </head>
    <body>
        <form action="infoyt.php" method="post">
            <input type="text" name="txa_publicacion" placeholder="URL de YouTube">
            <label><input type="radio" name="rbt_tipo" value="xml" checked="checked"> XML</label>
            <label><input type="radio" name="rbt_tipo" value="curl"> CURL</label>
            <button type="submit" name="btn_infoyt">Muestrame la INFO</button>
        </form>
    </body>
</html>


si, SI, eso es un bonito form (jejeje naaa, pero el diseño no importa en este caso). No explicaré a fondo ese código del index.html (creo no hace falta, incluso creo no puedo ir "a fondo" xDD).

Ahora si lo importante, el archivo php llamado:

ytinfo.php
<?php

class parseInfoYT {

 public function ytParseCURL($url) {
        $code = '';
        $return = '';
        $ch_opciones = array(
         CURLOPT_URL => '',
         CURLOPT_HEADER => 0,
         CURLOPT_TIMEOUT => 5,
         CURLOPT_RETURNTRANSFER => TRUE
     ); 

        if (preg_match("/youtube.com\/watch/", $url)) {
            $arr = explode('v=', $url);
            $arr2 = explode("&", $arr[1]);

            $code = $arr2[0];
        } else if (preg_match("/youtu.be\//", $url)) {
            $arr = explode('youtu.be/', $url);
            $arr2 = explode("?", $arr[1]);

            $code = $arr2[0];
        }

        if ($code != "") {
            $ch_opciones[CURLOPT_URL] = 'https://gdata.youtube.com/feeds/api/videos/' . $code;            
            $ch = curl_init();

            try {
             curl_setopt_array($ch, $ch_opciones);
             $xml = curl_exec($ch);
   } catch(Exception $e) {
    trigger_error(curl_error($ch));
    die();
   } finally {
             curl_close($ch);
   }

   $objXML = simplexml_load_string($xml);

            $return = array(
                'titulo' => $objXML->title,
                'descripcion' => $objXML->content,
                'thumbnail' => 'https://i.ytimg.com/vi/' . $code . '/0.jpg'
            );
        }

        return $return;
    }

 public function ytParseXML($url) {
        $code = '';
        $return = '';

        if (preg_match("/youtube.com\/watch/", $url)) {
            $arr = explode('v=', $url);
            $arr2 = explode("&", $arr[1]);

            $code = $arr2[0];
        } else if (preg_match("/youtu.be\//", $url)) {
            $arr = explode('youtu.be/', $url);
            $arr2 = explode("?", $arr[1]);

            $code = $arr2[0];
        }

        if ($code != "") {
            $ytURL = 'https://gdata.youtube.com/feeds/api/videos/' . $code;
            $xml = simplexml_load_file($ytURL);

            $return = array(
                'titulo' => $xml->title,
                'descripcion' => (strlen($xml->content) > 300) ? substr($xml->content, 0, 297) . '...' : $xml->content,
                'thumbnail' => 'https://i.ytimg.com/vi/' . $code . '/0.jpg'
            );
        }

        return $return;
    }
}


if (isset($_POST['btn_infoyt']) && isset($_POST['txa_publicacion']) && !empty($_POST['txa_publicacion'])) {
 $txa_publicacion = $_POST['txa_publicacion'];
 preg_match('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', $txa_publicacion, $urls);

 $objParseInfoYT = new parseInfoYT();

 if (count($urls) > 0) {
  if ($_POST['rbt_tipo'] == 'xml') {
         $video = $objParseInfoYT->ytParseXML($urls[0]);
     } else if ($_POST['rbt_tipo'] == 'curl') {
      $video = $objParseInfoYT->ytParseCURL($urls[0]);
     }
    }

    if (isset($video) && $video != "" && is_array($video)) {
     echo '<div style="display: block; text-align: center;">';
     echo '<h2>' . utf8_decode($video['titulo']) . '</h2>';
     echo '<img src="' . $video['thumbnail'] . '">';
     echo '<p style="display: block;">' . utf8_decode($video['descripcion']) . '</p>';
     echo '</div>';
    } else {
     echo 'Eso no tenia url de youtube <a href="index.html">VOLVER</a>';
    }

} else {
 header('Location: index.html');
}


Vale, este si lo explico, pero un poco ya que en función se ve claramente lo que hace... hay una clase (parseInfoYT) con 2 funciones ytParseCURL y ytParseXML. En ambas funciones se revisa el código de la url, con el preg_match aceptando la forma youtube.com o youtu.be, una vez extraído el código de la url se le concatena a la url antes mencionada ( https://gdata.youtube.com/feeds/api/ ) y ahora dependiendo del caso:


La primera función usa CURL con las opciones básicas para obtener el contenido del link que creamos ( https://gdata.youtube.com/feeds/api/ . $code ) y luego lo asigna a la variable $xml, una vez obtenido el xml se carga en la función simplexml_load_string (la cual es similar a simplexml_load_file solo que a la primera el parámetro de entrada es una variable de tipo string con el xml; la segunda el parámetro de entrada es igualmente un string pero con la ruta del archivo/url que contiene el xml) y genera el objeto, del cual extraemos los valores para asignarlos a un array que retornaremos al final;

En la segunda, se le pasa la url directamente a la función simplexml_load_file y se genera el objeto tal cual como en el anterior caso.

Notas:
* Para mas informacion sobre SimpleXML referirse a la guia de php.net https://php.net/manual/es/book.simplexml.php

* Para mas información de curl referirse a la guia de php.net https://php.net/manual/es/book.curl.php o donde este loco ciber-compa (arthusuhttp://arthusu.blogspot.com/2014/04/parte-1-curl-en-php.html lo explica muy bien y tiene como 5 partes pero vale la pena, y desde 0 :3

Bueno, no siendo mas os dejo el proyecto en este link si desean descargarlo y verlo mas amenamente en su editor de código de preferencia: https://mega.co.nz/#!XVtHmDDD!dgFik-o-zBAh1zxo306N4nMZbTshabh0WsvUPT0RwwM

Saludos kid_goth

No hay comentarios:

Publicar un comentario