|
@@ -8,6 +8,10 @@ import io.legado.app.constant.BookType
|
|
|
import io.legado.app.data.entities.rule.*
|
|
import io.legado.app.data.entities.rule.*
|
|
|
import io.legado.app.help.SourceAnalyzer
|
|
import io.legado.app.help.SourceAnalyzer
|
|
|
import io.legado.app.utils.*
|
|
import io.legado.app.utils.*
|
|
|
|
|
+import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
|
+import kotlinx.coroutines.sync.Mutex
|
|
|
|
|
+import kotlinx.coroutines.sync.withLock
|
|
|
|
|
+import kotlinx.coroutines.withContext
|
|
|
import kotlinx.parcelize.IgnoredOnParcel
|
|
import kotlinx.parcelize.IgnoredOnParcel
|
|
|
import kotlinx.parcelize.Parcelize
|
|
import kotlinx.parcelize.Parcelize
|
|
|
import java.io.InputStream
|
|
import java.io.InputStream
|
|
@@ -89,46 +93,66 @@ data class BookSource(
|
|
|
return bookSourceUrl
|
|
return bookSourceUrl
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- @delegate:Transient
|
|
|
|
|
- @delegate:Ignore
|
|
|
|
|
|
|
+ @Ignore
|
|
|
@IgnoredOnParcel
|
|
@IgnoredOnParcel
|
|
|
- val exploreKinds: List<ExploreKind> by lazy {
|
|
|
|
|
- val exploreUrl = exploreUrl ?: return@lazy emptyList()
|
|
|
|
|
- val kinds = arrayListOf<ExploreKind>()
|
|
|
|
|
- var ruleStr = exploreUrl
|
|
|
|
|
- if (ruleStr.isNotBlank()) {
|
|
|
|
|
- kotlin.runCatching {
|
|
|
|
|
- if (exploreUrl.startsWith("<js>", false)
|
|
|
|
|
- || exploreUrl.startsWith("@js:", false)
|
|
|
|
|
- ) {
|
|
|
|
|
- val aCache = ACache.get("explore")
|
|
|
|
|
- ruleStr = aCache.getAsString(bookSourceUrl) ?: ""
|
|
|
|
|
- if (ruleStr.isBlank()) {
|
|
|
|
|
- val jsStr = if (exploreUrl.startsWith("@")) {
|
|
|
|
|
- exploreUrl.substring(4)
|
|
|
|
|
- } else {
|
|
|
|
|
- exploreUrl.substring(4, exploreUrl.lastIndexOf("<"))
|
|
|
|
|
|
|
+ private var exploreKinds: List<ExploreKind>? = null
|
|
|
|
|
+
|
|
|
|
|
+ @Ignore
|
|
|
|
|
+ @IgnoredOnParcel
|
|
|
|
|
+ private val mutex = Mutex()
|
|
|
|
|
+
|
|
|
|
|
+ suspend fun exploreKinds(): List<ExploreKind> {
|
|
|
|
|
+ exploreKinds?.let { return it }
|
|
|
|
|
+ val exploreUrl = exploreUrl
|
|
|
|
|
+ if (exploreUrl.isNullOrBlank()) {
|
|
|
|
|
+ return emptyList()
|
|
|
|
|
+ }
|
|
|
|
|
+ mutex.withLock {
|
|
|
|
|
+ exploreKinds?.let { return it }
|
|
|
|
|
+ val kinds = arrayListOf<ExploreKind>()
|
|
|
|
|
+ var ruleStr: String = exploreUrl
|
|
|
|
|
+ withContext(IO) {
|
|
|
|
|
+ kotlin.runCatching {
|
|
|
|
|
+ if (exploreUrl.startsWith("<js>", false)
|
|
|
|
|
+ || exploreUrl.startsWith("@js:", false)
|
|
|
|
|
+ ) {
|
|
|
|
|
+ val aCache = ACache.get("explore")
|
|
|
|
|
+ ruleStr = aCache.getAsString(bookSourceUrl) ?: ""
|
|
|
|
|
+ if (ruleStr.isBlank()) {
|
|
|
|
|
+ val jsStr = if (exploreUrl.startsWith("@")) {
|
|
|
|
|
+ exploreUrl.substring(4)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ exploreUrl.substring(4, exploreUrl.lastIndexOf("<"))
|
|
|
|
|
+ }
|
|
|
|
|
+ ruleStr = evalJS(jsStr).toString().trim()
|
|
|
|
|
+ aCache.put(bookSourceUrl, ruleStr)
|
|
|
}
|
|
}
|
|
|
- ruleStr = evalJS(jsStr).toString().trim()
|
|
|
|
|
- aCache.put(bookSourceUrl, ruleStr)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if (ruleStr.isJsonArray()) {
|
|
|
|
|
- GSON.fromJsonArray<ExploreKind>(ruleStr).getOrThrow()?.let {
|
|
|
|
|
- kinds.addAll(it)
|
|
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
- ruleStr.split("(&&|\n)+".toRegex()).forEach { kindStr ->
|
|
|
|
|
- val kindCfg = kindStr.split("::")
|
|
|
|
|
- kinds.add(ExploreKind(kindCfg.first(), kindCfg.getOrNull(1)))
|
|
|
|
|
|
|
+ if (ruleStr.isJsonArray()) {
|
|
|
|
|
+ GSON.fromJsonArray<ExploreKind>(ruleStr).getOrThrow()?.let {
|
|
|
|
|
+ kinds.addAll(it)
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ruleStr.split("(&&|\n)+".toRegex()).forEach { kindStr ->
|
|
|
|
|
+ val kindCfg = kindStr.split("::")
|
|
|
|
|
+ kinds.add(ExploreKind(kindCfg.first(), kindCfg.getOrNull(1)))
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ }.onFailure {
|
|
|
|
|
+ kinds.add(ExploreKind("ERROR:${it.localizedMessage}", it.stackTraceToString()))
|
|
|
|
|
+ it.printOnDebug()
|
|
|
}
|
|
}
|
|
|
- }.onFailure {
|
|
|
|
|
- kinds.add(ExploreKind("ERROR:${it.localizedMessage}", it.stackTraceToString()))
|
|
|
|
|
- it.printOnDebug()
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ exploreKinds = kinds
|
|
|
|
|
+ return kinds
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ suspend fun clearExploreKindsCache() {
|
|
|
|
|
+ withContext(IO) {
|
|
|
|
|
+ ACache.get("explore").remove(bookSourceUrl)
|
|
|
|
|
+ exploreKinds = null
|
|
|
}
|
|
}
|
|
|
- return@lazy kinds
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun hashCode(): Int {
|
|
override fun hashCode(): Int {
|