Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PARSEUR DE TAGS ID3V2 ...


Information sur la source

Catégorie :Application Classé sous : id3, id3v2, tags, id3tag, mp3 Niveau : Initié Date de création : 23/07/2005 Vu : 4 398

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

... Ou en tous cas le début.
Avant de parler du code proprement dit, je vais expliquer pourquoi j'ai créé une telle classe ... Ce script appartient à un projet un peu plus vaste qui dépasse un peu le PHP : un lecteur mp3 en Flash. Sauf que le Flash ne gère pas les tags Id3v2 des fichiers mp3, d'où l'utilisation du PHP. J'ai alors cherché des classes de gestions de ces tags et la seule classe opérationnelle que j'ai trouvé est allemande. Du coup, histoire de bien comprendre comment ça marchait, j'ai cherché beaucoup sur le net des informations sur ces tags et il se trouve que c'est tout de même assez élaboré.
Du coup, j'ai revu les opérations binaires, les octets, l'hexadecimal et tout ça et je me suis dit que ça pourrait peut-être interesser quelqu'un. Et histoire de mettre en pratique tout ce que j'ai appris, j'ai mis en place ce début de classe que je tacherais de completer dès que j'aurais un peu plus de temps.
Au niveau du code, c'est en fait assez basique. Il faut juste bien comprendre les fonction ord() et les opérateurs binaires et le tour est joué. Il faut aussi savoir lire l'anglais et lire la structure des tags ID3v2 sur www.id3.org. Ensuite, voilà ! ...
 

Source

  • <?php
  • /* ------------------------- */
  • echo '<pre>';
  • /* ------------------------- */
  • class ID3Parser
  • {
  • // Informations sur le fichier.
  • var $Name;
  • var $Path;
  • var $Content;
  • // Informations ID3.
  • var $FrameList = array();
  • var $Headers = array();
  • // Constructeur.
  • function __construct($file_directory)
  • {
  • $i = strrpos($file_path, '/');
  • if(!$i) $i = -1;
  • $length = strlen($file_directory);
  • $this -> Name = substr($file_directory, $i + 1, $length - $i);
  • $this -> Path = substr($file_directory, 0, $i + 1);
  • return true;
  • }
  • // Charge le fichier en mémoire.
  • function LoadFile()
  • {
  • $file_directory = ($this -> Path).($this -> Name);
  • $fp = fopen($file_directory, 'rb');
  • $this -> Content = fread($fp, filesize($file_directory));
  • fclose($fp);
  • return true;
  • }
  • // Lit les en-têtes.
  • function GetHeader()
  • {
  • // Extractions des en-têtes.
  • $headers = substr($this -> Content, 0, 10);
  • // Présence de l'indicateur ID3.
  • $this -> Headers['ID3'] = (substr($headers, 0, 3) == 'ID3') ? 0 : 1;
  • // Version du tag.
  • $this -> Headers['VERSION'] = ord(substr($headers, 3, 1)).'.'.ord(substr($headers, 4, 1));
  • $list = &$this -> Headers['FLAGS'];
  • $list = array();
  • // Extraction des flags.
  • $flags = ord(substr($headers, 5, 1));
  • // Valeur des propriétés.
  • $list['UNSYCHRONISATION'] = ($flags & 128) ? 1 : 0;
  • $list['EXTENDED_HEADER'] = ($flags & 64) ? 1 : 0;
  • $list['EXPERIMENTAL'] = ($flags & 32) ? 1 : 0;
  • $list['FOOTER'] = ($flags & 16) ? 1 : 0;
  • // Taille.
  • $this -> Headers['SIZE'] = (ord(substr($headers, 6, 1)) & 127) * 2097152 +
  • (ord(substr($headers, 7, 1)) & 127) * 16384 +
  • (ord(substr($headers, 8, 1)) & 127) * 128 +
  • (ord(substr($headers, 9, 1)) & 127);
  • }
  • // Lit les frames.
  • function GetFrames()
  • {
  • $i = 0;
  • $size = $this -> Headers['SIZE'];
  • $frames = substr($this -> Content, 10, $size);
  • while($i < $size - 1)
  • {
  • // Extraction de l'ID de la frame.
  • $id = substr($frames, $i, 4); $i += 4;
  • if(trim($id) == '') break;
  • $list = &$this -> Frames[$id];
  • $list = array();
  • // Taille du tag.
  • $list['SIZE'] = (ord(substr($frames, $i + 0, 1)) & 127) * 2097152 +
  • (ord(substr($frames, $i + 1, 1)) & 127) * 16384 +
  • (ord(substr($frames, $i + 2, 1)) & 127) * 128 +
  • (ord(substr($frames, $i + 3, 1)) & 127);
  • $i += 4;
  • // Extraction des flags.
  • $list['TAG_ALTER_DISCARD'] = (ord(substr($frames, $i, 1)) & 128) ? 1 : 0;
  • $list['FILE_ALTER_DISCARD'] = (ord(substr($frames, $i, 1)) & 64) ? 1 : 0;
  • $list['READ_ONLY'] = (ord(substr($frames, $i, 1) & 32)) ? 1 : 0;
  • $i += 1;
  • $list['GROUP'] = (ord(substr($frames, $i, 1)) & 128) ? 1 : 0;
  • $list['COMPRESSED'] = (ord(substr($frames, $i, 1)) & 16) ? 1 : 0;
  • $list['ENCRYPTED'] = (ord(substr($frames, $i, 1)) & 8) ? 1 : 0;
  • $list['UNSYCHRONISED'] = (ord(substr($frames, $i, 1)) & 4) ? 1 : 0;
  • $list['DATA_LENGTH_INDICATOR'] = (ord(substr($frames, $i, 1)) & 2) ? 1 : 0;
  • $i += 1;
  • //Extraction du contenu
  • $list['CONTENT'] = trim(substr($frames, $i, $list['SIZE']));
  • $i += $list['SIZE'];
  • }
  • }
  • }
  • /* ------------------------- */
  • $info = new ID3Parser('zikmu.mp3');
  • $info -> LoadFile();
  • $info -> GetHeader();
  • $info -> GetFrames();
  • print_r($info);
  • /* ------------------------- */
  • echo '</pre>';
  • /* ------------------------- */
  • ?>
<?php
/* ------------------------- */
   echo '<pre>';
/* ------------------------- */
   class ID3Parser
   {
      // Informations sur le fichier.
      var $Name;
      var $Path;
      var $Content;
      // Informations ID3.
      var $FrameList = array();
      var $Headers = array();
      // Constructeur.
      function __construct($file_directory)
      {
         $i = strrpos($file_path, '/');
         if(!$i) $i = -1;
         $length = strlen($file_directory);
         $this -> Name = substr($file_directory, $i + 1, $length - $i);
         $this -> Path = substr($file_directory, 0, $i + 1);
         return true;
      }
      // Charge le fichier en mémoire.
      function LoadFile()
      {
         $file_directory = ($this -> Path).($this -> Name);
         $fp = fopen($file_directory, 'rb');
         $this -> Content = fread($fp, filesize($file_directory));
         fclose($fp);
         return true;
      }
      // Lit les en-têtes.
      function GetHeader()
      {
         // Extractions des en-têtes.
         $headers = substr($this -> Content, 0, 10);
         // Présence de l'indicateur ID3.
         $this -> Headers['ID3'] = (substr($headers, 0, 3) == 'ID3') ? 0 : 1;
         // Version du tag.
         $this -> Headers['VERSION'] = ord(substr($headers, 3, 1)).'.'.ord(substr($headers, 4, 1));
         $list = &$this -> Headers['FLAGS'];
         $list = array();
         // Extraction des flags.
         $flags = ord(substr($headers, 5, 1));
         // Valeur des propriétés.
	     	$list['UNSYCHRONISATION'] = ($flags & 128) ? 1 : 0; 
		   $list['EXTENDED_HEADER'] = ($flags & 64) ? 1 : 0;
		   $list['EXPERIMENTAL'] = ($flags & 32) ? 1 : 0;
		   $list['FOOTER'] = ($flags & 16) ? 1 : 0;
         // Taille.
         $this -> Headers['SIZE'] = (ord(substr($headers, 6, 1)) & 127) * 2097152 +
                                    (ord(substr($headers, 7, 1)) & 127) * 16384 +
                                    (ord(substr($headers, 8, 1)) & 127) * 128 +
                                    (ord(substr($headers, 9, 1)) & 127);
      }
      // Lit les frames.
      function GetFrames()
      {
         $i = 0;
         $size = $this -> Headers['SIZE'];
         $frames = substr($this -> Content, 10, $size);
         while($i < $size - 1)
         {
            // Extraction de l'ID de la frame.
            $id = substr($frames, $i, 4); $i += 4;
            if(trim($id) == '') break;
            $list = &$this -> Frames[$id];
            $list = array();
            // Taille du tag.
            $list['SIZE'] = (ord(substr($frames, $i + 0, 1)) & 127) * 2097152 +
                            (ord(substr($frames, $i + 1, 1)) & 127) * 16384 +
                            (ord(substr($frames, $i + 2, 1)) & 127) * 128 +
                            (ord(substr($frames, $i + 3, 1)) & 127);
            $i += 4;
            // Extraction des flags.
			   $list['TAG_ALTER_DISCARD'] = (ord(substr($frames, $i, 1)) & 128) ? 1 : 0;
			   $list['FILE_ALTER_DISCARD'] = (ord(substr($frames, $i, 1)) & 64) ? 1 : 0;
			   $list['READ_ONLY'] = (ord(substr($frames, $i, 1) & 32)) ? 1 : 0;
			   $i += 1;
			   $list['GROUP'] = (ord(substr($frames, $i, 1)) & 128) ? 1 : 0;
			   $list['COMPRESSED'] = (ord(substr($frames, $i, 1)) & 16) ? 1 : 0;
			   $list['ENCRYPTED'] = (ord(substr($frames, $i, 1)) & 8) ? 1 : 0;
			   $list['UNSYCHRONISED'] = (ord(substr($frames, $i, 1)) & 4) ? 1 : 0;
			   $list['DATA_LENGTH_INDICATOR'] = (ord(substr($frames, $i, 1)) & 2) ? 1 : 0;
			   $i += 1;
            //Extraction du contenu
            $list['CONTENT'] = trim(substr($frames, $i, $list['SIZE']));
            $i += $list['SIZE'];
         }
      }
      
   }
/* ------------------------- */
   $info = new ID3Parser('zikmu.mp3');
   $info -> LoadFile();
   $info -> GetHeader();
   $info -> GetFrames();
   print_r($info);
/* ------------------------- */
   echo '</pre>';
/* ------------------------- */
?>

Conclusion

Le code est moche et extrèmement optimisable. Et c'est pourquoi ça me pousse à créer un vrai tutorial sur les opérateurs binaires, quitte à faire des rappels sur les octets, l'hexa et tout ça, parce que c'est vraiment interessant.
Donc ce petit morceau de code n'est qu'un avant gout de quelque chose de bien plus gros sur les opérateurs binaires et les tags mp3. Mais je voulais quand même le poster.
Voilà ... J'espère que c'est pas trop le bordel ce que je raconte, parce que je suis un peu fatigué.
++ !
LocalStone.
 

Commentaires et avis

signaler à un administrateur
Commentaire de GRenard le 23/07/2005 08:11:20

J'ai fais une classe ID3v2.4 en PHP pour lecture et écriture... il faudrait bien que je la mette en ligne, ca viendra surement sous peu... dès que je me décide de la terminer...
Lecture et écriture de tag 1.1 et 2.4 :) (et le code est beau ;))

signaler à un administrateur
Commentaire de malalam le 24/07/2005 17:02:08 administrateur CS

Hello,

bonne idee, code original. J'aime bien. Pourquoi ne pas enjoliver le code justement ? :-) Puisque tu nous fait une classe php5, autant rajouter les "droits" sur les methodes et proprietes (public, private, protected).
Bref, vraiment bien :-)

signaler à un administrateur
Commentaire de GRenard le 27/07/2005 17:30:06

http://www.phpcs.com/code.aspx?ID=32869 voila moi j'ai mis en ligne.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

id3 demarrage [ par MasterCent ] Bonjour, Je possède une db contenant 25.000 titres de "chansons"Par ailleurs, je possède les versions mp3 de certains de ces morceaux (10%), - soit ri players mp3 ou wave sur site web [ par phonethique ] bonjours !nous sommes un groupe de pop:rock et nous voudrions inclure un lecteur mp3 ou wave sur notre site perso !Est ce réalisable ! un lecteur dign Expression régulière pour retrouver tous les tags php [ par ninatomb ] Je recherche une expression régulière qui me retrouve tous les tags php dans une page html, sans modifier l'htmlEt une qui fonctionne !!!!!Celle ci ne Lire mp3 sur page web [ par TiotBour ] Bonjour, je voudrais savoir si il été possible de lire un fichier mp3 (pas de midi) sur une page web. Il me semble que c'est possible en php mais je n Streaming MP3 [ par TiotBour ] Bonjour, j'avais poster un message pour lire un mp3 sur une page web. Je remerci encore une fois les personnes ayant repondu a mon post.Maintenant mon winamp php [ par nicola2s ] J'ai listé dasn une base mysql tous mes mp3, puis dans une page php, j'ai fait un lien vers chacun de mes mp3, mais lorsque je clique dessus, ca lit l PHP et lecture de fichiers son [ par Ralph29 ] Bjr à tous,Voilà je suis en train de me faire un petit site intranet qui me permet de lister le contenu de ma machine en fichier MP3 (je précise que c Jukebox dynamique [ par isomorphe ] Bonjour tout le monde, j'aurais besoin que vous me disiez si la chose suivante est réalisable en PHP. Je voudrais en fait réaliser un jukebox (mp3) dy Tags Word - Conversion [ par jdaviaud ] Bonjour a tous,J'essaye desespérément de faire une interface d'import de fichiers texte pour les convertir ensuite en fichier HTML, tout fonctionne im mp3 MySql [ par RealKEV1 ] Bonjour,On peut stocker des LONGBLOB dans une table MySql comme des images, mais peut-on aussi le faire avec de petits fichiers mp3???Je pense que cel


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,28 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.