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
This commit is contained in:
anenasa 2022-05-09 21:14:02 +08:00 committed by GitHub
parent 2c1eb7c81c
commit 93054925ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 44 deletions

View File

@ -6,7 +6,7 @@ ext {
extName = 'WuqiManga' extName = 'WuqiManga'
pkgNameSuffix = 'zh.wuqimanga' pkgNameSuffix = 'zh.wuqimanga'
extClass = '.WuqiManga' extClass = '.WuqiManga'
extVersionCode = 2 extVersionCode = 3
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -1,8 +0,0 @@
package eu.kanade.tachiyomi.extension.zh.wuqimanga
import kotlinx.serialization.Serializable
@Serializable
class Comic {
val fs: List<String?>? = listOf()
}

View File

@ -1,38 +1,46 @@
package eu.kanade.tachiyomi.extension.zh.wuqimanga 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 com.squareup.duktape.Duktape
import eu.kanade.tachiyomi.network.GET 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.FilterList
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.Headers import okhttp3.Headers
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element 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 name = "57漫画"
override val baseUrl = "http://www.wuqimh.com" override val baseUrl = "http://www.wuqimh.net"
override val lang = "zh" override val lang = "zh"
override val supportsLatest = false override val supportsLatest = true
private val imageServer = "http://images.lancaier.com" // 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") private val preferences: SharedPreferences =
override fun latestUpdatesNextPageSelector() = throw Exception("Not used") Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
override fun latestUpdatesSelector() = throw Exception("Not used")
override fun latestUpdatesFromElement(element: Element) = throw Exception("Not used")
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 popularMangaSelector() = "ul#contList > li"
override fun popularMangaNextPageSelector(): String? = null override fun popularMangaNextPageSelector(): String? = "span.pager > a.prev:contains(下一页)"
override fun popularMangaFromElement(element: Element): SManga { override fun popularMangaFromElement(element: Element): SManga {
val coverEl = element.select("a img").first() val coverEl = element.select("a img").first()
@ -57,7 +65,7 @@ class WuqiManga : ParsedHttpSource() {
return GET("$baseUrl/search/q_$query-p-$page", headers) 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 searchMangaSelector() = "div.book-result li.cf"
override fun searchMangaFromElement(element: Element): SManga { override fun searchMangaFromElement(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
@ -82,12 +90,8 @@ class WuqiManga : ParsedHttpSource() {
return manga 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 chapterListSelector() = throw Exception("Not used")
override fun pageListRequest(chapter: SChapter) = GET("$baseUrl/${chapter.url}", headers)
override fun headersBuilder() = Headers.Builder().add("Referer", "$baseUrl/") 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") .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 { override fun mangaDetailsParse(document: Document): SManga {
val manga = SManga.create() 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.title = document.select(".book-title h1").text().trim()
manga.thumbnail_url = document.select(".hcover img").attr("src") manga.thumbnail_url = document.select(".hcover img").attr("src")
for (element in document.select("ul.detail-list li span")) { for (element in document.select("ul.detail-list li span")) {
@ -114,14 +118,6 @@ class WuqiManga : ParsedHttpSource() {
return manga 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 imageUrlParse(document: Document): String = ""
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> {
@ -139,8 +135,6 @@ class WuqiManga : ParsedHttpSource() {
return chapters return chapters
} }
private val json: Json by injectLazy()
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
val html = document.html() val html = document.html()
val packed = Regex("eval(.*?)\\n").find(html)?.groups?.get(1)?.value val packed = Regex("eval(.*?)\\n").find(html)?.groups?.get(1)?.value
@ -149,13 +143,25 @@ class WuqiManga : ParsedHttpSource() {
} }
val re2 = Regex("""\{.*\}""") val re2 = Regex("""\{.*\}""")
val imgJsonStr = re2.find(result)?.groups?.get(0)?.value val imgJsonStr = re2.find(result)?.groups?.get(0)?.value
val imageJson: Comic = json.decodeFromString(imgJsonStr!!) val server = preferences.getString("IMAGE_SERVER", imageServer[0])
// The website is using single quotes in json, so kotlinx.serialization doesn't work
return imageJson.fs!!.mapIndexed { i, imgStr -> return imgJsonStr!!.substringAfter("'fs':['").substringBefore("'],").split("','").mapIndexed { index, it ->
val imgurl = "$imageServer$imgStr" Page(index, "", if (it.startsWith("http")) it else "$server$it")
Page(i, "", imgurl)
} }
} }
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)
}
} }