kunfei 4 лет назад
Родитель
Сommit
8b2c648811

+ 18 - 0
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<String> {
         val kindList = arrayListOf<String>()
         wordCount?.let {

+ 29 - 0
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)
+    }
+
+}

+ 0 - 4
app/src/main/java/io/legado/app/data/entities/Book.kt

@@ -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

+ 12 - 5
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<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()

+ 3 - 13
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<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,

+ 3 - 13
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<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,

+ 0 - 4
app/src/main/java/io/legado/app/data/entities/SearchBook.kt

@@ -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 - 0
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
+    }
+}

+ 19 - 4
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<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)
     }
 
 }

+ 11 - 12
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<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?
+
 }

+ 12 - 5
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<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,

+ 7 - 6
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<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,