Magazine Internet

Lire les ID3 d'un fichier

Publié le 13 novembre 2007 par Stef1

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 :)


Retour à La Une de Logo Paperblog

A propos de l’auteur


Stef1 Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog