Rev 632 | Blame | Last modification | View Log | RSS feed
<?php
/**
* Classe d'extraction de metadonnées afin de les mettre dans
* un tableau au format du cel
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Aurélien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
*/
class ExtracteurMetadonnees {
public function extraireMetadonnees($chemin_fichier)
{
$metadonnees = $this->decoderMetaDonnees($chemin_fichier);
return $metadonnees ;
}
private function peutUtiliserExifTool() {
// TODO indiquer ceci dans un fichier de config
return file_exists('/usr/bin/exiftool') && is_executable('/usr/bin/exiftool');
}
private function decoderMetadonnees($chemin_image) {
$metadonnees = array();
if($this->peutUtiliserExifTool()) {
$res = $this->decoderMetadonneesExifTool($chemin_image);
$metadonnees['meta_exif'] = $this->convertirExifVersXML(&$res);
$metadonnees['meta_iptc'] = $this->convertirIptcVersXML(&$res);
$metadonnees['meta_xmp'] = $this->convertirXmpVersXML(&$res);
$metadonnees['meta_makernote'] = $this->convertirMakernoteVersXML(&$res);
$metadonnees['appareil_fabriquant'] = $this->obtenirAppareilFabricant(&$res);
$metadonnees['appareil_modele'] = $this->obtenirAppareilModele(&$res);
$metadonnees['hauteur'] = $this->obtenirHauteur(&$res);
$metadonnees['largeur'] = $this->obtenirLargeur(&$res);
$metadonnees['date_prise_de_vue'] = $this->obtenirDatePriseDeVue(&$res);
} else {
}
return $metadonnees;
}
private function obtenirAppareilFabricant($infos_meta) {
$fabriquant = '';
if(isset($infos_meta['EXIF']['Make'])) {
$fabriquant = $infos_meta['EXIF']['Make']['valeur'];
}
return $fabriquant;
}
private function obtenirAppareilModele($infos_meta) {
$modele = '';
if(isset($infos_meta['EXIF']['CameraModelName'])) {
$modele = $infos_meta['EXIF']['CameraModelName']['valeur'];
}
return $modele;
}
private function obtenirHauteur($infos_meta) {
$hauteur = '';
if(isset($infos_meta['File']['ImageHeight'])) {
$hauteur = $infos_meta['File']['ImageHeight']['valeur'];
}
return $hauteur;
}
private function obtenirLargeur($infos_meta) {
$largeur = '';
if(isset($infos_meta['File']['ImageWidth'])) {
$largeur = $infos_meta['File']['ImageWidth']['valeur'];
}
return $largeur;
}
private function obtenirDatePriseDeVue($infos_meta) {
$date = '';
if(isset($infos_meta['EXIF']['DateTimeOriginal'])) {
$date = $infos_meta['EXIF']['DateTimeOriginal']['valeur'];
}
return $date;
}
private function decoderMetadonneesExifTool($chemin_image) {
$metadata = array();
$res = exec('/usr/bin/exiftool -g -D '.$chemin_image, $metadata);
$metadata_decodees = array();
$categorie = '';
foreach($metadata as &$data) {
if($this->estUnSeparateurCategorieExifTool($data)) {
$categorie = trim(str_replace('----','',$data));
} else {
$data_decodee = $this->parserValeurMetadonneeExifTool($data);
$cle_metadonnee = str_replace(' ', '', $data_decodee['cle']);
$metadata_decodees[$categorie][$cle_metadonnee] = $data_decodee;
}
}
return $metadata_decodees;
}
private function estUnSeparateurCategorieExifTool($data) {
return preg_match('^---- (.)* ----^',$data);
}
private function parserValeurMetadonneeExifTool($data) {
$cle_valeur = explode(':',$data);
$valeur = '';
if(count($cle_valeur) == 2) {
$valeur = trim($cle_valeur[1]);
}
$id_cle = explode(' ',trim($cle_valeur[0]),2);
$id_cle[1] = str_replace(array('-','/'),'',$id_cle[1]);
$cle_id_valeur = array('cle' => $id_cle[1], 'id' => str_replace('-','',$id_cle[0]), 'valeur' => $valeur);
return $cle_id_valeur;
}
private function convertirExifVersXML($donnees_meta) {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
$xml .= '<exif>';
if (isset($donnees_meta['EXIF'])) {
foreach ($donnees_meta['EXIF'] as $prop => &$valeur) {
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
}
}
$xml .= '</exif>'."\n"."\n";
return $xml;
}
private function convertirIptcVersXML($donnees_meta) {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
$xml .= '<iptc>';
if (isset($donnees_meta['IPTC'])) {
foreach ($donnees_meta['IPTC'] as $prop => &$valeur) {
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
}
}
$xml .= '</iptc>'."\n"."\n";
return $xml;
}
private function convertirXmpVersXML($donnees_meta) {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
$xml .= '<xmp>';
if (isset($donnees_meta['XMP'])) {
foreach ($donnees_meta['XMP'] as $prop => &$valeur) {
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
}
}
$xml .= '</xmp>';
return $xml;
}
private function convertirMakernoteVersXML($donnees_meta) {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
$xml .= '<makernote>';
if (isset($donnees_meta['MAKERNOTE'])) {
foreach ($donnees_meta['MAKERNOTE'] as $prop => &$valeur) {
$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
}
}
$xml .= '</makernote>';
return '';
}
}
?>