Lire les tags id3 des fichiers mp3

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 295 fois - Téléchargée 28 fois

Contenu du snippet

Voila une fonction de base qui prend comme paramètre le chemin d'accès a un fichier mp3 et qui retourne la structure du tag formaté (ou 0 si l'operation échoue), il suffit d'utiliser les fonctions list et explode comme dans l'exemple pour séparer les informations (titre, artiste...)

cette fonction de marche qu'avec les tags ID3v1 et ID3v1.1
À propos si quelqu'un connaît un site avec des info sur les tags MP3 ID3v2 (lecture, taille de la structure...)

Désolé pour le manque de commentaires :-/, mais je ne pense pas que ce code soit difficile à comprendre ;-)

Source / Exemple :


<? 
  function ReadTag($path) 
  { 
     
           $genre_array = 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"); 
     
           $file=fopen($path, "rb"); 
     
           if($file) 
           { 
        fseek($file, 0, SEEK_END); 
        fseek($file, -128, SEEK_CUR); 
       
                      $tag=fread($file, 128); 
       
        fclose($file); 
        } 
       else
      {
          return 0;
      }
     
          if ($tag[0]=='T' && $tag[1]=='A' && $tag[2]=='G') 
            { 
                 $title=substr($tag,3,30); 
                 $artist=substr($tag,33,30); 
                 $album=substr($tag,63,30); 
                 $year=substr($tag,93,4); 
                 $comment=substr($tag,97,30); 
                 $type=ord(substr($tag,127,1)); 
       
                  if($type >= 0 && $type <= 125) 
             $genre = $genre_array[$type]; 
               else 
             $genre = "none"; 
       
                      if (ord($comment[28]) == 0 && ord($comment[29]) != 0) 
                      { 
                            $track = ord($comment[29]); 
                            $comment[29] = "\0"; 
                      } 
                      else 
                      { 
                           $track = 0; 
                      } 
       
       
                 return sprintf("%s-%s-%s-%s-%s-%s-%s",$title, $artist, $album, $year, $comment, $genre, $track); 
            } 
            else 
            { 
                 return 0; 
            } 
  } 
   
  /*Exemple d'utilisation*/ 
   
    $path = "Test.mp3"; 
    $tag = ReadTag($path); 

    if($path == 0)
     print("Lecture du tag impossible");
    else
    {
   
       list($title, $artist, $album, $year, $comment, $genre, $track) = explode   ("-", $tag); 
   
       print($title); 
       print("<br>"); 
       print($artist); 
       print("<br>"); 
       print($album); 
       print("<br>"); 
       print($year); 
       print("<br>"); 
       print($comment);   
       print("<br>"); 
       print($genre); 
       print("<br>"); 
       print($track); 
       print("<br>"); 
   }
    
  ?>

Conclusion :


Pour appeler la fonction faite $tag = ReadTag($path); $path correspond au chemin d'access au fichier mp3

la fonction ReadTag renvoie les informations séparées par des "-" il suffit, d'utiliser les fonctions list et explode comme dans l'exemple pour séparer les informations

çe code est l'adaptation PHP de la source http://www.cppfrance.com/article.aspx?Val=1386 Merci a sont auteur

A voir également

Ajouter un commentaire

Commentaires

cs_nicofer1
Messages postés
1
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
27 janvier 2011
-
Plusieurs problèmes avec ce code:
Ligne 82: $path est testé à la place de $tag
Ligne 82: Chez moi j'ai un "Lecture du tag impossible" quoi que renvoi ReadTag(), je pense que c'est dut à la comparaison entre une chaine et un entier
Ligne 87: explode() va poser un problème si jamais le caractère - (tiret) est présent dans une des variables, d'autant que ce caractère est présent dans le nom des genres défini ligne 5.

Résolution de ces problèmes:
Remplacer la ligne 82 par if(!$tag)
Remplacer le premier argument du sprintf() ligne 69 par "%sù£µ%sù£µ%sù£µ%sù£µ%sù£µ%sù£µ%s"
Remplacer le premier argument du explode() ligne 87 par "ù£µ"
Normalement ça devrait passer et ne poser de problème que si "ù£µ" est présent sur une info du tag ID3, je doute fortement qu'il existe ne serait-ce qu'un fichier au monde posant ce problème

Problème secondaire:
Voici l'artiste que me sort ce code avec mon fichier test, vous comprendrez le soucis: Stupeflip?????????????????????
gergalp
Messages postés
70
Date d'inscription
vendredi 14 février 2003
Statut
Membre
Dernière intervention
20 mars 2007
-
t'as juste à écrire par dessus :)


ou alors, tu peux aller voir cette source :
http://www.phpcs.com/code.aspx?ID=25736

pite pub ;)
mrmabo27
Messages postés
3
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 avril 2005
-
Tous ceci est interessant mais je me demande comment ecrire les tags ou les modifier !
cs_BadFox
Messages postés
3
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
24 août 2003
-
il y a une erreur dans l'exemple :

if($path == 0) print("Lecture du tag impossible"); else...

c'est pas $path qui doit être utilisé, un type chaîne, mais $tag
Moasky
Messages postés
1
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
16 mai 2003
-
C un bon code. Juste un truc, pour positionner ton pointeur de fichier, au lieu de faire un double fseek, tu peux faire :

if ( fseek( $file, -128L, SEEK_END ) != 0)
{
print ("Erreur en positionnant le pointeur de fichier");

return 0;
}

Bye

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.