saltar intro

carguen, apunten, this._parent

Archive for the ‘ActionScript’ Category

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

with 30 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

Cargar un video de Youtube en un player de Flash con ActionScript v.2 (AS2)

with 54 comments

Day 244/365
Creative Commons License photo credit: thp365

Actualización 30/Oct/2008: Solucionado ¡¡¡ Visita el post “Descargar un archivo de video flv de youtube.com con ActionScript2 (AS2)” con el nuevo script.

Actualización 27/Oct/2008: Youtube ha realizado cambios que impiden la descarga de los videos en formato flv según el script que describo más abajo.

- – -

Me ha costado encontrar información adecuada en inglés y menos en español, pero al final, gracias al blog de Abdul Qabiz hallé el script adecuado.

createEmptyMovieClip("mc",getNextHighestDepth());
var _mcl:MovieClipLoader = new MovieClipLoader();
_mclListener = new Object();
_mclListener.onLoadInit = function(target:MovieClip) {
    var _lv:LoadVars = new LoadVars();
    _lv.decode(target._url.split("?")[1]);
    _root.videoplayer_mc.contentPath = "http://www.youtube.com/get_video.php?"+"video_id="+_lv.video_id+"&t="+_lv.t;
    _mcl.unloadClip(target);
};
_mcl.addListener(_mclListener);
_mcl.loadClip("http://es.youtube.com/v/2OBZHB5I89A",mc);

Lo he retocado un poco, pero el mérito es casi todo de Abdul. Y digo casi todo por que cuando pruebas el script en su versión AS2, este no funciona en Internet Explorer, aunque si en Firefox y Ópera. Y la solución la da un comentario del post, escondido casi al final de los 99 que tiene, (uff¡¡¡). Solo había que sustituir “onLoadStar” por “onLoadInit” en la cuarta linea: _mclListener.onLoadInit = function(target:MovieClip) {

El script de ejemplo está pensado para que funcione junto con el componente MediaPlayer que viene por defecto en el FLash8 y CS3.

Solo hay que arrastrarlo desde la pestaña de componentes al escenario, darle un nombre de movieclip, en mi caso “videoplayer_mc“, y añadir el script en el mismo frame pero en otra capa. Todo en la linea principal de tiempo.

Antes se podía acceder a los videos de Youtube añadiendo como parámetro de url, la página propia del video. Por ejemplo: “http://es.youtube.com/v/2OBZHB5I89A”.

Pero desde hace un tiempo esto no es suficiente y hay que añadir un parámetro más, que se obtiene en la respuesta del servidor de Youtube.

Para ver de que hablo:

La URL http://es.youtube.com/watch?v=2OBZHB5I89A también se puede escribir de esta manera: http://es.youtube.com/v/2OBZHB5I89A.

Simplemente se ha sustituido la cadena “watch?v=” por “/v/“.

Cuando se solicita la nueva dirección, el navegador devuelve en la barra de direcciones esta otra ruta: http://es.youtube.com/swf/l.swf?video_id=2OBZHB5I89A&rel=1&eurl=&iurl=http%3A//s3.ytimg.com/vi/2OBZHB5I89A/default.jpg&t=OEgsToPDskLL1pfly-W5a5NQnX3gbuKO

Donde lo que nos interesa se encuentra al final, bajo el valor de la variable “t“.

El script simplemente lo captura y monta el url necesario.

Os podeis bajar un ejemplo .fla: videoyoutube.zip.

Written by sergiomas

Mayo 12th, 2008 at 10:47 am

Asignar un valor a una variable construida con eval().

without comments

En Actionscript v.1 a veces nos gustaría asignar un valor a una variable de la siguiente manera:

eval(“_root.mivar”+(i-1)) = 100; // da error

Pero esto no funciona, salvo que lo hagamos de otra manera. A saber:

set(“_root.mivar”+(i-1), 100); // ok

o también,

_root["mivar"+(i-1)] = 100; // ok

Para casos del tipo:

eval(“_root.movie”+(i-1)+”._alpha”) = 100; // da error

que tampoco funciona, si se puede utilizar eval() con una pequeña variante:

eval(“_root.movie”+(i-1))._alpha = 100; // ok

Written by sergiomas

Mayo 21st, 2006 at 11:33 am

Aplicar onEnterFrame y setInterval a un mismo MovieClip

without comments

A veces ocurre que quieres aplicar un efecto a un movieclip mediante un onEnterFrame y te das cuenta de que ya está a merced de otro onEnterFrame que se declaró con anterioridad.

La solución esta en el setInterval.

Puedes aplicar varias funciones o efectos, como si fueran varios onEnterframe, a un mismo movieclip sin que se interfieran entre ellos.

Ejemplo:
Crea un clip en el escenario con el nombre de instancia ‘bola_mc’ y añade en otra capa el siguiente actionscript.

[ftf]
bola_mc.onEnterFrame = function () {
_x++;
}
function desaparecer(pelicula){
pelicula._alpha-=10
}
function alargar(pelicula){
pelicula._yscale+=2;
}
idIntervalo= setInterval(desaparecer,1000,bola_mc)
idIntervalo1= setInterval(alargar,100,bola_mc)
[/ftf]

Written by sergiomas

Febrero 22nd, 2006 at 11:44 am

Posted in ActionScript,Flash

Truco al editar ActionScript

without comments

Leyendo un post sobre tips para Flash8, encontré uno que también funciona al editar código en el Flash MX 2004 pro.

Si pones el cursor entre dos paréntesis y pulsas CONTROL y ACENTO al mismo tiempo, quedará seleccionado todo el contenido dentro de esos paréntesis.

No es la locura, pero acelera un poco más el trabajo.

Vía: swfoo.com

Written by sergiomas

Septiembre 15th, 2005 at 4:59 pm

¿Desde donde llamé a esa función global?

with 2 comments

A veces nos interesa declarar una función global para poder acceder a ella desde cualquier línea de tiempo.

Por ejemplo, diseñé una función para cargar archivos XML.
Quería que la línea de tiempo desde donde se llamaba a la función parase hasta que terminara la carga y luego continuase.

Pero me encontré con el problema de que el ‘stop();’ no funcionaba. Ni siquiera en _level0. La función global no sabía desde donde era llamada.

Voy a poner un ejemplo más sencillo para explicarlo mejor.

Primero declaro una función global:

_global.clipalfa = function(alpha) {
trace(this);
var timeline_mc = eval(this);
timeline_mc._alpha = alpha;
};

Con esta función pretendo modificar la transparencia del movieclip que contiene una llamada a dicha función.

Por ejemplo, tengo un clip al que llamo ‘menu_mc’, y en su línea de tiempo hago la siguiente llamada:

clipalfa(50);

Sin embargo no sucede nada, y la ventana de salida muestra un [type Object], fruto del ‘trace(this);’.
Esto es debido a que cuando declaras una función como global la estás convirtiendo en un objeto, que es independiente de cualquier línea de tiempo.

Solución: el método CALL.

Con este método puedes saber desde donde se ha llamado a la función global.

La llamada quedaría así:

clipalfa.call(this, 50);

donde ‘this’ almacena la línea de tiempo desde donde se está llamando a la función global.

Written by sergiomas

Septiembre 14th, 2005 at 5:42 pm

Posted in ActionScript,Flash