Appli: Metabook - search ebooks on multiple websites

Parfois un pouet sur Mastodon pour partager une URL et une idée concorde avec un truc que t'avais déjà fait : https://framapiaf.org/@bronco/108423992250980547

Ainsi, Gilles me fait passer une adresse de métamoteur de recherche d'ebooks ( https://recherche-ebook.fr/ ) tout en notant que ce serait bien de faire une version qui soit plus propre... (pas de JS, de redirections, de pubs etc..)

therese.jpeg

écoutez Thérèse, comme la vie est savoureuse, n'est-ce pas...

Il se trouve que je m'étais fait un script dont le but était justement de charger des urls, de les parser, de récupérer et d'organiser du contenu.

Ça s'appelle Slurp
Pour faire simple, on crée des «profils» correspondant à une série d'URL avec la regex de parsing et le template correspondants. Il suffit alors d'appeler le profil pour obtenir une page de résultats mise en forme.

Comment ça marche ?

  1. on accède au script : ?p=<profil>
  2. slurp accède au fichier de configuration du profil dans packs/<profil>.php
  3. pour chaque url du pack, il charge la page, la parse, met en forme les données dans le template

Le pack est un array du type:

$packs['<profil>']=[
    [
        'url'=>'http://urltoparse.com/',
        'pattern'=>'REGEX PATTERN with (?<name>..) capture',
        'template'=>'<li> HTML Template where data is inserted to : use %name% '
    ],
    [
        'url'=>'http://urltoparse.com/',
        'pattern'=>'REGEX PATTERN with (?<name>..) capture',
        'template'=>'<li> HTML Template where data is inserted to : use %name% '
    ],

];

