Función de extracción de datos Youtube() en PHP version4

LogoYoutubePHPContinuo 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) {
	$_id = parse_url($id);
	parse_str($_id['query']);
	unset($_id);
	$id = empty($v) ? $id : $v;

	$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);
	$cookie = tempnam ("/tmp", "YOUTUBE");
	$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';
	preg_match_all($exp_info,$query,$t);
	
	$exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
	preg_match_all($exp_info,$query,$titulo);
	
	$exp_info = "!<meta name=\"description\" content=\"(.+)\">!U";
	preg_match_all($exp_info,$query,$descripcion);
		
	$exp_info = "!<span class=\"watch-video-added post-date\">(.+) de (.+) de (.+)</span>!U";
	preg_match_all($exp_info,$query,$fecha);
	
	$exp_info = "<meta name=\"keywords\" content=\"(.+)\">";
	preg_match_all($exp_info,$query,$tags);
	
	$exp_info = "!href=\"/user/(.+)\"!U";
	preg_match_all($exp_info,$query,$user);
	
	$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["title"]		= utf8_decode(html_entity_decode($titulo));
	$salida["descripcion"]	= utf8_decode(html_entity_decode($descripcion));
	$salida["fecha"]		= $fecha;
	$salida["tags"]			= utf8_decode(html_entity_decode($tags));
	$salida["usuario"]		= utf8_decode(html_entity_decode($user));

	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.

$datos = youtube('http://es.youtube.com/watch?v=aWCD69urAqQ&fmt=18');
if($datos){
	foreach($datos as $nombres => $valor){
		echo $nombre.' = '.$valor."<br />\n";
	}
} else {
	echo 'el video que intentaba ver no existe';
}

Si aun queda algún error solo tenéis que comentarlo ah!, y las donaciones/cafés son bienvenidas ;)

8 Respuestas a “Función de extracción de datos Youtube() en PHP version4”

  1. richardg dice:

    Bastante interesante para los que queiran manejar una gran cantidad de datos de videos y demas

  2. Laura dice:

    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){

  3. antares500 dice:

    Hola Laura, pues si, tienes mucha razón… gracias por el apunte.. ya esta corregido

  4. Kapry dice:

    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

  5. rove dice:

    Hola Antares, muchas gracias por tus aportes, recien empiezo en php. Como hago para correr la funcion youtube?
    Como podria hacer la parte donde se llama a la funcion, por favor podrias indicarme. Como mando los parametros?

  6. antares500 dice:

    emm pues eso es php basivo rove.. para terminar.. los comandos se pueden recibir por GET o POST desde las variables $_GET o $_POST.. es un formulario basico.. seguro que hay muchas paginas que lo hacen.. de todas formas esta función usaba el diseño de youtube y ha sufrido un cambio completo para adaptarse a los standar de HTML5, así que ya no debería estar operativa.. de todas formas es un punto inicial desde el que experimentar con expresiones regulares..

    sobre como ejecutarla, tienes el ejemplo en el mismo articulo.. un saludo.

  7. maik dice:

    Notice: Undefined offset: 0 in C:\xampp\htdocs\clase\youtube\ii.php on line 44

    Notice: Undefined offset: 0 in C:\xampp\htdocs\clase\youtube\ii.php on line 47
    el video que intentaba ver no existe

  8. segma dice:

    Hola muy bueno el script, pero no consigo ver la fecha ? Es porque al subir el video hay que rellenar este campo o es la fecha de publicación ? Saludos y thanks!!

Deja un comentario