Subversion Repositories eFlore/Applications.cel

Rev

Rev 632 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
?>