Goofi: ramener des google fonts en local en une ligne

Ceux qui, avec une ténacité et une abnégation forçant le respect autant que l'admiration, me suivent depuis longtemps se souviennent sans doute de Goofy, un script php permettant de récupérer les fontes de google sous forme de zip prêt à l'emploi...

Ben je trouvais ça encore un peu lourd, sans compter qu'il faut tout le temps modifier le script pour qu'il continue à fonctionner. Par voie de conséquence, j'ai repris l'idée mais en la modifiant quelque peu...

Ce nouveau script s'utilise de façon radicalement différente: en effet, il suffit de l'appeler via la balise du header, comme le fait la balise proposée par google, sauf qu'on remplace l'url de google par celle de goofi:

<link href="https://fonts.googleapis.com/css?family=Nunito+Sans|Roboto" rel="stylesheet">

devient

<link href="http://monserveur.com/goofi.php?family=Nunito+Sans|Roboto" rel="stylesheet">

Et... c'est tout.

Goofi.php va :

  1. chercher le css fourni par Google,
  2. récupérer les fontes pour les copier en local
  3. recrér le css en remplaçant les chemins google par les chemins locaux,
  4. stocker le tout sur le serveur
  5. et renvoyer le css sous forme de feuille de style.

Le téléchargement ne se fait que la première fois, et seulement depuis le serveur, ainsi l'usager n'a-t-il rien à craindre du flicage goorwellien

Le script en question:

<?php 
header("Content-Type: text/css");
$font_folder='fonts';
if (!empty($_GET['family'])){
    if (!is_dir($font_folder)){mkdir($font_folder);}
    $family=strip_tags($_GET['family']);
    $css_filename=urlencode($family).'.css';
    $css_file_url='http://fonts.googleapis.com/css?family='.urlencode($family);
    if (!is_file($css_filename)){
        $css=file_get_contents($css_file_url);

        preg_match_all("#font-family: '(?P<name>[^']+)[<img class="smile normal" src="http://warriordudimanche.net/plugins/WDD_replace/img/normal/satisfait.png"/>]*?url\((?P<url>[^\)]+)\)#", $css, $urls);

        foreach($urls['url'] as $nb=>$url){
            $font_file=$urls['name'][$nb].basename($url);
            if (!is_file($font_folder.'/'.$font_file)){
                $font=file_get_contents($url);
                file_put_contents($font_folder.'/'.$font_file, $font);
            }
            $css=str_replace($url,$font_folder.'/'.$font_file,$css);
        }
        file_put_contents($css_filename,$css );
    }else{
        $css=file_get_contents($css_filename);
    }
    exit($css);
}

Le Zip et le dépôt

❝ 8 commentaires ❞

1  jerry wham le

 
2  Nicolas le

Mais c'est super, merci beaucoup !

 
3  Beanux le

J'avais essayé de faire la même chose d'un point de vue utilisateur pour éviter le flicage pour les googles api.
Mon Dns renvoyait l'ip de mon serveur qui contenait les Gapi (un script python (très) moche qui récupère les l'ensemble des Gapi). Mais a cause de l'https ça ne passait pas vu que ça demandais un serveur google et que l'ip pointait sur mon serveur perso qui n'est pas google"


Je me suis rabatu sur le plugin foxreplace qui remplace l’appelle "ajax.googleapis.com" par mon serveur, et le tour est joué.
Je vais voir si je peux récupérer la liste des fonts de google pour faire de même avec.

 
4  CgX le

Je viens de faire tourner goofi, et j'ai remarqué qu'il choppe le CSS des font-face chez google avec la fonction file_get_contents().


Or, cette fonction n'indique pas le navigateur utilisé et renvoie toujours un fichier css avec les fontes en .ttf
Google prend en compte le navigateur qui appelle le script et s'adapte. Par exemple, avec Firefox, il renvoie plutôt des .woff2, qui est un format plus adapté.


Il faudrait améliorer le script pour prendre en compte ces choses là. (Je compte me pencher dessus, d'ailleurs)


Bref, Goofy, c'est bien...mais pas suffisant pour le moment

 
5  Bronco le

Je comprends... toutefois, je n'ai vu aucun problème sous firefox/chrome/android. Après, émuler le navigateur du visiteur pour effectuer une requête via curl, ça reste possible...
Je me le note

 
6  CgX le

Je me suis penché dessus : c'est fait, c'est fait :D


Du coup ça enregistre une version du font-face par navigateur, forcément.
J'ai aussi réadapté certains trucs à ma sauce.


https://github.com/cgxxx/goofi/blob/master/goofi.php

 
7  Bronco le

Cool \o/
Merci, je mettrai à jour aussi ;-)

 
8  Coki le

Bonjour,


j'utilise ton script, il est top (Google n'a pas à savoir qui consulte mes sites).


J'ai juste rencontré un petit soucis sur les polices contenant un espace dans leur nom (à savoir 'Roboto Condensed' et 'Sources Sans') que mon serveur ne semblait pas trouver.


Si quelqu'un rencontre ce problème, j'ai juste supprimé les espaces dans le noms des polices:
$font_file=str_replace(' ', '', $urls['name'][$nb].basename($url));


Et depuis ça marche super!


Encore merci

 

Fil RSS des commentaires de cet article

✍ Écrire un commentaire

les commentaires relevant du SPAM seront filtrés et dégagés direct...

Quelle est le premier caractère du mot 4h857 ?