Skip to content

Latest commit

ย 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

LegadoForLNR

ๆœฌ้กน็›ฎๆ˜ฏๅŸบไบŽ GPL-3.0 ่ฎธๅฏ่ฏ็š„ lyc486 ็‰ˆ Legado ็š„่ก็”Ÿไฝœๅ“ใ€‚

LightNovelReader (LNR) ๆ’ไปถ๏ผŒๆ”ฏๆŒ็›ดๆŽฅๅฏผๅ…ฅ lyc486 ็‰ˆ Legado ็š„ JSON ไนฆๆบๆ–‡ไปถ๏ผŒๆ— ้œ€ไปปไฝ•ๆ ผๅผ่ฝฌๆขใ€‚

ๅ”ฏไธ€ๆˆๅŠŸๆ ‡ๅ‡†๏ผšlyc486 ็‰ˆ Legado ไนฆๆบ็š„ๅ…จ้ƒจๅŠŸ่ƒฝๅœจ LNR ไธญๅฎŒๆ•ดๅฏ็”จใ€‚


ๅŠŸ่ƒฝๆธ…ๅ•

ๅŠŸ่ƒฝ ็Šถๆ€ ่ฏดๆ˜Ž
ๆœ็ดข โœ… ่ทจๆ‰€ๆœ‰ๅทฒๅฏผๅ…ฅไนฆๆบๆœ็ดขๅฐ่ฏด
ๅ‘็Žฐ้กต โœ… ๆต่งˆ้…็ฝฎไบ†ๅ‘็Žฐ้กต็š„ไนฆๆบ๏ผŒๆ”ฏๆŒๅˆ†็ฑปๅˆ‡ๆข
ไนฆ็ฑ่ฏฆๆƒ… โœ… ไนฆๅใ€ไฝœ่€…ใ€ๅฐ้ขใ€็ฎ€ไป‹ใ€ๆ ‡็ญพ
็ซ ่Š‚็›ฎๅฝ• โœ… ่Žทๅ–็ซ ่Š‚ๅˆ—่กจ
ๆญฃๆ–‡่งฃๆž โœ… CSS / XPath / JSONPath / ๆญฃๅˆ™ / JS
loginUi ็™ปๅฝ• โœ… ๅฎŒๆ•ดๆ”ฏๆŒ Legado ๅคšๅŠŸ่ƒฝ้ขๆฟ
ๅŠŸ่ƒฝๅผ€ๅ…ณ โœ… ๆŒ‰ไนฆๆบ้š”็ฆปๅญ˜ๅ‚จ๏ผŒๅฎžๆ—ถ็”Ÿๆ•ˆ
ไนฆๆบ็ฎก็† โœ… ๅฏผๅ…ฅ / ้•ฟๆŒ‰ๅˆ ้™ค / ๅฏ็”จ / ็ฆ็”จ
JavaScript โœ… Rhino 1.8.1 + ๅฎ‰ๅ…จๆฒ™็ฎฑ
ๆฎต่ฏ„่ง„ๅˆ™ โœ… ReviewRule ๆ•ฐๆฎๅฑ‚ๅฐฑ็ปช

loginUi ๆ”ฏๆŒ็š„ๆŽงไปถ

  • text / password โ€” ่พ“ๅ…ฅๆก†
  • select โ€” ไธ‹ๆ‹‰้€‰ๆ‹ฉ๏ผˆSpinner + options๏ผ‰
  • toggle โ€” ๅผ€ๅ…ณ๏ผˆTextView + chars ๅพช็Žฏ๏ผ‰
  • button โ€” ๆŒ‰้’ฎ๏ผˆaction URL / JS ๆ‰ง่กŒ๏ผ‰
  • @js: / <js> ๅ‰็ผ€ๅŠจๆ€ UI
  • upLoginData / reLoginView JS ๅ›ž่ฐƒ
  • WebView ๆจกๅผๅ›ž้€€

ๆŠ€ๆœฏๆžถๆž„

ๆ ธๅฟƒๅŽŸๅˆ™๏ผšSPI ๆŽฅๅฃ้š”็ฆป

