|
|
<?php |
|
|
|
|
|
/***************************************************************************\ |
|
|
* SPIP, Systeme de publication pour l'internet * |
|
|
* * |
|
|
* Copyright (c) 2001-2020 * |
|
|
* 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. * |
|
|
\***************************************************************************/ |
|
|
|
|
|
/** |
|
|
* Fonctions pour compléter les informations connues d'un document |
|
|
* |
|
|
* @package SPIP\Medias\Renseigner |
|
|
**/ |
|
|
|
|
|
if (!defined('_ECRIRE_INC_VERSION')) { |
|
|
return; |
|
|
} |
|
|
|
|
|
/** |
|
|
* Récuperer les infos distantes d'une URL, |
|
|
* et renseigner pour une insertion en base |
|
|
* |
|
|
* 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 |
|
|
* 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) { |
|
|
static $infos = array(); |
|
|
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)); |
|
|
|
|
|
// 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 (!$a = recuperer_infos_distantes($a['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 |
|
|
unset($a['body']); |
|
|
$a['distant'] = 'oui'; |
|
|
$a['mode'] = 'document'; |
|
|
$a['fichier'] = set_spip_doc($source); |
|
|
} |
|
|
|
|
|
// stocker pour la seconde demande |
|
|
return $infos[$source] = $a; |
|
|
} |
|
|
|
|
|
/** |
|
|
* 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 |
|
|
* @param string $ext |
|
|
* 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 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, $distant = false) { |
|
|
|
|
|
$infos = array( |
|
|
'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)) |
|
|
) { |
|
|
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)) { |
|
|
$meta = $metadata($fichier); |
|
|
} 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) |
|
|
); |
|
|
|
|
|
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)) { |
|
|
$infos[$m] = $v; |
|
|
} |
|
|
} |
|
|
|
|
|
return $infos; |
|
|
}
|
|
|
|