Fix Dm5 chapters and pages (#10341)

* Fix Dm5 chapters and pages

* desktop user agent

* clear more cookies

* clear all cookies
This commit is contained in:
stevenyomi 2025-09-01 09:09:59 +00:00 committed by Draff
parent 14b5edc771
commit 3e14b9b697
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 47 additions and 5 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Dm5' extName = 'Dm5'
extClass = '.Dm5' extClass = '.Dm5'
extVersionCode = 6 extVersionCode = 7
isNsfw = true isNsfw = true
} }

View File

@ -1,6 +1,9 @@
package eu.kanade.tachiyomi.extension.zh.dm5 package eu.kanade.tachiyomi.extension.zh.dm5
import android.content.SharedPreferences import android.content.SharedPreferences
import android.util.Log
import android.webkit.CookieManager
import android.widget.Toast
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
@ -36,6 +39,7 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource {
// Some mangas are blocked without this // Some mangas are blocked without this
override fun headersBuilder() = super.headersBuilder().set("Accept-Language", "zh-TW") override fun headersBuilder() = super.headersBuilder().set("Accept-Language", "zh-TW")
.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36")
override fun popularMangaRequest(page: Int) = GET("$baseUrl/manhua-list-p$page/", headers) override fun popularMangaRequest(page: Int) = GET("$baseUrl/manhua-list-p$page/", headers)
override fun popularMangaNextPageSelector(): String = "div.page-pagination a:contains(>)" override fun popularMangaNextPageSelector(): String = "div.page-pagination a:contains(>)"
@ -83,8 +87,9 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource {
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup() val document = response.asJsoup()
// May need to click button on website to read // May need to click button on website to read
document.selectFirst("div#chapterlistload") ?: throw Exception("請到webview確認") val container = document.selectFirst("div#chapterlistload")
val li = document.select("div#chapterlistload li > a").map { ?: throw Exception("请到 WebView 确认;切换网络环境后可尝试扩展设置里面的“(动漫屋专用)清除 Cookie”")
val li = container.select("li > a").map {
SChapter.create().apply { SChapter.create().apply {
url = it.attr("href") url = it.attr("href")
name = if (it.selectFirst("span.detail-lock, span.view-lock") != null) { name = if (it.selectFirst("span.detail-lock, span.view-lock") != null) {
@ -182,8 +187,10 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource {
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException() override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException()
override fun imageRequest(page: Page): Request { override fun imageRequest(page: Page): Request {
val header = headers.newBuilder().add("Referer", baseUrl).build() val url = page.imageUrl!!.toHttpUrl()
return GET(page.imageUrl!!, header) val cid = url.queryParameter("cid")!!
val headers = headers.newBuilder().add("Referer", "$baseUrl/m$cid").build()
return GET(url, headers)
} }
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
@ -208,6 +215,41 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource {
screen.addPreference(mirrorPreference) screen.addPreference(mirrorPreference)
screen.addPreference(chapterCommentsPreference) screen.addPreference(chapterCommentsPreference)
screen.addPreference(sortChapterPreference) screen.addPreference(sortChapterPreference)
SwitchPreferenceCompat(screen.context).run {
title = "(动漫屋专用)清除 Cookie"
summary = "切换网络环境后可尝试清除app 自带的清除 Cookie 无效)"
setOnPreferenceChangeListener { _, _ ->
val message = try {
val manager = CookieManager.getInstance()
var before = 0
var after = 0
for (mirror in MIRROR_ENTRIES) {
val cookies = manager.getCookie(mirror) ?: continue
val cookieList = cookies.split("; ")
before += cookieList.size
val url = mirror.toHttpUrl()
val domain = url.host
val topDomain = url.topPrivateDomain()
for (cookie in cookieList) {
val name = cookie.substringBefore('=')
manager.setCookie(mirror, "$name=; Max-Age=-1; Path=/")
manager.setCookie(mirror, "$name=; Max-Age=-1; Domain=$domain; Path=/")
manager.setCookie(mirror, "$name=; Max-Age=-1; Domain=$topDomain; Path=/")
}
val cookiesAfter = manager.getCookie(mirror) ?: continue
after += cookiesAfter.split("; ").size
}
"一共 $before 条 Cookie清除了 ${before - after}"
} catch (e: Exception) {
Log.e("Dm5", "failed to clear cookies", e)
"清除失败:$e"
}
Toast.makeText(screen.context, message, Toast.LENGTH_LONG).show()
false
}
screen.addPreference(this)
}
} }
companion object { companion object {