Hoe Legado Reader werkt en waarom een Android-app een ingebouwde JS-engine nodig heeft
Persoonlijk besteed ik zelden aandacht aan mobiele e-readers. Meestal zijn het ofwel wrappers rond systeemtekstrendering of gesloten apps vol met advertenties en abonnementen. Maar de Legado-repository trok mijn aandacht. Onder de motorkap van deze Android-reader ligt een architectuur die je eerder zou verwachten in een server-side data-harvestingkrachtpatser dan in een vrijetijds boekenlezer.
De app is geschreven in Kotlin en gedistribueerd onder de GPL-3.0-licentie. In wezen is het een webpaginascraper, een user script execution engine en een lokale webserver, gebundeld in één mobiele interface.
Wat zit er in een mobiele scraper
Als je naar de afhankelijkhedenlijst in de README kijkt, wordt duidelijk hoe de auteurs de ontwerpbenadering hebben gekozen. In plaats van strak gekoppeld te zijn aan specifieke formaten of websites, hebben ze een flexibel hulpmiddel gemaakt voor het extraheren van content van overal.
Zo werkt dit systeem:
- HTML en JSON-parsing. Het project gebruikt Jsoup, JsoupXpath en json-path. Hoofdstuktekst, titels en inhoudsopgaven worden uit webpagina's geëxtraheerd met behulp van XPath- en JSONPath-queries.
- JavaScript-uitvoering. Om dynamische pagina's te verwerken, embed de app rhino-android (een Mozilla Rhino JS-engine port). Als een site content levert via client-side scripts of niet-triviale markup gebruikt, voert Legado aangepaste JS uit rechtstreeks op het apparaat.
- Lokale webserver. Nanohttpd en nanohttpd-websocket worden gebruikt. De app start een HTTP- en WebSocket-server op de smartphone. Je kunt het IP-adres van de telefoon invoeren in de browser van je computer om boeken op een groot scherm te lezen of parse-regels te beheren.
- Code-editor in de UI. De io.github.rosemoe:editor-bibliotheek voegt een code-editor toe met syntax highlighting. Je kunt een tekstextractieregel rechtstreeks vanaf het telefoonscherm aanpassen.
Hoe het bronconcept werkt
De hoofdfunctie van Legado is de scheidbaarheid van de databron van de reader zelf. De app bevat geen ingebouwde boekendatabase. In plaats daarvan importeert de gebruiker configuratiebestanden in JSON-formaat.
Elk van zulke bestanden beschrijft de structuur van de doelsite. Het specificeert zoekregels voor boeken, paden naar hoofdstukken en selectors voor het extraheren van tekst. Als een site beschermd is door eenvoudige scripts, wordt JS-code ingebed in de configurator. Het resultaat is dat de reader verandert in een flexibele content cleaner: het verwijdert banners, formatteert alinea's en assembleert een kant-en-klare EPUB on the fly.
Voor het werken met taalkundig materiaal hebben de auteurs HanLP geïntegreerd — een bibliotheek voor natuurlijke taalverwerking. Dit helpt bij Chinese teksten, correcte woordafbreking en tekenconversie.
Potentiële uitdagingen waar je mee te maken kunt krijgen
De documentatie in de repository zelf is uiterst summier. De README beperkt zich tot het opsommen van de gebruikte bibliotheken en een paar links. Het merendeel van de community en kant-en-klare parse-regels is geconcentreerd op het Chinese internet, dus out of the box vind je niet veel in het Engels of Russisch.
Om boekextractie van een specifieke Russischtalige bron in te stellen, moet je het JSON-bronformaat van Legado begrijpen en de regels handmatig schrijven. Aan de andere kant maakt de ingebouwde editor met highlighting dit gemakkelijker als je bekend bent met XPath.
Waarom de broncode van dit project bestuderen
Zelfs als je niet van plan bent om webromans te lezen, is de Legado-codebase interessant als technische case study.
- Architectuur voor achtergrondverwerking. De code demonstreert hoe je parallelle paginalading en parsing kunt organiseren zonder UI-degradatie.
- Servercomponenten embedden. NanoHTTPD gebruiken voor telefoon-naar-PC-communicatie biedt een praktisch voorbeeld van het bouwen van lokale hybride interfaces.
- Veilige JS-uitvoering op Android. Het project toont duidelijk de Kotlin- en Rhino-combinatie voor het verwerken van gebruikerscode.
Legado is een interessant voorbeeld van hoe enthousiastelingen een vertrouwde mobiele app kunnen omtoveren tot een geavanceerd platform voor het werken met data. Het project is de moeite waard om te klonen en te bestuderen voor Android-ontwikkelaars die praktische voorbeelden zoeken van het integreren van webtechnologieën, scripting engines en achtergrondservices in Kotlin.
Gerelateerde projecten