ๅผ•ๆ“Žๆ ธๅฟƒ่งฃๆž้€ป่พ‘ไธŽ Android ๅนณๅฐ้›ถ่€ฆๅˆใ€‚ๅนณๅฐไพ่ต–้€š่ฟ‡ SPI ๆŽฅๅฃๆณจๅ…ฅ๏ผŒshim ๅฑ‚ๆไพ›ๅ‘ๅŽๅ…ผๅฎน็š„้ป˜่ฎคๅฎž็Žฐใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  LNR ๅฎฟไธป่ฟ›็จ‹                      โ”‚
โ”‚                                                   โ”‚
โ”‚  LegadoJsonPlugin                                 โ”‚
โ”‚    โ”‚                                              โ”‚
โ”‚    โ”œโ”€โ”€ Engine.init(                               โ”‚
โ”‚    โ”‚     context,           <- ๅฎฟไธป Context        โ”‚
โ”‚    โ”‚     cacheProvider,     <- ๅฏ้€‰๏ผš่‡ชๅฎšไน‰็ผ“ๅญ˜     โ”‚
โ”‚    โ”‚     sourceConfigProvider,                     โ”‚
โ”‚    โ”‚     appConfigProvider,                        โ”‚
โ”‚    โ”‚     logProvider                               โ”‚
โ”‚    โ”‚   )                                          โ”‚
โ”‚    โ”‚                                              โ”‚
โ”‚  โ”Œโ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚  โ”‚  engine ๆ ธๅฟƒ๏ผˆ้›ถ android.* ไพ่ต–๏ผ‰   โ”‚             โ”‚
โ”‚  โ”‚                                   โ”‚             โ”‚
โ”‚  โ”‚  rule/    AnalyzeRule, AnalyzeUrl โ”‚             โ”‚
โ”‚  โ”‚           AnalyzeByJSoup/XPath/  โ”‚             โ”‚
โ”‚  โ”‚           JSonPath/Regex         โ”‚             โ”‚
โ”‚  โ”‚  js/      JsExtensions (50+ๆ–นๆณ•) โ”‚             โ”‚
โ”‚  โ”‚           RhinoScriptEngine      โ”‚             โ”‚
โ”‚  โ”‚  http/    HttpClient, CookieStoreโ”‚             โ”‚
โ”‚  โ”‚  data/    Book, BookChapter,     โ”‚             โ”‚
โ”‚  โ”‚           BookSource, SearchBook โ”‚             โ”‚
โ”‚  โ”‚  webBook/ WebBook                โ”‚             โ”‚
โ”‚  โ”‚                                   โ”‚             โ”‚
โ”‚  โ”‚  ๅชไพ่ต– spi/ ๆŽฅๅฃ                  โ”‚             โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚
โ”‚                                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚  โ”‚  shim ๅฑ‚๏ผˆๅนณๅฐ้€‚้… + ๅ›ž้€€ๅฎž็Žฐ๏ผ‰      โ”‚             โ”‚
โ”‚  โ”‚                                   โ”‚             โ”‚
โ”‚  โ”‚  CacheManager  delegate? -> ่‡ชๅฎšไน‰ โ”‚             โ”‚
โ”‚  โ”‚                  null -> SharedPrefs             โ”‚
โ”‚  โ”‚  SourceConfig  ๅŒไธŠ                โ”‚             โ”‚
โ”‚  โ”‚  AppConfig     ๅŒไธŠ                โ”‚             โ”‚
โ”‚  โ”‚  Debug         ๅŒไธŠ                โ”‚             โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚
โ”‚                                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚  โ”‚  plugin ๅฑ‚๏ผˆLNR ๆ’ไปถ API ๅฏนๆŽฅ๏ผ‰     โ”‚             โ”‚
โ”‚  โ”‚                                   โ”‚             โ”‚
โ”‚  โ”‚  LegadoJsonPlugin    ๆ’ไปถๅ…ฅๅฃ      โ”‚             โ”‚
โ”‚  โ”‚  LoginActivity       loginUi ้ขๆฟ  โ”‚             โ”‚
โ”‚  โ”‚  LoginJsBridge       WebView ๆกฅๆŽฅ  โ”‚             โ”‚
โ”‚  โ”‚  BackstageWebView    ๆ— ๅคด WebView  โ”‚             โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

็›ฎๅฝ•็ป“ๆž„

