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'
|
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"
|
||||||
|
@ -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"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user