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);.

PHP:
  1. function youtube($id, $debug = false) {
  2.     $_id = parse_url($id);
  3.     parse_str($_id['query']);
  4.     unset($_id);
  5.     $id = empty($v) ? $id : $v;
  6.  
  7.     $url = 'http://es.youtube.com/watch?v='.$id;
  8.     // Obtencion de los datos desde la web // // //
  9.     //  (si esta parte te resulta demasiado lenta sustitullela por $query = @file_get_contents($url);
  10.     $cookie = tempnam ("/tmp", "YOUTUBE");
  11.     $user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
  12.     $c  = curl_init($url);
  13.             curl_setopt($c, CURLOPT_COOKIEJAR,      $cookie);
  14.             curl_setopt($c, CURLOPT_COOKIEFILE,    $cookie);
  15.             curl_setopt($c, CURLOPT_FOLLOWLOCATION,  true);    // no sigue las redirecciones
  16.             curl_setopt($c, CURLOPT_HEADER,      false);   // no mostrar el header denro de la salida
  17.             curl_setopt($c, CURLOPT_RETURNTRANSFER,  1);
  18.             curl_setopt($c, CURLOPT_USERAGENT,      $user_agent);
  19.  
  20.     $query= curl_exec($c);
  21.             curl_close($c);
  22.    
  23.     // // // // // // // // // // // // // // // //
  24.    
  25.     $exp_info = '!&t=(.+)&!U';
  26.     preg_match_all($exp_info,$query,$t);
  27.    
  28.     $exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
  29.     preg_match_all($exp_info,$query,$titulo);
  30.    
  31.     $exp_info = "!<meta name=\"description\" content=\"(.+)\">!U";
  32.     preg_match_all($exp_info,$query,$descripcion);
  33.        
  34.     $exp_info = "!<span class=\"watch-video-added post-date\">(.+) de (.+) de (.+)</span>!U";
  35.     preg_match_all($exp_info,$query,$fecha);
  36.    
  37.     $exp_info = "<meta name=\"keywords\" content=\"(.+)\">";
  38.     preg_match_all($exp_info,$query,$tags);
  39.    
  40.     $exp_info = "!href=\"/user/(.+)\"!U";
  41.     preg_match_all($exp_info,$query,$user);
  42.    
  43.     $t        = $t[1][0];
  44.     $titulo   = $titulo[1][0];
  45.     $descripcion    = $descripcion[1][0];
  46.     $fecha      = ($fecha[1][0]&&$fecha[2][0]&&$fecha[3][0]) ? $fecha[1][0].' de '.$fecha[2][0].' de '.$fecha[3][0] : '';
  47.     $tags         = $tags[1][0];
  48.     $user         = $user[1][0];
  49.            
  50.     $salida["id"]         = $id;
  51.     $salida["t"]            = $t;
  52.     $salida["url"]      = $url;
  53.     $salida["iurl"]   = "http://img.youtube.com/vi/".$id."/2.jpg";
  54.     $salida["reproductor"]  = "http://www.youtube.com/p.swf?video_id=".$id."&iurl=http://img.youtube.com/vi/".$id."/2.jpg&t=".$t;
  55.     $salida["video"]        = "http://youtube.com/get_video.php?video_id=".$id."&t=".$t;
  56.     $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>";
  57.    
  58.     $salida["title"]        = utf8_decode(html_entity_decode($titulo));
  59.     $salida["descripcion"]  = utf8_decode(html_entity_decode($descripcion));
  60.     $salida["fecha"]        = $fecha;
  61.     $salida["tags"]   = utf8_decode(html_entity_decode($tags));
  62.     $salida["usuario"]    = utf8_decode(html_entity_decode($user));
  63.  
  64.     if($debug){
  65.         //sistema de diagnostico
  66.         $salida['debug']                = $query;
  67.         $s['la url de lectura es']    = $url;
  68.         $s['lectura de video']      = ($query  )    ? 'si' : 'no' ;
  69.         $s['t encontrado']        = ($t   )    ? 'si' : 'no' ;
  70.         $s['titulo encontrado']   = ($titulo      )  ? 'si' : 'no' ;
  71.         $s['descripcion encontrada']    = ($descripcion )    ? 'si' : 'no' ;
  72.         $s['fecha encontrada']      = ($fecha  )    ? 'si' : 'no' ;
  73.         $s['tags encontrados']      = ($tags    ) ? 'si' : 'no' ;
  74.         $s['usuario encontrado']        = ($user        )   ? 'si' : 'no' ;
  75.         $s['contenido para debug']    = $salida;
  76.         return  $s;
  77.     }
  78.    
  79.     if($t == ""){ //Error de conexion
  80.         return false;
  81.     } else { // todo OK
  82.         return $salida;
  83.     }
  84. }

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.

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

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