Dans le template de chaque url,

  • on peut utiliser %variable% pour placer les captures regex : (?<title>[^"]*?)%title%
  • deux variables sont toujours accessibles:
    • %ROOT% pour accéder à l'url du pack
    • %DOMAIN% pour accéder au domaine de cette url (pour compléter une URL relative par exemple)
Ya plus qu'à   adapter

J'ai ajouté la possibilité de créer un dossier au nom du pack contenant un header et un footer pour qu'on puisse faire un site à partir d'un profil. packstemplates/<profil>/

J'ai ensuite créé un pack contenant les principaux sites d'epubs, cherché les patterns regex...

Et voilà: metapub cherche sur six sites en même temps: http://slurp.warriordudimanche.net/?p=ebook

meta.jpg

Comme d'hab

  1. c'est fait à l'arrache, mais vous avez l'habitude
  2. c'est cadeau, faites-en ce que vous voulez: avec slurp, vous pouvez parser les sites que vous voulez (warez, catalogues, porno... )
  3. vous pouvez installer slurp sur votre serveur et adapter le pack ebook au fur et à mesure que des changements se font (domaine, html de la page etc)
  4. vous pouvez télécharger slurp avec le pack ebook ici: http://slurp.warriordudimanche.net/?download

A venir ?

  • On peut déjà commencer par faire une UI moins dégueu, ce sera pas mal
  • slurp permet de récupérer le résultat en json mais le RSS n'est pas encore implémenté...
  • ajouter des sites... et les maintenir.

Enjoy !

❝ 14 commentaires ❞

1  Gilles le

Merci ;)
Du coup, autre idée, inspirée de... : https://duckduckgo.com/newbang
En gros mini formulaire : tu entres l'URL, avec la place pour la query et il crée la formule magique.
Le truc, ça serait de pouvoir rajouter n'importe quel URL qui accepte du GET juste en demandant l'URL avec l'endroit où tu mets le mot à rechercher...
Bon sinon de base c'est déjà pas mal pour faire son propre métamoteur.

 
2  Bronco le

Hé, mais c'est une bonne idée ça aussi


Toutefois, pour que ça fasse le même taf que ce script, il faudrait un formulaire avec la regex et le template en plus 😅


Ou alors, on fait un petit script qui permet d'ajouter/modifier des url de query et qui se contente d'ouvrir les recherches des sites dans une page BLANK

 
3  Gilles le

Ha et l'URL Masto/Framapiaf ne marche pas car mmmm je t'avais parlé en MP :P

 
4  Bronco le

Lol c'est pour çaaaaa ! Je ne pigeais pas ...


 
5  Gilles le

Et je viens de comprendre le coup du parsing en regex, tu parles des résultats et là en effet, faut faire à la main... chaud !

 
6  Bronco le

En fait, je ne vois que deux solutions pour récupérer des données sur une page HTML en PHP: une lib pour parcourir le dom (simpleXML ou autre) ou les regex... Avec leurs avantages et inconvénients.



  • XML parser : propre, élégant, plus lisible mais sans doute plus lent à maintenir et à mettre en place car on doit parcourir la hiérarchie du DOM pour piger comment c'est foutu et - crois-moi sur parole - c'est souvent mal fichu

  • les regex sont un truc cabalistique illisible mais, dans le cas qui nous occupe où on parse des infos simples et peu nombreuses, ça n'a rien de compliqué. De plus, avec un peu d'habitude, on crée de nouvelles règles et on les maintient plus rapidement. Sans compter que c'est natif, rapide et que ça ne patinera pas avec du HTML non standard (voire carrément illégal 💣)


Aucune des deux solutions n'est parfaite dans le cas du parsing de sites de ce type car le HTML des pages n'est jamais sémantique: ce qui me semble volontaire comme chez google, afin d'éviter précisément qu'on parse les pages en évitant toutes les méthodes de traçage/pub/exploitation de données possibles avec JS. 🤪


C'est un gloubiboulga de divs avec des classes peu significatives ne permettant pas le ciblage.


Du coup, à mon sens, un simpleXML n'apporte pas grand-chose par rapport aux regex si ce n'est une plus grande lisibilité pour un codeur qui ne maîtrise pas trop les regex...


Ceci dit, je prends toutes les idées à ce sujet, en particulier des solutions que je ne connais pas ! 👍

 
7  jerry wham le

Mais, mais mais mais ???!!!???

 
8  Petit Etre Malfaisant le

Mec ! On t'aime !!!!

 
9  Bronco le

Lol

 
10  Eric le

Interface moins moche :
html{
background-color: #222;
--base_color: 0;
min-width: 555px;
font-family: sans-serif;
}
main{padding: 1em}
header{
padding: 25px;
margin-bottom: 25px;
font-size: 96px;
font-family: monospace;
color: #e8e8e8;
}
header a{
display: flex;
width: fit-content;
margin: auto;
color: #e8e8e8
}
header a:hover{
color: aquamarine;
}
header img{
width: 96px;
margin-right: 30px;
}
h2.title:before{
content: "⭐";
}
h2.title:after{
content: "➜";
color: #e8e8e8;
}


h2.title a {
color: aquamarine;
}
h2.title a:hover {
color: #e8e8e8;
}
ul.container li{
list-style: none;
}
ul.container li a:before{
content: "➜";
color: aquamarine;
margin-right: 15px
}
ul.container li a{
color: #e8e8e8;
display: flex;
align-items: center;
border-bottom: 1px solid #e8e8e8;;
margin-bottom:15px;
padding-bottom: 15px;
}
ul.container li a:hover {
color:aquamarine;
}
ul.container li img{
height: 128px;
object-fit: cover;
margin-right: 1em;
}
form{
display: flex;
width: fit-content;
margin: auto;
}
footer{
color: var(--base_color_dark);
display: block;
padding: 25px;
color: #e8e8e8;
text-align: center;
}
footer a {
color: aquamarine
}
input[type="submit"]:hover {background-color: aquamarine; color: #444}
input[type="submit"] {background-color: #444; color: aquamarine}

 
11  Eric le

Si le css est pas passé mailes moi, je t'enverrais le fichier :)


Globalement j'ai pas fait grand chose, ajusté les tailles d'image, la police et les couleurs, mais ça pique moins les yeux :)

 
12  Bronco le

C'est mieux, en effet ! Merci

 
13  znarf le

eh ben ...ça marche pas mal ! voilà un boulot qui envoie le bois ! bravo les gars !

 
14  Bronco le

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 dernier caractère du mot j13czvk ?