Diseccionando youtube con php y flash

Hace tiempo que utilizo Youtube como mi sistema de vídeos, y es mas que nada por comodidad. Se que hay otros servicios que tienen mayor calidad, mejor resolución, mejor diseño y opciones, pero como la variedad que tiene youtube no hay en ningún sistema. Y por esto el otro día me di cuenta que, no me había puesto a pensar como funciona…. y no digo el sistema de usuario o el de subir vídeos, si no el de publicar los vídeos en la web.
Básicamente y a simple vista todos podemos ver que utiliza flash para reproducir los vídeos a través de la conversión de vídeos de cualquier clase a FLV. Pero, ¿como selecciona el vídeo a reproducir? ¿que hace el cuando nosotros hacemos algo?
Mirando las direcciones parece que cada vídeo tiene una "vídeo_id" que es un código de números y letras que determinan el vídeo a reproducir. Como ejemplo podéis ver uno de los publicados aquí.
Al pinchar al articulo de Verdades en la vida, podemos ver que la dirección se divide en unos cuantos elementos:
http://www.youtube.com/watch?
v=YDRId6QmNTA
&eurl=http://www.tierra0.com/
La "carpeta" mira dentro del servidor de youtube.com vale para entrar a la pagina del vídeo, "v" es el "video_id" que identifica que vídeo veremos y eurl indica a google de que web viene la visita.
Estas no son todas las variables que youtube toma, también hay otras que genera para mostrarnos información como "t" o "iurl". Las podemos ver entrando en la carpeta "v" de "youtube.com" y dentro de esta poniendo la "id_video" del vídeo que queremos ver. Como ejemplo: http://www.youtube.com/v/YDRId6QmNTA
Esta dirección es la que se insertará al poner un vídeo de youtube en nuestra web, generando un reproductor flash con el vídeo echo. Por eso utiliza los parámetros anteriormente comentados. Al entrar a, "http://www.youtube.com/v/YDRId6QmNTA", se &t=OEgsToPDskImpHgdkq8u8g6Aka7NXFnM">convertirá en "http://www.youtube.com/p.swf? vídeo_id=YDRId6QmNTA &eurl= &iurl=http%3A//sjl-static10.sjl.youtube.com/vi/YDRId6QmNTA/2.jpg &t=OEgsToPDskImpHgdkq8u8g6Aka7NXFnM" dándonos los datos anteriormente citados de:
id_video: Identificador del vídeo
eurl: Direccion de origen del video
iurl: Imagen previa del vídeo. Estas imágenes se toman cada 10 segundos y se numeran con .jpg. Por defecto youtube pone la imagen tomada a los 10 segundos (la imagen 2.jpg).
t: código generado por youtube para verificar que no se accede ilegalmente.
Estos datos insertados en p.swf darán como resultado el reproductor flash.
Para automatizare estas direcciones y poder usarlas en aplicaciones web he creado una sencilla ´funcion que da como resultado un Array de todas las variables y direcciones completas de los datos de un vídeo de youtube a partir de su id_video.
Para utilizarlo solo tenis que poner youtube("ID_VIDEO"); y poner el elemento del array que se quiera.
Por ejemplo. Si queremos obtener la imagen de un vídeo:
-
<?php
-
echo "<img src=\"".$youtube["iurl"]."\">";
-
?>
Las etiquetas del array que podemos obtener de un video son: id, t, url, iurl, reproductor, video, html, propietario, title, descripcion, fecha, tags
Como siempre la funcion que tenemos que poner antes del ejemplo para que funcione sería:
-
<?php
-
function youtube($id) {
-
$url = 'http://www.youtube.com/watch?v='.$id;
-
-
$exp_info = '!&t=(.+)&sk=!U';
-
-
$exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
-
-
$exp_info = "!<span id=\"vidDescRemain\">(.+)</span>!U";
-
-
$exp_info = "!<b class=\"smallText\">(.+)</b><br>!U";
-
-
$exp_info = "!<meta name=\"keywords\" content=\"(.+)\">!U";
-
-
$exp_info = "!<b><a href=\"/user/(.+)\" onclick=\"!U";
-
-
$t = $t[1][0];
-
$titulo = $titulo[1][0];
-
$descripcion = $descripcion[1][0];
-
$fecha = $fecha[1][0];
-
$tags = $tags[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["propietario"] = $propietario[1][0];
-
$salida["title"] = $titulo;
-
$salida["descripcion"] = $descripcion;
-
$salida["fecha"] = $fecha;
-
$salida["tags"] = $tags;
-
-
return $salida;
-
}
-
?>
Si queremos hacerlo directamente con Flash podemos encontrar la clave en el blog de Abdul Qabiz el cual tiene un extenso post en el que podemos ver una demostración de como obtener los vídeos FLV directamente con flash en AS3 y AS2, y además obtener el archivo editable .fla que extrae los vídeos.
Por si alguien le interesa os dejo el código de AS2 que modifique para la extracción del vídeo en flash:
-
//Declaración de elementos
-
createEmptyMovieClip ("mc", getNextHighestDepth ());
-
var _mcl:MovieClipLoader = new MovieClipLoader ();
-
_mclListener = new Object ();
-
_mcl.addListener (_mclListener);
-
_mcl.loadClip ("http://www.youtube.com/v/3IcwG0jUFxU", mc);
-
-
_mclListener.onLoadStart = function (target:MovieClip){
-
trace ("flv url: " + constructFLVURL (target));
-
salida = "oeeeoeoeoeoe: " + constructFLVURL (target);
-
_mcl.unloadClip (target);
-
};
-
-
//función de composición de la URL
-
function constructFLVURL (dir):String {
-
var _lv:LoadVars = new LoadVars ();
-
_lv.decode (dir._url.split ("?")[1]);
-
trace ("The URL is: " + target._url);
-
trace ("t param: " + _lv.t);
-
trace ("video_id: " + _lv.video_id);
-
trace ("thumbnail: " + _lv.iurl);
-
var str:String = "http://www.youtube.com/get_video.php?" + "video_id=" + _lv.videoId + "&t=" + _lv.t;
-
return str;
-
}
Para ejecutar este código solo tenéis que pegarlo en un clip en el que haya una caja de texto con nombre "salida" en la que se mostrará la dirección de salida del código. La caja de texto debe tener una propiedad de Texto Dinámico.
actualizado:La función de extracción de datos del youtube tenia un pequeño fallo en los datos de propietario y tags que ya esta solucionado, gacias @Lisandro.
Very detailed and interesting post… It’s good to see you documenting most of techniques involved in YouTube stuff…
-abdul
solo queria preguntarte como haces para que el codigo que insertas entre < /code> quede asi con la barra y no se pase de los margenes de tu blog?, si me podrias decir te agradeceria mucho, gracias de antemano.
Es cuestión del CSS, Cada theme de wordpress tiene un css incorporado que determina los anchos y los altos de cada capa. Si te refieres a los [/code] de fondo verde, utilizo un plugin para escribir código que he modificado para la web. Su nombre es "iG:Syntax Hiliter" y está basado en la librería de sintaxis GeSHi es muy fácil de usar. Cuando quieras poner código solo tienes que encerrarlo entre las etiquetas del nombre del lenguaje de programación q sea.
Ejemplo:
[PHP]
< ?php echo "hola mundo"; ?>
[/PHP]
La lista de lenguajes soportados esta con el plugin. Te dejo la dirección del manual de CristalLab sobre como se instala.
Muy buen artículo, yo en realidad no lo use para youtube pero me sirvió mucho para descargar unos juegos en flash que estaba necesitando.
Saludos.
Valla me alegra que te valga
. Para los que les quede alguna duda.. Descargar archivos el flash es muy fácil con firefox. Solo hay que dar botón derecho en algún espacio en blanco, Ver información de la pagina web y ir a la pestaña de medios… Una vez allí buscamos el archivo que queramos descargar, le seleccionamos y pulsamos guardar. Y ya esta! (recordad que algunos flash necesitan otros archivos adjuntos a los que accede por ruta directa y aveces por este motivo no nos funcionan. Podéis ver los mensajes de trace que se obtienen para comprobar estos errores.)
Buena información, pero cómo sería posible tener acceso a la ruta completa del archivo .flv alojado en Youtube.
Tengo un player de flv´s en mi blog, y en el sistema de administración puedo ir añadiendo archivos flv al playlist, pero claro, tengo 2 opciones:
a) Subir el archivo flv a mi propio servidor
b) Introducir la tuta completa del flv
Y claro, mejor que ir subiendo archivos a mi propio servidor, prefiero añadir la ruta del flv directamente, pero ahí está el problema, no consigo la ruta completa de los videos flv de Youtube, lo único que consigo es poder descargar el flv a mi pc.
No hay ninguna manera de encontrar la ruta completa de los videos flv alojados en Youtube.¿?
Muchas gracias!
Un saludo!
Ismael, dentro del array que da como resultado la función youtube() hay una variable que se llama "video". Esa es la ruta del FLV. No estoy seguro de que funcione desde la ultima remodelación del youtube. Si no te funciona me lo comentas y buscamos una solución.
Pues no consigo que funcione…
Pero claro lo que yo busco es algún método para conseguir la ruta completa del archivo .flv , y pueda añadirlo directamente al video player de mi blog.
Pero por mucho que he buscado y buscado, no he encontrado nada acerca de la dirección del .flv
Bueno si me pudieses informar al respecto te lo agradecería.
Un saludo!
antares500 ya he conseguido lo que pretendía, bueno no del todo pero casi…
desde http://video.qooqle.jp/dl/ puedo introducir la URL del video de Youtube y me duvuelve otra URL desde la que puedo descargar el video flv, pero esa misma URL la puedo añadir en mi media player añadiendo al final .flv y el video va perfectamente.
Me viene perfecto porque el servicio es open source y puedes descargarlo para tu propio uso. Entonces lo que me gustaría añadir es que me devolviera también la URL de la imágen previa del video.
¿Alguna idea de cómo poder implementarlo?
El código fuente está aquí –> http://video.qooqle.jp/dl/youtube_downloader.zip?070607
Muchas gracias!
Ismael, muy buen sistema, como mucho ajax y eso pero es que sigue haciendo lo mismo que mi función, solo que mi función lo puedes usar mas cómodamente en tu código php
Solo tendrías que poner:
$datos = youtube("ID_DEL_VIDEO");
echo $datos["video"];
y te daría la dirección de descarga del vídeo.
si cambias "video" por "iurl" tienes la imagen del vídeo, y así con cada parámetro.
para implementarla, o te haces un código que te de lo que tienes que pegar en tu pagina o usas algún plugin de wordpress modificándolo, pero me parece que eso ya existe. Suerte!
Muy ingenioso de tu parte, el codigo funciona perfectamente para hacer mil cosas con esos videos guardados en YOUTUBE, tienes mas codigo que desencripta de otros lugares?
Mi idea es tambien acceder al site repositorio y mostrar videos sin tener que hacer "PLAY" manualmente, los logos y demas si estoy deacuardo en dejarlos
PS, hay un error o algo en alguna parte ya que cuando lo uso me muestra esto.
Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '
Función corregida Lisandro, ya está todo operativo. Lo que no comprendí es eso del repositorio y que se reproduzcan sin pulsar play… si quieres comentármelo… ya sabes como
Un saludo y suerte con tu proyecto..
Otra ayudita, podria por favor agregarle a esa misma funcion la forma de obtener la DURACION del video. La duraci'on en SEGUNDOS.
Gracias
Caballeros, me refiero a esto. entren a este site..
El Secreto - Subtitulada
Hagan click en todo el link, como pueden ver estoy accediendo al youtube y he organizado unos videos como si fuera una programaci'on.
Visite www.ebacr.com y pueden ver mas.
Gracias otra vez.
Buenas Lisandro, lo siendo pero la duración del vídeo no viene en la misma web en la que se toman todos los datos sobre el vídeo. Para extraer la duración del vídeo tendríamos que acceder a una web extra realizando una búsqueda de tipo http://es.youtube.com/results?search_query=ID_SELECCIONADA y a partir del código de esa web buscar el vídeo del que queremos extraer la duración ya que suelen salir varios.
Te animo a que hagas una propia a partir de mi código si quieres. Un saludo y espero que nos la dejes ver por aquí. Por cierto, buena implementación de youtube como TV online si quieres postear el código con el que lo ya sabes donde lo puedes hacer.
Me temo que han cambiado la forma de acceder a la variable $t… alguien sabe cómo acceder a ella ahora? Me corre 1 poco de prisa ya que tengo mi página web "estropeada" desde ayer por esta razón.
Muchas gracias y un saludo.
Tx
[…] interna, y de aquello nació la función youtube(). Como ya comente en el anterior articulo, la fucnion youtube() se puede utilizar para extraer todos los datos de un vídeo en formad en forma de array de manera […]
En efecto, algo cambió en youtube xq ya no veo puedo diseccionar.
Ayuda!!!
Muchas gracias
Lisandro solo tienes que usar la funcion corregida que deje en el post, funcion de extraccion de datos youtube en php version2.
ya observe el script de Flash y funciona!!!, pero quisiera saber como puedo colocar el video en un movieclip directamente desde Youtube para hacer una presentacion preliminar del video. Gracias por su colaboracion.
Hola @Armadillo, no estoy seguro de lo que quieres hacer, sobre una presentación preliminar pero puedes obtener el video FLV para operarlo completamente desde la función PHP que deje en aquí. A demás si lo que quieres hacer es mostrar algún dato sobre el video tienes en esa misma función un link que muestra imágenes sobre el video. Espero haberte ayudado. Un saludo.
Gracias, ya resolvi mi problema…
Estoy trabajando con vuestro script pero noha que funcione ni ademas me pinta nada…
Si pudierais dar otro scripct se lo agradeceria mucho.
Un saludo!
http://www.posicionempresarial.es/
http://www.d-w-m.es/
hola Juan Manuel, una pequeña búsqueda en este blog te dará la segunda versión de la función de youtube para obtener información de archivos de forma fácil..
De todas formas.. cual es el proyecto?
no se porq motivo pero no me da la informacion de $titulo, $descripcion, $fecha y $tags. imprimo las variables y me salen vacias. q puede estar pasando?
he investigado y es porque la funcion file_get_contents no se puede utilizar en mi hosting (es una basurilla). no habra otro metodo para hacer lo mismo que hace esta funcion?
Hola gemeprod, creo que el problema que puedes tener es que esta es la función antigua.. tiene algunos errores en al expresión regular y por eso no funciona.. Esta es la ultima versión de la función.
Si con la nueva sigues teniendo problemas puedes usar la función archivo() en modo lectura para sustituir los file_get_contents().
un saludo y espero que todo te funcione..