Subversion Repositories eFlore/Applications.cel

Rev

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 '';
        }
}
?>