Legado Readerの仕組みと、Androidアプリに組み込みJSエンジンが必要な理由
個人的な話ですが、私はモバイル電子書籍リーダーにあまり注意を払いません。通常、それらはシステムテキスト描画のラッパーか、广告やサブスクリプションが詰め込まれたクローズドアプリのどちらかです。しかし、Legadoリポジトリは私の興味を引きました。このAndroidリーダーの内部には、レジャーで本を読むユーティリティというよりも、サーバーサイドのデータ収集パワーハウスで見つけるようなアーキテクチャが隠されています。
このアプリはKotlinで書かれており、GPL-3.0ライセンスで配布されています。本質的には、Webスクレイパー、ユーザースクリプト実行エンジン、ローカルWebサーバーが1つのモバイルインターフェースにバンドルされています。
モバイルスクレイパーの内部
READMEの依存関係リストを見ると、作者たちがどのように設計アプローチを取ったかが明確になります。特定のフォーマットやウェブサイトに密結合するのではなく、どこからでもコンテンツを抽出するための柔軟なツールを作成しました。
このシステムの動作は以下の通りです:
- HTMLとJSONのパース。プロジェクトではJsoup、JsoupXpath、json-pathを使用しています。章のテキスト、タイトル、目次は、XPathおよびJSONPathクエリを使用してWebページから抽出されます。
- JavaScript実行。動的なページ処理のため、アプリはrhino-android(Mozilla Rhino JSエンジンのポート)を組み込んでいます。サイトがクライアントサイドライブラリでコンテンツを提供したり、複雑なマークアップを使用している場合、Legadoはデバイス上でカスタムJSを実行します。
- ローカルWebサーバー。Nanohttpdとnanohttpd-websocketが使用されています。アプリはスマートフォン上でHTTPサーバーとWebSocketサーバーを起動します。コンピュータのブラウザに手机的IPアドレスを入力すると、大きな画面で本を読んだり、パースルールを管理したりできます。
- UIに直接組み込まれたコードエディタ。io.github.rosemoe:editorライブラリがシンタックスハイライト付きのコードエディタを追加します。手机画面から直接テキスト抽出ルールを調整できます。
ソースコンセプトの動作
Legadoの主な特徴は、データソースとリーダー自体を分離できることです。アプリには組み込みの書籍データベースがありません。代わりに、ユーザーはJSON形式の設定ファイルをインポートします。
各ファイルはターゲットサイトの構造を記述します。書籍の検索ルール、章へのパス、テキスト抽出用のセレクターを指定します。サイトが単純なスクリプトで保護されている場合、JSコードがコンフィギュレーターに埋め込まれます。結果として、リーダーは柔軟なコンテンツクリーナーになります:バナーを削除し、段落をフォーマットし、リアルタイムで готовый EPUBをアセンブルします。
言語資料の処理のために、作者たちはHanLP——自然言語処理ライブラリを統合しました。これは中国語のテキスト、適切な折り返し、文字変換に役立ちます。
直面する可能性のある課題
リポジトリ内のドキュメントは極めて稀疏です。READMEは使用されているライブラリのリストと数件のリンクに制限されています。コミュニティと готовыеパースルールのほとんどは中国インターネットに集中しているため、そのままでは英語やロシア語で多くは見つかりません。
特定のロシア語リソースから書籍抽出を設定するには、LegadoのJSONソース形式を理解し、手動でルールを書く必要があります。一方、組み込みのエディタとハイライト機能により、XPathに精通していれば作業が容易になります。
このプロジェクトのソースコードを研究する理由
Web小説を読む予定がなくても、Legadoのコードベースは技術的なケーススタディとして興味深いです。
- バックグラウンド処理アーキテクチャ。コードは、UIの劣化なしに並列ページ読み込みとパースを整理する方法を示しています。
- サーバーコンポーネントの埋め込み。NanoHTTPDを使用して電話からPCへの通信を提供することは、ローカルハイブリッドインターフェース構築の実用的な例です。
- Androidでの安全なJS実行。プロジェクトはユーザコード処理のためのKotlinとRhinoのペアリングを明確に示しています。
Legadoは、熱狂的なファンが熟悉のモバイルアプリをデータ処理のための advanced プラットフォームに変えることができる興味深い例です。Webテクノロジー、スクリプティングエンジン、バックグラウンドサービスをKotlinで統合する実践的な例を探しているAndroid開発者にとって、このプロジェクトはクローンして研究する価値があります。
関連プロジェクト