From 93054925ae04025e181531ed44ad39737e11ee35 Mon Sep 17 00:00:00 2001 From: anenasa <84259093+anenasa@users.noreply.github.com> Date: Mon, 9 May 2022 21:14:02 +0800 Subject: [PATCH] Wuqimanga: Fixes (#11782) 1. Update baseUrl 2. Add preference screen for selecting image server 3. Support latest manga 4. Fix popular manga only showing first page 5. Fix searchMangaNextPageSelector 6. Fix manga description 7. Fix page list parsing 8. Remove unused overrides --- src/zh/wuqimanga/build.gradle | 2 +- .../tachiyomi/extension/zh/wuqimanga/Comic.kt | 8 -- .../extension/zh/wuqimanga/WuqiManga.kt | 76 ++++++++++--------- 3 files changed, 42 insertions(+), 44 deletions(-) delete mode 100644 src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/Comic.kt diff --git a/src/zh/wuqimanga/build.gradle b/src/zh/wuqimanga/build.gradle index b32c4d9cd..1624ac982 100644 --- a/src/zh/wuqimanga/build.gradle +++ b/src/zh/wuqimanga/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'WuqiManga' pkgNameSuffix = 'zh.wuqimanga' extClass = '.WuqiManga' - extVersionCode = 2 + extVersionCode = 3 } apply from: "$rootDir/common.gradle" diff --git a/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/Comic.kt b/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/Comic.kt deleted file mode 100644 index dcb957081..000000000 --- a/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/Comic.kt +++ /dev/null @@ -1,8 +0,0 @@ -package eu.kanade.tachiyomi.extension.zh.wuqimanga - -import kotlinx.serialization.Serializable - -@Serializable -class Comic { - val fs: List? = listOf() -} diff --git a/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt b/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt index 0b47c99f3..08d0f8fb2 100644 --- a/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt +++ b/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt @@ -1,38 +1,46 @@ package eu.kanade.tachiyomi.extension.zh.wuqimanga +import android.app.Application +import android.content.SharedPreferences +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen import com.squareup.duktape.Duktape import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element -import uy.kohesive.injekt.injectLazy +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get -class WuqiManga : ParsedHttpSource() { +class WuqiManga : ParsedHttpSource(), ConfigurableSource { override val name = "57漫画" - override val baseUrl = "http://www.wuqimh.com" + override val baseUrl = "http://www.wuqimh.net" override val lang = "zh" - override val supportsLatest = false - private val imageServer = "http://images.lancaier.com" + override val supportsLatest = true + // Server list can be found from baseUrl/templates/wuqi/default/scripts/configs.js?v=1.0.3 + private val imageServer = arrayOf("http://imagesold.benzidui.com", "http://images.tingliu.cc") - override fun latestUpdatesRequest(page: Int) = throw Exception("Not used") - override fun latestUpdatesNextPageSelector() = throw Exception("Not used") - override fun latestUpdatesSelector() = throw Exception("Not used") - override fun latestUpdatesFromElement(element: Element) = throw Exception("Not used") + private val preferences: SharedPreferences = + Injekt.get().getSharedPreferences("source_$id", 0x0000) - override fun popularMangaRequest(page: Int) = GET("$baseUrl/list/area-日本-order-hits", headers) + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/list/order-addtime-p-$page", headers) + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + override fun latestUpdatesSelector() = popularMangaSelector() + override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/list/order-hits-p-$page", headers) override fun popularMangaSelector() = "ul#contList > li" - override fun popularMangaNextPageSelector(): String? = null + override fun popularMangaNextPageSelector(): String? = "span.pager > a.prev:contains(下一页)" override fun popularMangaFromElement(element: Element): SManga { val coverEl = element.select("a img").first() @@ -57,7 +65,7 @@ class WuqiManga : ParsedHttpSource() { return GET("$baseUrl/search/q_$query-p-$page", headers) } - override fun searchMangaNextPageSelector() = "div.book-result > div > span > a.prev" + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() override fun searchMangaSelector() = "div.book-result li.cf" override fun searchMangaFromElement(element: Element): SManga { val manga = SManga.create() @@ -82,12 +90,8 @@ class WuqiManga : ParsedHttpSource() { return manga } - override fun mangaDetailsRequest(manga: SManga) = GET("$baseUrl/${manga.url}", headers) - override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) override fun chapterListSelector() = throw Exception("Not used") - override fun pageListRequest(chapter: SChapter) = GET("$baseUrl/${chapter.url}", headers) - override fun headersBuilder() = Headers.Builder().add("Referer", "$baseUrl/") .set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36") @@ -102,7 +106,7 @@ class WuqiManga : ParsedHttpSource() { override fun mangaDetailsParse(document: Document): SManga { val manga = SManga.create() - manga.description = "" + manga.description = document.selectFirst("div#intro-all > p").text() manga.title = document.select(".book-title h1").text().trim() manga.thumbnail_url = document.select(".hcover img").attr("src") for (element in document.select("ul.detail-list li span")) { @@ -114,14 +118,6 @@ class WuqiManga : ParsedHttpSource() { return manga } - override fun imageRequest(page: Page): Request { - return GET(page.imageUrl.toString(), headers) - } - - override fun imageUrlRequest(page: Page): Request { - return GET(page.imageUrl.toString(), headers) - } - override fun imageUrlParse(document: Document): String = "" override fun chapterListParse(response: Response): List { @@ -139,8 +135,6 @@ class WuqiManga : ParsedHttpSource() { return chapters } - private val json: Json by injectLazy() - override fun pageListParse(document: Document): List { val html = document.html() val packed = Regex("eval(.*?)\\n").find(html)?.groups?.get(1)?.value @@ -149,13 +143,25 @@ class WuqiManga : ParsedHttpSource() { } val re2 = Regex("""\{.*\}""") val imgJsonStr = re2.find(result)?.groups?.get(0)?.value - val imageJson: Comic = json.decodeFromString(imgJsonStr!!) - - return imageJson.fs!!.mapIndexed { i, imgStr -> - val imgurl = "$imageServer$imgStr" - Page(i, "", imgurl) + val server = preferences.getString("IMAGE_SERVER", imageServer[0]) + // The website is using single quotes in json, so kotlinx.serialization doesn't work + return imgJsonStr!!.substringAfter("'fs':['").substringBefore("'],").split("','").mapIndexed { index, it -> + Page(index, "", if (it.startsWith("http")) it else "$server$it") } } - override fun getFilterList() = FilterList() + override fun setupPreferenceScreen(screen: PreferenceScreen) { + ListPreference(screen.context).apply { + key = "IMAGE_SERVER" + title = "线路" + summary = "需要清除章节缓存以生效" + entries = arrayOf("主线", "备用") + entryValues = imageServer + setDefaultValue(imageServer[0]) + + setOnPreferenceChangeListener { _, newValue -> + preferences.edit().putString(key, newValue as String).commit() + } + }.let(screen::addPreference) + } }