diff --git a/src/zh/bainianmanga/build.gradle b/src/zh/bainianmanga/build.gradle index a94f7d6ea..25ca0930e 100755 --- a/src/zh/bainianmanga/build.gradle +++ b/src/zh/bainianmanga/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'BainianManga' pkgNameSuffix = 'zh.bainianmanga' extClass = '.BainianManga' - extVersionCode = 4 + extVersionCode = 5 } apply from: "$rootDir/common.gradle" diff --git a/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt b/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt index 8ac444569..a2d55c5fb 100755 --- a/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt +++ b/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt @@ -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 { - return super.chapterListParse(response).asReversed() - } - - override fun pageListParse(document: Document): List { - 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>(imgUrlArray) - return imgUrlList.mapIndexed { i, imgUrl -> - Page(i, "", "$baseImgUrl$imgUrl") - } + override fun pageListParse(response: Response): List { + return json.decodeFromString>( + response.body!!.string() + .substringAfter("var z_img='") + .substringBefore("';") + ).mapIndexed { i, imageUrl -> + Page(i, "", imageUrl) } - return listOf() } + override fun pageListParse(document: Document): List = + throw UnsupportedOperationException("Not used.") + override fun imageUrlParse(document: Document) = "" - private class GenreFilter(genres: Array) : Filter.Select("Genre", genres) - - override fun getFilterList() = FilterList( - GenreFilter(getGenreList()) - ) - - private fun getGenreList() = arrayOf( - "All" - ) + override fun getFilterList() = FilterList() }