Changeset 103884 in spip-zone


Ignore:
Timestamp:
Apr 10, 2017, 9:40:20 PM (15 months ago)
Author:
cedric@…
Message:

Prise en charge de mastodon que l'on oembed comme twitter :

  • il faut que l'autodetection du provider soit activee dans la configuration puisque chaque instance est un provider, on ne peut pas les whitelister
  • on est oblige de faire la detection de mastodon dans le HTML de la page source, pour unifier, sinon chaque instance a son provider_name
  • on va extraire le texte et la date dans le contenu de l'iframe pour generer un blockquote comme pour twitter, ce qui permet d'etre homogene

(l'iframe est moche, et pose plein de problemes de rendu)

On verra si c'est stable dans le temps !

Location:
_plugins_/oembed
Files:
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/oembed/css/oembed.css

    r86715 r103884  
    8585.oembed_audio .oe-play-button:hover button{background-color: #DD2826;}
    8686.oembed_audio .oe-play-button:hover button:before{border-color:#fff;}
     87
     88/* Mastodon */
     89.oembed_mastodon .oembed-source {display: none;}
     90.oembed_mastodon .spip_doc_titre {display: none;}
     91.oembed_mastodon .oe-rich {max-width:none !important;}
  • _plugins_/oembed/inc/oembed.php

    r103149 r103884  
    133133        }
    134134
    135         $data_url = parametre_url(url_absolue($provider['endpoint'], url_de_base()), 'url', $url, '&');
     135        $data_url = url_absolue($provider['endpoint'], url_de_base());
     136
     137        // certains oembed fournissent un endpoint qui contient deja l'URL, parfois differente de celle de la page
     138        if (!parametre_url($data_url, 'url')) {
     139                $data_url = parametre_url($data_url, 'url', $url, '&');
     140        }
     141
    136142        include_spip('inc/config');
    137143        if (!$maxwidth) {
     
    146152        $data_url = parametre_url($data_url, 'format', $format, '&');
    147153
    148         // pre-traitement du provider si besoin
    149         $endpoint = explode('//', $provider['endpoint']);
    150         $endpoint = explode('/', $endpoint[1]);
    151         $endpoint = reset($endpoint);
    152         $endpoint = preg_replace(',\W+,', '_', $endpoint);
    153         if ($oembed_endpoint_pretraite = charger_fonction("pretraite_$endpoint", 'oembed/input', true)) {
     154        if (isset($provider['provider_name']) and $provider['provider_name']) {
     155                $provider_name = $provider['provider_name'];
     156        }
     157        else {
     158                // pre-traitement du provider si besoin
     159                $provider_name = explode('//', $provider['endpoint']);
     160                $provider_name = explode('/', $provider_name[1]);
     161                $provider_name = reset($provider_name);
     162        }
     163        $provider_name = preg_replace(',\W+,', '_', strtolower($provider_name));
     164
     165        if ($oembed_endpoint_pretraite = charger_fonction("pretraite_$provider_name", 'oembed/input', true)) {
    154166                $a = func_get_args();
    155167                $args = array('url'=>array_shift($a));
     
    163175                        $args['format'] = array_shift($a);
    164176                }
     177                $args['endpoint'] = $provider['endpoint'];
    165178                $data_url = $oembed_endpoint_pretraite($data_url, $args);
    166179        }
     
    183196        // si une fonction de post-traitement est fourni pour ce provider+type, l'utiliser
    184197        if ($cache[$data_url]) {
    185                 $provider_name= str_replace(' ', '_', strtolower($cache[$data_url]['provider_name']));
     198                $provider_name2= str_replace(' ', '_', strtolower($cache[$data_url]['provider_name']));
    186199                $type = strtolower($cache[$data_url]['type']);
    187200                // securisons le nom de la fonction (provider peut contenir n'importe quoi)
    188                 $f1 = preg_replace(',\W,', '', "posttraite_{$provider_name}_$type");
    189                 $f2 = preg_replace(',\W,', '', "posttraite_{$provider_name}");
    190                 if ($oembed_provider_posttraite = charger_fonction($f1, 'oembed/input', true)
    191                         or $oembed_provider_posttraite = charger_fonction($f2, 'oembed/input', true)) {
     201                $f1 = preg_replace(',\W,', '', "posttraite_{$provider_name2}_$type");
     202                $f2 = preg_replace(',\W,', '', "posttraite_{$provider_name2}");
     203                $f3 = preg_replace(',\W,', '', "posttraite_{$provider_name}_$type");
     204                $f4 = preg_replace(',\W,', '', "posttraite_{$provider_name}");
     205                if (
     206                     $oembed_provider_posttraite = charger_fonction($f1, 'oembed/input', true)
     207                  or $oembed_provider_posttraite = charger_fonction($f2, 'oembed/input', true)
     208                  or $oembed_provider_posttraite = charger_fonction($f3, 'oembed/input', true)
     209                  or $oembed_provider_posttraite = charger_fonction($f4, 'oembed/input', true) ) {
    192210                        $cache[$data_url] = $oembed_provider_posttraite($cache[$data_url], $url);
    193211                }
     
    231249        $providers = array();
    232250
     251        $oembed_recuperer_url = charger_fonction('oembed_recuperer_url', 'inc');
    233252        // on recupere le contenu de la page
    234253        include_spip('inc/distant');
     254
    235255        if ($html = recuperer_page($url)) {
    236256                // types de liens oembed à détecter
     
    269289        }
    270290
     291        $res = array();
     292
    271293        // on préfère le json au xml
    272294        if (!empty($providers['json'])) {
    273                 return array('endpoint'=>$providers['json']);
     295                $res['endpoint'] = $providers['json'];
    274296        } elseif (!empty($providers['xml'])) {
    275                 return array('endpoint' => $providers['xml']);
     297                $res['endpoint'] = $providers['xml'];
    276298        } else {
    277299                return false;
    278300        }
     301
     302        // detecter certains providers specifiques : ex mastodon, chaque instance a son nom et on peut pas l'identifier par son URL
     303        if (strpos($html, '//github.com/tootsuite/mastodon') !== false) {
     304                $res['provider_name'] = 'Mastodon';
     305        }
     306
     307        return $res;
    279308}
    280309
  • _plugins_/oembed/inc/oembed_recuperer_url.php

    r98148 r103884  
    3030                curl_setopt($c, CURLOPT_URL, $oembed_url);
    3131                curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
     32                curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
     33                curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    3234
    3335                if (isset($GLOBALS['meta']['http_proxy']) and $GLOBALS['meta']['http_proxy']) {
  • _plugins_/oembed/oembed/input/posttraite_mastodon.php

    r103877 r103884  
    1010}
    1111
    12 function oembed_input_posttraite_twitter_dist($data) {
     12function oembed_input_posttraite_mastodon_dist($data) {
    1313
    14         $data['html'] = trim(preg_replace(',<script[^>]*></script>,i', '', $data['html']));
     14        if ($iframe = extraire_balise($data['html'], 'iframe')) {
     15                $iframe_cor = vider_attribut($iframe, 'height');
     16                $iframe_cor = vider_attribut($iframe_cor, 'scrolling');
     17                $iframe_cor = vider_attribut($iframe_cor, 'style');
     18
     19                $data['html'] = str_replace($data['html'], $iframe, $iframe_cor);
     20                $src = extraire_attribut($iframe_cor, 'src');
     21
     22                // si on sait mieux faire en faisant un extract du contenu de l'iframe on y go, car les iframe c'est moche
     23                if ($html = recuperer_page($src)) {
     24                        $texte = $date_link = "";
     25                        if ($p = strpos($html, 'status__content')
     26                          and $p1 = strpos($html, '<p', $p)
     27                          and $p2 = strpos($html, '</p>', $p1)
     28                        ) {
     29                                $texte = substr($html, $p1, $p2 - $p1 +4);
     30                        }
     31                        if ($p = strpos($html, 'dt-published')
     32                          and $p1 = strpos($html, '<a', $p)
     33                          and $p2 = strpos($html, '</a>', $p1)
     34                        ) {
     35                                $date_link = substr($html, $p1, $p2 - $p1 +4);
     36                        }
     37
     38                        if ($texte and $date_link) {
     39                                $html = "<blockquote class=\"twitter-tweet\">".$texte."\n&mdash; ".$data['author_name'];
     40                                $author_account = explode('/users/', $data['author_url']);
     41                                $a = "@".end($author_account)."@".trim(protocole_implicite(reset($author_account)),'/');
     42                                $html .= " ($a) $date_link\n</blockquote>";
     43
     44                                $data['html'] = $html;
     45                                $data['height'] = null;
     46                        }
     47                }
     48
     49
     50        }
     51        $data['provider_name'] = 'Mastodon';
    1552
    1653        return $data;
  • _plugins_/oembed/paquet.xml

    r103720 r103884  
    22        prefix="oembed"
    33        categorie="multimedia"
    4         version="1.6.12"
     4        version="1.7.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.