BainianManga (百年漫画): update url and update for new design (#10628)
This commit is contained in:
parent
b3dd6236bb
commit
3d1630b784
@ -6,7 +6,7 @@ ext {
|
||||
extName = 'BainianManga'
|
||||
pkgNameSuffix = 'zh.bainianmanga'
|
||||
extClass = '.BainianManga'
|
||||
extVersionCode = 4
|
||||
extVersionCode = 5
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
||||
|
@ -1,7 +1,6 @@
|
||||
package eu.kanade.tachiyomi.extension.zh.bainianmanga
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import eu.kanade.tachiyomi.source.model.SChapter
|
||||
@ -9,23 +8,49 @@ import eu.kanade.tachiyomi.source.model.SManga
|
||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import okhttp3.Interceptor
|
||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import okhttp3.ResponseBody.Companion.toResponseBody
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
|
||||
class BainianManga : ParsedHttpSource() {
|
||||
|
||||
override val name = "百年漫画"
|
||||
override val baseUrl = "https://m.bnmanhua.com"
|
||||
override val baseUrl = "https://www.bnman.net"
|
||||
override val lang = "zh"
|
||||
override val supportsLatest = true
|
||||
|
||||
override val client: OkHttpClient
|
||||
get() = network.client.newBuilder()
|
||||
.addNetworkInterceptor(rewriteOctetStream)
|
||||
.build()
|
||||
|
||||
// Based on Pufei ext
|
||||
private val rewriteOctetStream: Interceptor = Interceptor { chain ->
|
||||
val originalResponse: Response = chain.proceed(chain.request())
|
||||
if (originalResponse.headers("Content-Type").contains("application/octet-stream") && originalResponse.request.url.toString().contains(".jpg")) {
|
||||
val orgBody = originalResponse.body!!.bytes()
|
||||
val newBody = orgBody.toResponseBody("image/jpeg".toMediaTypeOrNull())
|
||||
originalResponse.newBuilder()
|
||||
.body(newBody)
|
||||
.build()
|
||||
} else originalResponse
|
||||
}
|
||||
|
||||
private val json: Json by injectLazy()
|
||||
|
||||
override fun popularMangaRequest(page: Int) = GET("$baseUrl/page/hot/$page.html", headers)
|
||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/new/$page.html", headers)
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
val url = "$baseUrl/index.php?m=vod-search-pg-$page-wd-$query.html".toHttpUrlOrNull()?.newBuilder()
|
||||
val url = "$baseUrl/search.html?".toHttpUrl().newBuilder()
|
||||
.addQueryParameter("keyword", query)
|
||||
.addQueryParameter("page", page.toString())
|
||||
return GET(url.toString(), headers)
|
||||
}
|
||||
|
||||
@ -33,12 +58,12 @@ class BainianManga : ParsedHttpSource() {
|
||||
override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
|
||||
override fun pageListRequest(chapter: SChapter) = GET(baseUrl + chapter.url, headers)
|
||||
|
||||
override fun popularMangaSelector() = "ul.tbox_m > li.vbox"
|
||||
override fun popularMangaSelector() = "ul#list_img > li"
|
||||
override fun latestUpdatesSelector() = popularMangaSelector()
|
||||
override fun searchMangaSelector() = popularMangaSelector()
|
||||
override fun chapterListSelector() = "ul.list_block > li"
|
||||
override fun chapterListSelector() = "ul.jslist01 > li"
|
||||
|
||||
override fun searchMangaNextPageSelector() = "a.pagelink_a"
|
||||
override fun searchMangaNextPageSelector() = ".pagination > li:last-child > a"
|
||||
override fun popularMangaNextPageSelector() = searchMangaNextPageSelector()
|
||||
override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector()
|
||||
|
||||
@ -50,11 +75,11 @@ class BainianManga : ParsedHttpSource() {
|
||||
override fun searchMangaFromElement(element: Element) = mangaFromElement(element)
|
||||
private fun mangaFromElement(element: Element): SManga {
|
||||
val manga = SManga.create()
|
||||
element.select("a.vbox_t").first().let {
|
||||
element.select("a").first().let {
|
||||
manga.setUrlWithoutDomain(it.attr("href"))
|
||||
manga.title = it.attr("title").trim()
|
||||
manga.title = it.select("p").first().text()
|
||||
}
|
||||
manga.thumbnail_url = element.select("mip-img").attr("src")
|
||||
manga.thumbnail_url = element.select("img").attr("src")
|
||||
return manga
|
||||
}
|
||||
|
||||
@ -63,47 +88,33 @@ class BainianManga : ParsedHttpSource() {
|
||||
|
||||
val chapter = SChapter.create()
|
||||
chapter.setUrlWithoutDomain(urlElement.attr("href"))
|
||||
chapter.name = urlElement.text().trim()
|
||||
chapter.name = urlElement.text()
|
||||
return chapter
|
||||
}
|
||||
|
||||
override fun mangaDetailsParse(document: Document): SManga {
|
||||
val infoElement = document.select("div.data")
|
||||
val infoElement = document.select(".info")
|
||||
|
||||
val manga = SManga.create()
|
||||
manga.description = document.select("div.tbox_js").text().trim()
|
||||
manga.author = infoElement.select("p.dir").text().substring(3).trim()
|
||||
manga.description = document.select(".mt10").first().text()
|
||||
manga.author = infoElement.select("ul > li > span:contains(漫画作者) + p").first().text()
|
||||
return manga
|
||||
}
|
||||
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
return super.chapterListParse(response).asReversed()
|
||||
}
|
||||
|
||||
override fun pageListParse(document: Document): List<Page> {
|
||||
val html = document.html()
|
||||
val baseImgUrl = "https://img.hltongchen.com/"
|
||||
|
||||
val imgUrlRegex = Regex("var z_img='(.*?)';")
|
||||
val imgUrlArray = imgUrlRegex.find(html)?.groups?.get(1)?.value
|
||||
if (imgUrlArray != null) {
|
||||
val imgUrlList = Json.decodeFromString<List<String>>(imgUrlArray)
|
||||
return imgUrlList.mapIndexed { i, imgUrl ->
|
||||
Page(i, "", "$baseImgUrl$imgUrl")
|
||||
}
|
||||
override fun pageListParse(response: Response): List<Page> {
|
||||
return json.decodeFromString<List<String>>(
|
||||
response.body!!.string()
|
||||
.substringAfter("var z_img='")
|
||||
.substringBefore("';")
|
||||
).mapIndexed { i, imageUrl ->
|
||||
Page(i, "", imageUrl)
|
||||
}
|
||||
return listOf()
|
||||
}
|
||||
|
||||
override fun pageListParse(document: Document): List<Page> =
|
||||
throw UnsupportedOperationException("Not used.")
|
||||
|
||||
override fun imageUrlParse(document: Document) = ""
|
||||
|
||||
private class GenreFilter(genres: Array<String>) : Filter.Select<String>("Genre", genres)
|
||||
|
||||
override fun getFilterList() = FilterList(
|
||||
GenreFilter(getGenreList())
|
||||
)
|
||||
|
||||
private fun getGenreList() = arrayOf(
|
||||
"All"
|
||||
)
|
||||
override fun getFilterList() = FilterList()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user