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

Last change on this file since 47868 was 47868, checked in by brunobergot@…, 9 years ago

deux options de config en plus : mode kermesse (détection automatique des liens oembed dans les pages distantes, ignore la liste blanche des providers) + possiblité de désactiver l'autoembed des urls placées dans les textes

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