plugin/src/main/kotlin/
โ”œโ”€โ”€ com/script/                      # Rhino ScriptEngine ๅŒ…่ฃ…
โ”‚   โ”œโ”€โ”€ rhino/
โ”‚   โ”‚   โ”œโ”€โ”€ RhinoScriptEngine.kt     #   JS ๆ‰ง่กŒๅผ•ๆ“Ž
โ”‚   โ”‚   โ””โ”€โ”€ RhinoClassShutter.kt     #   ๅฎ‰ๅ…จๆฒ™็ฎฑ๏ผˆ็™ฝๅๅ•๏ผ‰
โ”‚   โ””โ”€โ”€ ScriptBindings.kt
โ”‚
โ”œโ”€โ”€ io/legado/
โ”‚   โ”œโ”€โ”€ engine/                      # ๅผ•ๆ“Žๆจกๅ—
โ”‚   โ”‚   โ”œโ”€โ”€ spi/                     # SPI ๆŽฅๅฃ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CacheProvider.kt     #   ็ผ“ๅญ˜
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SourceConfigProvider #   ๆบ้…็ฝฎ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AppConfigProvider    #   ๅบ”็”จ้…็ฝฎ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ LogProvider          #   ๆ—ฅๅฟ—
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Engine.kt           #   ็ปŸไธ€ๅˆๅง‹ๅŒ–
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ shim/                    # ๅนณๅฐ้€‚้…ๅฑ‚
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CacheManager.kt      #   SP ๅ›ž้€€
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SourceConfig.kt
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AppConfig.kt
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Debug.kt
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ AndroidContext.kt
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ rule/                    # ่ง„ๅˆ™่งฃๆž
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AnalyzeRule.kt       #   ๆ ธๅฟƒ๏ผˆscriptCache + ้€’ๅฝ’ไฟๆŠค๏ผ‰
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AnalyzeUrl.kt
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RuleAnalyzer.kt
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AnalyzeByJSoup.kt    #   CSS ้€‰ๆ‹ฉๅ™จ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AnalyzeByXPath.kt    #   XPath
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AnalyzeByJSonPath.kt #   JSONPath
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ AnalyzeByRegex.kt    #   ๆญฃๅˆ™
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ js/                      # JavaScript
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ JsExtensions.kt      #   50+ JS ๅฏ่ฐƒ็”จๆ–นๆณ•
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ SharedJsScope.kt
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ http/                    # HTTP
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ HttpClient.kt        #   OkHttp ๅฐ่ฃ…
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ CookieStore.kt
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ StrResponse.kt
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ data/                    # ๆ•ฐๆฎๆจกๅž‹
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Book.kt              #   35 ๅญ—ๆฎต
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BookChapter.kt       #   19 ๅญ—ๆฎต
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ SearchBook.kt        #   25 ๅญ—ๆฎต
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BookSource.kt
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ rule/                #   ๅญ่ง„ๅˆ™ๆจกๅž‹
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ webBook/WebBook.kt       # ไธšๅŠกๆต็จ‹็ผ–ๆŽ’
โ”‚   โ”‚   โ””โ”€โ”€ webview/BackstageWebView # ๆ— ๅคด WebView
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ plugin/                      # ๆ’ไปถๅฑ‚
โ”‚       โ”œโ”€โ”€ LegadoJsonPlugin.kt      #   ๅ…ฅๅฃ
โ”‚       โ”œโ”€โ”€ LoginActivity.kt         #   loginUi
โ”‚       โ”œโ”€โ”€ LoginJsBridge.kt         #   JS ๆกฅๆŽฅ๏ผˆ30+ ๆ–นๆณ•๏ผ‰
โ”‚       โ””โ”€โ”€ LegadoSourceManagerContent.kt

SPI ๆŽฅๅฃ่ฏฆ่งฃ

ๆ›ฟๆขๆŸไธชๅนณๅฐๅฎž็Žฐๅช้œ€ๅฎž็Žฐๅฏนๅบ”ๆŽฅๅฃๅนถๆณจๅ…ฅใ€‚

CacheProvider๏ผˆ14 ไธชๆ–นๆณ•๏ผ‰

interface CacheProvider {
    fun getString(key: String): String?
    fun putString(key: String, value: String)
    fun putString(key: String, value: String, saveTimeSeconds: Int)
    fun delete(key: String)
    fun deleteByPrefix(prefix: String)
    fun contains(key: String): Boolean
    fun getLong(key: String): Long
    fun putLong(key: String, value: Long)
    fun getInt(key: String): Int
    fun putInt(key: String, value: Int)
    fun getFloat(key: String): Float
    fun putFloat(key: String, value: Float)
    fun getBoolean(key: String): Boolean
    fun putBoolean(key: String, value: Boolean)
}

SourceConfigProvider๏ผˆ5 ไธชๆ–นๆณ•๏ผ‰

interface SourceConfigProvider {
    fun get(sourceKey: String, configKey: String): String?
    fun put(sourceKey: String, configKey: String, value: String)
    fun delete(sourceKey: String, configKey: String)
    fun clear(sourceKey: String)
    fun getAll(sourceKey: String): Map<String, String>
}

AppConfigProvider

interface AppConfigProvider {
    val userAgent: String
    val threadCount: Int
}

LogProvider

interface LogProvider {
    fun d(tag: String, msg: String)
    fun i(tag: String, msg: String)
    fun w(tag: String, msg: String)
    fun e(tag: String, msg: String, throwable: Throwable? = null)
    fun putDebug(msg: String, throwable: Throwable? = null)
}

