CoreLib: biblioteca de clases para actionscript 3

El proyecto CoreLib consiste en una biblioteca en Actionscript 3 que contiene un buen número de clases y utilidades para trabajar con Actionscript. Incluye, entre otras cosas, clases para codificación MD5 y SHA1, serialización JSON y tratamiento avanzado de cadenas de texto y fechas. El proyecto ha sido creado por gente como Mike Chambers, Daniel Durà o Darron Schall, verdaderos maestros en la programación en actionscript.

CoreLib » »

Acceder a las etiquetas ID3 con Flash

Los archivos de sonido MP3 pueden contener etiquetas ID3 que proporcionan metadatos sobre el archivo. Si un sonido MP3 que se carga utilizando Sound.attachSound() o Sound.loadSound() contiene etiquetas ID3, se puede consultar estas propiedades.

En el siguiente ejemplo, usamos el handler onID3() asociado a la clase Sound para determinar cuando la información de la cabecera ID3 ha sido cargada y mostrarla dentro de una caja de texto que creamos a tal efecto.

var Cancion:Sound = new Sound();
Cancion.onID3 = function():Void {
	for (var i:String in this.id3){
	DatosMp3.htmlText += "" + i + ":" + this.id3[i] + "\n";
	}
};
this.createTextField("DatosMp3", 1, 10, 10, 500, 300);
DatosMp3.border = true;
DatosMp3.html = true;
DatosMp3.multiline = true;
DatosMp3.wordWrap = true;
Cancion.loadSound("song.mp3", true);

En un principio se podía accdeer a las propiedades ID3 1.0, con los siguientes métodos:
 
Sound.id3.comment
Sound.id3.album
Sound.id3.genre
Sound.id3.songname
Sound.id3.artist
Sound.id3.track
Sound.id3.year

Lo cierto es que con estas propiedades nos puede servir en el 99% de los casos pero a partir de las versión 7 del Player, éste admitía etiquetas ID3 2.0. La equivalencia con las etiquetas anteriores sería:

Sound.id3.COMM
Sound.id3.TALB (album)
Sound.id3.TCON (genre)
Sound.id3.TIT2 (songname)
Sound.id3.TPE1 (artist)
Sound.id3.TRCK (track number)
Sound.id3.TYER (year

Pero además, con las etiquetas IDe 2.0 se puede acceder a la siguiente información:

Sound.id3.TFLT: Tipo de archivo
Sound.id3.TIME: Tiempo
Sound.id3.TIT1: Descripción de grupo de contenido
Sound.id3.TIT2: Título/nombre de canción/descripción del contenido
Sound.id3.TIT3: Subtítulo/descripción adicional
Sound.id3.TKEY: Clave inicial
Sound.id3.TLAN: Idiomas
Sound.id3.TLEN: Longitud
Sound.id3.TMED:Tipo de medio
Sound.id3.TOAL: Álbum/película/título de espectáculo original
Sound.id3.TOFN: Nombre de archivo original
Sound.id3.TOLY: Letrista/escritor original
Sound.id3.TOPE: Artistas/intérpretes originales
Sound.id3.TORY: Año de publicación original
Sound.id3.TOWN: Propietario/licenciatario del archivo
Sound.id3.TPE1: Intérpretes/solistas principales
Sound.id3.TPE2: Grupo/orquesta/acompañamiento
Sound.id3.TPE3: Director/intérprete adicional
Sound.id3.TPE4: Interpretado, remezclado o editado por
Sound.id3.TPOS: Parte de un conjunto
Sound.id3.TPUB: Editor
Sound.id3.TRCK: Número de pista/posición en el conjunto
Sound.id3.TRDA: Fechas de grabación
Sound.id3.TRSN: Nombre de emisora de Internet
Sound.id3.TRSO: Propietario de emisora de Internet
Sound.id3.TSIZ: Tamaño
Sound.id3.TSRC: ISRC (código de grabación estándar internacional)
Sound.id3.TSSE: Software/hardware y configuración empleados para la codificación
Sound.id3.TYER: Año
Sound.id3.WXXX: Fotograma de vínculo de URL

 El siguiente ejemplo muestra estos datos dentro de un Datagrid:

1.– Desde el panel de componentes arrastramos una instancia de Datagrid y le asignamos como nombre de instancia “id3_dg”
2.– En un fotograma pegamos el siguiente código:

import mx.controls.gridclasses.DataGridColumn;
id3_dg.move(0, 0);
id3_dg.setSize(200, 200);
var DataGrid_Propiedad:DataGridColumn = id3_dg.addColumn(new DataGridColumn("property"));
DataGrid_Propiedad.width = 100;
DataGrid_Propiedad.headerText = "Propiedad";
var DataGrid_Valor:DataGridColumn = id3_dg.addColumn(new DataGridColumn("value"));
DataGrid_Valor.width = id3_dg._width-DataGrid_Propiedad.width;
DataGrid_Valor.headerText = "Valor ID3";
var cancion:Sound = new Sound();
cancion.onID3 = function() {
for (var prop in this.id3) {
     id3_dg.addItem({property:prop, value:this.id3[prop]});
}
};
cancion.loadSound("song.mp3", true); 

As3: El evento mouseLeave y el método addEventListener

Con el nuevo evento Stage.mouseLeave, perteneciente a la clase Stage, podemos averiguar cuando el puntero del ratón se mueve fuera de la película de Flash. Lo que nos puede resultar muy útil a la hora de programar nuestras aplicaciones.

En este ejemplo controlamos las veces que el cursor se desplaza fuera de la película de flash:

var textTest:TextField;
var Contador:int=0;
stage.addEventListener(Event.MOUSE_LEAVE, onStageLeave);
textTest = new TextField();
addChild(textTest);
textTest.text = "FUERA:";
function onStageLeave(event:Event):void{
      textTest.text = "FUERA:\n"+ ++Contador + " veces.";
}

Por otro lado, un método también muy interesante a la hora de mantener la interacción con el usuario es addEventListener, con el que podemos recibir notificaciones a la ejecución de eventos. Por ejemplo, recibir la tecla que ha sido pulsada:

var textTest:TextField;
stage.addEventListener(KeyboardEvent.KEY_DOWN, TeclaPulsada);
textTest = new TextField();
addChild(textTest);
textTest.text = "HAS PULSADO:";
function TeclaPulsada(tecla:KeyboardEvent):void{
	textTest.text = "HAS PULSADO:\n"+tecla.keyCode;
}

Clase Uri

Autor:PollyJex
E-mail:pollyjex@emc2zen.com.ar
URL:www.emc2zen.com.ar

Ver ejemplo en funcionamiento
Archivos fuente del ejemplo » »
Archivos Fuente de la clase » »
Documentación de la clase » »

Estructura de la clase:

Esta clase permite administrar el armado de una URI, para ser enviada por el método GET, o bien en la escritura de la misma para se almacenada.

Además posee ciertas utilidades para la verificación de factores que determinen el tipo de URI que es.

NOTAS:

  • La clase es muy sencilla, pero como siempre dejo algunos detalles que se pueden mejorar y así hacer un poco más entretenida la tarea de implementar o mejorar la clase
  • Aquellos que este usando la Clase FileLoad, SoundDataLayer, les recomiendo bajar las fuentes de este tutorial y actualizar las clase ? ya que la Utils sufrió algunas mejoras.

Estructura de la clase:

AsLib
Uri extends Utils

Detalles de las clases:

Uri: Utilidad para el manejo de las URI.

Métodos:
new Uri(), addParameters(), getDns(), getFileName(), getParameters(), getParametersUri(), getUri(), isFile(), isHttp(), isHttps(), removeAllParameters(), removeParameters()

Uso de la clase:

La forma de utilizar la clase es muy sencilla:

// Métodos básicos:

trace( Uri.isHttp() );
trace( Uri.isHttp( "https://www.misitio.com" ) );

trace( Uri.isHttps() );
trace( Uri.isHttps( "https://www.misitio.com" ) );

trace( Uri.isFile() );
trace( Uri.isFile( "https://www.misitio.com" ) );

trace( Uri.getFileName() );
trace( Uri.getFileName( "http://www.misitio.com/log.txt" ) );

trace( Uri.getDns() );
trace( Uri.getDns( "http://www.misitio.com/log.txt" ) );

trace( Uri.getUri() );

Uso del administrador de parámetros:

// Creamos una instacia de la clase
var $uri:Uri = new Uri();

// agregamos parámetros
$uri.addParameters( {
user:"toshi",
pass:1234,
id:7,
lánzame:"toshiba",
idAction:777
} )

// traceamos la URI formateada
trace( $uri.getParametersUri() );

// visualizamos todos lo parámetros
var param:Object = $uri.getParameters();

for( var a:String in param ){
     trace( "Key: " + a );
     trace( "\t\tValue: " + param[a] );
}

// removemos parametros
$uri.removeParameters( [
"idAction",
"lastname"
] );

// traceamos la URI formateada
trace( $uri.getParametersUri() );

// eliminamos todos lo parámetros
$uri.removeAllParameters();

// traceamos la URI formateada
trace( $uri.getParametersUri() );

SIN MAS

Espero que les sea de utilidad, y que puedan experimentar en su estructura para modificarla a sus necesidades.

Críticas/mejoras/dudas/problemas, escribir a: pollyjex@emc2zen.com.ar.

Aquellos que quiera colaborar, aportando ideas o bien estructuras de código, escribir a: mfw@emc2zen.com.ar

Saludos.

PollyJex ^_^!

Clase SoundDataLayer

Autor:PollyJex
E-mail: pollyjex@emc2zen.com.ar
URL:www.emc2zen.com.ar

Ver ejemplo en funcionamiento » »
Archivos fuente del ejemplo » »
Archivos Fuente de la clase » »
Documentación de la clase » »

Estructura de la clase:

Esta clase permite separar la Capa de Datos y de Programación (API) de un reproductor de MP3, con respecto a la Interfaz Grafica (GUI).

Lo bueno de esto es que permite una versatilidad en el diseño de la GUI, sin tener que preocuparse por la API.

La clase es muy sencilla, pero como siempre dejo algunos detalles que se pueden mejorar y así hacer un poco más entretenida la tarea de implementar o mejorar la clase.

De apoco iré armando un miniFrameWork (mFW), para que aquellas ávidas mentes que quieran incursionar en la programación de flash, no tengan que romperse la cabeza con mounstrosos FrameWork que jamás se llegan a comprender o a utilizar del todo.

Sigo sosteniendo que este mFW esta orientado a personas que no poseen grandes capacidades de programación o bien están inicializando sus pasos en ella, dentro de lo que es ActionScript 2. Una vez finalizado en AS2 migraremos a AS3, reescribiendo el mFW en dicha versión del lenguaje.

Por ultimo, el lema que pretendo implementar en la elaboración de mFW es: A grandes problemas, soluciones simples.

NOTA: Aquellos que este usando la Clase FileLoad, les recomiendo bajar las fuentes de este tutorial y actualizar la clase ya que la modifiqué para adaptarla al mFW, jejeje!

Otra cosa, por el momento seguiré armando los ejemplos (example) de las clases en AS1, pero tengo la intención de que el armado de las estructuras lógicas de las GUI, sean también hecho en clases.

Estructura de la clase:

AsLib
SoundPlayer
SoundDataLayer

Detalles de las clases:

SoundDataLayer: Administra las funcionalidades en la reproducción de archivos de audio, en este caso MP3.

Propiedades:
coefficientVolume, initialVolume, repeat, streaming

Métodos:
new SoundDataLayer(), GetDataTrack(), GetStatus(), load(), MaxVolume(), MinVolume(), MuteVolume(), NextTrack(), PauseTrack(), PlayTrack(), PrevTrack(), StopTrack(), Volume()

Eventos:
OnChanged(), OnLoad(), OnProgress()
Uso de la clase:

La forma de utilizar la clase es muy sencilla:

// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();

// Definimos que hacer con el cambio de track
player.OnChanged = function():Void {
	var _data:Object = this.GetDataTrack();
for( var a:String in _data ){
	trace( a + ": " + _data[a] );
}
}

// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );

Utilizando algunos métodos y propiedades:

// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();

// Definimos que hacer con el cambio de track
player.OnChanged = function():Void {
	var _data:Object = this.GetDataTrack();
for( var a:String in _data ){
	trace( a + ": " + _data[a] );
}
}

// coeficiente de volumen
player.coefficientVolume = 2;

// inicio del volumen
player.initialVolume = 70;

// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );

///////////////////////////////////////////////////////////////

// Siguiente Track
player.NextTrack();

// Track Anterior
player.NextTrack();

// Play Track
player.PLayTrack();

// Stop Track
player.StopTrack();

// más volument
player.maxVolume();

// menos volument
player.minVolume();

// etc...

La clase posee dos modos de reproducción por:

STREAMING (default):

// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();

// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );

NO STREAMING:

// Creamos una instancia a la clase
// una de las opciones es setearlo en el constructor
// new SoundDataLayer( false );
var player:SoundDataLayer = new SoundDataLayer();

// o bien como propiedad 
player.streming = false;

// medimos el progreso de la carga
player.OnProgress = function( _value:Number ):Void {
trace( "CARGA: " + _value + " %..." )
}

// Cargamos nuestra lista
player.load( "playList.xml", "_music/playList/" );

La clase posee tres eventos:

OnLoad: este se ejecuta una vez finalizada la carga total del archivo.

// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();

// Definimos el evento
player.OnLoad = function():Void {}

OnChanged: este se ejecuta una vez finalizada la reproducción y cambio del track, o bien cuando el cambio es manual.

// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();

// Definimos el evento
player.OnChanged = function():Void {}

OnProgress: este se ejecuta mientras se efectúa la carga, y retorna el progreso de la misma. El valor devuelto es el porcentaje de carga que posee en ese momento el archivo.>

// Creamos una instancia a la clase
var player:SoundDataLayer = new SoundDataLayer();

// Definimos el evento
player.OnProgress = function( _value:Number ):Void {
	trace( "CARGA: " + _value + " %..." )
}

NOTA: Si el constructor es creado e inicializado dentro del ámbito de una función, lo que deben utilizar es el método delegate de la clase Utils. Ya que la clase no maneja el dentro de ella el ámbito donde se ejecuta la dicha instancia.

EJ1:

import AsLib.Utils;

var PLAYER:SoundDataLayer;

var ViewTitle:Function = function ():Void {
	trace("ON_CHANGED!!!");
}

var init:Function = function ( _playlist:String, _folder:String ):Void {
	PLAYER = new SoundDataLayer();
	PLAYER.load( _playlist, _folder );
	PLAYER.OnChanged = Utils.delegate( this, ViewTitle );
}

EJ2:

var PLAYER:SoundDataLayer = new SoundDataLayer();

PLAYER.load( _playlist, _folder );

PLAYER.OnChanged = function():Void {
	trace("ON_CHANGED!!!");
}

SIN MAS?

Espero que les sea de utilidad, y que puedan experimentar en su estructura para modificarla a sus necesidades.

Criticas/mejoras/dudas/problemas, escribir a: pollyjex@emc2zen.com.ar.

Aquellos que quiera colaborar, aportando ideas o bien estructuras de código, escribir a: mfw@emc2zen.com.ar

Saludos.

PollyJex ^_^!