This commit is contained in:
Horis
2025-04-19 16:49:25 +08:00
parent 041cd1420b
commit aa2485839e
16 changed files with 48 additions and 45 deletions
@@ -4,6 +4,7 @@ import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import kotlin.coroutines.coroutineContext import kotlin.coroutines.coroutineContext
@@ -3,6 +3,7 @@ package io.legado.app.help
import androidx.annotation.Keep import androidx.annotation.Keep
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.ACache import io.legado.app.utils.ACache
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
@@ -4,8 +4,6 @@ import com.bumptech.glide.load.Option
import com.bumptech.glide.load.Options import com.bumptech.glide.load.Options
import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.load.model.ModelLoader import com.bumptech.glide.load.model.ModelLoader
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.isAbsUrl
import java.io.InputStream import java.io.InputStream
object OkHttpModelLoader : ModelLoader<GlideUrl?, InputStream?> { object OkHttpModelLoader : ModelLoader<GlideUrl?, InputStream?> {
@@ -20,15 +18,7 @@ object OkHttpModelLoader : ModelLoader<GlideUrl?, InputStream?> {
height: Int, height: Int,
options: Options, options: Options,
): ModelLoader.LoadData<InputStream?> { ): ModelLoader.LoadData<InputStream?> {
val cacheKey = model.toString() return ModelLoader.LoadData(model, OkHttpStreamFetcher(model, options))
var modelWithHeader = model
if (cacheKey.isAbsUrl()) {
modelWithHeader = AnalyzeUrl(cacheKey).getGlideUrl()
}
return ModelLoader.LoadData(
modelWithHeader,
OkHttpStreamFetcher(model,modelWithHeader, options)
)
} }
override fun handles(model: GlideUrl): Boolean { override fun handles(model: GlideUrl): Boolean {
@@ -10,12 +10,12 @@ import com.bumptech.glide.util.ContentLengthInputStream
import com.script.rhino.runScriptWithContext import com.script.rhino.runScriptWithContext
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.http.CookieManager.cookieJarHeader
import io.legado.app.help.http.addHeaders import io.legado.app.help.http.addHeaders
import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.okHttpClient
import io.legado.app.help.http.okHttpClientManga import io.legado.app.help.http.okHttpClientManga
import io.legado.app.help.source.SourceHelp import io.legado.app.help.source.SourceHelp
import io.legado.app.model.ReadManga import io.legado.app.model.ReadManga
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.ImageUtils import io.legado.app.utils.ImageUtils
import io.legado.app.utils.isWifiConnect import io.legado.app.utils.isWifiConnect
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@@ -30,7 +30,6 @@ import java.io.InputStream
class OkHttpStreamFetcher( class OkHttpStreamFetcher(
private val oldUrl: GlideUrl,
private val url: GlideUrl, private val url: GlideUrl,
private val options: Options, private val options: Options,
) : ) :
@@ -41,6 +40,7 @@ class OkHttpStreamFetcher(
private var source: BaseSource? = null private var source: BaseSource? = null
private val manga = options.get(OkHttpModelLoader.mangaOption) == true private val manga = options.get(OkHttpModelLoader.mangaOption) == true
private val coroutineContext = Job() private val coroutineContext = Job()
private lateinit var analyzedUrl: GlideUrl
@Volatile @Volatile
private var call: Call? = null private var call: Call? = null
@@ -59,21 +59,19 @@ class OkHttpStreamFetcher(
callback.onLoadFailed(NoStackTraceException("只在wifi加载图片")) callback.onLoadFailed(NoStackTraceException("只在wifi加载图片"))
return return
} }
val requestBuilder: Request.Builder = Request.Builder().url(url.toStringUrl())
val headerMap = HashMap<String, String>()
options.get(OkHttpModelLoader.sourceOriginOption)?.let { sourceUrl -> options.get(OkHttpModelLoader.sourceOriginOption)?.let { sourceUrl ->
source = SourceHelp.getSource(sourceUrl) source = SourceHelp.getSource(sourceUrl)
runScriptWithContext(coroutineContext) {
source?.getHeaderMap(true)?.let {
headerMap.putAll(it)
}
}
if (source?.enabledCookieJar == true) {
headerMap[cookieJarHeader] = "1"
}
} }
headerMap.putAll(url.headers)
requestBuilder.addHeaders(headerMap) analyzedUrl = AnalyzeUrl(
url.toString(),
source = source,
coroutineContext = coroutineContext
).getGlideUrl()
val requestBuilder = Request.Builder().url(analyzedUrl.toStringUrl())
requestBuilder.addHeaders(analyzedUrl.headers)
val request: Request = requestBuilder.build() val request: Request = requestBuilder.build()
this.callback = callback this.callback = callback
call = if (manga) { call = if (manga) {
@@ -118,7 +116,7 @@ class OkHttpStreamFetcher(
responseBody!!.byteStream() responseBody!!.byteStream()
} else if (manga) { } else if (manga) {
ImageUtils.decode( ImageUtils.decode(
oldUrl.toString(), url.toString(),
responseBody!!.bytes(), responseBody!!.bytes(),
isCover = false, isCover = false,
source, source,
@@ -126,7 +124,7 @@ class OkHttpStreamFetcher(
)?.inputStream() )?.inputStream()
} else { } else {
ImageUtils.decode( ImageUtils.decode(
url.toStringUrl(), responseBody!!.byteStream(), analyzedUrl.toStringUrl(), responseBody!!.byteStream(),
isCover = true, source isCover = true, source
) )
} }
@@ -142,7 +140,7 @@ class OkHttpStreamFetcher(
} }
} else { } else {
if (!manga) { if (!manga) {
failUrl.add(url.toStringUrl()) failUrl.add(analyzedUrl.toStringUrl())
} }
callback?.onLoadFailed(HttpException(response.message, response.code)) callback?.onLoadFailed(HttpException(response.message, response.code))
} }
@@ -27,6 +27,7 @@ import io.legado.app.help.glide.BlurTransformation
import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.BitmapUtils import io.legado.app.utils.BitmapUtils
import io.legado.app.utils.GSON import io.legado.app.utils.GSON
@@ -88,11 +88,6 @@ class AnalyzeRule(
return this return this
} }
fun setCoroutineContext(context: CoroutineContext): AnalyzeRule {
coroutineContext = context.minusKey(ContinuationInterceptor)
return this
}
fun setBaseUrl(baseUrl: String?): AnalyzeRule { fun setBaseUrl(baseUrl: String?): AnalyzeRule {
baseUrl?.let { baseUrl?.let {
this.baseUrl = baseUrl this.baseUrl = baseUrl
@@ -861,6 +856,12 @@ class AnalyzeRule(
private val evalPattern = private val evalPattern =
Pattern.compile("@get:\\{[^}]+?\\}|\\{\\{[\\w\\W]*?\\}\\}", Pattern.CASE_INSENSITIVE) Pattern.compile("@get:\\{[^}]+?\\}|\\{\\{[\\w\\W]*?\\}\\}", Pattern.CASE_INSENSITIVE)
private val regexPattern = Pattern.compile("\\$\\d{1,2}") private val regexPattern = Pattern.compile("\\$\\d{1,2}")
fun AnalyzeRule.setCoroutineContext(context: CoroutineContext): AnalyzeRule {
coroutineContext = context.minusKey(ContinuationInterceptor)
return this
}
} }
} }
@@ -78,7 +78,7 @@ class AnalyzeUrl(
val page: Int? = null, val page: Int? = null,
val speakText: String? = null, val speakText: String? = null,
val speakSpeed: Int? = null, val speakSpeed: Int? = null,
var baseUrl: String = "", private var baseUrl: String = "",
private val source: BaseSource? = null, private val source: BaseSource? = null,
private val ruleData: RuleDataInterface? = null, private val ruleData: RuleDataInterface? = null,
private val chapter: BookChapter? = null, private val chapter: BookChapter? = null,
@@ -88,12 +88,6 @@ class AnalyzeUrl(
headerMapF: Map<String, String>? = null, headerMapF: Map<String, String>? = null,
hasLoginHeader: Boolean = true hasLoginHeader: Boolean = true
) : JsExtensions { ) : JsExtensions {
companion object {
val paramPattern: Pattern = Pattern.compile("\\s*,\\s*(?=\\{)")
private val pagePattern = Pattern.compile("<(.*?)>")
private val queryEncoder =
RFC3986.UNRESERVED.orNew(PercentCodec.of("!$%&()*+,/:;=?@[\\]^`{|}"))
}
var ruleUrl = "" var ruleUrl = ""
private set private set
@@ -644,11 +638,6 @@ class AnalyzeUrl(
return GlideUrl(url, GlideHeaders(headerMap)) return GlideUrl(url, GlideHeaders(headerMap))
} }
fun getMediaItem(): MediaItem {
setCookie()
return ExoPlayerHelper.createMediaItem(url, headerMap)
}
fun getUserAgent(): String { fun getUserAgent(): String {
return headerMap.get(UA_NAME, true) ?: AppConfig.userAgent return headerMap.get(UA_NAME, true) ?: AppConfig.userAgent
} }
@@ -661,6 +650,19 @@ class AnalyzeUrl(
return source return source
} }
companion object {
val paramPattern: Pattern = Pattern.compile("\\s*,\\s*(?=\\{)")
private val pagePattern = Pattern.compile("<(.*?)>")
private val queryEncoder =
RFC3986.UNRESERVED.orNew(PercentCodec.of("!$%&()*+,/:;=?@[\\]^`{|}"))
fun AnalyzeUrl.getMediaItem(): MediaItem {
setCookie()
return ExoPlayerHelper.createMediaItem(url, headerMap)
}
}
@Keep @Keep
data class UrlOption( data class UrlOption(
private var method: String? = null, private var method: String? = null,
@@ -6,6 +6,7 @@ import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.http.StrResponse import io.legado.app.help.http.StrResponse
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
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.model.analyzeRule.RuleData
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
@@ -7,6 +7,7 @@ import io.legado.app.data.entities.RssSource
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.analyzeRule.RuleData import io.legado.app.model.analyzeRule.RuleData
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
import splitties.init.appCtx import splitties.init.appCtx
@@ -16,6 +16,7 @@ import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.isTrue import io.legado.app.utils.isTrue
import io.legado.app.utils.mapAsync import io.legado.app.utils.mapAsync
@@ -13,6 +13,7 @@ import io.legado.app.help.book.BookHelp
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.HtmlFormatter import io.legado.app.utils.HtmlFormatter
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
@@ -9,6 +9,7 @@ import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.isWebFile import io.legado.app.help.book.isWebFile
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.utils.DebugLog import io.legado.app.utils.DebugLog
import io.legado.app.utils.HtmlFormatter import io.legado.app.utils.HtmlFormatter
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
@@ -10,6 +10,7 @@ import io.legado.app.help.book.BookHelp
import io.legado.app.help.source.getBookType import io.legado.app.help.source.getBookType
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
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.model.analyzeRule.RuleData
import io.legado.app.utils.HtmlFormatter import io.legado.app.utils.HtmlFormatter
@@ -14,6 +14,7 @@ import io.legado.app.help.http.StrResponse
import io.legado.app.help.source.getBookType import io.legado.app.help.source.getBookType
import io.legado.app.model.Debug import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
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.model.analyzeRule.RuleData
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -36,6 +36,7 @@ import io.legado.app.help.exoplayer.ExoPlayerHelper
import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.ImageLoader
import io.legado.app.model.AudioPlay import io.legado.app.model.AudioPlay
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.analyzeRule.AnalyzeUrl.Companion.getMediaItem
import io.legado.app.receiver.MediaButtonReceiver import io.legado.app.receiver.MediaButtonReceiver
import io.legado.app.ui.book.audio.AudioPlayActivity import io.legado.app.ui.book.audio.AudioPlayActivity
import io.legado.app.utils.activityPendingIntent import io.legado.app.utils.activityPendingIntent
@@ -61,6 +61,7 @@ import io.legado.app.lib.theme.accentColor
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.localBook.EpubFile import io.legado.app.model.localBook.EpubFile
import io.legado.app.model.localBook.MobiFile import io.legado.app.model.localBook.MobiFile
import io.legado.app.receiver.NetworkChangedListener import io.legado.app.receiver.NetworkChangedListener