pull/2311/head
parent
b22e1ffb34
commit
c695985b75
@ -0,0 +1,72 @@ |
|||||||
|
package io.legado.app.help.source |
||||||
|
|
||||||
|
import io.legado.app.data.entities.BookSource |
||||||
|
import io.legado.app.data.entities.rule.ExploreKind |
||||||
|
import io.legado.app.utils.* |
||||||
|
import kotlinx.coroutines.Dispatchers |
||||||
|
import kotlinx.coroutines.sync.Mutex |
||||||
|
import kotlinx.coroutines.sync.withLock |
||||||
|
import kotlinx.coroutines.withContext |
||||||
|
|
||||||
|
private val mutexMap by lazy { hashMapOf<String, Mutex>() } |
||||||
|
private val exploreKindsMap by lazy { hashMapOf<String, List<ExploreKind>>() } |
||||||
|
private val aCache by lazy { ACache.get("explore") } |
||||||
|
|
||||||
|
private fun BookSource.exploreKindsKey(): String { |
||||||
|
return MD5Utils.md5Encode(bookSourceUrl + exploreUrl) |
||||||
|
} |
||||||
|
|
||||||
|
suspend fun BookSource.exploreKinds(): List<ExploreKind> { |
||||||
|
val exploreKindsKey = exploreKindsKey() |
||||||
|
exploreKindsMap[exploreKindsKey]?.let { return it } |
||||||
|
val exploreUrl = exploreUrl |
||||||
|
if (exploreUrl.isNullOrBlank()) { |
||||||
|
return emptyList() |
||||||
|
} |
||||||
|
val mutex = mutexMap[bookSourceUrl] ?: Mutex().apply { mutexMap[bookSourceUrl] = this } |
||||||
|
mutex.withLock { |
||||||
|
exploreKindsMap[exploreKindsKey()]?.let { return it } |
||||||
|
val kinds = arrayListOf<ExploreKind>() |
||||||
|
var ruleStr: String = exploreUrl |
||||||
|
withContext(Dispatchers.IO) { |
||||||
|
kotlin.runCatching { |
||||||
|
if (exploreUrl.startsWith("<js>", false) |
||||||
|
|| exploreUrl.startsWith("@js:", false) |
||||||
|
) { |
||||||
|
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(exploreKindsKey, 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))) |
||||||
|
} |
||||||
|
} |
||||||
|
}.onFailure { |
||||||
|
kinds.add(ExploreKind("ERROR:${it.localizedMessage}", it.stackTraceToString())) |
||||||
|
it.printOnDebug() |
||||||
|
} |
||||||
|
} |
||||||
|
exploreKindsMap[exploreKindsKey] = kinds |
||||||
|
return kinds |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
suspend fun BookSource.clearExploreKindsCache() { |
||||||
|
withContext(Dispatchers.IO) { |
||||||
|
aCache.remove(bookSourceUrl) |
||||||
|
exploreKindsMap.remove(exploreKindsKey()) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package io.legado.app.help.source |
||||||
|
|
||||||
|
import io.legado.app.data.entities.RssSource |
||||||
|
import io.legado.app.utils.ACache |
||||||
|
import io.legado.app.utils.MD5Utils |
||||||
|
import kotlinx.coroutines.Dispatchers |
||||||
|
import kotlinx.coroutines.withContext |
||||||
|
|
||||||
|
private val aCache by lazy { ACache.get("rssSortUrl") } |
||||||
|
|
||||||
|
private fun RssSource.sortUrlsKey(): String { |
||||||
|
return MD5Utils.md5Encode(sourceUrl + sortUrl) |
||||||
|
} |
||||||
|
|
||||||
|
suspend fun RssSource.sortUrls(): List<Pair<String, String>> = |
||||||
|
arrayListOf<Pair<String, String>>().apply { |
||||||
|
val sortUrlsKey = sortUrlsKey() |
||||||
|
withContext(Dispatchers.IO) { |
||||||
|
kotlin.runCatching { |
||||||
|
var a = sortUrl |
||||||
|
if (sortUrl?.startsWith("<js>", false) == true |
||||||
|
|| sortUrl?.startsWith("@js:", false) == true |
||||||
|
) { |
||||||
|
a = aCache.getAsString(sortUrlsKey) ?: "" |
||||||
|
if (a.isBlank()) { |
||||||
|
val jsStr = if (sortUrl!!.startsWith("@")) { |
||||||
|
sortUrl!!.substring(4) |
||||||
|
} else { |
||||||
|
sortUrl!!.substring(4, sortUrl!!.lastIndexOf("<")) |
||||||
|
} |
||||||
|
a = evalJS(jsStr).toString() |
||||||
|
aCache.put(sortUrlsKey, a) |
||||||
|
} |
||||||
|
} |
||||||
|
a?.split("(&&|\n)+".toRegex())?.forEach { c -> |
||||||
|
val d = c.split("::") |
||||||
|
if (d.size > 1) |
||||||
|
add(Pair(d[0], d[1])) |
||||||
|
} |
||||||
|
if (isEmpty()) { |
||||||
|
add(Pair("", sourceUrl)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
suspend fun RssSource.removeSortCache() { |
||||||
|
withContext(Dispatchers.IO) { |
||||||
|
aCache.remove(sortUrlsKey()) |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package io.legado.app.help |
package io.legado.app.help.source |
||||||
|
|
||||||
import androidx.annotation.Keep |
import androidx.annotation.Keep |
||||||
import com.jayway.jsonpath.JsonPath |
import com.jayway.jsonpath.JsonPath |
@ -1,8 +1,10 @@ |
|||||||
package io.legado.app.help |
package io.legado.app.help.source |
||||||
|
|
||||||
import io.legado.app.constant.AppLog |
import io.legado.app.constant.AppLog |
||||||
import io.legado.app.data.entities.BaseSource |
import io.legado.app.data.entities.BaseSource |
||||||
import io.legado.app.exception.NoStackTraceException |
import io.legado.app.exception.NoStackTraceException |
||||||
|
import io.legado.app.help.CacheManager |
||||||
|
import io.legado.app.help.IntentData |
||||||
import io.legado.app.ui.association.VerificationCodeActivity |
import io.legado.app.ui.association.VerificationCodeActivity |
||||||
import io.legado.app.ui.browser.WebViewActivity |
import io.legado.app.ui.browser.WebViewActivity |
||||||
import io.legado.app.utils.startActivity |
import io.legado.app.utils.startActivity |
Loading…
Reference in new issue