mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package io.legado.app.data.entities
|
||||
|
||||
import io.legado.app.help.RuleBigDataHelp
|
||||
import io.legado.app.model.analyzeRule.RuleDataInterface
|
||||
import io.legado.app.utils.GSON
|
||||
import io.legado.app.utils.splitNotBlank
|
||||
|
||||
interface BaseBook : RuleDataInterface {
|
||||
@@ -9,10 +11,26 @@ interface BaseBook : RuleDataInterface {
|
||||
var bookUrl: String
|
||||
var kind: String?
|
||||
var wordCount: String?
|
||||
var variable: String?
|
||||
|
||||
var infoHtml: String?
|
||||
var tocHtml: String?
|
||||
|
||||
override fun putVariable(key: String, value: String?): Boolean {
|
||||
if (super.putVariable(key, value)) {
|
||||
variable = GSON.toJson(variableMap)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String?) {
|
||||
RuleBigDataHelp.putBookVariable(bookUrl, key, value)
|
||||
}
|
||||
|
||||
override fun getBigVariable(key: String): String? {
|
||||
return RuleBigDataHelp.getBookVariable(bookUrl, key)
|
||||
}
|
||||
|
||||
fun getKindList(): List<String> {
|
||||
val kindList = arrayListOf<String>()
|
||||
wordCount?.let {
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package io.legado.app.data.entities
|
||||
|
||||
import io.legado.app.help.RuleBigDataHelp
|
||||
import io.legado.app.model.analyzeRule.RuleDataInterface
|
||||
import io.legado.app.utils.GSON
|
||||
|
||||
interface BaseRssArticle : RuleDataInterface {
|
||||
|
||||
var origin: String
|
||||
var link: String
|
||||
|
||||
var variable: String?
|
||||
|
||||
override fun putVariable(key: String, value: String?): Boolean {
|
||||
if (super.putVariable(key, value)) {
|
||||
variable = GSON.toJson(variableMap)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String?) {
|
||||
RuleBigDataHelp.putRssVariable(origin, link, key, value)
|
||||
}
|
||||
|
||||
override fun getBigVariable(key: String): String? {
|
||||
return RuleBigDataHelp.getRssVariable(origin, link, key)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -142,10 +142,6 @@ data class Book(
|
||||
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf()
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String) {
|
||||
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@IgnoredOnParcel
|
||||
override var infoHtml: String? = null
|
||||
|
||||
@@ -8,6 +8,7 @@ import androidx.room.Index
|
||||
import com.github.liuyueyi.quick.transfer.ChineseUtils
|
||||
import io.legado.app.R
|
||||
import io.legado.app.constant.AppPattern
|
||||
import io.legado.app.help.RuleBigDataHelp
|
||||
import io.legado.app.help.config.AppConfig
|
||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||
import io.legado.app.model.analyzeRule.RuleDataInterface
|
||||
@@ -44,7 +45,7 @@ data class BookChapter(
|
||||
var end: Long? = null, // 章节终止位置
|
||||
var startFragmentId: String? = null, //EPUB书籍当前章节的fragmentId
|
||||
var endFragmentId: String? = null, //EPUB书籍下一章节的fragmentId
|
||||
override var variable: String? = null //变量
|
||||
var variable: String? = null //变量
|
||||
) : Parcelable, RuleDataInterface {
|
||||
|
||||
@delegate:Transient
|
||||
@@ -54,13 +55,19 @@ data class BookChapter(
|
||||
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf()
|
||||
}
|
||||
|
||||
override fun putVariable(key: String, value: String?) {
|
||||
super.putVariable(key, value)
|
||||
variable = GSON.toJson(variableMap)
|
||||
override fun putVariable(key: String, value: String?): Boolean {
|
||||
if (super.putVariable(key, value)) {
|
||||
variable = GSON.toJson(variableMap)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String) {
|
||||
override fun putBigVariable(key: String, value: String?) {
|
||||
RuleBigDataHelp.putChapterVariable(bookUrl, url, key, value)
|
||||
}
|
||||
|
||||
override fun getBigVariable(key: String): String? {
|
||||
return RuleBigDataHelp.getChapterVariable(bookUrl, url, key)
|
||||
}
|
||||
|
||||
override fun hashCode() = url.hashCode()
|
||||
|
||||
@@ -2,7 +2,6 @@ package io.legado.app.data.entities
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.Ignore
|
||||
import io.legado.app.model.analyzeRule.RuleDataInterface
|
||||
import io.legado.app.utils.GSON
|
||||
import io.legado.app.utils.fromJsonObject
|
||||
import kotlinx.parcelize.IgnoredOnParcel
|
||||
@@ -13,18 +12,18 @@ import kotlinx.parcelize.IgnoredOnParcel
|
||||
primaryKeys = ["origin", "link"]
|
||||
)
|
||||
data class RssArticle(
|
||||
var origin: String = "",
|
||||
override var origin: String = "",
|
||||
var sort: String = "",
|
||||
var title: String = "",
|
||||
var order: Long = 0,
|
||||
var link: String = "",
|
||||
override var link: String = "",
|
||||
var pubDate: String? = null,
|
||||
var description: String? = null,
|
||||
var content: String? = null,
|
||||
var image: String? = null,
|
||||
var read: Boolean = false,
|
||||
override var variable: String? = null
|
||||
) : RuleDataInterface {
|
||||
) : BaseRssArticle {
|
||||
|
||||
override fun hashCode() = link.hashCode()
|
||||
|
||||
@@ -40,15 +39,6 @@ data class RssArticle(
|
||||
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf()
|
||||
}
|
||||
|
||||
override fun putVariable(key: String, value: String?) {
|
||||
super.putVariable(key, value)
|
||||
variable = GSON.toJson(variableMap)
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String) {
|
||||
|
||||
}
|
||||
|
||||
fun toStar() = RssStar(
|
||||
origin = origin,
|
||||
sort = sort,
|
||||
|
||||
@@ -2,7 +2,6 @@ package io.legado.app.data.entities
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.Ignore
|
||||
import io.legado.app.model.analyzeRule.RuleDataInterface
|
||||
import io.legado.app.utils.GSON
|
||||
import io.legado.app.utils.fromJsonObject
|
||||
import kotlinx.parcelize.IgnoredOnParcel
|
||||
@@ -13,17 +12,17 @@ import kotlinx.parcelize.IgnoredOnParcel
|
||||
primaryKeys = ["origin", "link"]
|
||||
)
|
||||
data class RssStar(
|
||||
var origin: String = "",
|
||||
override var origin: String = "",
|
||||
var sort: String = "",
|
||||
var title: String = "",
|
||||
var starTime: Long = 0,
|
||||
var link: String = "",
|
||||
override var link: String = "",
|
||||
var pubDate: String? = null,
|
||||
var description: String? = null,
|
||||
var content: String? = null,
|
||||
var image: String? = null,
|
||||
override var variable: String? = null
|
||||
) : RuleDataInterface {
|
||||
) : BaseRssArticle {
|
||||
|
||||
@delegate:Transient
|
||||
@delegate:Ignore
|
||||
@@ -32,15 +31,6 @@ data class RssStar(
|
||||
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf()
|
||||
}
|
||||
|
||||
override fun putVariable(key: String, value: String?) {
|
||||
super.putVariable(key, value)
|
||||
variable = GSON.toJson(variableMap)
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String) {
|
||||
|
||||
}
|
||||
|
||||
fun toRssArticle() = RssArticle(
|
||||
origin = origin,
|
||||
sort = sort,
|
||||
|
||||
@@ -63,10 +63,6 @@ data class SearchBook(
|
||||
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: HashMap()
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String) {
|
||||
|
||||
}
|
||||
|
||||
@delegate:Transient
|
||||
@delegate:Ignore
|
||||
@IgnoredOnParcel
|
||||
|
||||
29
app/src/main/java/io/legado/app/help/RuleBigDataHelp.kt
Normal file
29
app/src/main/java/io/legado/app/help/RuleBigDataHelp.kt
Normal file
@@ -0,0 +1,29 @@
|
||||
package io.legado.app.help
|
||||
|
||||
object RuleBigDataHelp {
|
||||
|
||||
fun putBookVariable(bookUrl: String, key: String, value: String?) {
|
||||
|
||||
}
|
||||
|
||||
fun getBookVariable(bookUrl: String, key: String?): String? {
|
||||
return null
|
||||
}
|
||||
|
||||
|
||||
fun putChapterVariable(bookUrl: String, chapterUrl: String, key: String, value: String?) {
|
||||
|
||||
}
|
||||
|
||||
fun getChapterVariable(bookUrl: String, chapterUrl: String, key: String): String? {
|
||||
return null
|
||||
}
|
||||
|
||||
fun putRssVariable(origin: String, link: String, key: String, value: String?) {
|
||||
|
||||
}
|
||||
|
||||
fun getRssVariable(origin: String, link: String, key: String): String? {
|
||||
return null
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,30 @@
|
||||
package io.legado.app.model.analyzeRule
|
||||
|
||||
class RuleData : RuleDataInterface {
|
||||
import io.legado.app.utils.GSON
|
||||
|
||||
override var variable: String? = null
|
||||
class RuleData : RuleDataInterface {
|
||||
|
||||
override val variableMap by lazy {
|
||||
hashMapOf<String, String>()
|
||||
}
|
||||
|
||||
override fun putBigVariable(key: String, value: String) {
|
||||
variableMap[key] = value
|
||||
override fun putBigVariable(key: String, value: String?) {
|
||||
if (value == null) {
|
||||
variableMap.remove(key)
|
||||
} else {
|
||||
variableMap[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
override fun getBigVariable(key: String): String? {
|
||||
return null
|
||||
}
|
||||
|
||||
fun getVariable(): String? {
|
||||
if (variableMap.isEmpty()) {
|
||||
return null
|
||||
}
|
||||
return GSON.toJson(variableMap)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,34 +1,33 @@
|
||||
package io.legado.app.model.analyzeRule
|
||||
|
||||
import io.legado.app.utils.GSON
|
||||
|
||||
interface RuleDataInterface {
|
||||
|
||||
var variable: String?
|
||||
|
||||
val variableMap: HashMap<String, String>
|
||||
|
||||
fun putVariable(key: String, value: String?) {
|
||||
when {
|
||||
fun putVariable(key: String, value: String?): Boolean {
|
||||
return when {
|
||||
value == null -> {
|
||||
variableMap.remove(key)
|
||||
variable = GSON.toJson(variableMap)
|
||||
putBigVariable(key, value)
|
||||
true
|
||||
}
|
||||
value.length < 1000 -> {
|
||||
variableMap[key] = value
|
||||
variable = GSON.toJson(variableMap)
|
||||
true
|
||||
}
|
||||
else -> {
|
||||
variableMap[key] = value
|
||||
variable = GSON.toJson(variableMap)
|
||||
putBigVariable(key, value)
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun putBigVariable(key: String, value: String)
|
||||
fun putBigVariable(key: String, value: String?)
|
||||
|
||||
fun getVariable(key: String): String? {
|
||||
return variableMap[key]
|
||||
return variableMap[key] ?: getBigVariable(key)
|
||||
}
|
||||
|
||||
fun getBigVariable(key: String): String?
|
||||
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import io.legado.app.model.Debug
|
||||
import io.legado.app.model.NoStackTraceException
|
||||
import io.legado.app.model.analyzeRule.AnalyzeRule
|
||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||
import io.legado.app.model.analyzeRule.RuleData
|
||||
import io.legado.app.utils.HtmlFormatter
|
||||
import io.legado.app.utils.NetworkUtils
|
||||
import io.legado.app.utils.StringUtils.wordCountFormat
|
||||
@@ -26,7 +27,7 @@ object BookList {
|
||||
fun analyzeBookList(
|
||||
scope: CoroutineScope,
|
||||
bookSource: BookSource,
|
||||
variableBook: SearchBook,
|
||||
ruleData: RuleData,
|
||||
analyzeUrl: AnalyzeUrl,
|
||||
baseUrl: String,
|
||||
body: String?,
|
||||
@@ -41,7 +42,7 @@ object BookList {
|
||||
val bookList = ArrayList<SearchBook>()
|
||||
Debug.log(bookSource.bookSourceUrl, "≡获取成功:${analyzeUrl.ruleUrl}")
|
||||
Debug.log(bookSource.bookSourceUrl, body, state = 10)
|
||||
val analyzeRule = AnalyzeRule(variableBook, bookSource)
|
||||
val analyzeRule = AnalyzeRule(ruleData, bookSource)
|
||||
analyzeRule.setContent(body).setBaseUrl(baseUrl)
|
||||
analyzeRule.setRedirectUrl(baseUrl)
|
||||
bookSource.bookUrlPattern?.let {
|
||||
@@ -49,7 +50,13 @@ object BookList {
|
||||
if (baseUrl.matches(it.toRegex())) {
|
||||
Debug.log(bookSource.bookSourceUrl, "≡链接为详情页")
|
||||
getInfoItem(
|
||||
scope, bookSource, analyzeRule, analyzeUrl, body, baseUrl, variableBook.variable
|
||||
scope,
|
||||
bookSource,
|
||||
analyzeRule,
|
||||
analyzeUrl,
|
||||
body,
|
||||
baseUrl,
|
||||
ruleData.getVariable()
|
||||
)?.let { searchBook ->
|
||||
searchBook.infoHtml = body
|
||||
bookList.add(searchBook)
|
||||
@@ -78,7 +85,7 @@ object BookList {
|
||||
if (collections.isEmpty() && bookSource.bookUrlPattern.isNullOrEmpty()) {
|
||||
Debug.log(bookSource.bookSourceUrl, "└列表为空,按详情页解析")
|
||||
getInfoItem(
|
||||
scope, bookSource, analyzeRule, analyzeUrl, body, baseUrl, variableBook.variable
|
||||
scope, bookSource, analyzeRule, analyzeUrl, body, baseUrl, ruleData.getVariable()
|
||||
)?.let { searchBook ->
|
||||
searchBook.infoHtml = body
|
||||
bookList.add(searchBook)
|
||||
@@ -95,7 +102,7 @@ object BookList {
|
||||
Debug.log(bookSource.bookSourceUrl, "└列表大小:${collections.size}")
|
||||
for ((index, item) in collections.withIndex()) {
|
||||
getSearchItem(
|
||||
scope, bookSource, analyzeRule, item, baseUrl, variableBook.variable,
|
||||
scope, bookSource, analyzeRule, item, baseUrl, ruleData.getVariable(),
|
||||
index == 0,
|
||||
ruleName = ruleName,
|
||||
ruleBookUrl = ruleBookUrl,
|
||||
|
||||
@@ -9,6 +9,7 @@ import io.legado.app.help.http.StrResponse
|
||||
import io.legado.app.model.Debug
|
||||
import io.legado.app.model.NoStackTraceException
|
||||
import io.legado.app.model.analyzeRule.AnalyzeUrl
|
||||
import io.legado.app.model.analyzeRule.RuleData
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.isActive
|
||||
@@ -38,7 +39,7 @@ object WebBook {
|
||||
key: String,
|
||||
page: Int? = 1,
|
||||
): ArrayList<SearchBook> {
|
||||
val variableBook = SearchBook()
|
||||
val ruleData = RuleData()
|
||||
bookSource.searchUrl?.let { searchUrl ->
|
||||
val analyzeUrl = AnalyzeUrl(
|
||||
mUrl = searchUrl,
|
||||
@@ -47,7 +48,7 @@ object WebBook {
|
||||
baseUrl = bookSource.bookSourceUrl,
|
||||
headerMapF = bookSource.getHeaderMap(true),
|
||||
source = bookSource,
|
||||
ruleData = variableBook,
|
||||
ruleData = ruleData,
|
||||
)
|
||||
var res = analyzeUrl.getStrResponseAwait()
|
||||
//检测书源是否已登录
|
||||
@@ -59,7 +60,7 @@ object WebBook {
|
||||
return BookList.analyzeBookList(
|
||||
scope = scope,
|
||||
bookSource = bookSource,
|
||||
variableBook = variableBook,
|
||||
ruleData = ruleData,
|
||||
analyzeUrl = analyzeUrl,
|
||||
baseUrl = res.url,
|
||||
body = res.body,
|
||||
@@ -90,13 +91,13 @@ object WebBook {
|
||||
url: String,
|
||||
page: Int? = 1,
|
||||
): ArrayList<SearchBook> {
|
||||
val variableBook = SearchBook()
|
||||
val ruleData = RuleData()
|
||||
val analyzeUrl = AnalyzeUrl(
|
||||
mUrl = url,
|
||||
page = page,
|
||||
baseUrl = bookSource.bookSourceUrl,
|
||||
source = bookSource,
|
||||
ruleData = variableBook,
|
||||
ruleData = ruleData,
|
||||
headerMapF = bookSource.getHeaderMap(true)
|
||||
)
|
||||
var res = analyzeUrl.getStrResponseAwait()
|
||||
@@ -109,7 +110,7 @@ object WebBook {
|
||||
return BookList.analyzeBookList(
|
||||
scope = scope,
|
||||
bookSource = bookSource,
|
||||
variableBook = variableBook,
|
||||
ruleData = ruleData,
|
||||
analyzeUrl = analyzeUrl,
|
||||
baseUrl = res.url,
|
||||
body = res.body,
|
||||
|
||||
Reference in New Issue
Block a user