diff --git a/.gitattributes b/.gitattributes index 96d2cd57df1005d35fbbfb6cf594e473d089d57e..a43e58d1f02179a4404929d30060ca4f0375610b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -71,6 +71,10 @@ lang/medias_fr.php -text /medias_autoriser.php -text /medias_fonctions.php -text /medias_pipelines.php -text +metadata/flv.php -text +metadata/image.php -text +metadata/svg.php -text +metadata/swf.php -text modalbox/jquery.simplemodal-1.3.3.js -text modalbox/modal_closebox.png -text modalbox/modalbox.js -text diff --git a/inc/renseigner_document.php b/inc/renseigner_document.php index d2fd721b02ad499d135c4bc39ede66dfc2c39eb3..f1d72c5e548728a826bf4169a2d377fb25c21ff3 100644 --- a/inc/renseigner_document.php +++ b/inc/renseigner_document.php @@ -52,10 +52,14 @@ function renseigner_source_distante($source){ * @return <type> */ function renseigner_taille_dimension_image($fichier,$ext){ - $infos = array(); - - $infos['type_image'] = false; + $infos = array( + 'largeur'=>0, + 'hauteur'=>0, + 'type_image'=>'', + 'taille'=>0 + ); + // Quelques infos sur le fichier if ( !$fichier @@ -65,110 +69,22 @@ function renseigner_taille_dimension_image($fichier,$ext){ return _T('medias:erreur_copie_fichier',array('nom'=> $fichier)); } - // VIDEOS : Prevoir traitement specifique ? - // (http://www.getid3.org/ peut-etre) - if ($ext == "mov") { - $infos['largeur'] = 0; - $infos['hauteur'] = 0; - } - - // SVG : recuperer les dimensions et supprimer les scripts - elseif ($ext == "svg") { - list($infos['largeur'],$infos['hauteur'])= traite_svg($fichier); - } - - // image ? - else { - - // Si c'est une image, recuperer sa taille et son type (detecte aussi swf) - $size_image = @getimagesize($fichier); - $infos['largeur'] = intval($size_image[0]); - $infos['hauteur'] = intval($size_image[1]); - $infos['type_image'] = decoder_type_image($size_image[2]); + // chercher une fonction de description + $meta = array(); + if ($metadata = charger_fonction($ext,"metadata",true)){ + $meta = $metadata($fichier); } + else { + $media = sql_getfetsel('media','spip_types_documents','extension='.sql_quote($ext)); + if ($metadata = charger_fonction($media,"metadata",true)){ + $meta = $metadata($fichier); + } + } + foreach($meta as $m=>$v) + if (in_array($m,array('largeur','hauteur','type_image'/*,'duree'*/))) + $infos[$m] = $v; return $infos; } -if (!function_exists('traite_svg')){ -/** - * Determiner les dimensions d'un svg, et enlever ses scripts si necessaire - * - * @param string $file - * @return array - */ -// http://doc.spip.org/@traite_svg -function traite_svg($file) -{ - $texte = spip_file_get_contents($file); - - // Securite si pas admin : virer les scripts et les references externes - // sauf si on est en mode javascript 'ok' (1), cf. inc_version - if ($GLOBALS['filtrer_javascript'] < 1 - AND $GLOBALS['visiteur_session']['statut'] != '0minirezo') { - include_spip('inc/texte'); - $new = trim(safehtml($texte)); - // petit bug safehtml - if (substr($new,0,2) == ']>') $new = ltrim(substr($new,2)); - if ($new != $texte) ecrire_fichier($file, $texte = $new); - } - - $width = $height = 150; - if (preg_match(',<svg[^>]+>,', $texte, $s)) { - $s = $s[0]; - if (preg_match(',\WviewBox\s*=\s*.\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+),i', $s, $r)){ - $width = $r[3]; - $height = $r[4]; - } else { - // si la taille est en centimetre, estimer le pixel a 1/64 de cm - if (preg_match(',\Wwidth\s*=\s*.(\d+)([^"\']*),i', $s, $r)){ - if ($r[2] != '%') { - $width = $r[1]; - if ($r[2] == 'cm') $width <<=6; - } - } - if (preg_match(',\Wheight\s*=\s*.(\d+)([^"\']*),i', $s, $r)){ - if ($r[2] != '%') { - $height = $r[1]; - if ($r[2] == 'cm') $height <<=6; - } - } - } - } - return array($width, $height); -} -} - -if (!function_exists('decoder_type_image')){ -/** - * Convertit le type numerique retourne par getimagesize() en extension fichier - * - * @param int $type - * @param bool $strict - * @return string - */ -// http://doc.spip.org/@decoder_type_image -function decoder_type_image($type, $strict = false) { - switch ($type) { - case 1: - return "gif"; - case 2: - return "jpg"; - case 3: - return "png"; - case 4: - return $strict ? "" : "swf"; - case 5: - return "psd"; - case 6: - return "bmp"; - case 7: - case 8: - return "tif"; - default: - return ""; - } -} -} - ?> \ No newline at end of file diff --git a/metadata/flv.php b/metadata/flv.php new file mode 100644 index 0000000000000000000000000000000000000000..a3eb2403c6dfb0ac81f13483e1649932ea418c99 --- /dev/null +++ b/metadata/flv.php @@ -0,0 +1,36 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2011 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined('_ECRIRE_INC_VERSION')) return; + +function metadata_flv_dist($file, $bigindian = true){ + $meta = array(); + + if ($fd = fopen($file, 'r') + AND $raw = fread($fd, 512)){ + + $keys = array('largeur'=>'width', 'hauteur'=>'height','duree'=>'duration','framerate'=>'framerate'); + foreach ($keys as $m=>$k) { + if (($i = strpos($raw, $k))>-1){ + $bytes = substr($raw, $i+strlen($k)+1, 8); + if ($bigindian) + $bytes = strrev($bytes); + $zz = unpack("dflt", $bytes); // unpack the bytes + $meta[$m] = $zz['flt']; // return the number from the associative array + } + } + } + + return $meta; +} + +?> \ No newline at end of file diff --git a/metadata/image.php b/metadata/image.php new file mode 100644 index 0000000000000000000000000000000000000000..544514cd1ae0ccdabc6a3ae44812f68c1043b86f --- /dev/null +++ b/metadata/image.php @@ -0,0 +1,56 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2011 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined('_ECRIRE_INC_VERSION')) return; + +function metadata_image_dist($fichier){ + $meta = array(); + + if ($size_image = @getimagesize($fichier)) { + $meta['largeur'] = intval($size_image[0]); + $meta['hauteur'] = intval($size_image[1]); + $meta['type_image'] = decoder_type_image($size_image[2]); + } + + return $meta; +} + +/** + * Convertit le type numerique retourne par getimagesize() en extension fichier + * + * @param int $type + * @param bool $strict + * @return string + */ +// http://doc.spip.org/@decoder_type_image +function decoder_type_image($type, $strict = false) { + switch ($type) { + case 1: + return "gif"; + case 2: + return "jpg"; + case 3: + return "png"; + case 4: + return $strict ? "" : "swf"; + case 5: + return "psd"; + case 6: + return "bmp"; + case 7: + case 8: + return "tif"; + default: + return ""; + } +} +?> \ No newline at end of file diff --git a/metadata/svg.php b/metadata/svg.php new file mode 100644 index 0000000000000000000000000000000000000000..022233d16fc71a03d1f97347fc135f6289abe49e --- /dev/null +++ b/metadata/svg.php @@ -0,0 +1,63 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2011 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined('_ECRIRE_INC_VERSION')) return; + +/** + * Determiner les dimensions d'un svg, et enlever ses scripts si necessaire + * + * @param string $file + * @return array + */ +// http://doc.spip.org/@traite_svg +function medata_svg_dist($file){ + $meta = array(); + + $texte = spip_file_get_contents($file); + + // Securite si pas admin : virer les scripts et les references externes + // sauf si on est en mode javascript 'ok' (1), cf. inc_version + if ($GLOBALS['filtrer_javascript'] < 1 + AND $GLOBALS['visiteur_session']['statut'] != '0minirezo') { + include_spip('inc/texte'); + $new = trim(safehtml($texte)); + // petit bug safehtml + if (substr($new,0,2) == ']>') $new = ltrim(substr($new,2)); + if ($new != $texte) ecrire_fichier($file, $texte = $new); + } + + $width = $height = 150; + if (preg_match(',<svg[^>]+>,', $texte, $s)) { + $s = $s[0]; + if (preg_match(',\WviewBox\s*=\s*.\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+),i', $s, $r)){ + $width = $r[3]; + $height = $r[4]; + } else { + // si la taille est en centimetre, estimer le pixel a 1/64 de cm + if (preg_match(',\Wwidth\s*=\s*.(\d+)([^"\']*),i', $s, $r)){ + if ($r[2] != '%') { + $width = $r[1]; + if ($r[2] == 'cm') $width <<=6; + } + } + if (preg_match(',\Wheight\s*=\s*.(\d+)([^"\']*),i', $s, $r)){ + if ($r[2] != '%') { + $height = $r[1]; + if ($r[2] == 'cm') $height <<=6; + } + } + } + } + $meta['largeur'] = $width; + $meta['hauteur'] = $height; + return $meta; +} \ No newline at end of file diff --git a/metadata/swf.php b/metadata/swf.php new file mode 100644 index 0000000000000000000000000000000000000000..ab1ceb5b4626d5e947982c2fb2ac42fb603b588c --- /dev/null +++ b/metadata/swf.php @@ -0,0 +1,18 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2011 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined('_ECRIRE_INC_VERSION')) return; + +function metadata_swf_dist($file){ + $metadata = charger_fonction('image','metadata'); + return $metadata($file); +} \ No newline at end of file