Función de extracción de datos Youtube() en PHP version4
Continuo con el desarrollo de una nueva versión de esta función que tan famosa parece estarse haciendo.. como todo el mundo sabe su funcionamiento es muy sencillo, se le pasa una variable que puede ser la URL de un video de youtube o su ID y da como resultado un montón de datos sobre el video ordenados dentro de un array, teniendo un segundo parámetro que podemos activar en caso de error y que nos facilita información interna sobre la función..
Esta 4º versión de la función ha salido sobre todo gracias al generoso "cafe" al que me ha invitado @Tx y a los apuntes sobre errores que ha encontrado @Nach en los textos con acentos y similares. De modo que el funcionamiento general de la función es exactamente el mismo.
La otra novedad que tiene esta actualización es el modo en que se realiza la petición de datos, ya que ahora lo hace prácticamente a la misma velocidad pero indicando a youtube que somos un navegador firefox, de manera que así obtendremos los mismos datos que un navegador web normal a su misma velocidad.
Esta modificación se encuentra entre las lineas 9 y 23 de manera que si alguien tiene problemas con esta nueva manera de obtener los datos o encuentra que tiene un consumo de memoria o de tiempo mayor puede volver al modo anterior solo sustituyendo ese párrafo por query = @file_get_contents($url);.
-
function youtube($id, $debug = false) {
-
-
$url = 'http://es.youtube.com/watch?v='.$id;
-
// Obtencion de los datos desde la web // // //
-
// (si esta parte te resulta demasiado lenta sustitullela por $query = @file_get_contents($url);
-
$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
-
$c = curl_init($url);
-
curl_setopt($c, CURLOPT_COOKIEJAR, $cookie);
-
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie);
-
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); // no sigue las redirecciones
-
curl_setopt($c, CURLOPT_HEADER, false); // no mostrar el header denro de la salida
-
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
-
curl_setopt($c, CURLOPT_USERAGENT, $user_agent);
-
-
$query= curl_exec($c);
-
curl_close($c);
-
-
// // // // // // // // // // // // // // // //
-
-
$exp_info = '!&t=(.+)&!U';
-
-
$exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
-
-
$exp_info = "!<meta name=\"description\" content=\"(.+)\">!U";
-
-
$exp_info = "!<span class=\"watch-video-added post-date\">(.+) de (.+) de (.+)</span>!U";
-
-
$exp_info = "<meta name=\"keywords\" content=\"(.+)\">";
-
-
$exp_info = "!href=\"/user/(.+)\"!U";
-
-
$t = $t[1][0];
-
$titulo = $titulo[1][0];
-
$descripcion = $descripcion[1][0];
-
$fecha = ($fecha[1][0]&&$fecha[2][0]&&$fecha[3][0]) ? $fecha[1][0].' de '.$fecha[2][0].' de '.$fecha[3][0] : '';
-
$tags = $tags[1][0];
-
$user = $user[1][0];
-
-
$salida["id"] = $id;
-
$salida["t"] = $t;
-
$salida["url"] = $url;
-
$salida["iurl"] = "http://img.youtube.com/vi/".$id."/2.jpg";
-
$salida["reproductor"] = "http://www.youtube.com/p.swf?video_id=".$id."&iurl=http://img.youtube.com/vi/".$id."/2.jpg&t=".$t;
-
$salida["video"] = "http://youtube.com/get_video.php?video_id=".$id."&t=".$t;
-
$salida["html"] = "<object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http://www.youtube.com/v/".$id."\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/".$id."\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"425\" height=\"350\"></embed></object>";
-
-
$salida["fecha"] = $fecha;
-
-
if($debug){
-
//sistema de diagnostico
-
$salida['debug'] = $query;
-
$s['la url de lectura es'] = $url;
-
$s['lectura de video'] = ($query ) ? 'si' : 'no' ;
-
$s['t encontrado'] = ($t ) ? 'si' : 'no' ;
-
$s['titulo encontrado'] = ($titulo ) ? 'si' : 'no' ;
-
$s['descripcion encontrada'] = ($descripcion ) ? 'si' : 'no' ;
-
$s['fecha encontrada'] = ($fecha ) ? 'si' : 'no' ;
-
$s['tags encontrados'] = ($tags ) ? 'si' : 'no' ;
-
$s['usuario encontrado'] = ($user ) ? 'si' : 'no' ;
-
$s['contenido para debug'] = $salida;
-
return $s;
-
}
-
-
if($t == ""){ //Error de conexion
-
return false;
-
} else { // todo OK
-
return $salida;
-
}
-
}
Esta función responde un array con las variables del video siempre que el video no haya sido borrado, caso en el que devuelve false.
Un ejemplo practico.
Si aun queda algún error solo tenéis que comentarlo ah!, y las donaciones/cafés son bienvenidas
Bastante interesante para los que queiran manejar una gran cantidad de datos de videos y demas
El único error que veo es en el ejemplo, que pone:
foreach($datos as $nombres => $valores){
Y debería poner:
foreach($datos as $nombre => $valor){
Hola Laura, pues si, tienes mucha razón… gracias por el apunte.. ya esta corregido
Me parce muy interesante tu codigo, solo que he intentado probarlo poniendole una url que si exite y me dice
“el video que intentaba ver no existe”
Intente con
$datos = youtube(’lrsslAbsRUw’);
y
$datos = youtube(’http://www.youtube.com/watch?v=lrsslAbsRUw’);
Cual es el error?
Muchas gracias por la ayuda de antemano
que tengas un buen dia
Saludos