diff --git a/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt b/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt index 3f4910d77..2758c82c3 100644 --- a/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt +++ b/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt @@ -2,12 +2,28 @@ 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 io.legado.app.model.SharedJsScope +import io.legado.app.utils.ACache +import io.legado.app.utils.GSON +import io.legado.app.utils.MD5Utils +import io.legado.app.utils.fromJsonArray +import io.legado.app.utils.isJsonArray +import io.legado.app.utils.printOnDebug import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext +import org.mozilla.javascript.Scriptable import java.util.concurrent.ConcurrentHashMap +import kotlin.collections.List +import kotlin.collections.arrayListOf +import kotlin.collections.emptyList +import kotlin.collections.filterNotNull +import kotlin.collections.first +import kotlin.collections.forEach +import kotlin.collections.getOrNull +import kotlin.collections.hashMapOf +import kotlin.collections.set /** * 采用md5作为key可以在分类修改后自动重新计算,不需要手动刷新 @@ -77,6 +93,10 @@ suspend fun BookSource.clearExploreKindsCache() { } } +suspend fun BookSource.getShareScope(): Scriptable? { + return SharedJsScope.getScope(jsLib) +} + fun BookSource.contains(word: String?): Boolean { if (word.isNullOrEmpty()) { return true diff --git a/app/src/main/java/io/legado/app/help/source/RssSourceExtensions.kt b/app/src/main/java/io/legado/app/help/source/RssSourceExtensions.kt index 3ef40b0e6..4c0b5f789 100644 --- a/app/src/main/java/io/legado/app/help/source/RssSourceExtensions.kt +++ b/app/src/main/java/io/legado/app/help/source/RssSourceExtensions.kt @@ -1,11 +1,13 @@ package io.legado.app.help.source import io.legado.app.data.entities.RssSource +import io.legado.app.model.SharedJsScope import io.legado.app.utils.ACache import io.legado.app.utils.MD5Utils import io.legado.app.utils.NetworkUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.mozilla.javascript.Scriptable private val aCache by lazy { ACache.get("rssSortUrl") } @@ -56,4 +58,8 @@ suspend fun RssSource.removeSortCache() { withContext(Dispatchers.IO) { aCache.remove(getSortUrlsKey()) } +} + +suspend fun RssSource.getShareScope(): Scriptable? { + return SharedJsScope.getScope(jsLib) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/SharedJsScope.kt b/app/src/main/java/io/legado/app/model/SharedJsScope.kt index 6b8a925f0..963418dd8 100644 --- a/app/src/main/java/io/legado/app/model/SharedJsScope.kt +++ b/app/src/main/java/io/legado/app/model/SharedJsScope.kt @@ -3,19 +3,26 @@ package io.legado.app.model import com.google.gson.reflect.TypeToken import com.script.SimpleBindings import io.legado.app.constant.SCRIPT_ENGINE +import io.legado.app.exception.NoStackTraceException import io.legado.app.help.http.newCallStrResponse import io.legado.app.help.http.okHttpClient +import io.legado.app.utils.ACache import io.legado.app.utils.GSON import io.legado.app.utils.MD5Utils import io.legado.app.utils.Rhino import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isJsonObject import org.mozilla.javascript.Scriptable +import splitties.init.appCtx +import java.io.File import java.lang.ref.WeakReference import kotlin.collections.set object SharedJsScope { + private val cacheFolder = File(appCtx.filesDir, "shareJs") + private val aCache = ACache.get(cacheFolder) + private val scopeMap = hashMapOf>() suspend fun getScope(jsLib: String?): Scriptable? { @@ -39,9 +46,18 @@ object SharedJsScope { ) jsMap.values.forEach { value -> if (value.isAbsUrl()) { - val js = okHttpClient.newCallStrResponse { - url(value) - }.body + val fileName = MD5Utils.md5Encode(value) + var js = aCache.getAsString(fileName) + if (js == null) { + js = okHttpClient.newCallStrResponse { + url(value) + }.body + if (js !== null) { + aCache.put(fileName, js) + } else { + throw NoStackTraceException("下载jsLib-${value}失败") + } + } evaluateString(scope, js, "jsLib", 1, null) } }