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 (arthusu) http://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