Accueil > > > PARSEUR DE TAGS ID3V2 ...
PARSEUR DE TAGS ID3V2 ...
Information sur la source
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 de la même categorie
Commentaires et avis
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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|