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:
parent
2c1eb7c81c
commit
93054925ae
@ -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"
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.extension.zh.wuqimanga
|
|
||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
class Comic {
|
|
||||||
val fs: List<String?>? = listOf()
|
|
||||||
}
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user