source: spip-zone/_core_/plugins/medias/inc/renseigner_document.php

Last change on this file was 113294, checked in by spip.franck@…, 10 months ago

Il parait que le futur c'est maintenant :-D

File size: 5.1 KB
Line 
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
19if (!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 */
47function 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 */
101function 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}
Note: See TracBrowser for help on using the repository browser.