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

Youtube()A estas alturas supongo que los que lean este blog seguramente sepan que hace esta función. Es una función que a partir de una ID de youtube extrae el resto de datos del mismo video…
El motivo de esta actualización es el aviso de @pablo que me indicaba que en la versión 1 se la función si que se obtener el usuario que ha subido el video, asi que esa ha sido la primera corrección.
Revisando el código a demás me di cuenta que la fecha también fallaba, así como el debug de fecha, y como guinda.. mucha gente esta usando la direccion de youtube completa para obtener el ID y para los usuarios menos expertos es un coñazo el extraerlo.. así que he incorporado el metodo que el genio Alex Barros diseño en Boozox y uno de sus lectores @Javier compartieron para que ahora podamos ver los vídeos no solo con la ID si no que también con la URL.

[PHP]
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;
$query = @file_get_contents($url);

$exp_info = ‘!&t=(.+)&!U’;
preg_match_all($exp_info,$query,$t);

$exp_info = “!!U”;
preg_match_all($exp_info,$query,$titulo);

$exp_info = “!!U”;
preg_match_all($exp_info,$query,$descripcion);

$exp_info = “!(.+) de (.+) de (.+)!U”;
preg_match_all($exp_info,$query,$fecha);

$exp_info = ““;
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”] = ““;
$salida[“title”] = $titulo;
$salida[“descripcion”] = $descripcion;
$salida[“fecha”] = $fecha;
$salida[“tags”] = $tags;
$salida[“usuario”] = $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;
}
}
[/PHP]

Un ejemplo con ID:
[PHP]
$datos = youtube(‘aWCD69urAqQ’);
print_r($datos);
[/PHP]

