diff --git a/src/zh/hanime1/build.gradle b/src/zh/hanime1/build.gradle index 85bc719b..f1b59699 100644 --- a/src/zh/hanime1/build.gradle +++ b/src/zh/hanime1/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Hanime1' extClass = '.Hanime1' - extVersionCode = 4 + extVersionCode = 5 isNsfw = true } diff --git a/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt index ab8e354b..f3bdfdb9 100644 --- a/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt +++ b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.animeextension.zh.hanime1 import android.app.Application import android.content.SharedPreferences +import android.util.Log import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource @@ -19,9 +20,11 @@ import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import okhttp3.Cookie @@ -65,14 +68,32 @@ class Hanime1 : AnimeHttpSource(), ConfigurableAnimeSource { } override fun animeDetailsParse(response: Response): SAnime { - val jsoup = response.asJsoup() + val doc = response.asJsoup() return SAnime.create().apply { - genre = jsoup.select(".single-video-tag").not("[data-toggle]").eachText().joinToString() - author = jsoup.select("#video-artist-name").text() - jsoup.select("script[type=application/ld+json]").first()?.data()?.let { + genre = doc.select(".single-video-tag").not("[data-toggle]").eachText().joinToString() + author = doc.select("#video-artist-name").text() + doc.select("script[type=application/ld+json]").first()?.data()?.let { val info = json.decodeFromString(it).jsonObject title = info["name"]!!.jsonPrimitive.content description = info["description"]!!.jsonPrimitive.content + thumbnail_url = info["thumbnailUrl"]?.jsonArray?.get(0)?.jsonPrimitive?.content + } + val type = doc.select("a#video-artist-name + a").text().trim() + if (type == "裏番" || type == "泡麵番") { + // Use the series cover image for bangumi entries instead of the episode image. + runBlocking { + try { + val animesPage = + getSearchAnime( + 1, + title, + AnimeFilterList(GenreFilter(arrayOf("", type)).apply { state = 1 }), + ) + thumbnail_url = animesPage.animes.first().thumbnail_url + } catch (e: Exception) { + Log.e(name, "Failed to get bangumi cover image") + } + } } } } @@ -137,7 +158,7 @@ class Hanime1 : AnimeHttpSource(), ConfigurableAnimeSource { override fun searchAnimeParse(response: Response): AnimesPage { val jsoup = response.asJsoup() - val nodes = jsoup.select("div.search-doujin-videos.hidden-xs") + val nodes = jsoup.select("div.search-doujin-videos.hidden-xs:not(:has(a[target=_blank]))") val list = if (nodes.isNotEmpty()) { nodes.map { SAnime.create().apply {