[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / medias / inc / renseigner_document.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
13 /**
14 * Fonctions pour compléter les informations connues d'un document
15 *
16 * @package SPIP\Medias\Renseigner
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Récuperer les infos distantes d'une URL,
25 * et renseigner pour une insertion en base
26 *
27 * Utilise une variable static car appellée plusieurs fois au cours du même hit
28 * (vérification puis traitement)
29 *
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
33 *
34 * @pipeline_appel renseigner_document_distant
35 *
36 * @param string $source
37 * URL du document
38 * @return array|string
39 * Informations sur le fichier distant, sinon message d'erreur.
40 * Sans erreur, retourne un tableau :
41 *
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é
46 */
47 function renseigner_source_distante($source) {
48 static $infos = array();
49 if (isset($infos[$source])) {
50 return $infos[$source];
51 }
52
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
57 // ex : oembed
58 $a = pipeline('renseigner_document_distant', array('source' => $source));
59
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));
65 }
66 # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
67 # $a['fichier'] est une copie locale du fichier
68 unset($a['body']);
69 $a['distant'] = 'oui';
70 $a['mode'] = 'document';
71 $a['fichier'] = set_spip_doc($source);
72 }
73
74 // stocker pour la seconde demande
75 return $infos[$source] = $a;
76 }
77
78 /**
79 * Renseigner les informations de taille et dimension d'un document
80 *
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/*
83 *
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
86 *
87 * @todo
88 * Renommer cette fonction sans "_image"
89 *
90 * @param string $fichier
91 * Le fichier à examiner
92 * @param string $ext
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
97 *
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
100 */
101 function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
102
103 $infos = array(
104 'largeur' => 0,
105 'hauteur' => 0,
106 'type_image' => '',
107 'taille' => 0
108 );
109
110 // Quelques infos sur le fichier
111 if (
112 !$fichier
113 or !@file_exists($fichier)
114 or !$infos['taille'] = @intval(filesize($fichier))
115 ) {
116 if ($distant) {
117 // on ne saura pas la taille
118 unset($infos['taille']);
119
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));
123 if (!$res) {
124 spip_log("Echec copie du fichier $fichier", 'medias');
125
126 return _T('medias:erreur_copie_fichier', array('nom' => $fichier));
127 }
128 $fichier = $tmp;
129 } else {
130 spip_log("Echec copie du fichier $fichier", 'medias');
131
132 return _T('medias:erreur_copie_fichier', array('nom' => $fichier));
133 }
134 }
135
136 // chercher une fonction de description
137 $meta = array();
138 if ($metadata = charger_fonction($ext, 'metadata', true)) {
139 $meta = $metadata($fichier);
140 } else {
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);
144 }
145 }
146
147 $meta = pipeline(
148 'renseigner_document',
149 array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)
150 );
151
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)) {
156 $infos[$m] = $v;
157 }
158 }
159
160 return $infos;
161 }