El mismo ejemplo de antes pero esta vez con la URL completa:
[PHP]
$datos = youtube(‘http://es.youtube.com/watch?v=aWCD69urAqQ&fmt=18’);
print_r($datos);
[/PHP]
He sacado una nueva version que corrige errores de peticion y caracteres. la podeis encontrar en Función de extracción de datos Youtube() en PHP version4

21 opiniones en “Función de extracción de datos Youtube() en PHP version3”

  1. Me temo que los de youtube han vuelto a cambiar algo, y me funciona perfectamente desde localhost, pero la variable t que me da desde el servidor es no válida.
    Es más, si meto a mano el código que me genera la función desde localhost en el servidor también me funciona (el problema es que no es dinámico), pero desde el servidor al vuelo no, me genera 2 “t”s distintas, desde localhost funciona, desde el servidor (y he probado en 4 distintos) no.
    No tengo ni idea de qué puede ser.
    ¿Alguien tiene alguna idea?
    Un saludo, y gracias por adelantado.

  2. Igual es cosa de flash, me refiero a que sí que me da una variable “t” tu función, y esa “t” me sirve para cargar videos desde flash en localhost, pero no en el servidor remoto (www.insomnio.eu)…
    Estoy desesperado… pero bueno, seguiré luchando a ver si lo consigo.

    El código:

    básicamente hago un sendAndLoad a la función PHP desde flash en la que le envío el identificador de la película y recibo la variable t, sería algo así:

    enviar2_lv.videoID = _root[“video”+(video_actual)];
    recibir2_lv.onLoad = function(exito:Boolean):Void {
    if (exito) {
    ns.play(“http://youtube.com/get_video.php?video_id=”+this.video_id+”&t=”+this.t);
    } else {
    Alert.show(“No se ha podido recuperar la dirección FLV”, “Error”);
    }
    };
    enviar2_lv.sendAndLoad(“creaFLV.php”, recibir2_lv, “POST”);

    donde ns es el reproductor de video por streaming.

    Funcionaba perfecto hasta que dejó de funcionar, es decir, cuando la t se crea en tiempo de ejecución desde localhost me funciona bien, tanto en localhost como en el servidor remoto (si copio y pego el código que me da directamente a machete en plan ns.play(“http://youtube.com/get_video.php?video_id=N3UxjKCbpAk&t=vjVQa1PpcFPD2zxEjyYYuVfxM5EHmxa_0o8cyf1zh8Y=”);

    pero no lo hace bien si la variable t la creo desde el servidor remoto…

    No tengo ni idea de qué puede ser? igual me han puesto en una lista de baneados los de youtube x descargar contenido sin permiso?

    Muchas gracias y perdona por la chapa.

    Un saludo.

  3. hola Tx, ahora ando un poco liado y no he podido hacer pruebas pero creo que tienes razón. Al hacer demasiadas peticiones pueden haberte “baneado” de la obtención del servicio pero de todas formas es algo bastante raro… yo en tu caso lo q haría es un archivo que me sirva de puente.. que obtenga los datos q necesito y los regrese al hacer la consulta, y lo pondría en un servidor gratuito o externo. Una vez colocado procura cerciórate que imitas la estructura de un navegador para que no te vuelva a pasar… creo que casi todo lo podrás hacer con la función Source_extract(), y si consigues algo no dejes de comentarnoslo, igual puedo hacer alguna mejora a la función con tu experiencia..

  4. Hola Tes, no estoy seguro de por que te sale ese error.. que versión de PHP usas, 4 o 5? y que datos son los que metes en el primer parámetro de la función??

    La parte donde te da el error es la parte donde se extraen los datos.. quizá hayas introducido una URL o una variable no valida o algo así

  5. Hola Antares, gracias por responder tan rápidamente. Actualmente estoy trabajando en local, la versión de PHP es la 5.2.9-1

    Creo que el problema lo tengo yo. Ya que si creo un archivo PHP suelto con la función tal cual y realizo la llamada a la función me devuelve lo que le pido.

    Cuando lo meto en el CMS que uso (PHP-Fusion) es donde viene el problema. Parece que entra en un bucle o algo y cuando sale de él devuelve lo que le pido y el error

    Notice: Undefined index: query in URL on line X

    Linea X: parse_str($_id[‘query’]);

    Pero si le pido el HTML, el título, o lo que sea, me lo da. Voy a seguir trasteando a ver por qué podría ser.

    Elimina el anterior mensaje, que me he colado. Saludos

  6. Vale, el problema no es el CMS. Probándolo en un archivo a parte me devuelve el mismo error, parece ser la variable ($idVideo) en sí.

    $youtube = youtube($idVideo); // Problema
    $youtube = youtube(‘9wFiuFzOwJI’); //Perfecto

    Saludos

  7. Tes, siempre puedes usar un include o un file_get_text para leer los datos de un archivo externo a tu CMS, y de esa manera olvidarte del error del CMS. Sobre lo de la variable… comprueba que esa variable sea texto al ser introducida y de todas formas podrias convertirla… solo tienes que ponerle .” y la funcion la tomara como si fuera texto. (EJ. $youtube = youtube($idVideo.”); )

    un saludo

  8. Pues no sé, ya no sé ni qué hacer…
    Me he abierto 3 cuentas distintas en servidores gratuitos de php y no consigo que funcione con ninguna.

    Resumiendolo todo a LO MÍNIMO, he creado una página con lo mínimo mínimo mínimo:

    en teoría y tal y como yo lo entiendo, copiando y pegando en el navegador el código resultante te debe abrir un pop up preguntándote a ver si quieres descargarte un .flv… bueno, pues si lo hago desde localhost me funciona, si lo hago desde cualquiera de los otros 3 servidores NO.

    Es factible que youtube también tuviera baneados los servidores php gratuitos? Me parece un poco sobrada, no?

  9. Aivá! no sé por qué no sale el código… supongo que porque estaba con llaves de php?
    voy a ponerlo otra vez sin ellas:

    $varurl=”CoiFGva_JoY”;
    function youtube($id, $debug = false) {
    //aqui va tu función
    }
    $todo=youtube($varurl);
    echo $todo[“video”];

    si es por otra cuestión y se repite el código, siéntete libre de borrar este post.

    PD: xcierto… disfruta de ese café a mi salud. ;o)
    Yo seguiré luchando contra youtube!!!

  10. Hola Nach, cierto.. eso pasa por que decidí no usar correcciones de los caracteres para que se pudiera usar con todos los idiomas en los que esta youtube..
    para hacer esa corrección solo tienes que hacer tu pagina compatible con UTF-8 que son los caracteres que usamos en español y en la mayoría de idiomas europeos. para lograr esto tienes varias funciones como utf8_encode para codificar un texto a UTF8 o su contrario, utf8_decode. Si aun así sigues teniendo problemas lo mejor es que pruebes con otras fucniones para convertir los caracteres “especiales” a otros compatibles en HTML.
    Un saludo y si sigues con el problema coméntame..

  11. Hola, poco después de escribir el mensaje encontré esa función y la apliqué. La verdad es que funciona estupendamente.

    Aun así, por ejemplo, con este video

    http://www.youtube.com/watch?v=uloNaUWGP3c

    usa comillas (“) y cuando uso el utf8_decode me lo traduce como quote en vez de las comillas. Ya sé que no viene al hilo.
    Un saludo

  12. he hecho una pagina
    http://87.216.61.125:8080/test/emailing/iutube.php

    donde el código es tal cual el que está en esta pagina agregandole la asignación a $id.

    <?php
    $id = youtube(’65aky9tppws’);

    function youtube($id, $debug = false) {
    $url = ‘http://es.youtube.com/watch?v=’.$id;
    $query = @file_get_contents($url);
    ……..

    No hace nada de nada, cual es mi error?
    Gracias

  13. tambien he probado asi…

    <?PHP
    $datos = youtube(‘aWCD69urAqQ’);
    print_r($datos);

    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 // // //

    …..

    y nada de nada, aunque tarda mas en decir LISTO en navegador.

  14. hola @eduardo, hace tiempo que escribi esta funcion y no estoy seguro de que siga actualizada debido a los cambios en la estructura de youtube con todo el revuelo del HTML5 y su cambio de codec de video.
    lo mas seguro actualmente es que utilices su api oficial para obtener los datos del video, que aun q es algo mas compleja de usar seguro que te da un resultado fijo.

    te dejo un ejemplo facil de como sacar los datos del video que buscas.
    http://gdata.youtube.com/feeds/api/videos/aWCD69urAqQ?alt=json

    (el alt=json es mania mia.. prefiero obtener los datos en json antes que en xml xq en json solo hay que usar json_decode() para obtener el array completo)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *