From a5a62a2d4e81f7b8fd0993373713eb7657ec4543 Mon Sep 17 00:00:00 2001 From: Hualiang <78242797+hualiong@users.noreply.github.com> Date: Wed, 9 Jul 2025 14:14:23 +0800 Subject: [PATCH] Add bilimanga source (#9552) * init * optimize * adjust * little modify * modify extName * modify prompt * apply commit Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com> * apply commit Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com> * add request rate limit * apply commit * apply commit --------- Co-authored-by: stevenyomi <95685115+stevenyomi@users.noreply.github.com> --- src/zh/bilimanga/build.gradle | 8 + .../bilimanga/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5237 bytes .../bilimanga/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2809 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7131 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 12851 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 18024 bytes .../extension/zh/bilimanga/BiliManga.kt | 174 ++++++++++++++++++ .../extension/zh/bilimanga/Filters.kt | 42 +++++ .../zh/bilimanga/MangaInterceptor.kt | 46 +++++ .../extension/zh/bilimanga/Preferences.kt | 41 +++++ 10 files changed, 311 insertions(+) create mode 100644 src/zh/bilimanga/build.gradle create mode 100644 src/zh/bilimanga/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/zh/bilimanga/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/zh/bilimanga/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/zh/bilimanga/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/zh/bilimanga/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/BiliManga.kt create mode 100644 src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Filters.kt create mode 100644 src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/MangaInterceptor.kt create mode 100644 src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Preferences.kt diff --git a/src/zh/bilimanga/build.gradle b/src/zh/bilimanga/build.gradle new file mode 100644 index 000000000..edc296fcc --- /dev/null +++ b/src/zh/bilimanga/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'BiliManga' + extClass = '.BiliManga' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/zh/bilimanga/res/mipmap-hdpi/ic_launcher.png b/src/zh/bilimanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf90b3aa52b6fbfd444f3c041e6cd52d9031252 GIT binary patch literal 5237 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 literal 0 HcmV?d00001 diff --git a/src/zh/bilimanga/res/mipmap-xxhdpi/ic_launcher.png b/src/zh/bilimanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9177b9ea536088b0cfc5b8c42ae2cba0dc3d5d21 GIT binary patch literal 12851 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 RZASnA002ovPDHLkV1k&ck_7+& literal 0 HcmV?d00001 diff --git a/src/zh/bilimanga/res/mipmap-xxxhdpi/ic_launcher.png b/src/zh/bilimanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e8acafe963300fdb6b09b4d1c31fe4e1c1fea7a4 GIT binary patch literal 18024 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 literal 0 HcmV?d00001 diff --git a/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/BiliManga.kt b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/BiliManga.kt new file mode 100644 index 000000000..f29ddbf81 --- /dev/null +++ b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/BiliManga.kt @@ -0,0 +1,174 @@ +package eu.kanade.tachiyomi.extension.zh.bilimanga + +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.ConfigurableSource +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.getPreferencesLazy +import keiyoushi.utils.tryParse +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Element +import org.jsoup.select.Elements +import java.text.SimpleDateFormat +import java.util.Locale + +class BiliManga : HttpSource(), ConfigurableSource { + + override val baseUrl = "https://www.bilimanga.net" + + override val lang = "zh" + + override val name = "Bilimanga.net" + + override val supportsLatest = true + + private val preferences by getPreferencesLazy() + + override val client = super.client.newBuilder() + .rateLimit(10, 10).addNetworkInterceptor(MangaInterceptor()).build() + + override fun headersBuilder() = super.headersBuilder() + .add("Referer", "$baseUrl/") + .add("Accept-Language", "zh") + .add("Accept", "*/*") + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + preferencesInternal(screen.context).forEach(screen::addPreference) + } + + // Customize + + private val SManga.id get() = MANGA_ID_REGEX.find(url)!!.groups[1]!!.value + private fun String.toHalfWidthDigits(): String { + return this.map { if (it in '0'..'9') it - 65248 else it }.joinToString("") + } + + companion object { + const val PAGE_SIZE = 50 + val META_REGEX = Regex("連載|完結|收藏|推薦|热度") + val DATE_REGEX = Regex("\\d{4}-\\d{1,2}-\\d{1,2}") + val MANGA_ID_REGEX = Regex("/detail/(\\d+)\\.html") + val DATE_FORMAT = SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE) + } + + private fun getChapterUrlByContext(i: Int, els: Elements) = when (i) { + 0 -> "${els[1].attr("href")}#prev" + else -> "${els[i - 1].attr("href")}#next" + } + + // Popular Page + + override fun popularMangaRequest(page: Int): Request { + val suffix = preferences.getString(PREF_POPULAR_MANGA_DISPLAY, "/top/weekvisit/%d.html")!! + return GET(baseUrl + String.format(suffix, page), headers) + } + + override fun popularMangaParse(response: Response) = response.asJsoup().let { + val mangas = it.select(".book-layout").map { + SManga.create().apply { + setUrlWithoutDomain(it.absUrl("href")) + val img = it.selectFirst("img")!! + thumbnail_url = img.absUrl("data-src") + title = img.attr("alt") + } + } + MangasPage(mangas, mangas.size >= PAGE_SIZE) + } + + // Latest Page + + override fun latestUpdatesRequest(page: Int) = + GET("$baseUrl/top/lastupdate/$page.html", headers) + + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + // Search Page + + override fun getFilterList() = buildFilterList() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder() + if (query.isNotBlank()) { + url.addPathSegment("search").addPathSegment("${query}_$page.html") + } else { + url.addPathSegment("top").addPathSegment(filters[1].toString()) + .addPathSegment("$page.html") + } + return GET(url.build(), headers) + } + + override fun searchMangaParse(response: Response): MangasPage { + if (response.request.url.pathSegments.contains("detail")) { + return MangasPage(listOf(mangaDetailsParse(response)), false) + } + return popularMangaParse(response) + } + + // Manga Detail Page + + override fun mangaDetailsParse(response: Response) = SManga.create().apply { + val doc = response.asJsoup() + val meta = doc.selectFirst(".book-meta")!!.text().split("|") + val extra = meta.filterNot(META_REGEX::containsMatchIn) + val backupname = doc.selectFirst(".backupname")?.let { "漫畫別名:${it.text()}\n\n" } + url = doc.location() + title = doc.selectFirst(".book-title")!!.text() + thumbnail_url = doc.selectFirst(".book-cover")!!.attr("src") + description = backupname + doc.selectFirst("#bookSummary")?.text() + artist = doc.selectFirst(".authorname")?.text() + author = doc.selectFirst(".illname")?.text() ?: artist + status = when (meta.firstOrNull()) { + "連載" -> SManga.ONGOING + "完結" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + genre = (doc.select(".tag-small").map(Element::text) + extra).joinToString() + initialized = true + } + + // Catalog Page + + override fun chapterListRequest(manga: SManga) = + GET("$baseUrl/read/${manga.id}/catalog", headers) + + override fun chapterListParse(response: Response) = response.asJsoup().let { + val info = it.selectFirst(".chapter-sub-title")!!.text() + val date = DATE_FORMAT.tryParse(DATE_REGEX.find(info)?.value) + val elements = it.select(".chapter-li-a") + elements.mapIndexed { i, e -> + val url = e.absUrl("href").takeUnless("javascript:cid(1)"::equals) + SChapter.create().apply { + name = e.text().toHalfWidthDigits() + date_upload = date + setUrlWithoutDomain(url ?: getChapterUrlByContext(i, elements)) + } + }.reversed() + } + + // Manga View Page + + override fun pageListParse(response: Response) = response.asJsoup().let { + val images = it.select(".imagecontent") + check(images.size > 0) { + it.selectFirst("#acontentz")?.let { e -> + if ("電腦端" in e.text()) "章節不支持桌面電腦端瀏覽器顯示" else "漫畫可能已下架或需要登錄查看" + } ?: "章节鏈接错误" + } + images.mapIndexed { i, image -> + Page(i, imageUrl = image.attr("data-src")) + } + } + + // Image + + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException() +} diff --git a/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Filters.kt b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Filters.kt new file mode 100644 index 000000000..ad216b5e5 --- /dev/null +++ b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Filters.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.extension.zh.bilimanga + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList + +fun buildFilterList() = FilterList( + Filter.Header("篩選條件(搜尋時無效)"), + RankFilter(), +) + +class RankFilter : Filter.Select( + "排行榜", + arrayOf( + "月點擊榜", + "周點擊榜", + "月推薦榜", + "周推薦榜", + "月鮮花榜", + "周鮮花榜", + "月雞蛋榜", + "周雞蛋榜", + "最新入庫", + "收藏榜", + "新書榜", + ), +) { + override fun toString(): String { + return arrayOf( + "monthvisit", + "weekvisit", + "monthvote", + "weekvote", + "monthflower", + "weekflower", + "monthegg", + "weekegg", + "postdate", + "goodnum", + "newhot", + )[state] + } +} diff --git a/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/MangaInterceptor.kt b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/MangaInterceptor.kt new file mode 100644 index 000000000..978cbc1c0 --- /dev/null +++ b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/MangaInterceptor.kt @@ -0,0 +1,46 @@ +package eu.kanade.tachiyomi.extension.zh.bilimanga + +import okhttp3.HttpUrl +import okhttp3.Interceptor +import okhttp3.Response +import okio.GzipSource +import okio.buffer + +class MangaInterceptor : Interceptor { + + companion object { + val PREV_URL_REGEX = Regex("url_previous:'(.*?)'") + val NEXT_URL_REGEX = Regex("url_next:'(.*?)'") + val CHAPTER_ID_REGEX = Regex("/read/(\\d+)/(\\d+)\\.html") + } + + private fun regexOf(str: String?) = when (str) { + "prev" -> PREV_URL_REGEX + "next" -> NEXT_URL_REGEX + else -> null + } + + private fun predictUrlByContext(url: HttpUrl) = when (url.fragment) { + "prev" -> { + val groups = CHAPTER_ID_REGEX.find(url.toString())?.groups + "/read/${groups?.get(1)?.value}/${groups?.get(2)?.value?.toInt()?.plus(1)}.html" + } + "next" -> { + val groups = CHAPTER_ID_REGEX.find(url.toString())?.groups + "/read/${groups?.get(1)?.value}/${groups?.get(2)?.value?.toInt()?.minus(1)}.html" + } + else -> "/read/0/0.html" + } + "?predict" + + override fun intercept(chain: Interceptor.Chain): Response { + val origin = chain.request() + regexOf(origin.url.fragment)?.let { + val response = chain.proceed(origin) + val html = GzipSource(response.body.source()).buffer().readUtf8() + val url = it.find(html)?.groups?.get(1)?.value?.plus("?match") + return response.newBuilder().code(302) + .header("Location", url ?: predictUrlByContext(origin.url)).build() + } + return chain.proceed(origin.newBuilder().addHeader("Cookie", "night=1").build()) + } +} diff --git a/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Preferences.kt b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Preferences.kt new file mode 100644 index 000000000..e763ba215 --- /dev/null +++ b/src/zh/bilimanga/src/eu/kanade/tachiyomi/extension/zh/bilimanga/Preferences.kt @@ -0,0 +1,41 @@ +package eu.kanade.tachiyomi.extension.zh.bilimanga + +import android.content.Context +import androidx.preference.ListPreference + +const val PREF_POPULAR_MANGA_DISPLAY = "POPULAR_MANGA_DISPLAY" + +fun preferencesInternal(context: Context) = arrayOf( + ListPreference(context).apply { + key = PREF_POPULAR_MANGA_DISPLAY + title = "熱門漫畫顯示内容" + summary = "%s" + entries = arrayOf( + "月点击榜", + "周点击榜", + "月推荐榜", + "周推荐榜", + "月鲜花榜", + "周鲜花榜", + "月鸡蛋榜", + "周鸡蛋榜", + "最新入库", + "收藏榜", + "新书榜", + ) + entryValues = arrayOf( + "/top/monthvisit/%d.html", + "/top/weekvisit/%d.html", + "/top/monthvote/%d.html", + "/top/weekvote/%d.html", + "/top/monthflower/%d.html", + "/top/weekflower/%d.html", + "/top/monthegg/%d.html", + "/top/weekegg/%d.html", + "/top/postdate/%d.html", + "/top/goodnum/%d.html", + "/top/newhot/%d.html", + ) + setDefaultValue("/top/weekvisit/%d.html") + }, +)