source: spip-zone/_plugins_/oembed/inc/oembed.php @ 54448

Last change on this file since 54448 was 54448, checked in by cedric@…, 8 years ago

modification de la signature de oembed_verifier_provider et oembed_detecter_lien qui renvoient un tableau associatif decrivant le provider et plus seulement le endpoint
ajout d'un appel a post-traitement sur le retour du provider :
si une fonction oembed_posttraite_{$provider_name}_$type[_dist] existe elle est appelee pour post-traiter les donnees
ajout d'une telle fonction pour youtube_video qui extrait l'url du html pour peupler la valeur url des donnees
modification de l'insertion du document : si url est connu, on insere en document distant, avec recuperation de donnees distantes (taille, format etc)
sinon insertion en html statique comme auparavant, ce qui est un pis aller
Cette modification permet d'inserer par exemple les video youtube au format swf dans la base, et elles sont bien identifiees comme sequences
l'insertion de fait par <emb>

File size: 4.4 KB
Line 
1<?php
2/**
3 * Plugin oEmbed
4 * Licence GPL3
5 *
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return;
9
10// Merci WordPress :)
11// http://core.trac.wordpress.org/browser/trunk/wp-includes/class-oembed.php
12
13/**
14 * Récupérer les données oembed d'une url
15 *
16 * @param string $url url de la page qui contient le document à récupérer avec oembed
17 * @param int $maxwidth largeur max du document
18 *   null : la valeur configuree par defaut ou pour le provider est utilisee
19 *   '' : pas de valeur max
20 * @param int $maxheight hauteur max du document
21 *   null : la valeur configuree par defaut ou pour le provider est utilisee
22 *   '' : pas de valeur max
23 * @param string $format format à utiliser pour la requete oembed (json ou xml)
24 * @param string $detecter_lien tenter la détection automatique de lien oembed dans la page indiquée
25 * @return bool|array false si aucun retour ou erreur ; tableau des éléménents de la réponse oembed
26 */
27function oembed_recuperer_data($url, $maxwidth = null, $maxheight = null, $format = 'json', $detecter_lien = 'non') {
28        static $cache = array();
29        $provider = false;
30       
31        $provider = oembed_verifier_provider($url);
32
33        if ((!$provider)
34          AND (($detecter_lien != 'non') OR lire_config('oembed/detecter_lien','non')=='oui')) {
35                $provider = oembed_detecter_lien($url);
36        }
37
38        if (!$provider)
39                return false;
40       
41        $data_url = parametre_url($provider['endpoint'],'url',$url,'&');
42        include_spip('inc/config');
43        if (is_null($maxwidth)){
44                $maxwidth = lire_config('oembed/maxwidth','600');
45        }
46        if (is_null($maxheight)){
47                $maxheight = lire_config('oembed/maxheight','400');
48        }
49
50        $data_url = parametre_url($data_url,'maxwidth',$maxwidth,'&');
51        $data_url = parametre_url($data_url,'maxheight',$maxheight,'&');
52        $data_url = parametre_url($data_url,'format',$format,'&');
53
54        if (isset($cache[$data_url]))
55                return $cache[$data_url];
56       
57        $cache[$data_url] = false;
58        // on recupere le contenu de la page
59        include_spip('inc/distant');
60        if ($data = recuperer_page($data_url)) {
61                if ($format == 'json')
62                        $cache[$data_url] = json_decode($data,true);
63                // TODO : format xml
64                //if ($format == 'xml')
65                //      $cache[$data_url] = false;
66        }
67
68        // si une fonction de post-traitement est fourni pour ce provider+type, l'utiliser
69        if ($cache[$data_url]){
70                $provider_name= strtolower($cache[$data_url]['provider_name']);
71                $type = strtolower($cache[$data_url]['type']);
72                if ($oembed_provider_posttraite = charger_fonction("posttraite_{$provider_name}_$type",'oembed',true))
73                        $cache[$data_url] = $oembed_provider_posttraite($cache[$data_url]);
74        }
75
76        return $cache[$data_url];
77}
78
79/**
80 * Vérfier qu'une url est dans la liste des providers autorisés
81 *
82 * @param string $url l'url à tester
83 * @return bool|array
84 *   false si non ; details du provider dans un tabeau associatif si oui
85 */
86function oembed_verifier_provider($url) {
87        $providers = sql_allfetsel('*', 'spip_oembed_providers');
88        foreach ($providers as $p) {
89                $regex = '/' . str_replace('\*', '(.+)', preg_quote($p['scheme'], '/')) . '/';
90                if (preg_match($regex, $url)) {
91                        return $p;
92                }
93        }
94        return false;
95}
96
97/**
98 * Détecter les liens oembed dans le head d'une page web
99 *
100 * @param string $url url de la page à analyser
101 * @return bool|string false si pas de lien ; url du contenu oembed
102 */
103function oembed_detecter_lien($url) {
104        $providers = array();
105
106        // on recupere le contenu de la page
107        include_spip('inc/distant');
108        if ($html = recuperer_page($url)) {
109               
110                // types de liens oembed à détecter
111                $linktypes = array(
112                        'application/json+oembed' => 'json',
113                        'text/xml+oembed' => 'xml',
114                        'application/xml+oembed' => 'xml', // uniquement pour Vimeo
115                );
116
117                // on ne garde que le head de la page
118                $head = substr($html,0,stripos($html,'</head>'));
119
120                // un test rapide...
121                $tagfound = false;
122                foreach ($linktypes as $linktype => $format) {
123                        if (stripos($head, $linktype)) {
124                                $tagfound = true;
125                                break;
126                        }
127                }
128               
129                if ($tagfound && preg_match_all('/<link([^<>]+)>/i', $head, $links)) {
130                        foreach ($links[0] as $link) {
131                                $type = extraire_attribut($link,'type');
132                                $href = extraire_attribut($link,'href');
133                                if (!empty($type) AND !empty($linktypes[$type]) AND !empty($href)) {
134                                        $providers[$linktypes[$type]] = $href;
135                                        // on a le json, ça nous suffit
136                                        if ('json' == $linktypes[$type])
137                                                break;
138                                }
139                        }
140                }
141        }
142
143        // on préfère le json au xml
144        if (!empty($providers['json']))
145                return array('endpoint'=>$providers['json']);
146        elseif (!empty($providers['xml']))
147                return array('endpoint'=>$providers['xml']);
148        else
149                return false;
150}
151
152?>
Note: See TracBrowser for help on using the repository browser.