3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
14 * Fonctions pour compléter les informations connues d'un document
16 * @package SPIP\Medias\Renseigner
19 if (!defined('_ECRIRE_INC_VERSION')) {
24 * Récuperer les infos distantes d'une URL,
25 * et renseigner pour une insertion en base
27 * Utilise une variable static car appellée plusieurs fois au cours du même hit
28 * (vérification puis traitement)
30 * Un plugin peut avec le pipeline renseigner_document_distant renseigner
31 * les informations fichier et mode avant l'analyse et traitement par ce plugin,
32 * qui dans ce cas ne les fera pas. Exemple : OEmbed
34 * @pipeline_appel renseigner_document_distant
36 * @param string $source
38 * @return array|string
39 * Informations sur le fichier distant, sinon message d'erreur.
40 * Sans erreur, retourne un tableau :
42 * - source : URL du fichier
43 * - distant : Est-ce un fichier distant ?
44 * - mode : Mode d'inclusion
45 * - fichier : Chemin local du fichier s'il a été recopié
47 function renseigner_source_distante($source) {
48 static $infos = array();
49 if (isset($infos[$source])) {
50 return $infos[$source];
53 include_spip('inc/distant');
54 // on passe la source dans le pipeline, le premier plugin
55 // qui est capable de renseigner complete
56 // fichier et mode + tous les autres champs a son gout
58 $a = pipeline('renseigner_document_distant', array('source' => $source));
60 // si la source est encore la, en revenir a la
61 // methode traditionnelle : chargement de l'url puis analyse
62 if (!isset($a['fichier']) or !isset($a['mode'])) {
63 if (!$a = recuperer_infos_distantes($a['source'])) {
64 return _T('medias:erreur_chemin_distant', array('nom' => $source));
66 # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
67 # $a['fichier'] est une copie locale du fichier
69 $a['distant'] = 'oui';
70 $a['mode'] = 'document';
71 $a['fichier'] = set_spip_doc($source);
74 // stocker pour la seconde demande
75 return $infos[$source] = $a;
79 * Renseigner les informations de taille et dimension d'un document
81 * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document
82 * Utilise pour cela les fonctions du répertoire metadatas/*
84 * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis
85 * comme editable dans la déclaration de la table spip_documents
88 * Renommer cette fonction sans "_image"
90 * @param string $fichier
91 * Le fichier à examiner
93 * L'extension du fichier à examiner
94 * @param bool $distant
95 * Indique que le fichier peut etre distant, on essaiera alors d'en recuperer un bout pour en lire les meta infos
96 * @return array|string $infos
98 * - Si c'est une chaîne, c'est une erreur
99 * - Si c'est un tableau, l'ensemble des informations récupérées du fichier
101 function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
110 // Quelques infos sur le fichier
113 or !@file_exists
($fichier)
114 or !$infos['taille'] = @intval
(filesize($fichier))
117 // on ne saura pas la taille
118 unset($infos['taille']);
120 // recuperer un debut de fichier 512ko semblent suffire
121 $tmp = _DIR_TMP
. md5($fichier);
122 $res = recuperer_url($fichier, array('file' => $tmp, 'taille_max' => 512 * 1024));
124 spip_log("Echec copie du fichier $fichier", 'medias');
126 return _T('medias:erreur_copie_fichier', array('nom' => $fichier));
130 spip_log("Echec copie du fichier $fichier", 'medias');
132 return _T('medias:erreur_copie_fichier', array('nom' => $fichier));
136 // chercher une fonction de description
138 if ($metadata = charger_fonction($ext, 'metadata', true)) {
139 $meta = $metadata($fichier);
141 $media = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($ext));
142 if ($metadata = charger_fonction($media, 'metadata', true)) {
143 $meta = $metadata($fichier);
148 'renseigner_document',
149 array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)
152 include_spip('inc/filtres'); # pour objet_info()
153 $editables = objet_info('document', 'champs_editables');
154 foreach ($meta as $m => $v) {
155 if (isset($infos[$m]) or in_array($m, $editables)) {