parent
f3ddcc74cd
commit
8201673f06
|
@ -0,0 +1,18 @@
|
||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
|
ext {
|
||||||
|
appName = 'Tachiyomi: WuqiManga'
|
||||||
|
pkgNameSuffix = 'zh.wuqimanga'
|
||||||
|
extClass = '.WuqiManga'
|
||||||
|
extVersionCode = 1
|
||||||
|
libVersion = '1.2'
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly project(':duktape-stub')
|
||||||
|
compileOnly 'com.google.code.gson:gson:2.8.2'
|
||||||
|
compileOnly 'com.github.salomonbrys.kotson:kotson:2.5.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
apply from: "$rootDir/common.gradle"
|
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.0 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.zh.wuqimanga
|
||||||
|
|
||||||
|
class Comic {
|
||||||
|
|
||||||
|
val fs: List<String?>? = listOf()
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.zh.wuqimanga
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.*
|
||||||
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
import com.squareup.duktape.Duktape
|
||||||
|
|
||||||
|
class WuqiManga : ParsedHttpSource() {
|
||||||
|
|
||||||
|
override val name = "57漫画"
|
||||||
|
override val baseUrl = "http://www.wuqimh.com"
|
||||||
|
override val lang = "zh"
|
||||||
|
override val supportsLatest = false
|
||||||
|
private val imageServer = "http://images.lancaier.com"
|
||||||
|
|
||||||
|
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")
|
||||||
|
|
||||||
|
override fun popularMangaRequest(page: Int) = GET("$baseUrl/list/area-日本-order-hits", headers)
|
||||||
|
override fun popularMangaSelector() = "ul#contList > li"
|
||||||
|
override fun popularMangaNextPageSelector(): String? = null
|
||||||
|
|
||||||
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
|
val coverEl = element.select("a img").first()
|
||||||
|
val cover = if (coverEl.hasAttr("data-src")) {
|
||||||
|
coverEl.attr("data-src")
|
||||||
|
} else {
|
||||||
|
coverEl.attr("src")
|
||||||
|
}
|
||||||
|
val title = element.select("a").attr("title")
|
||||||
|
val url = element.select("a").attr("href")
|
||||||
|
|
||||||
|
val manga = SManga.create()
|
||||||
|
|
||||||
|
manga.thumbnail_url = cover
|
||||||
|
manga.title = title
|
||||||
|
manga.url = url
|
||||||
|
|
||||||
|
return manga
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
|
return GET("$baseUrl/search/q_$query-p-$page", headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun searchMangaNextPageSelector() = "div.book-result > div > span > a.prev"
|
||||||
|
override fun searchMangaSelector() = "div.book-result li.cf"
|
||||||
|
override fun searchMangaFromElement(element: Element): SManga {
|
||||||
|
val manga = SManga.create()
|
||||||
|
element.select("div.book-detail").first().let {
|
||||||
|
val titleEl = it.select("dl > dt > a")
|
||||||
|
manga.setUrlWithoutDomain(titleEl.attr("href"))
|
||||||
|
manga.title = titleEl.attr("title").trim()
|
||||||
|
manga.description = it.select("dd.intro").text()
|
||||||
|
val status = it.select("dd.tags.status")
|
||||||
|
manga.status = if (status.select("span.red").first().text().contains("连载中")) {
|
||||||
|
SManga.ONGOING
|
||||||
|
} else {
|
||||||
|
SManga.COMPLETED
|
||||||
|
}
|
||||||
|
for (el in it.select("dd.tags")) {
|
||||||
|
if (el.select("span strong").text().contains("作者")) {
|
||||||
|
manga.author = el.select("span a").text()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
manga.thumbnail_url = element.select("a.bcover > img").attr("src")
|
||||||
|
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")
|
||||||
|
|
||||||
|
|
||||||
|
override fun chapterFromElement(element: Element): SChapter {
|
||||||
|
val urlElement = element.select("a")
|
||||||
|
|
||||||
|
val chapter = SChapter.create()
|
||||||
|
chapter.url = urlElement.attr("href")
|
||||||
|
chapter.name = urlElement.attr("alt").trim()
|
||||||
|
return chapter
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
|
val manga = SManga.create()
|
||||||
|
manga.description = ""
|
||||||
|
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")) {
|
||||||
|
if (element.select("strong").text().contains("漫画作者")) {
|
||||||
|
manga.author = element.select("a").text()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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<SChapter> {
|
||||||
|
val chapters = mutableListOf<SChapter>()
|
||||||
|
response.asJsoup().select("div.chapter div.chapter-list>ul").asReversed().forEach {
|
||||||
|
it.select("li a").forEach {
|
||||||
|
chapters.add(SChapter.create().apply {
|
||||||
|
url = it.attr("href")
|
||||||
|
name = it.attr("title")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chapters
|
||||||
|
}
|
||||||
|
|
||||||
|
private val gson = Gson()
|
||||||
|
|
||||||
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
|
val html = document.html()
|
||||||
|
val packed = Regex("eval(.*?)\\n").find(html)?.groups?.get(1)?.value
|
||||||
|
val result = Duktape.create().use {
|
||||||
|
it.evaluate(packed) as String
|
||||||
|
}
|
||||||
|
val re2 = Regex("""\{.*\}""")
|
||||||
|
val imgJsonStr = re2.find(result)?.groups?.get(0)?.value
|
||||||
|
val imageJson: Comic = gson.fromJson(imgJsonStr, Comic::class.java)
|
||||||
|
|
||||||
|
return imageJson.fs!!.mapIndexed { i, imgStr ->
|
||||||
|
val imgurl = "$imageServer$imgStr"
|
||||||
|
Page(i, "", imgurl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getFilterList() = FilterList()
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue