saltar intro

carguen, apunten, this._parent

Descargar un archivo de video flv de youtube.com con ActionScript2 (AS2)

with 32 comments

YouTube button
Creative Commons License photo credit: PIAZZA del POPOLO

Actualización 18/11/2008:

Me pasa, y no soy el único, que solo funciona el script en local, y no cuando el swf está colgado online. No se cual es la razón, aunque tampoco he buscado muy a fondo. Podría ser alguna directiva de seguridad del flashplayer quizás.

A falta de recurrir al API de Youtube también hay otras maneras de obtener los enlaces directos a sus videos, en formato flv, alojados en cualquiera de sus diferentes servidores.

Lo mejor sería usar su propia API por que así se evita que cualquier cambio en su sistema invalide nuestros anteriores scripts, como ya me ha pasado.

El caso es que sigo tropezando con la misma piedra, así que aquí está el nuevo código para poder descargar un flv y visionarlo en tu propio mediaplayer.

var my_lv:LoadVars = new LoadVars();
my_lv.onData = function(vars_str:String) {
if (vars_str == undefined) {
trace("Error al cargar datos");
return;
}
var i:Number = 0;
while (vars_str.split("&")[i] != undefined) {
var token_str = vars_str.split("&")[i];
if(token_str.split("=")[0] == "token") {
var t = token_str.split("=")[1];
_root.videoplayer_mc.contentPath = "http://www.youtube.com/get_video.php?video_id="+idvideo+"&t="+t+"&fmt=5";
break;
}
i ++;
}
};
idvideo = "2OBZHB5I89A";
my_lv.load("http://www.youtube.com/get_video_info?video_id="+idvideo, my_lv, "GET");

Y un ejemplo en formato .fla que se puede descargar desde aquí.

Pulsa aquí para abrir otra ventana con el swf. Si no funciona es que Youtube ha cambiado de nuevo su sistema.

Explicación:

Los enlaces a los videos en las propias páginas de youtube son del tipo:

http://www.youtube.com/watch?v=2OBZHB5I89A

Donde el valor de la variable “v”, en este caso “2OBZHB5I89A”, indica el id único del archivo de video.

Para acceder al archivo de video, y no al player que lo carga, son necesarias otras variables que completarían el enlace directo.

Este enlace tiene el siguiente formato:

http://www.youtube.com/get_video.php?video_id=valorid&t=valortoken&fmt=5

valorid se tiene que sustituir con el valor de la variable “v” mencionada antes, y valortoken con otro valor que se obtiene mediante el script.

El código solicita a una URL específica la información relativa a un video determinado
http://www.youtube.com/get_video_info?video_id=valorid"
y esta URL le devuelve una cadena de variables, entre las cuales se encuentra una llamada “token”, cuyo valor es el que necesitamos.

Finalmente la línea
_root.videoplayer_mc.contentPath = 'http://www.youtube.com/get_video.php?video_id='+idvideo+'&t='+t+'&fmt=5';
monta el enlace al video, y lo asigna a la variable del player de video, definida para guardar la ruta hacia el flv.

Algunas dudas se solucionaron en los comentarios del post anterior sobre este tema.

Written by sergiomas

octubre 30th, 2008 at 2:50 pm

Posted in ActionScript,Flash

32 Responses to 'Descargar un archivo de video flv de youtube.com con ActionScript2 (AS2)'

Subscribe to comments with RSS or TrackBack to 'Descargar un archivo de video flv de youtube.com con ActionScript2 (AS2)'.

  1. [...] 30/Oct/2008: Solucionado ¡¡¡ Visita el post “Descargar un archivo de video flv de youtube.com con ActionScript2 (AS2)” con el nuevo script, que funcionará mientras Youtube no modifique de nuevo su [...]

  2. Muchas gracias por el post, es realmente interesante y sobre todo útil en mi caso que estoy montando algo medianamente parecido en Adobe AIR. La explicación del id y del token son muy claras y el ejemplo muy bueno. Nuevamente gracias.
    Saludos!!!

    Luis Adrián

    1 nov 08 at 11:28 am

  3. Gracias a tí, Luis, por tu visita, y por los tutos que hay en tu web.
    Los especiales de JSFL me encantan. Arriba Subflash y el Rock&Roll¡¡¡

    sergiomas

    1 nov 08 at 11:50 am

  4. Primero de nada gracias por el código. Sólo comentar una cosa curiosa: Me funciona perfectamente en local, pero no online, lo que me hace suponer que Youtube puede estar capando ips. El anterior script lo utilicé bastante antes de dejar de funcionar y no me parece descabellado pensar eso, sobretodo por lo que comentabais de su modelo de negocio. Vamos, que yo lo haría si tuviera que proteger mis intereses, ¿no?.

    Jorge

    14 nov 08 at 2:10 pm

  5. Efectivamente. Ahora solo me funciona en local, y no desde internet.
    Si a alguien no le pasa que lo reporte, please.

    sergiomas

    18 nov 08 at 10:15 am

  6. No tiene mucho sentido que funcione en local y no online, al fin y al cabo en local tambien tiene que acceder a youtube para cogerlo.
    Nadie sabe una manera de apañarlo?

    Gracias de todas formas por todo lo que poneis es magnifico y ayuda a los torpes como yo.

    javier

    2 dic 08 at 2:15 pm

  7. Pues despues de mirar todo,es problema de seguridad si.Aun cuando uno
    pudiese configurar cosas de su flash player y demas,la gente que asccediese
    a tu web a saber si podria.Lo mejor es como dije hace poco,usar esta direccion:
    http://emehmedovic.com/xmca/toobplayer/fl_youTubeProxy.php?id=VIDEOID
    .Esta dire os genera un xml con el parametro “t”,y elthumbnail.Si quereis el codigo para extaer la ruta del flv me lo decis.
    Tengo otro script que pudes ponerlo en tu servidor,pero solo funciona en
    determinados servidores grauitos.Como ejemplo de donde no funcionara es
    en awardspace.com.En 0fees.net si funiona.Pero mejor usar el primero que os
    di.Nunca falla.Ademas que mas da conectar a youtube que a ese.Lo que cuenta
    es el resultado.Con la api de youtube tampoco probeis.Yo tengo mi key y na de na.

    pipi

    10 ene 09 at 11:37 pm

  8. NO ME RESULTO PORQUE
    PORFABOR AYUDA

    JUAN

    22 feb 09 at 1:09 am

  9. Pues mira Juan.Doy por hecho que tienes ya el codigo Netstream,con el objecto video en la pelicula.Ok?.Pues en el frame donde tengas eso debes pegar el siguiente codigo,que sera el encargado de extraer del xml que te da la dire esa de emehmedovic, los valores “t” y “video_id”.Este es el codigo:
    my_xml = new XML();
    my_xml.onLoad = my_function;
    my_xml.ignoreWhite = 1;
    function my_function() {
    t = my_xml.firstChild.childNodes[0].attributes.t;
    video_id = my_xml.firstChild.childNodes[0].attributes.video_id;
    stream_ns.play(“http://www.youtube.com/get_video.php?video_id=” + dire+ “&t=” + t);
    }
    Yo a l netsream lo llamo stream_ns,pero puedes cambiarlo por sihas puesto otro en el tuyo.El siguiente paso es crear un boton y ponerle dentro este codigo:
    on (press)
    {
    video=”_1Qo1eaWF8c”;
    my_xml.load(“http://emehmedovic.com/xmca/toobplayer/fl_youTubeProxy.php?id=”+video);
    }
    Eso te carga el video.Sencillo no?.Ya mediras como te fue.Si quieres puedes poner depues de donde dice net_stream.play un trace,por ejemplo trace(t); y te lo mostrara.Un saludo

    pipi

    22 feb 09 at 4:11 pm

  10. Hola Sergio, estuvo muy buena la explicación que diste, pero al bajar el archivo me di cuenta que solo se abre una pagina en blanco, imagino que los de youtube han cambiado sus codigos, si no fuera molestia te pediria que subas un tutorial en donde podamos subir videos al fla, te estare muy agradecido.

    Chester

    8 abr 09 at 1:35 am

  11. ¿Subir videos al fla?
    ¿Qué quieres decir?

    sergiomas

    8 abr 09 at 8:37 am

  12. Si justamente estoy haciendo una pagina completamente en flash, soy novel en la materia, y lo que me urge es integrar videos de youtube, segui tus instruciones pero al darle F12 solo aparece en blanco, por eso pense que los de youtube habrian cambiado sus codigo para que tu tutorial no se ejecute como debe ser. Nuevamente te estare agredecido si puedo integrar videos a esta pagina en Flash.

    William

    13 abr 09 at 2:32 am

  13. huyy carajo, esto esta candente. yo lo unico q quiero es que se puedan reproducir en algun movieclip o frame determinado, me dijeron que con la inclusion de html y este conteniendo el video, ojala lo puedan resolver..

    rowilson

    15 abr 09 at 1:04 am

  14. huyy carajo, este tema esta candente. yo lo unico q quiero es que se puedan reproducir en algun movieclip o frame determinado, me dijeron que con la inclusion de html y este conteniendo el video, ojala lo puedan resolver..

    rowilson

    15 abr 09 at 1:04 am

  15. pipi, he hecho la prueba que dices, pero el xml que recojo no tiene la variable t por ningún lado, de hecho, lo que me vuelca es esto:

    ¿Sabes qué estoy haciendo mal?

    Mi código:
    var my_xml:XML = new XML();
    my_xml.onLoad = my_function;
    my_xml.ignoreWhite = true;
    function my_function() {
    t = my_xml.firstChild.childNodes[0].attributes.t;
    video_id = my_xml.firstChild.childNodes[0].attributes.video_id;
    texto_txt.text=my_xml;
    }

    video=”N3UxjKCbpAk”;
    my_xml.load(“http://emehmedovic.com/xmca/toobplayer/fl_youTubeProxy.php?id=”+video);

    quizás sea que ya no funciona?

    Muchas gracias de antemano.

    Txabi

    26 abr 09 at 11:26 am

  16. ups… no ha salido el xml, supongo que será porque lo interpreta, lo pongo sin menores que ni mayores que:

    video video_id=”http://v16.lscache6.googlevideo.com/videoplayback?id=3775318ca09ba409&itag=18&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag&ip=208.113.148.19&signature=8D6D2A52E4FCC72C47B8C6E79954665A28A58BB1.248C51C9669B80284AFBF4B75477DE6866BA5C78&sver=3&expire=1240759674&key=yt1&ipbits=0

    Txabi

    26 abr 09 at 11:28 am

  17. Pues si Txabi.Youtube a vuelto a poner trabas.Conseguir el valor “t” es facil,pero ahora para acceder a el han puesto algun otro tipo de crossdomain, en el lugar donde esta alojado el flv.Lo mejor actualmente es usar el chromeless que youtube facilita.Tienes dos opciones.Una con flash,y otra con javascript.Diferencia usando el chromeless?.Pues que solo cargas el fondo con el logo,pero no los controles,que puedes entonces hacerlos tu.Logicamente usando flash es mas facil.Con javascript,crear un control dee volumen por ejemplo es un rollo.Yo tengo uno con flash y va perfecto.Tengo dos playlst,una con javascript y otra puro flash.Si es con javascript,se debe usar el setvariable.Si es con flash,pues imagino que sabras como hacer una.Si intentas
    crear uno con el crhomeless para flash,una vez veas que te carga un video bien,intenta ya ponerle volumen,progress,play stop,etc.Si no sabes como ,me los dices y te paso el actionscript que uso yo.Vale?.Un saludo

    pipi

    12 may 09 at 9:45 pm

  18. lo fastidioso del chromeless es que a veces no te carga los videos a su tamanho natural sinó que salen un poco más pequenhos que el tamanho total del chromeless, y otra cosa es que aparecen los links y si tocas en la pantalla te lanza el video en la página de youtube.

    Joaquín

    19 jun 09 at 10:56 pm

  19. Hola,Joaquin,pues a mi no me ocurre eso.Lo unico que sale es el logo de youtube.Pero ni salen links, ni si pulsas en pantalla te lleva a Youtube.En cuanto al tamaño eso es inevitable.De todas formas,haciendolo como antiguamente tambien era un problema puesto que si el contendor de netstream era por ejmplo de 320×230 y el video es de 320×100,te ocupaba todo el contenedor pero perdiendo proporciones,con lo cual no se veia bien tampoco,a no ser que dieras el height y en base a eso redimensionar,pero tambien era un rollo..Creo que algo haces mal.Si quieres pasame el codigo que usas y te digo si veo algo incorrecto.

    pipi

    20 jun 09 at 7:21 pm

  20. Que tal. Mi consulta es la siguiente… En mi sitio tengo cargados 3 videos de youtube que se ven en un contenedor dentro de la misma web, el inconveniente es que ahora cuando quiero cargar un nuevo video, me encuentro que cuando cambio la url de youtube y le quito el watch? para dejarle solo el /v/ para que me de la url completa del video, solo me arroja un mensaje como para que descargue un archivo y aparte de que da error si lo quiero descargar, no me da la url que necesito para poder postear el nuevo video.
    Sabes de alguna manera de poder subir mas videos ahora que youtube cambio?
    Si queres entra a la web y fijate como estan posteados los videos como para entenderme mejor.
    Ante todo muchas gracias y disculpa las molestias si no corresponde esta pregunta aca pero como vi que en el post anterior pusiste ese dato para ver la url no encontre a nadie que tenga idea como para preguntarle.
    Saludos.
    Andres.-

    Andres

    1 jul 09 at 8:35 am

  21. Lo mejor sería que postearas el AS o un enlace a un fla para poder chequear el problema.

    sergiomas

    1 jul 09 at 6:45 pm

  22. Hola Andres.Fui a tu web a menu-videos.Hay tres botones con un loadmovie en cada uno.Carga los tres bien.No acabo de comprender tu pregunta.De todas formas veo alguna cosa mal.En principio me parece demasiado 101 kb de menu.swf.Con 6 o 7 kb maximo tienes la misma web con un solo fichero.Otra cosa es que para cargar un video de youtube en un contenedor con el player mismo de youtube con poner loadMovie(“http://youtube.com/v/IDDELVIDEO?title=eltituloquequieras”,contenedor_mc);
    ya es suficiente.De todas formas explicate algo mas.

    pipi

    1 jul 09 at 6:46 pm

  23. Me explico mejor. No tengo mucho conocimiento de Flash por lo que pesa tanto mi menu, pero bueno, ese no es el tema.
    Te comento… en la pagina de Cristalab hay un articulo de como ver los videos de youtube en un contenedor de flash con el script loadmovie_contenedor.
    Lo que se explica es que si uno coloca la url normal que da youtube, dicen que te abre en cualquier tamaño, pero cambiando el watch? por /v/ en la url, cuando se coloca en el navegador, te aparece otra url. Te dejo el ejemplo:

    URL comun: http://www.youtube.com/watch?v=KQGT4tn-n-U
    URL con /v/: http://www.youtube.com/swf/l.swf?iurl=http%3A%2F%2Fi4.ytimg.com%2Fvi%2FKQGT4tn-n-U%2Fhqdefault.jpg&fexp=900064&title=El+Rito+Tributo+a+Soda+Stereo+La+Plata+En+la+ci…&avg_rating=0.0&video_id=KQGT4tn-n-U&length_seconds=361&allow_embed=1&swf=http%3A%2F%2Fs.ytimg.com%2Fyt%2Fswf%2Fcps-vfl102521.swf&sk=3UrhSu1Fc3CCCxaqAuUgqYhfPddfpdBGC&allow_ratings=1&rel=1&cr=US&eurl=

    De esta manera, es que lo tengo en la web y se abren en la ventana del contenedor como los viste.
    Lo que pasa es que ahora cuando le cambio a la url el watch? por el /v/, no me sale mas la url larga sino que tira un cartel como para descargar algo y da error.
    Ya que estamos… te jodo con una pregunta mas. Como puedo hacer para que cuando abra un segundo video desde la pagina se corte el sonido del anterior? Porque si pones uno video y queres pasar al otro, abre bien pero sigue sonando el primero. Intente con unLoadmovie_contenedor pero no funciona.
    Mil gracias por las respuestas rapidas!
    Saludos-
    Andres.-

    Andres

    1 jul 09 at 8:32 pm

  24. Ah.. tambien probe lo que pusiste anteriormente (loadMovie(”http://youtube.com/v/IDDELVIDEO?title=eltituloquequieras”,contenedor_mc);) pero abajo en la barra de estado dice “Esperando a youtube” y no abre nada.
    El problema esta en que no consigo que youtube me de la url larga como antes, porque de esa manera no tuve problemas en subir los otros videos!
    Saludos.-

    Andres

    1 jul 09 at 8:44 pm

  25. Yo de nuevo. Perdon por lo molesto. Ya solucione el problema de subir los videos. Copie el mismo url largo y le cambie el identificador en el codigo y abrio bien.
    Lo que sigue haciendo es que cuando estas reproduciendo un video, si abris el otro, no funciona el nuevo y sigue sonando el anterior. Y si podes decime mas o menos como puedo bajar el peso del menu porque con las imagenes que tiene es que se me hace pesado.
    Mil gracias y disculpen las molestias!
    Andres.-

    Andres

    1 jul 09 at 8:59 pm

  26. Andres.He modificado el fichero videos.swf.He incorporado el chromeless y ya va perfecto.Si me das un correo tuyo te lo envio.Luego tan solo sustituye el videos.swf que tienes por el nuevo que he hecho.Solo te pido que dejes constancia de que es mio vale?.De momento te enviare el swf solamente.Si ves que funciona bien,me lo dices y ya te mando el fla,para que veas como funciona ok?.Espero tu respuesta.

    pipi

    2 jul 09 at 8:21 pm

  27. pipi podrias pasarme el codigo mi correo es miguelo_27_8@hotmail.com

    miguel

    29 sep 09 at 12:28 am

  28. Hola Sergio , bueno primero gracias por tu post, aun que mi nivel de programacion es bastante basico o nulo, el problema que tengo es que tengo mi videobook en vimeo y ahora me estoy haciendo una pagina web, y quiero incrustar ese video pero no se ni como ni donde, estoy usando un template de flasha, he conseguido sustituir todos los datos y las fotos por las mias pero ahora no se como incrustar el video, donde se hace ni na de na… se q es una jodienda de pregunta pero bueno si tienes tiempo, te lo agradeceria, mi l gracias

    David

    11 ene 10 at 11:15 pm

  29. Supongo que lo que quieres decir es que estás usando un template en flash y quieres que se visualice tu video que está alojado en Vimeo.
    Necesitarás añadir un movieclip de reproductor de video y darle el enlace al video de Vimeo, que supongo estará en el código que proporciona el propio Vimeo cuando pulsas sobre el botón Embed que se encuentra en los videos cuando pasas el ratón por encima.
    No se que problemas te puedas encontrar pero no dispongo de tiempo para hacer pruebas y averiguarlo.
    En San Google podrás solucionar algunas dudas.
    http://www.google.es/search?hl=es&q=cargar+videos+de+Vimeo+en+flash&sourceid=navclient-ff&rlz=1B3GGGL_esES268ES268&ie=UTF-8

    sergiomas

    12 ene 10 at 10:16 am

  30. hola buenas pipi me pasarias tu correo para hacerte unas consultas de cosas que no entiendo mucho si quieres mandame tu uno groteck@gmail.com

    groteck

    22 feb 10 at 4:28 pm

  31. Para hacer esto podrían utilizar el API de Youtube, es muy facil de integrar y esta disponible en AS2 y AS3.

    Ejemplo, copien y peguen ese codigo en el primer fotograma de su pelicula Flash.

    Para poder cargar sus videos solo hay que reemplazar la liga del video en la siguiente línea de código: ytPlayerLoader.loadClip(“dirección_de_tu_video”, ytplayer);

    // create a MovieClip to load the player into
    var ytplayer:MovieClip = _root.createEmptyMovieClip(“ytplayer”, 1);

    // create a listener object for the MovieClipLoader to use
    var ytPlayerLoaderListener:Object = {
    onLoadInit: function() {
    // When the player clip first loads, we start an interval to
    // check for when the player is ready
    loadInterval = setInterval(checkPlayerLoaded, 250);
    }
    };

    var loadInterval:Number;

    function checkPlayerLoaded():Void {
    // once the player is ready, we can subscribe to events, or in the case of
    // the chromeless player, we could load videos
    if (ytplayer.isPlayerLoaded()) {
    ytplayer.addEventListener(“onStateChange”, onPlayerStateChange);
    ytplayer.addEventListener(“onError”, onPlayerError);
    clearInterval(loadInterval);
    }
    }

    function onPlayerStateChange(newState:Number) {
    trace(“New player state: “+ newState);
    }

    function onPlayerError(errorCode:Number) {
    trace(“An error occurred: “+ errorCode);
    }

    // create a MovieClipLoader to handle the loading of the player
    var ytPlayerLoader:MovieClipLoader = new MovieClipLoader();
    ytPlayerLoader.addListener(ytPlayerLoaderListener);

    // load the player
    ytPlayerLoader.loadClip(“http://www.youtube.com/v/pv5zWaTEVkI”, ytplayer);

    Saludos espero le sirva a alguien.

    flashreloco

    20 oct 10 at 7:01 am

  32. Super útil tu comentario.
    Gracias por el código.
    Un abrazo.

    sergiomas

    20 oct 10 at 9:14 am

Leave a Reply