diff --git a/app/src/main/java/io/legado/app/data/entities/BaseBook.kt b/app/src/main/java/io/legado/app/data/entities/BaseBook.kt index 5b3f76e0c..13189d805 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseBook.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseBook.kt @@ -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 { val kindList = arrayListOf() wordCount?.let { diff --git a/app/src/main/java/io/legado/app/data/entities/BaseRssArticle.kt b/app/src/main/java/io/legado/app/data/entities/BaseRssArticle.kt new file mode 100644 index 000000000..b42040a03 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/BaseRssArticle.kt @@ -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) + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 8f2628dcd..8f1661bc2 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -142,10 +142,6 @@ data class Book( GSON.fromJsonObject>(variable).getOrNull() ?: hashMapOf() } - override fun putBigVariable(key: String, value: String) { - - } - @Ignore @IgnoredOnParcel override var infoHtml: String? = null diff --git a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt index 7a1b1b142..f448f6c85 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt @@ -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>(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() diff --git a/app/src/main/java/io/legado/app/data/entities/RssArticle.kt b/app/src/main/java/io/legado/app/data/entities/RssArticle.kt index ca3374de4..a5093f3c8 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssArticle.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssArticle.kt @@ -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>(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, diff --git a/app/src/main/java/io/legado/app/data/entities/RssStar.kt b/app/src/main/java/io/legado/app/data/entities/RssStar.kt index d4deca1bb..e8e9a6bba 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssStar.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssStar.kt @@ -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>(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, diff --git a/app/src/main/java/io/legado/app/data/entities/SearchBook.kt b/app/src/main/java/io/legado/app/data/entities/SearchBook.kt index 25f662e99..7d0d1e026 100644 --- a/app/src/main/java/io/legado/app/data/entities/SearchBook.kt +++ b/app/src/main/java/io/legado/app/data/entities/SearchBook.kt @@ -63,10 +63,6 @@ data class SearchBook( GSON.fromJsonObject>(variable).getOrNull() ?: HashMap() } - override fun putBigVariable(key: String, value: String) { - - } - @delegate:Transient @delegate:Ignore @IgnoredOnParcel diff --git a/app/src/main/java/io/legado/app/help/RuleBigDataHelp.kt b/app/src/main/java/io/legado/app/help/RuleBigDataHelp.kt new file mode 100644 index 000000000..b1d17ae29 --- /dev/null +++ b/app/src/main/java/io/legado/app/help/RuleBigDataHelp.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/RuleData.kt b/app/src/main/java/io/legado/app/model/analyzeRule/RuleData.kt index 196861be4..ba17c882e 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/RuleData.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/RuleData.kt @@ -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() } - 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) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/RuleDataInterface.kt b/app/src/main/java/io/legado/app/model/analyzeRule/RuleDataInterface.kt index fd28c1b11..b214110f3 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/RuleDataInterface.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/RuleDataInterface.kt @@ -1,34 +1,33 @@ package io.legado.app.model.analyzeRule -import io.legado.app.utils.GSON - interface RuleDataInterface { - var variable: String? - val variableMap: HashMap - 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? + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/webBook/BookList.kt b/app/src/main/java/io/legado/app/model/webBook/BookList.kt index 48f7adf52..e7597ff87 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookList.kt @@ -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() 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, diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index f657b4e13..09538958b 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -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 { - 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 { - 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,