ๆณจๅ…ฅ็คบไพ‹

// ๆ–นๅผ 1๏ผšๅ…จ้ƒจ่‡ชๅฎšไน‰
Engine.init(context, myCache, mySourceConfig, myAppConfig, myLog)

// ๆ–นๅผ 2๏ผšๅชๆ›ฟๆข้ƒจๅˆ†
CacheManager.delegate = MyCacheProvider()
// ๅ…ถไฝ™ไฝฟ็”จ้ป˜่ฎค SharedPreferences ๅ›ž้€€

ๅฎฟไธป API ๅ˜ๅŠจๆ—ถๆ€Žไนˆๆ”น

ๅœบๆ™ฏ ๆ”นๅŠจ่Œƒๅ›ด
็ผ“ๅญ˜ API ๅ˜ไบ† ๅชๆ”นๅฎฟไธปไพง CacheProvider ๅฎž็Žฐ๏ผˆ1 ไธชๆ–‡ไปถ๏ผ‰
SP -> DataStore CacheManager.delegate = DataStoreProvider(dataStore)
ๆ”ฏๆŒ้ž Android ๅชๆ”น shim ๅฑ‚ 5 ไธชๆ–‡ไปถ๏ผŒๅผ•ๆ“Žๆ ธๅฟƒ้›ถๆ”นๅŠจ
LNR ๆ’ไปถ API ๅ‡็บง ๅชๆ”น plugin/ ็›ฎๅฝ•๏ผŒengine ไธๅŠจ

ไพ่ต–็‰ˆๆœฌ

ไธŽ lyc486 ็‰ˆ Legado ไธฅๆ ผไธ€่‡ด๏ผš

ไพ่ต– ็‰ˆๆœฌ
Rhino 1.8.1
Jsoup 1.16.2
OkHttp 5.3.2
json-path 2.10.0
Gson 2.13.2
JsoupXpath 2.5.3
commons-text 1.13.1
Kotlin 2.0.21
compileSdk 36
minSdk 24

ๆž„ๅปบ

็Žฏๅขƒ

  • JDK 17+
  • Android SDK๏ผˆcompileSdk 36๏ผ‰

็ผ–่ฏ‘

.\gradlew :plugin:assembleDebug

ไบง็‰ฉ๏ผšplugin/build/outputs/apk/debug/plugin-debug.apk.lnrp

ๅฎ‰่ฃ…

ๅฐ† .lnrp ๆ–‡ไปถ้€š่ฟ‡ LightNovelReader ๆ’ไปถ็ฎก็†็•Œ้ขๅฏผๅ…ฅใ€‚


ไฝฟ็”จ

  1. ๅฎ‰่ฃ…ๆ’ไปถ
  2. ่ฟ›ๅ…ฅๆ’ไปถ่ฎพ็ฝฎ้กต -> ใ€Œๅฏผๅ…ฅ Legado JSON ไนฆๆบใ€
  3. ๅฏ็”จๆ’ไปถ
  4. ๆœ็ดข / ๅ‘็Žฐๆ‰พไนฆ้˜…่ฏป

็™ปๅฝ•ไนฆๆบ

  1. ไนฆๆบๅˆ—่กจๆ‰พๅˆฐ็›ฎๆ ‡ -> ็‚นๅ‡ปใ€Œ็™ปๅฝ•ใ€
  2. ๆœ‰ loginUi -> ๆ˜พ็คบ่‡ชๅฎšไน‰่กจๅ•
  3. ๆ—  loginUi -> WebView ๅŠ ่ฝฝ loginUrl
  4. ๆไบคๅŽ่‡ชๅŠจไฟๅญ˜ๅ‡ญ่ฏ
  5. ไนŸๆ”ฏๆŒ่ขซๅŠจๅ”ค่ตท๏ผˆๅผ•ๆ“Žๆฃ€ๆต‹ๅˆฐ้œ€่ฆ็™ปๅฝ•ๆ—ถ่‡ชๅŠจ่งฆๅ‘๏ผ‰

่ฎธๅฏ่ฏ

GNU ้€š็”จๅ…ฌๅ…ฑ่ฎธๅฏ่ฏ v3.0๏ผˆGPL-3.0๏ผ‰

ๆœฌ้กน็›ฎๆ˜ฏๅŸบไบŽ GPL-3.0 ่ฎธๅฏ่ฏ็š„ lyc486 ็‰ˆ Legado ็š„่ก็”Ÿไฝœๅ“ใ€‚

่‡ด่ฐข

็›ธๅ…ณ่ต„ๆบ

About

LightNovelReader plugin for lyc486 Legado JSON book sources - supports search, explore, loginUi login, JS rules

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages