pull/1705/head
kunfei 3 years ago
parent d13cff158e
commit ca8f57bd5c
  1. 18
      app/src/main/java/io/legado/app/data/entities/BaseBook.kt
  2. 29
      app/src/main/java/io/legado/app/data/entities/BaseRssArticle.kt
  3. 4
      app/src/main/java/io/legado/app/data/entities/Book.kt
  4. 17
      app/src/main/java/io/legado/app/data/entities/BookChapter.kt
  5. 16
      app/src/main/java/io/legado/app/data/entities/RssArticle.kt
  6. 16
      app/src/main/java/io/legado/app/data/entities/RssStar.kt
  7. 4
      app/src/main/java/io/legado/app/data/entities/SearchBook.kt
  8. 29
      app/src/main/java/io/legado/app/help/RuleBigDataHelp.kt
  9. 23
      app/src/main/java/io/legado/app/model/analyzeRule/RuleData.kt
  10. 23
      app/src/main/java/io/legado/app/model/analyzeRule/RuleDataInterface.kt
  11. 17
      app/src/main/java/io/legado/app/model/webBook/BookList.kt
  12. 13
      app/src/main/java/io/legado/app/model/webBook/WebBook.kt

@ -1,6 +1,8 @@
package io.legado.app.data.entities package io.legado.app.data.entities
import io.legado.app.help.RuleBigDataHelp
import io.legado.app.model.analyzeRule.RuleDataInterface import io.legado.app.model.analyzeRule.RuleDataInterface
import io.legado.app.utils.GSON
import io.legado.app.utils.splitNotBlank import io.legado.app.utils.splitNotBlank
interface BaseBook : RuleDataInterface { interface BaseBook : RuleDataInterface {
@ -9,10 +11,26 @@ interface BaseBook : RuleDataInterface {
var bookUrl: String var bookUrl: String
var kind: String? var kind: String?
var wordCount: String? var wordCount: String?
var variable: String?
var infoHtml: String? var infoHtml: String?
var tocHtml: 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> { fun getKindList(): List<String> {
val kindList = arrayListOf<String>() val kindList = arrayListOf<String>()
wordCount?.let { 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() GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf()
} }
override fun putBigVariable(key: String, value: String) {
}
@Ignore @Ignore
@IgnoredOnParcel @IgnoredOnParcel
override var infoHtml: String? = null override var infoHtml: String? = null

@ -8,6 +8,7 @@ import androidx.room.Index
import com.github.liuyueyi.quick.transfer.ChineseUtils import com.github.liuyueyi.quick.transfer.ChineseUtils
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.AppPattern import io.legado.app.constant.AppPattern
import io.legado.app.help.RuleBigDataHelp
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.analyzeRule.RuleDataInterface import io.legado.app.model.analyzeRule.RuleDataInterface
@ -44,7 +45,7 @@ data class BookChapter(
var end: Long? = null, // 章节终止位置 var end: Long? = null, // 章节终止位置
var startFragmentId: String? = null, //EPUB书籍当前章节的fragmentId var startFragmentId: String? = null, //EPUB书籍当前章节的fragmentId
var endFragmentId: String? = null, //EPUB书籍下一章节的fragmentId var endFragmentId: String? = null, //EPUB书籍下一章节的fragmentId
override var variable: String? = null //变量 var variable: String? = null //变量
) : Parcelable, RuleDataInterface { ) : Parcelable, RuleDataInterface {
@delegate:Transient @delegate:Transient
@ -54,13 +55,19 @@ data class BookChapter(
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf() GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf()
} }
override fun putVariable(key: String, value: String?) { override fun putVariable(key: String, value: String?): Boolean {
super.putVariable(key, value) if (super.putVariable(key, value)) {
variable = GSON.toJson(variableMap) 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() override fun hashCode() = url.hashCode()

@ -2,7 +2,6 @@ package io.legado.app.data.entities
import androidx.room.Entity import androidx.room.Entity
import androidx.room.Ignore import androidx.room.Ignore
import io.legado.app.model.analyzeRule.RuleDataInterface
import io.legado.app.utils.GSON import io.legado.app.utils.GSON
import io.legado.app.utils.fromJsonObject import io.legado.app.utils.fromJsonObject
import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.IgnoredOnParcel
@ -13,18 +12,18 @@ import kotlinx.parcelize.IgnoredOnParcel
primaryKeys = ["origin", "link"] primaryKeys = ["origin", "link"]
) )
data class RssArticle( data class RssArticle(
var origin: String = "", override var origin: String = "",
var sort: String = "", var sort: String = "",
var title: String = "", var title: String = "",
var order: Long = 0, var order: Long = 0,
var link: String = "", override var link: String = "",
var pubDate: String? = null, var pubDate: String? = null,
var description: String? = null, var description: String? = null,
var content: String? = null, var content: String? = null,
var image: String? = null, var image: String? = null,
var read: Boolean = false, var read: Boolean = false,
override var variable: String? = null override var variable: String? = null
) : RuleDataInterface { ) : BaseRssArticle {
override fun hashCode() = link.hashCode() override fun hashCode() = link.hashCode()
@ -40,15 +39,6 @@ data class RssArticle(
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf() 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( fun toStar() = RssStar(
origin = origin, origin = origin,
sort = sort, sort = sort,

@ -2,7 +2,6 @@ package io.legado.app.data.entities
import androidx.room.Entity import androidx.room.Entity
import androidx.room.Ignore import androidx.room.Ignore
import io.legado.app.model.analyzeRule.RuleDataInterface
import io.legado.app.utils.GSON import io.legado.app.utils.GSON
import io.legado.app.utils.fromJsonObject import io.legado.app.utils.fromJsonObject
import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.IgnoredOnParcel
@ -13,17 +12,17 @@ import kotlinx.parcelize.IgnoredOnParcel
primaryKeys = ["origin", "link"] primaryKeys = ["origin", "link"]
) )
data class RssStar( data class RssStar(
var origin: String = "", override var origin: String = "",
var sort: String = "", var sort: String = "",
var title: String = "", var title: String = "",
var starTime: Long = 0, var starTime: Long = 0,
var link: String = "", override var link: String = "",
var pubDate: String? = null, var pubDate: String? = null,
var description: String? = null, var description: String? = null,
var content: String? = null, var content: String? = null,
var image: String? = null, var image: String? = null,
override var variable: String? = null override var variable: String? = null
) : RuleDataInterface { ) : BaseRssArticle {
@delegate:Transient @delegate:Transient
@delegate:Ignore @delegate:Ignore
@ -32,15 +31,6 @@ data class RssStar(
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: hashMapOf() 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( fun toRssArticle() = RssArticle(
origin = origin, origin = origin,
sort = sort, sort = sort,

@ -63,10 +63,6 @@ data class SearchBook(
GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: HashMap() GSON.fromJsonObject<HashMap<String, String>>(variable).getOrNull() ?: HashMap()
} }
override fun putBigVariable(key: String, value: String) {
}
@delegate:Transient @delegate:Transient
@delegate:Ignore @delegate:Ignore
@IgnoredOnParcel @IgnoredOnParcel

@ -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 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 { override val variableMap by lazy {
hashMapOf<String, String>() hashMapOf<String, String>()
} }
override fun putBigVariable(key: String, value: String) { override fun putBigVariable(key: String, value: String?) {
variableMap[key] = value 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 package io.legado.app.model.analyzeRule
import io.legado.app.utils.GSON
interface RuleDataInterface { interface RuleDataInterface {
var variable: String?
val variableMap: HashMap<String, String> val variableMap: HashMap<String, String>
fun putVariable(key: String, value: String?) { fun putVariable(key: String, value: String?): Boolean {
when { return when {
value == null -> { value == null -> {
variableMap.remove(key) variableMap.remove(key)
variable = GSON.toJson(variableMap) putBigVariable(key, value)
true
} }
value.length < 1000 -> { value.length < 1000 -> {
variableMap[key] = value variableMap[key] = value
variable = GSON.toJson(variableMap) true
} }
else -> { else -> {
variableMap[key] = value putBigVariable(key, value)
variable = GSON.toJson(variableMap) false
} }
} }
} }
fun putBigVariable(key: String, value: String) fun putBigVariable(key: String, value: String?)
fun getVariable(key: String): 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.NoStackTraceException
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeUrl 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.HtmlFormatter
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.StringUtils.wordCountFormat import io.legado.app.utils.StringUtils.wordCountFormat
@ -26,7 +27,7 @@ object BookList {
fun analyzeBookList( fun analyzeBookList(
scope: CoroutineScope, scope: CoroutineScope,
bookSource: BookSource, bookSource: BookSource,
variableBook: SearchBook, ruleData: RuleData,
analyzeUrl: AnalyzeUrl, analyzeUrl: AnalyzeUrl,
baseUrl: String, baseUrl: String,
body: String?, body: String?,
@ -41,7 +42,7 @@ object BookList {
val bookList = ArrayList<SearchBook>() val bookList = ArrayList<SearchBook>()
Debug.log(bookSource.bookSourceUrl, "≡获取成功:${analyzeUrl.ruleUrl}") Debug.log(bookSource.bookSourceUrl, "≡获取成功:${analyzeUrl.ruleUrl}")
Debug.log(bookSource.bookSourceUrl, body, state = 10) Debug.log(bookSource.bookSourceUrl, body, state = 10)
val analyzeRule = AnalyzeRule(variableBook, bookSource) val analyzeRule = AnalyzeRule(ruleData, bookSource)
analyzeRule.setContent(body).setBaseUrl(baseUrl) analyzeRule.setContent(body).setBaseUrl(baseUrl)
analyzeRule.setRedirectUrl(baseUrl) analyzeRule.setRedirectUrl(baseUrl)
bookSource.bookUrlPattern?.let { bookSource.bookUrlPattern?.let {
@ -49,7 +50,13 @@ object BookList {
if (baseUrl.matches(it.toRegex())) { if (baseUrl.matches(it.toRegex())) {
Debug.log(bookSource.bookSourceUrl, "≡链接为详情页") Debug.log(bookSource.bookSourceUrl, "≡链接为详情页")
getInfoItem( getInfoItem(
scope, bookSource, analyzeRule, analyzeUrl, body, baseUrl, variableBook.variable scope,
bookSource,
analyzeRule,
analyzeUrl,
body,
baseUrl,
ruleData.getVariable()
)?.let { searchBook -> )?.let { searchBook ->
searchBook.infoHtml = body searchBook.infoHtml = body
bookList.add(searchBook) bookList.add(searchBook)
@ -78,7 +85,7 @@ object BookList {
if (collections.isEmpty() && bookSource.bookUrlPattern.isNullOrEmpty()) { if (collections.isEmpty() && bookSource.bookUrlPattern.isNullOrEmpty()) {
Debug.log(bookSource.bookSourceUrl, "└列表为空,按详情页解析") Debug.log(bookSource.bookSourceUrl, "└列表为空,按详情页解析")
getInfoItem( getInfoItem(
scope, bookSource, analyzeRule, analyzeUrl, body, baseUrl, variableBook.variable scope, bookSource, analyzeRule, analyzeUrl, body, baseUrl, ruleData.getVariable()
)?.let { searchBook -> )?.let { searchBook ->
searchBook.infoHtml = body searchBook.infoHtml = body
bookList.add(searchBook) bookList.add(searchBook)
@ -95,7 +102,7 @@ object BookList {
Debug.log(bookSource.bookSourceUrl, "└列表大小:${collections.size}") Debug.log(bookSource.bookSourceUrl, "└列表大小:${collections.size}")
for ((index, item) in collections.withIndex()) { for ((index, item) in collections.withIndex()) {
getSearchItem( getSearchItem(
scope, bookSource, analyzeRule, item, baseUrl, variableBook.variable, scope, bookSource, analyzeRule, item, baseUrl, ruleData.getVariable(),
index == 0, index == 0,
ruleName = ruleName, ruleName = ruleName,
ruleBookUrl = ruleBookUrl, ruleBookUrl = ruleBookUrl,

@ -9,6 +9,7 @@ import io.legado.app.help.http.StrResponse
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.NoStackTraceException import io.legado.app.model.NoStackTraceException
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.analyzeRule.RuleData
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
@ -38,7 +39,7 @@ object WebBook {
key: String, key: String,
page: Int? = 1, page: Int? = 1,
): ArrayList<SearchBook> { ): ArrayList<SearchBook> {
val variableBook = SearchBook() val ruleData = RuleData()
bookSource.searchUrl?.let { searchUrl -> bookSource.searchUrl?.let { searchUrl ->
val analyzeUrl = AnalyzeUrl( val analyzeUrl = AnalyzeUrl(
mUrl = searchUrl, mUrl = searchUrl,
@ -47,7 +48,7 @@ object WebBook {
baseUrl = bookSource.bookSourceUrl, baseUrl = bookSource.bookSourceUrl,
headerMapF = bookSource.getHeaderMap(true), headerMapF = bookSource.getHeaderMap(true),
source = bookSource, source = bookSource,
ruleData = variableBook, ruleData = ruleData,
) )
var res = analyzeUrl.getStrResponseAwait() var res = analyzeUrl.getStrResponseAwait()
//检测书源是否已登录 //检测书源是否已登录
@ -59,7 +60,7 @@ object WebBook {
return BookList.analyzeBookList( return BookList.analyzeBookList(
scope = scope, scope = scope,
bookSource = bookSource, bookSource = bookSource,
variableBook = variableBook, ruleData = ruleData,
analyzeUrl = analyzeUrl, analyzeUrl = analyzeUrl,
baseUrl = res.url, baseUrl = res.url,
body = res.body, body = res.body,
@ -90,13 +91,13 @@ object WebBook {
url: String, url: String,
page: Int? = 1, page: Int? = 1,
): ArrayList<SearchBook> { ): ArrayList<SearchBook> {
val variableBook = SearchBook() val ruleData = RuleData()
val analyzeUrl = AnalyzeUrl( val analyzeUrl = AnalyzeUrl(
mUrl = url, mUrl = url,
page = page, page = page,
baseUrl = bookSource.bookSourceUrl, baseUrl = bookSource.bookSourceUrl,
source = bookSource, source = bookSource,
ruleData = variableBook, ruleData = ruleData,
headerMapF = bookSource.getHeaderMap(true) headerMapF = bookSource.getHeaderMap(true)
) )
var res = analyzeUrl.getStrResponseAwait() var res = analyzeUrl.getStrResponseAwait()
@ -109,7 +110,7 @@ object WebBook {
return BookList.analyzeBookList( return BookList.analyzeBookList(
scope = scope, scope = scope,
bookSource = bookSource, bookSource = bookSource,
variableBook = variableBook, ruleData = ruleData,
analyzeUrl = analyzeUrl, analyzeUrl = analyzeUrl,
baseUrl = res.url, baseUrl = res.url,
body = res.body, body = res.body,

Loading…
Cancel
Save