Как устроена читалка Legado и зачем Android-приложению встроенный JS-движок
Лично я редко обращаю внимание на мобильные читалки. Обычно это либо обертки над системным отображением текста, либо закрытые приложения с кучей рекламы и подписок. Но репозиторий Legado меня зацепил. Под капотом этой Android-читалки скрывается архитектура, которую скорее ожидаешь увидеть у серверного комбайна для сбора данных, чем у утилиты для чтения книг на досуге.
Приложение написано на Kotlin и распространяется под лицензией GPL-3.0. По своей сути это скрапер веб-страниц, движок исполнения пользовательских скриптов и локальный веб-сервер, упакованные в единый мобильный интерфейс.
Что внутри у мобильного скрапера
Если заглянуть в список зависимостей в README, становится понятно, как авторы подошли к проектированию. Вместо жесткой привязки к конкретным форматам или сайтам, они создали гибкий инструмент для извлечения контента отовсюду.
Вот за счет чего работает эта система:
- Парсинг HTML и JSON. Проект использует Jsoup, JsoupXpath и json-path. Текст глав, заголовки и оглавления извлекаются из веб-страниц с помощью XPath- и JSONPath-запросов.
- Исполнение JavaScript. Для обработки динамических страниц в приложение встроен rhino-android (порт JS-движка Mozilla Rhino). Если сайт отдаёт контент через клиентский скрипт или использует нетривиальную разметку, Legado выполняет кастомный JS прямо на устройстве.
- Локальный веб-сервер. Задействованы nanohttpd и nanohttpd-websocket. Приложение поднимает HTTP- и WebSocket-сервер на самом смартфоне. Вы можете ввести IP-адрес телефона в браузере компьютера, чтобы читать книги на большом экране или управлять правилами парсинга.
- Редактор кода прямо в UI. Библиотека io.github.rosemoe:editor добавляет редактор кода с подсветкой синтаксиса. Правило извлечения текста можно подправить прямо с экрана телефона.
Как работает концепция источников
Главная фича Legado заключается в отчуждаемости источника данных от самого ридера. Приложение не содержит встроенной базы книг. Вместо этого пользователь импортирует конфигурационные файлы в формате JSON.
Каждый такой файл описывает структуру целевого сайта. Там указаны правила поиска книг, пути к главам и селекторы для получения текста. Если сайт защищен простыми скриптами, в конфигуратор встраивают JS-код. В итоге читалка превращается в гибкий клинер контента: убирает баннеры, форматирует абзацы и собирает готовый EPUB на лету.
Для работы с языковым материалом авторы подключили HanLP — библиотеку для обработки естественного языка. Это помогает при работе с китайскими текстами, правильным переносом слов и конвертацией символов.
С какими трудностями можно столкнуться
Документация в самом репозитории крайне скудная. README ограничивается перечислением использованных библиотек и парой ссылок. Большая часть сообщества и готовых правил парсинга сосредоточена в китайском интернете, поэтому из коробки на английском или русском языке мало что найдешь.
Чтобы настроить извлечение книг с конкретного русскоязычного ресурса, придется разобраться в формате JSON-источников Legado и написать правила вручную. С другой стороны, встроенный редактор с подсветкой облегчает эту задачу, если вы знакомы с XPath.
Зачем изучать исходники этого проекта
Даже если вы не планируете читать сетевые романы, кодовая база Legado интересна как технический кейс.
- Архитектура фоновой обработки. В коде показано, как организовать параллельную загрузку и парсинг страниц без проседания UI.
- Встраивание серверных компонентов. Использование NanoHTTPD для связи смартфона с ПК дает практический пример построения локальных гибридных интерфейсов.
- Безопасное исполнение JS в Android. Проект наглядно демонстрирует связку Kotlin и Rhino для обработки пользовательского кода.
Legado — интересный пример того, как энтузиасты могут превратить привычное мобильное приложение в продвинутую платформу для работы с данными. Проект стоит склонировать и изучить Android-разработчикам, которые ищут практические примеры интеграции веб-технологий, скриптовых движков и фоновых сервисов в Kotlin.