Lire les balises d'un mp3 peux sembler simple, c'est vrai si on accepte de lancer un objet sound.
Mais mon but étant simplement de récupérer les données pour les afficher, je ne trouvais pas très propre de lancer le son en arrière plan avec un volume à zéro le temps de récupérer les infos.
Heureusement Mr Ben Stucki nous a concoté un super tutoriel sur la lecture d'un fichier binaire et la récupération des tags sur un fichier mp3
http://labs.adobe.com/wiki/index.php/AIR:Articles:Working_with_Binary_Data#Reading_binary_data
L'un des principaux problèmes de ce tuto pour les maceux, c'est l'utilisation de browse .... :( un jour peut être.
Enfin pour ça il suffit de déterminer soit même le chemin du fichier que l'on souhaite lire.
Pour ça je donne le path du fichier comme argument de la fonction.
Un autre petit souci c'est que l'exemple considère que les fichiers sont bien tagés ce qui malheureusement n'est pas toujours le cas, j'ai donc ajouté (en rouge )un test try ... catch pour eviter l'erreur 2030.
Et modifié (en vert) la manière de récupérer les infos notamment parce que sur certains mp3 le titre n'est pas dans TIT2 mais TT2, une question de version je crois.
Le code original et les autres fonctions nécéssaires sont disponibles via le lien précédent.
SongTitle, SongAlbum, SongArtiste sont les noms de mes champs textes ou variables à vous de les adapter au votre.
private function loadLocalID3( pathDuFichier:String ):void {
var file:File = new File();
file.nativePath = pathDuFichier;
var bytes:FileStream = new FileStream();
bytes.open(file, FileMode.READ);
// read in sequence
var tagId:String = bytes.readUTFBytes(3);
var majorVersion:Number = bytes.readByte();
var minorVersion:Number = bytes.readByte();
var flags:int = bytes.readByte();
var tagSize:uint = convertSynchsafe(bytes.readUnsignedInt())
trace("id: " + tagId);
if(flags==0) {
//frames
while(bytes.position < tagSize) {
var id:String = bytes.readUTFBytes(4);
var size:uint = bytes.readUnsignedInt();
var flags1:int = bytes.readByte();
var flags2:int = bytes.readByte();
if(id!="") { trace(id); }
if(id.charAt(0)=="T") {
try{
var encodingFlag:int = bytes.readByte();
var text:String = bytes.readUTFBytes(size-1);
if(id == "TIT2"){
SongTitle.text = text;
}
if(id == "TT2"){
SongTitle.text = text;
}
if(id == "TPE1"){
SongArtist.text = text;
}
if(id == "TALB"){
SongAlbum = text;
}
} catch(error:EOFError){
trace (error.message);
}
} else if(id == "APIC") {
var start:int = bytes.position;
var textEncoding:int = bytes.readByte();
var mime:String = readISO(bytes);
var pictureType:int = bytes.readByte();
var description:String = readISO(bytes);
var stop:int = bytes.position;
var imageSize:int = size-(stop-start);
var image:ByteArray = new ByteArray();
bytes.readBytes(image,0,imageSize);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.loadBytes(image);
} else {
bytes.position += size;
}
}
SongTitle.text = SongTitle.text+' '+SongAlbum; // Ca c'est perso j affiche le titre et l album dans le même champs
}
}
La ou Mr Stucki fait très fort, c'est sur son blog ou il propose de récupérer le contenu des balises ID3 d'un élément distant (ce post à pratiquement deux ans :)), mais il fonctionne avec flex3 beta 2 donc pas de soucis.
Il faut refaire les opérations citées précédemment dans le code car il y a le même type de problèmes sur les fichiers qui n'ont pas de tags ou pas les mêmes.
D'ici quelques temps, j'espère être moins chargé et faire un tutoriel complet sur le sujet, il me faut aussi un vrai blog avec de l'affichage de code et un moteur de recherche parce que là c'est n'importe quoi :)