diff --git a/src/zh/dm5/build.gradle b/src/zh/dm5/build.gradle index 5a7c51984..2ca6f1e82 100644 --- a/src/zh/dm5/build.gradle +++ b/src/zh/dm5/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Dm5' extClass = '.Dm5' - extVersionCode = 6 + extVersionCode = 7 isNsfw = true } diff --git a/src/zh/dm5/src/eu/kanade/tachiyomi/extension/zh/dm5/Dm5.kt b/src/zh/dm5/src/eu/kanade/tachiyomi/extension/zh/dm5/Dm5.kt index d7f1bbb48..d95a906d1 100644 --- a/src/zh/dm5/src/eu/kanade/tachiyomi/extension/zh/dm5/Dm5.kt +++ b/src/zh/dm5/src/eu/kanade/tachiyomi/extension/zh/dm5/Dm5.kt @@ -1,6 +1,9 @@ package eu.kanade.tachiyomi.extension.zh.dm5 import android.content.SharedPreferences +import android.util.Log +import android.webkit.CookieManager +import android.widget.Toast import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreferenceCompat @@ -36,6 +39,7 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource { // Some mangas are blocked without this 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 popularMangaNextPageSelector(): String = "div.page-pagination a:contains(>)" @@ -83,8 +87,9 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource { override fun chapterListParse(response: Response): List { val document = response.asJsoup() // May need to click button on website to read - document.selectFirst("div#chapterlistload") ?: throw Exception("請到webview確認") - val li = document.select("div#chapterlistload li > a").map { + val container = document.selectFirst("div#chapterlistload") + ?: throw Exception("请到 WebView 确认;切换网络环境后可尝试扩展设置里面的“(动漫屋专用)清除 Cookie”") + val li = container.select("li > a").map { SChapter.create().apply { url = it.attr("href") 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 imageRequest(page: Page): Request { - val header = headers.newBuilder().add("Referer", baseUrl).build() - return GET(page.imageUrl!!, header) + val url = page.imageUrl!!.toHttpUrl() + val cid = url.queryParameter("cid")!! + val headers = headers.newBuilder().add("Referer", "$baseUrl/m$cid").build() + return GET(url, headers) } override fun setupPreferenceScreen(screen: PreferenceScreen) { @@ -208,6 +215,41 @@ class Dm5 : ParsedHttpSource(), ConfigurableSource { screen.addPreference(mirrorPreference) screen.addPreference(chapterCommentsPreference) 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 {