BainianManga (百年漫画): update url and update for new design (#10628)

This commit is contained in:
Vetle Ledaal 2022-01-31 12:10:53 +00:00 committed by GitHub
parent b3dd6236bb
commit 3d1630b784
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 40 deletions

View File

@ -6,7 +6,7 @@ ext {
extName = 'BainianManga' extName = 'BainianManga'
pkgNameSuffix = 'zh.bainianmanga' pkgNameSuffix = 'zh.bainianmanga'
extClass = '.BainianManga' extClass = '.BainianManga'
extVersionCode = 4 extVersionCode = 5
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.extension.zh.bainianmanga package eu.kanade.tachiyomi.extension.zh.bainianmanga
import eu.kanade.tachiyomi.network.GET 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.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
@ -9,23 +8,49 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json 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.Request
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody
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
class BainianManga : ParsedHttpSource() { class BainianManga : ParsedHttpSource() {
override val name = "百年漫画" override val name = "百年漫画"
override val baseUrl = "https://m.bnmanhua.com" override val baseUrl = "https://www.bnman.net"
override val lang = "zh" override val lang = "zh"
override val supportsLatest = true 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 popularMangaRequest(page: Int) = GET("$baseUrl/page/hot/$page.html", headers)
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/new/$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 { 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) return GET(url.toString(), headers)
} }
@ -33,12 +58,12 @@ class BainianManga : ParsedHttpSource() {
override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
override fun pageListRequest(chapter: SChapter) = GET(baseUrl + chapter.url, headers) 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 latestUpdatesSelector() = popularMangaSelector()
override fun searchMangaSelector() = 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 popularMangaNextPageSelector() = searchMangaNextPageSelector()
override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector()
@ -50,11 +75,11 @@ class BainianManga : ParsedHttpSource() {
override fun searchMangaFromElement(element: Element) = mangaFromElement(element) override fun searchMangaFromElement(element: Element) = mangaFromElement(element)
private fun mangaFromElement(element: Element): SManga { private fun mangaFromElement(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
element.select("a.vbox_t").first().let { element.select("a").first().let {
manga.setUrlWithoutDomain(it.attr("href")) 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 return manga
} }
@ -63,47 +88,33 @@ class BainianManga : ParsedHttpSource() {
val chapter = SChapter.create() val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href")) chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.text().trim() chapter.name = urlElement.text()
return chapter return chapter
} }
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.data") val infoElement = document.select(".info")
val manga = SManga.create() val manga = SManga.create()
manga.description = document.select("div.tbox_js").text().trim() manga.description = document.select(".mt10").first().text()
manga.author = infoElement.select("p.dir").text().substring(3).trim() manga.author = infoElement.select("ul > li > span:contains(漫画作者) + p").first().text()
return manga return manga
} }
override fun chapterListParse(response: Response): List<SChapter> { override fun pageListParse(response: Response): List<Page> {
return super.chapterListParse(response).asReversed() return json.decodeFromString<List<String>>(
response.body!!.string()
.substringAfter("var z_img='")
.substringBefore("';")
).mapIndexed { i, imageUrl ->
Page(i, "", imageUrl)
}
} }
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> =
val html = document.html() throw UnsupportedOperationException("Not used.")
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")
}
}
return listOf()
}
override fun imageUrlParse(document: Document) = "" override fun imageUrlParse(document: Document) = ""
private class GenreFilter(genres: Array<String>) : Filter.Select<String>("Genre", genres) override fun getFilterList() = FilterList()
override fun getFilterList() = FilterList(
GenreFilter(getGenreList())
)
private fun getGenreList() = arrayOf(
"All"
)
} }