From 9c2cdd3729b692b57d549e6dccb3bc524d4b6a22 Mon Sep 17 00:00:00 2001 From: AlphaBoom <30779939+AlphaBoom@users.noreply.github.com> Date: Wed, 30 Oct 2024 02:53:07 +0800 Subject: [PATCH] xfani: fix filter error (#336) --- src/zh/xfani/build.gradle | 2 +- .../animeextension/zh/xfani/Filters.kt | 7 +- .../animeextension/zh/xfani/Xfani.kt | 153 ++++++++++++++---- 3 files changed, 133 insertions(+), 29 deletions(-) diff --git a/src/zh/xfani/build.gradle b/src/zh/xfani/build.gradle index a7ccc34c..71047c71 100644 --- a/src/zh/xfani/build.gradle +++ b/src/zh/xfani/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Xfani' extClass = '.Xfani' - extVersionCode = 2 + extVersionCode = 3 } apply from: "$rootDir/common.gradle" diff --git a/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Filters.kt b/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Filters.kt index 17c9656b..4072b453 100644 --- a/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Filters.kt +++ b/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Filters.kt @@ -52,7 +52,10 @@ class VersionFilter( class LetterFilter( tags: Array = "ABCDEFGHIJKLMNOPQRSTUYWXYZ".map { it.toString() }.toMutableList() - .also { it.add("0-9") }.toTypedArray(), + .also { + it.add(0, "全部") + it.add("0-9") + }.toTypedArray(), ) : TagFilter("字母", tags) class SortFilter( @@ -62,3 +65,5 @@ class SortFilter( "按评分" to "score", ), ) : SelectFilter("排序", kv) + +class YearFilter(tags: Array) : TagFilter("年份", tags) diff --git a/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt b/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt index 77a1e455..c0f5041c 100644 --- a/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt +++ b/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt @@ -17,7 +17,12 @@ import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive @@ -27,6 +32,7 @@ import okhttp3.MultipartBody import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import org.jsoup.nodes.Document import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy @@ -37,6 +43,13 @@ import javax.net.ssl.SSLHandshakeException import javax.net.ssl.TrustManager import javax.net.ssl.X509TrustManager +enum class FilterUpdateState { + NONE, + UPDATING, + UPDATED, + FAILED, +} + class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { override val baseUrl: String get() = "https://dick.xfani.com" @@ -52,6 +65,8 @@ class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { Injekt.get().getSharedPreferences("source_$id", 0x0000) } private val numberRegex = Regex("\\d+") + private var filterState = FilterUpdateState.NONE + private fun OkHttpClient.Builder.ignoreAllSSLErrors(): OkHttpClient.Builder { val naiveTrustManager = @SuppressLint("CustomX509TrustManager") @@ -74,12 +89,13 @@ class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { return this } - override val client: OkHttpClient - get() = if (preferences.getBoolean(PREF_KEY_IGNORE_SSL_ERROR, false)) { - network.client.newBuilder().ignoreAllSSLErrors().build() + override val client: OkHttpClient by lazy { + if (preferences.getBoolean(PREF_KEY_IGNORE_SSL_ERROR, false)) { + network.client.newBuilder().ignoreAllSSLErrors() } else { - network.client.newBuilder().addInterceptor(::checkSSLErrorInterceptor).build() - } + network.client.newBuilder().addInterceptor(::checkSSLErrorInterceptor) + }.addInterceptor(::updateFiltersInterceptor).build() + } private val selectedVideoSource get() = preferences.getString(PREF_KEY_VIDEO_SOURCE, DEFAULT_VIDEO_SOURCE)!!.toInt() @@ -92,6 +108,13 @@ class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { } } + private fun updateFiltersInterceptor(chain: Interceptor.Chain): Response { + if (filterState == FilterUpdateState.NONE) { + updateFilter() + } + return chain.proceed(chain.request()) + } + override fun animeDetailsParse(response: Response): SAnime { val jsoup = response.asJsoup() return SAnime.create().apply { @@ -118,10 +141,37 @@ class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { } override fun videoListParse(response: Response): List