[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / medias / inc / renseigner_document.php
index 427abac..8ab77f9 100644 (file)
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined("_ECRIRE_INC_VERSION")) return;
+/**
+ * Fonctions pour compléter les informations connues d'un document
+ *
+ * @package SPIP\Medias\Renseigner
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 /**
- * recuperer les infos distantes d'une url,
+ * Récuperer les infos distantes d'une URL,
  * et renseigner pour une insertion en base
- * utilise une variable static car appellee plusieurs fois au cours du meme hit
- * (verification puis traitement)
+ *
+ * Utilise une variable static car appellée plusieurs fois au cours du même hit
+ * (vérification puis traitement)
+ *
+ * Un plugin peut avec le pipeline renseigner_document_distant renseigner
+ * les informations fichier et mode avant l'analyse et traitement par ce plugin,
+ * qui dans ce cas ne les fera pas. Exemple : OEmbed
+ *
+ * @pipeline_appel renseigner_document_distant
  *
  * @param string $source
- * @return string
+ *     URL du document
+ * @return array|string
+ *     Informations sur le fichier distant, sinon message d'erreur.
+ *     Sans erreur, retourne un tableau :
+ *
+ *     - source : URL du fichier
+ *     - distant : Est-ce un fichier distant ?
+ *     - mode : Mode d'inclusion
+ *     - fichier : Chemin local du fichier s'il a été recopié
  */
-function renseigner_source_distante($source){
+function renseigner_source_distante($source) {
        static $infos = array();
-       if (isset($infos[$source]))
+       if (isset($infos[$source])) {
                return $infos[$source];
-       
+       }
+
        include_spip('inc/distant');
        // on passe la source dans le pipeline, le premier plugin
        // qui est capable de renseigner complete
        // fichier et mode + tous les autres champs a son gout
        // ex : oembed
-       $a = pipeline('renseigner_document_distant',array('source'=>$source));
+       $a = pipeline('renseigner_document_distant', array('source' => $source));
 
        // si la source est encore la, en revenir a la
        // methode traditionnelle : chargement de l'url puis analyse
-       if (!isset($a['fichier']) OR !isset($a['mode'])){
+       if (!isset($a['fichier']) or !isset($a['mode'])) {
                if (!$a = recuperer_infos_distantes($a['source'])) {
-                       return _T('medias:erreur_chemin_distant',array('nom'=>$source));
+                       return _T('medias:erreur_chemin_distant', array('nom' => $source));
                }
                # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
                # $a['fichier'] est une copie locale du fichier
@@ -53,62 +77,85 @@ function renseigner_source_distante($source){
 
 /**
  * Renseigner les informations de taille et dimension d'un document
- * 
+ *
  * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document
  * Utilise pour cela les fonctions du répertoire metadatas/*
- * 
+ *
  * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis
  * comme editable dans la déclaration de la table spip_documents
- * 
- * TODO Renommer cette fonction sans "_image"
  *
- * @param string $fichier 
- *             Le fichier à examiner 
+ * @todo
+ *     Renommer cette fonction sans "_image"
+ *
+ * @param string $fichier
+ *     Le fichier à examiner
  * @param string $ext
- *             L'extension du fichier à examiner
+ *     L'extension du fichier à examiner
+ * @param bool $distant
+ *     Indique que le fichier peut etre distant, on essaiera alors d'en recuperer un bout pour en lire les meta infos
  * @return array|string $infos
- *             Si c'est une chaine, c'est une erreur
- *             Si c'est un tableau, l'ensemble des informations récupérées du fichier
+ *
+ *     - Si c'est une chaîne, c'est une erreur
+ *     - Si c'est un tableau, l'ensemble des informations récupérées du fichier
  */
-function renseigner_taille_dimension_image($fichier,$ext){
+function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
 
        $infos = array(
-               'largeur'=>0,
-               'hauteur'=>0,
-               'type_image'=>'',
-               'taille'=>0
+               'largeur' => 0,
+               'hauteur' => 0,
+               'type_image' => '',
+               'taille' => 0
        );
-       
+
        // Quelques infos sur le fichier
        if (
                !$fichier
-               OR !@file_exists($fichier)
-               OR !$infos['taille'] = @intval(filesize($fichier))) {
-                       spip_log ("Echec copie du fichier $fichier");
-                       return _T('medias:erreur_copie_fichier',array('nom'=> $fichier));
+               or !@file_exists($fichier)
+               or !$infos['taille'] = @intval(filesize($fichier))
+       ) {
+               if ($distant) {
+                       // on ne saura pas la taille
+                       unset($infos['taille']);
+
+                       // recuperer un debut de fichier 512ko semblent suffire
+                       $tmp = _DIR_TMP . md5($fichier);
+                       $res = recuperer_url($fichier, array('file' => $tmp, 'taille_max' => 512 * 1024));
+                       if (!$res) {
+                               spip_log("Echec copie du fichier $fichier", 'medias');
+
+                               return _T('medias:erreur_copie_fichier', array('nom' => $fichier));
+                       }
+                       $fichier = $tmp;
+               } else {
+                       spip_log("Echec copie du fichier $fichier", 'medias');
+
+                       return _T('medias:erreur_copie_fichier', array('nom' => $fichier));
+               }
        }
 
        // chercher une fonction de description
        $meta = array();
-       if ($metadata = charger_fonction($ext,"metadata",true)){
+       if ($metadata = charger_fonction($ext, 'metadata', true)) {
                $meta = $metadata($fichier);
-       }
-       else {
-               $media = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($ext));
-               if ($metadata = charger_fonction($media,"metadata",true)){
+       } else {
+               $media = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($ext));
+               if ($metadata = charger_fonction($media, 'metadata', true)) {
                        $meta = $metadata($fichier);
                }
        }
 
-       $meta = pipeline('renseigner_document',array('args'=>array('extension'=>$ext,'fichier'=>$fichier),'data' => $meta));
+       $meta = pipeline(
+               'renseigner_document',
+               array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)
+       );
 
        include_spip('inc/filtres'); # pour objet_info()
-       $editables = objet_info('document','champs_editables');
-       foreach($meta as $m=>$v)
-               if (isset($infos[$m]) OR in_array($m,$editables))
+       $editables = objet_info('document', 'champs_editables');
+       foreach ($meta as $m => $v) {
+               if (isset($infos[$m]) or in_array($m, $editables)) {
                        $infos[$m] = $v;
+               }
+       }
 
        return $infos;
 }
-
-?>
\ No newline at end of file