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

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

permettre de configurer maxwidth et maxheight dans la config du plugin
inverser les 2 forms de config sur la page de config (les providers sont moins important car presumes pre-configures)
modifier la fonction oembed_recuperer_data :

  • si on ne lui fournit pas de maxheight/maxwidth : utiliser ceux par defaut (ou TODO du provider si precises)
  • si on fournit , ne pas demander maxheight/maxwidth
  • cacher la requete pour eviter de la faire 2 fois (principale et pour vignette)

version a 3 digits

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