0/5 (10 avis)
Vue 12 267 fois - Téléchargée 507 fois
<? //Cette classe (ontact: nicolasboumal@hotmail.com), lit et édite les tags mp3 ID3v1 //note: à propos de ID3v1.1: il serait facile de rendre ce code compatible (http://www.id3.org/id3v1.html) //mais j'ai jugé que c'était inutile. (boh oui quoi ^^) //infos tableau de genres: http://www.egr.uri.edu/~kovacsp/mp3/ID3-Tag.html class mp3 { var $vide = "-"; //chaine retournée en cas de fichier non tagé var $genres = array("Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge", "Hip-Hop","Jazz","Metal","New Age","Oldies","Other","Pop","R&B", "Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska", "Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient", "Trip-Hop","Vocal","Jazz+Funk","Fusion","Trance","Classical", "Instrumental","Acid","House","Game","Sound Clip","Gospel", "Noise","AlternRock","Bass","Soul","Punk","Space","Meditative", "Instrumental Pop","Instrumental Rock","Ethnic","Gothic", "Darkwave","Techno-Industrial","Electronic","Pop-Folk", "Eurodance","Dream","Southern Rock","Comedy","Cult","Gangsta", "Top 40","Christian Rap","Pop/Funk","Jungle","Native American", "Cabaret","New Wave","Psychadelic","Rave","Showtunes","Trailer", "Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro", "Musical","Rock & Roll","Hard Rock","Folk","Folk-Rock", "National Folk","Swing","Fast Fusion","Bebob","Latin","Revival", "Celtic","Bluegrass","Avantgarde","Gothic Rock","Progressive Rock", "Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band", "Chorus","Easy Listening","Acoustic","Humour","Speech","Chanson", "Opera","Chamber Music","Sonata","Symphony","Booty Bass","Primus", "Porn Groove","Satire","Slow Jam","Club","Tango","Samba", "Folklore","Ballad","Power Ballad","Rhythmic Soul","Freestyle", "Duet","Punk Rock","Drum Solo","Acapella","Euro-House","Dance Hall"); //tableau des genres selon les spécifications ID3v1 // private: var $chaine; //contient la chaîne de 128 bits finaux du fichier var $tagged; //"booléen" qui spécifie si le fichier est taggé ou pas var $fic; //contient le chemin vers le fichier //constructeur function mp3(){ } //ouvre un fichier mp3 function ouvre($fichier) { $f = @fopen($fichier, "rb"); //ouvre le fichier en lecture seulement (sans erreur php) (la spécification binaire ne semble pas être obligatoire) if(!$f){ //le fichier n'existe pas ou ne peut être ouvert $this->tagged = false; return false; } fseek($f, filesize($fichier)-128); //pointe le début du tag $this->chaine = fread($f, 128); //lit la chaîne de 128 octets //vérifie qu'il s'agit bien d'une chaîne de tag (3 premiers caract. = TAG) if(substr($this->chaine, 0, 3) != "TAG") $this->tagged = false; else $this->tagged = true; @fclose($f); //sauve le nom du fichier ouvert $this->fic = $fichier; return true; } //retourne le titre function titre() { if($this->tagged) return trim(substr($this->chaine, 3, 30)); else return $this->vide; } //retourne le nom de l'artiste function artiste() { if($this->tagged) return trim(substr($this->chaine, 33, 30)); else return $this->vide; } //retourne le nom de l'album function album() { if($this->tagged) return trim(substr($this->chaine, 63, 30)); else return $this->vide; } //retourne l'année function annee() { if($this->tagged) return trim(substr($this->chaine, 93, 4)); else return $this->vide; } //retourne le commentaire function commentaire() { if($this->tagged) return trim(substr($this->chaine, 97, 30)); else return $this->vide; } //retourne le genre function genre() { if($this->tagged) return $this->genres[ord(substr($this->chaine, 127, 1))]; //ord() retourne le code ascii d'un caract. (inverse de chr()) else return $this->vide; } //tag un fichier (ajoute une chaîne de 128 bits à la fin commençant par TAG et fournie avec des \0 //les tags sont vides mais les emplacements réservés function tagit() { //préparatifs: ouverture du fichier $f = @fopen($this->fic, "r+b"); if(!$f) return false; fseek($f, filesize($this->fic)); //place à la fin //note: pas 128 caract, car le dernier déclarerait blues comme genre (0), or ce n'est pas forcément le cas //le 128ème est la valeur 255 (comme ça, aucun genre associé) $ch = "TAG"; $null = chr(0); //évite de lancer 124 fois la même fct for($i=0; $i<124; $i++) $ch .= $null; $ch .= chr(255); fputs($f, $ch); fclose($f); $this->ouvre($this->fic); //met à jour } //modifie la valeur du tag selon deux paramètres (tag, valeur) function set($tag, $val) { //préparatifs: ouverture du fichier $f = @fopen($this->fic, "r+b"); if(!$f) return false; //si pas taggé -> tag ! ^^ if(!$this->tagged) if(!$this->tagit()) return false; $lg = strlen($val); if($tag == "titre"){ //note: si la valeur est trop grande, elle sera coupée //complète la valeur avec des \0 (caract. null) puis l'écrit dans le fichier au bon endroit //attention! '\0' ne donne pas un bon résultat! il faut "\0" (va savoir! -_-) for($i=0; $i<30-$lg; $i++) $val .= "\0"; fseek($f, filesize($this->fic) - 128 + 3); fputs($f, $val, 30); //précision du 30 par sécurité fclose($f); $this->ouvre($this->fic); //mise à jour return true; } elseif($tag == "artiste"){ for($i=0; $i<30-$lg; $i++) $val .= "\0"; fseek($f, filesize($this->fic) - 128 + 33); fputs($f, $val, 30); fclose($f); $this->ouvre($this->fic); return true; } elseif($tag == "album"){ for($i=0; $i<30-$lg; $i++) $val .= "\0"; fseek($f, filesize($this->fic) - 128 + 63); fputs($f, $val, 30); fclose($f); $this->ouvre($this->fic); return true; } elseif($tag == "année"){ for($i=0; $i<4-$lg; $i++) $val .= "\0"; fseek($f, filesize($this->fic) - 128 + 93); fputs($f, $val, 4); fclose($f); $this->ouvre($this->fic); return true; } elseif($tag == "commentaire"){ for($i=0; $i<30-$lg; $i++) $val .= "\0"; fseek($f, filesize($this->fic) - 128 + 97); fputs($f, $val, 30); fclose($f); $this->ouvre($this->fic); return true; } elseif($tag == "genre"){ fseek($f, filesize($this->fic) - 1); fputs($f, chr($val), 1); //chr() retourne la valeure caractère pr un nombre ascii fclose($f); $this->ouvre($this->fic); return true; } else return false; } //lance la fonction selon le paramètre (ansi, si la l'info à récupérée est contenue dans une variable, on la passe ici) function get($tag) { if($tag == "titre") return $this->titre; elseif($tag == "artiste") return $this->artiste; elseif($tag == "album") return $this->album; elseif($tag == "année") return $this->annee; elseif($tag == "commentaire") return $this->commentaire; elseif($tag == "genre") return $this->genre; else return false; } } ?>
11 nov. 2003 à 21:40
11 nov. 2003 à 20:08
18 sept. 2003 à 16:46
c marrant que tu postes ici, parce que juste hier j'ai réécrit une classe pr ID3v1.1 en C++, et je m'y suis pris autrement, et le résultat est meilleur, plus fiable. j'ai utilisé cette classe PHP pr classer mes mp3 et ça marchait à 90% (c pratique de l'avoir fait en php, comme ça l'interface graphique est en html, pas besoin de code Win32)
donc, je pense, après utilisation, qu'il n'est pas judicieux d'utiliser cette classe-ci pour un site publique. mais je ne compte pas non plus la réécrire.
ce qui bug, c'est si le fichier n'est pas déjà taggé, alors la classe n'arrive pas à le tagger, ce qui est très bête ^^
17 sept. 2003 à 23:14
11 juin 2003 à 16:17
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.