begin process at 2012 05 27 19:36:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > PARSEUR DE TAGS ID3V2 ...

PARSEUR DE TAGS ID3V2 ...


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

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

Auteur : LocalStone

Ecrire un message privé
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.


 Sources du même auteur

Source avec Zip Source avec une capture MOTEUR D'ASPECT POUR PHP
Source avec Zip [PHPHOOK] UN PETIT SYSTÈME DE GESTION DES HOOKS DE SUBVERSIO...
Source avec Zip [PHP5] TASKSCHEDULER, UN PETIT PLANIFICATEUR DE TÂCHE EN PHP...
Source avec Zip [PHP5] NAVIGUER DANS UNE COLLECTION À L'AIDE D'UNE PSEUDO SY...
Source avec Zip Source avec une capture CLASSE D'ÉDITION DES FICHIERS DE CONFIGURATION D'APACHE

 Sources de la même categorie

Source avec une capture PHPREPOGENERATOR + REPO (WIN) par alvinp
Source avec Zip IPHONE - ICÔNE D'APPEL TÉLÉPHONIQUE SUR L'ÉCRAN D'ACCUEIL par Rainbow
Source avec Zip Source avec une capture [APP WEB]SERVEUREXPLOREUR par thematrix01
Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme

 Sources en rapport avec celle ci

Source avec Zip GÉNÉRATEUR DE MOTS CLÉS (TAGS) À PARTIR DE FICHIER HTML OU B... par Galip
Source avec Zip JUKEBOX MP3 par sesebs
Source avec Zip Source avec une capture JUKEBOX EN LIGNE par Flachy Joe
Source avec Zip Source avec une capture LECTURE/ÉCRITURE DE TAGS ID3 VERSION 1 ET VERSION 2 par GRenard
LIRE LES ID3V1 TAG (+RAPIDE, +COURT) par OverDarck

Commentaires et avis

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

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

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 Lire les ID3 Tag (mp3) [ par akzoo ] Salut a tous, J'aimerais pouvoir lire les tag de mes mp3 grâce au php, j'ai trouvé un script qui fonctionne (http://www.phpcs.com/codes/LIRE-ID3V1-TAG lecteur mp3 [ par darkvision ] salut, je veut integrer a mon site un lecteur mp3 avec un compteur de lecteur via mysql pour enregistrer le nombre de lecture dans la base de données Upload MP3 [ par vincej ] Bonjour, Je cherche un script qui permet d'uploader des MP3, comme pour des images avec la balise Merci. Vincej petit soucie de recup de données externe ... [ par DiabloBros ] bien le bonjours a tous , alors mon petit soucie va surment etre du gateau pour certain ^^ mais bon j'éssais d'afficher dans une page perso , les fi crée un blog [ par jerome226 ] bonjour ! j'aimerais bien crée un blog ( je connais le php; sql; html; css) mais le problème c'est que je ne sai pas comment mi prendre pour organis Problème de récupération [ par taurito ] Bonjour, J'ai fais un codage qui récupère des informations sur des pages ! Sur chaque page il y a 18 informations à récupérer et il y a 80 pages en Problème de variable ! [ par insu22 ] Bonjour, J'ai fais un codage qui récupère des informations sur des pages ! Sur chaque page il y a 18 informations à récupérer et il y a 80 pages en Mettre tous les tags img d'un attribut xml dans une array [ par jimmyhendrix ] Salut ! J'ai un problème. J'ai un fichier xml qui contient les articles de mon blog. Donc, j'ai un peu de code html dans un attribut appellé texte qu (PHP) download.php avec renomage de fichier . [ par alleztulle19 ] Bonjours alors voila j'aurais besoin d'une page php , download.php en fesant un lien style download.php?url=EXEMPLE le fichier EXEMPLE se situant da


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales