Jak działa Legado Reader i dlaczego aplikacja Android potrzebuje wbudowanego silnika JS
Osobiście rzadko zwracam uwagę na mobilne czytniki e-booków. Zwykle są to albo nakładki na systemowe renderowanie tekstu, albo zamknięte aplikacje wypełnione reklamami i subskrypcjami. Jednak repozytorium Legado przyciągnęło moją uwagę. Pod maską tego czytnika na Androida kryje się architektura, której spodziewałbym się raczej w potężnym narzędziu do pozyskiwania danych po stronie serwera niż w aplikacji do czytania książek.
Aplikacja jest napisana w Kotlinie i dystrybuowana na licencji GPL-3.0. Zasadniczo stanowi scraper stron internetowych, silnik wykonywania skryptów użytkownika i lokalny serwer WWW zintegrowane w jeden mobilny interfejs.
Co kryje się w mobilnym scraperze
Jeśli spojrzysz na listę zależności w README, staje się jasne, jak autorzy podeszli do projektu. Zamiast być ściśle powiązany z konkretnymi formatami lub stronami, stworzyli elastyczne narzędzie do wydobywania treści z dowolnego źródła.
Oto jak działa ten system:
- Parsowanie HTML i JSON. Projekt wykorzystuje Jsoup, JsoupXpath i json-path. Tekst rozdziałów, tytuły i spisy treści są wydobywane ze stron internetowych za pomocą zapytań XPath i JSONPath.
- Wykonanie JavaScript. Aby obsłużyć dynamiczne strony, aplikacja osadza rhino-android (port silnika Mozilla Rhino JS). Jeśli strona dostarcza treść za pomocą skryptów po stronie klienta lub używa nietrywialnego markupu, Legado wykonuje niestandardowy JS bezpośrednio na urządzeniu.
- Lokalny serwer WWW. Wykorzystywane są Nanohttpd i nanohttpd-websocket. Aplikacja uruchamia serwer HTTP i WebSocket bezpośrednio na smartfonie. Możesz wpisać adres IP telefonu w przeglądarce komputera, aby czytać książki na dużym ekranie lub zarządzać regułami parsowania.
- Edytor kodu w interfejsie. Biblioteka io.github.rosemoe:editor dodaje edytor kodu z podświetlaniem składni. Możesz dostosować regułę wydobywania tekstu bezpośrednio z ekranu telefonu.
Jak działa koncepcja źródeł
Główną cechą Legado jest oddzielanie źródła danych od samego czytnika. Aplikacja nie zawiera wbudowanej bazy książek. Zamiast tego użytkownik importuje pliki konfiguracyjne w formacie JSON.
Każdy taki plik opisuje strukturę strony docelowej. Określa reguły wyszukiwania książek, ścieżki do rozdziałów i selektory do wydobywania tekstu. Jeśli strona jest chroniona prostymi skryptami, kod JS jest osadzany w konfiguratorze. W rezultacie czytnik zamienia się w elastyczny cleaner treści: usuwa banery, formatuje akapity i składa gotowy EPUB w locie.
Do pracy z materiałem lingwistycznym autorzy zintegrowali HanLP — bibliotekę do przetwarzania języka naturalnego. Pomaga to w przypadku tekstów chińskich, prawidłowego zawijania wyrazów i konwersji znaków.
Potencjalne wyzwania, z którymi możesz się spotkać
Dokumentacja w samym repozytorium jest niezwykle skąpa. README ogranicza się do wymienienia używanych bibliotek i kilku linków. Większość społeczności i gotowych reguł parsowania jest skoncentrowana w chińskim internecie, więc od razu nie znajdziesz zbyt wiele w języku angielskim czy rosyjskim.
Aby skonfigurować wydobywanie książek z konkretnego rosyjskojęzycznego źródła, musisz zrozumieć format JSON źródeł w Legado i napisać reguły ręcznie. Z drugiej strony wbudowany edytor z podświetlaniem to ułatwia, jeśli znasz XPath.
Dlaczego warto badać kod źródłowy tego projektu
Nawet jeśli nie planujesz czytać powieści internetowych, baza kodu Legado jest interesująca jako studium przypadku.
- Architektura przetwarzania w tle. Kod demonstruje, jak zorganizować równoległe ładowanie i parsowanie stron bez pogorszenia interfejsu użytkownika.
- Osadzanie komponentów serwerowych. Użycie NanoHTTPD do komunikacji telefon-PC dostarcza praktyczny przykład budowania lokalnych hybrydowych interfejsów.
- Bezpieczne wykonanie JS na Androidzie. Projekt wyraźnie pokazuje parowanie Kotlina i Rhino do obsługi kodu użytkownika.
Legado to interesujący przykład tego, jak entuzjaści mogą przekształcić znaną aplikację mobilną w zaawansowaną platformę do pracy z danymi. Projekt warto sklonować i przestudiować programistom Androida szukającym praktycznych przykładów integracji technologii webowych, silników skryptowych i usług działających w tle w Kotlinie.
Powiązane projekty