| 623 | aurelien | 1 | <?php
 | 
        
           |  |  | 2 | /**
 | 
        
           |  |  | 3 |  * Classe d'extraction de metadonnées afin de les mettre dans
 | 
        
           |  |  | 4 |  * un tableau au format du cel
 | 
        
           |  |  | 5 |  * Encodage en entrée : utf8
 | 
        
           |  |  | 6 |  * Encodage en sortie : utf8
 | 
        
           |  |  | 7 |  *
 | 
        
           |  |  | 8 |  * @author Aurélien PERONNET <aurelien@tela-botanica.org>
 | 
        
           |  |  | 9 |  * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 | 
        
           |  |  | 10 |  * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 | 
        
           |  |  | 11 |  * @version $Id$
 | 
        
           |  |  | 12 |  */
 | 
        
           | 632 | aurelien | 13 | class ExtracteurMetadonnees {
 | 
        
           | 623 | aurelien | 14 |   | 
        
           |  |  | 15 | 	 public function extraireMetadonnees($chemin_fichier)
 | 
        
           |  |  | 16 | 	 {
 | 
        
           | 970 | aurelien | 17 |   | 
        
           |  |  | 18 | 	 	$metadonnees = $this->decoderMetaDonnees($chemin_fichier);
 | 
        
           |  |  | 19 |   | 
        
           |  |  | 20 | 		return $metadonnees ;
 | 
        
           | 623 | aurelien | 21 | 	 }
 | 
        
           |  |  | 22 |   | 
        
           | 970 | aurelien | 23 | 	private function peutUtiliserExifTool() {
 | 
        
           |  |  | 24 | 		// TODO indiquer ceci dans un fichier de config
 | 
        
           |  |  | 25 | 		return file_exists('/usr/bin/exiftool') && is_executable('/usr/bin/exiftool');
 | 
        
           | 623 | aurelien | 26 | 	}
 | 
        
           |  |  | 27 |   | 
        
           | 970 | aurelien | 28 | 	private function decoderMetadonnees($chemin_image) {
 | 
        
           | 623 | aurelien | 29 |   | 
        
           | 970 | aurelien | 30 | 		$metadonnees = array();
 | 
        
           | 623 | aurelien | 31 |   | 
        
           | 970 | aurelien | 32 | 		if($this->peutUtiliserExifTool()) {
 | 
        
           | 623 | aurelien | 33 |   | 
        
           | 970 | aurelien | 34 | 			$res = $this->decoderMetadonneesExifTool($chemin_image);
 | 
        
           |  |  | 35 | 			$metadonnees['meta_exif'] = $this->convertirExifVersXML(&$res);
 | 
        
           |  |  | 36 | 			$metadonnees['meta_iptc'] = $this->convertirIptcVersXML(&$res);
 | 
        
           |  |  | 37 | 			$metadonnees['meta_xmp'] = $this->convertirXmpVersXML(&$res);
 | 
        
           |  |  | 38 | 			$metadonnees['meta_makernote'] = $this->convertirMakernoteVersXML(&$res);
 | 
        
           | 623 | aurelien | 39 |   | 
        
           | 970 | aurelien | 40 | 			$metadonnees['appareil_fabriquant'] = $this->obtenirAppareilFabricant(&$res);
 | 
        
           |  |  | 41 | 			$metadonnees['appareil_modele'] = $this->obtenirAppareilModele(&$res);
 | 
        
           | 623 | aurelien | 42 |   | 
        
           | 970 | aurelien | 43 | 			$metadonnees['hauteur'] = $this->obtenirHauteur(&$res);
 | 
        
           |  |  | 44 | 			$metadonnees['largeur'] = $this->obtenirLargeur(&$res);
 | 
        
           | 623 | aurelien | 45 |   | 
        
           | 970 | aurelien | 46 | 			$metadonnees['date_prise_de_vue'] = $this->obtenirDatePriseDeVue(&$res);
 | 
        
           | 623 | aurelien | 47 |   | 
        
           | 970 | aurelien | 48 | 		} else {
 | 
        
           | 623 | aurelien | 49 |   | 
        
           | 970 | aurelien | 50 | 		}
 | 
        
           |  |  | 51 |   | 
        
           |  |  | 52 | 		return $metadonnees;
 | 
        
           | 623 | aurelien | 53 | 	}
 | 
        
           |  |  | 54 |   | 
        
           | 970 | aurelien | 55 | 	private function obtenirAppareilFabricant($infos_meta) {
 | 
        
           |  |  | 56 |   | 
        
           |  |  | 57 | 		$fabriquant = '';
 | 
        
           |  |  | 58 |   | 
        
           |  |  | 59 | 		if(isset($infos_meta['EXIF']['Make'])) {
 | 
        
           |  |  | 60 | 			$fabriquant = $infos_meta['EXIF']['Make']['valeur'];
 | 
        
           |  |  | 61 | 		}
 | 
        
           |  |  | 62 |   | 
        
           |  |  | 63 | 		return $fabriquant;
 | 
        
           | 623 | aurelien | 64 | 	}
 | 
        
           |  |  | 65 |   | 
        
           | 970 | aurelien | 66 | 	private function obtenirAppareilModele($infos_meta) {
 | 
        
           | 623 | aurelien | 67 |   | 
        
           | 970 | aurelien | 68 | 		$modele = '';
 | 
        
           | 623 | aurelien | 69 |   | 
        
           | 970 | aurelien | 70 | 		if(isset($infos_meta['EXIF']['CameraModelName'])) {
 | 
        
           |  |  | 71 | 			$modele = $infos_meta['EXIF']['CameraModelName']['valeur'];
 | 
        
           |  |  | 72 | 		}
 | 
        
           | 623 | aurelien | 73 |   | 
        
           | 970 | aurelien | 74 | 		return $modele;
 | 
        
           |  |  | 75 | 	}
 | 
        
           | 623 | aurelien | 76 |   | 
        
           | 970 | aurelien | 77 | 	private function obtenirHauteur($infos_meta) {
 | 
        
           |  |  | 78 | 		$hauteur = '';
 | 
        
           |  |  | 79 |   | 
        
           |  |  | 80 | 		if(isset($infos_meta['File']['ImageHeight'])) {
 | 
        
           |  |  | 81 | 			$hauteur = $infos_meta['File']['ImageHeight']['valeur'];
 | 
        
           |  |  | 82 | 		}
 | 
        
           |  |  | 83 |   | 
        
           |  |  | 84 | 		return $hauteur;
 | 
        
           | 623 | aurelien | 85 | 	}
 | 
        
           |  |  | 86 |   | 
        
           | 970 | aurelien | 87 | 	private function obtenirLargeur($infos_meta) {
 | 
        
           |  |  | 88 | 		$largeur = '';
 | 
        
           | 623 | aurelien | 89 |   | 
        
           | 970 | aurelien | 90 | 		if(isset($infos_meta['File']['ImageWidth'])) {
 | 
        
           |  |  | 91 | 			$largeur = $infos_meta['File']['ImageWidth']['valeur'];
 | 
        
           |  |  | 92 | 		}
 | 
        
           | 623 | aurelien | 93 |   | 
        
           | 970 | aurelien | 94 | 		return $largeur;
 | 
        
           |  |  | 95 | 	}
 | 
        
           |  |  | 96 |   | 
        
           |  |  | 97 | 	private function obtenirDatePriseDeVue($infos_meta) {
 | 
        
           | 623 | aurelien | 98 |   | 
        
           | 970 | aurelien | 99 | 		$date = '';
 | 
        
           | 623 | aurelien | 100 |   | 
        
           | 970 | aurelien | 101 | 		if(isset($infos_meta['EXIF']['DateTimeOriginal'])) {
 | 
        
           |  |  | 102 | 			$date = $infos_meta['EXIF']['DateTimeOriginal']['valeur'];
 | 
        
           |  |  | 103 | 		}
 | 
        
           | 623 | aurelien | 104 |   | 
        
           | 970 | aurelien | 105 | 		return $date;
 | 
        
           |  |  | 106 | 	}
 | 
        
           | 623 | aurelien | 107 |   | 
        
           | 970 | aurelien | 108 | 	private function decoderMetadonneesExifTool($chemin_image) {
 | 
        
           |  |  | 109 | 		$metadata = array();
 | 
        
           |  |  | 110 | 		$res = exec('/usr/bin/exiftool -g -D '.$chemin_image, $metadata);
 | 
        
           |  |  | 111 |   | 
        
           |  |  | 112 | 		$metadata_decodees = array();
 | 
        
           |  |  | 113 |   | 
        
           |  |  | 114 | 		$categorie = '';
 | 
        
           |  |  | 115 | 		foreach($metadata as &$data) {
 | 
        
           |  |  | 116 | 			if($this->estUnSeparateurCategorieExifTool($data)) {
 | 
        
           |  |  | 117 | 				$categorie = trim(str_replace('----','',$data));
 | 
        
           |  |  | 118 | 			} else {
 | 
        
           |  |  | 119 | 				$data_decodee = $this->parserValeurMetadonneeExifTool($data);
 | 
        
           |  |  | 120 | 				$cle_metadonnee = str_replace(' ', '', $data_decodee['cle']);
 | 
        
           |  |  | 121 | 				$metadata_decodees[$categorie][$cle_metadonnee] = $data_decodee;
 | 
        
           |  |  | 122 | 			}
 | 
        
           |  |  | 123 | 		}
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 | 		return $metadata_decodees;
 | 
        
           |  |  | 126 | 	}
 | 
        
           | 623 | aurelien | 127 |   | 
        
           | 970 | aurelien | 128 | 	private function estUnSeparateurCategorieExifTool($data) {
 | 
        
           |  |  | 129 | 		return preg_match('^---- (.)* ----^',$data);
 | 
        
           |  |  | 130 | 	}
 | 
        
           | 623 | aurelien | 131 |   | 
        
           | 970 | aurelien | 132 | 	private function parserValeurMetadonneeExifTool($data) {
 | 
        
           |  |  | 133 | 		$cle_valeur = explode(':',$data);
 | 
        
           |  |  | 134 |   | 
        
           |  |  | 135 | 		$valeur = '';
 | 
        
           |  |  | 136 | 		if(count($cle_valeur) == 2) {
 | 
        
           |  |  | 137 | 			$valeur	= trim($cle_valeur[1]);
 | 
        
           |  |  | 138 | 		}
 | 
        
           |  |  | 139 |   | 
        
           |  |  | 140 | 		$id_cle = explode(' ',trim($cle_valeur[0]),2);
 | 
        
           |  |  | 141 |   | 
        
           |  |  | 142 | 		$id_cle[1] = str_replace(array('-','/'),'',$id_cle[1]);
 | 
        
           |  |  | 143 |   | 
        
           |  |  | 144 | 		$cle_id_valeur = array('cle' => $id_cle[1], 'id' => str_replace('-','',$id_cle[0]), 'valeur' => $valeur);
 | 
        
           |  |  | 145 | 		return $cle_id_valeur;
 | 
        
           |  |  | 146 | 	}
 | 
        
           | 623 | aurelien | 147 |   | 
        
           | 970 | aurelien | 148 | 	private function convertirExifVersXML($donnees_meta) {
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 | 		$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
 | 
        
           |  |  | 151 | 		$xml .= '<exif>';
 | 
        
           |  |  | 152 | 		if (isset($donnees_meta['EXIF'])) {
 | 
        
           |  |  | 153 | 			foreach ($donnees_meta['EXIF'] as $prop => &$valeur) {
 | 
        
           |  |  | 154 | 				$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
 | 
        
           |  |  | 155 | 			}
 | 
        
           |  |  | 156 | 		}
 | 
        
           |  |  | 157 | 		$xml .= '</exif>'."\n"."\n";
 | 
        
           |  |  | 158 |   | 
        
           |  |  | 159 | 		return $xml;
 | 
        
           |  |  | 160 | 	}
 | 
        
           | 623 | aurelien | 161 |   | 
        
           | 970 | aurelien | 162 | 	private function convertirIptcVersXML($donnees_meta) {
 | 
        
           | 623 | aurelien | 163 |   | 
        
           | 970 | aurelien | 164 | 		$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
 | 
        
           |  |  | 165 | 		$xml .= '<iptc>';
 | 
        
           |  |  | 166 | 		if (isset($donnees_meta['IPTC'])) {
 | 
        
           |  |  | 167 | 			foreach ($donnees_meta['IPTC'] as $prop => &$valeur) {
 | 
        
           |  |  | 168 | 				$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
 | 
        
           |  |  | 169 | 			}
 | 
        
           |  |  | 170 | 		}
 | 
        
           |  |  | 171 | 		$xml .= '</iptc>'."\n"."\n";
 | 
        
           |  |  | 172 |   | 
        
           |  |  | 173 | 		return $xml;
 | 
        
           |  |  | 174 | 	}
 | 
        
           | 623 | aurelien | 175 |   | 
        
           | 970 | aurelien | 176 | 	private function convertirXmpVersXML($donnees_meta) {
 | 
        
           | 623 | aurelien | 177 |   | 
        
           | 970 | aurelien | 178 | 		$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
 | 
        
           |  |  | 179 | 		$xml .= '<xmp>';
 | 
        
           |  |  | 180 | 		if (isset($donnees_meta['XMP'])) {
 | 
        
           |  |  | 181 | 			foreach ($donnees_meta['XMP'] as $prop => &$valeur) {
 | 
        
           |  |  | 182 | 				$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
 | 
        
           |  |  | 183 | 			}
 | 
        
           |  |  | 184 | 		}
 | 
        
           |  |  | 185 | 		$xml .= '</xmp>';
 | 
        
           |  |  | 186 |   | 
        
           |  |  | 187 | 		return $xml;
 | 
        
           | 623 | aurelien | 188 | 	}
 | 
        
           |  |  | 189 |   | 
        
           | 970 | aurelien | 190 | 	private function convertirMakernoteVersXML($donnees_meta) {
 | 
        
           |  |  | 191 |   | 
        
           |  |  | 192 | 		$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
 | 
        
           |  |  | 193 | 		$xml .= '<makernote>';
 | 
        
           |  |  | 194 | 		if (isset($donnees_meta['MAKERNOTE'])) {
 | 
        
           |  |  | 195 | 			foreach ($donnees_meta['MAKERNOTE'] as $prop => &$valeur) {
 | 
        
           |  |  | 196 | 				$xml .= '<'.$prop.' id="'.$valeur['id'].'">'.$valeur['valeur'].'</'.$prop.'>'."\n";
 | 
        
           |  |  | 197 | 			}
 | 
        
           |  |  | 198 | 		}
 | 
        
           |  |  | 199 | 		$xml .= '</makernote>';
 | 
        
           |  |  | 200 |   | 
        
           |  |  | 201 | 		return '';
 | 
        
           | 623 | aurelien | 202 | 	}
 | 
        
           |  |  | 203 | }
 | 
        
           |  |  | 204 | ?>
 |