From cf6ed5c5c0c8f859cac189f731a29f6b90185318 Mon Sep 17 00:00:00 2001 From: SnowArk <0@snowark.cn> Date: Mon, 6 Sep 2021 18:24:05 +0800 Subject: [PATCH] [zh-copymanga]fix chapter list and manga load failed (#8946) * [zh-copymanga]fix chapter list and manga load failed * remove test code * Set chapter's date_upload to current time, which would make the updated manga displayed in the "Recent updates" section * fix typo * use System.currentTimeMillis() instead * optimize imports * Revert "optimize imports" This reverts commit 6514e517 * revert useless import changes and remove java.util.Date import * fix wrong timestamp * fix an issue that only display the default chapters --- src/zh/copymanga/build.gradle | 2 +- .../extension/zh/copymanga/CopyManga.kt | 82 ++++++++++--------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/zh/copymanga/build.gradle b/src/zh/copymanga/build.gradle index ed7367832..d41915124 100644 --- a/src/zh/copymanga/build.gradle +++ b/src/zh/copymanga/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'CopyManga' pkgNameSuffix = 'zh.copymanga' extClass = '.CopyManga' - extVersionCode = 11 + extVersionCode = 12 libVersion = '1.2' } apply from: "$rootDir/common.gradle" diff --git a/src/zh/copymanga/src/eu/kanade/tachiyomi/extension/zh/copymanga/CopyManga.kt b/src/zh/copymanga/src/eu/kanade/tachiyomi/extension/zh/copymanga/CopyManga.kt index e502460ea..59163f7d2 100644 --- a/src/zh/copymanga/src/eu/kanade/tachiyomi/extension/zh/copymanga/CopyManga.kt +++ b/src/zh/copymanga/src/eu/kanade/tachiyomi/extension/zh/copymanga/CopyManga.kt @@ -25,7 +25,6 @@ import uy.kohesive.injekt.api.get import java.security.SecureRandom import java.security.cert.X509Certificate import java.text.SimpleDateFormat -import java.util.Date import java.util.Locale import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec @@ -137,60 +136,60 @@ class CopyManga : ConfigurableSource, HttpSource() { override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) override fun chapterListParse(response: Response): List { val document = response.asJsoup() - val disposableData = document.select("div.disposableData").first().attr("disposable") val disposablePass = document.select("div.disposablePass").first().attr("disposable") + // Get encrypted chapters data from another endpoint + val chapterResponse = client.newCall(GET("${response.request.url}/chapters", headers)).execute() + val disposableData = JSONObject(chapterResponse.body!!.string()).get("results").toString() + + // Decrypt chapter JSON val chapterJsonString = decryptChapterData(disposableData, disposablePass) - // default > groups > 全部 [] + val chapterJson = JSONObject(chapterJsonString) - var chapterArray = chapterJson.optJSONObject("default")?.optJSONObject("groups")?.optJSONArray("全部") - if (chapterArray == null) { + // Get the comic path word + val comicPathWord = chapterJson.optJSONObject("build")?.optString("path_word") + + // Get chapter groups + val chapterGroups = chapterJson.optJSONObject("groups") + if (chapterGroups == null) { return listOf() } - val retDefault = ArrayList(chapterArray.length()) - for (i in 0 until chapterArray.length()) { - val chapter = chapterArray.getJSONObject(i) - retDefault.add( - SChapter.create().apply { - name = chapter.getString("name") - date_upload = stringToUnixTimestamp(chapter.getString("datetime_created")) * 1000 - url = "/comic/${chapter.getString("comic_path_word")}/chapter/${chapter.getString("uuid")}" - } - ) - } + val retChapter = ArrayList() + // Get chapters according to groups + chapterGroups.keys().forEach { groupName -> + run { + val chapterGroup = chapterGroups.getJSONObject(groupName) - // {others} > groups > 全部 [] - val retOthers = ArrayList() - for (categroy in chapterJson.keys()) { - if (categroy != "default") { - chapterArray = chapterJson.optJSONObject(categroy)?.optJSONObject("groups")?.optJSONArray("全部") - if (chapterArray == null) { - continue - } - for (i in 0 until chapterArray.length()) { - val chapter = chapterArray.getJSONObject(i) - retOthers.add( - SChapter.create().apply { - name = chapter.getString("name") - date_upload = stringToUnixTimestamp(chapter.getString("datetime_created")) * 1000 - url = "/comic/${chapter.getString("comic_path_word")}/chapter/${chapter.getString("uuid")}" - } - ) + // group's last update time + val groupLastUpdateTime = chapterGroup.optJSONObject("last_chapter")?.optString("datetime_created") + + // chapters in the group to + val chapterArray = chapterGroup.optJSONArray("chapters") + if (chapterArray != null) { + for (i in 0 until chapterArray.length()) { + val chapter = chapterArray.getJSONObject(i) + retChapter.add( + SChapter.create().apply { + name = chapter.getString("name") + date_upload = stringToUnixTimestamp(groupLastUpdateTime) + url = "/comic/$comicPathWord/chapter/${chapter.getString("id")}" + } + ) + } } } } // place others to top, as other group updates not so often - retDefault.addAll(0, retOthers) - return retDefault.asReversed() + return retChapter.asReversed() } override fun pageListRequest(chapter: SChapter) = GET(baseUrl + chapter.url, headers) override fun pageListParse(response: Response): List { val document = response.asJsoup() - val disposableData = document.select("div.disposableData").first().attr("disposable") - val disposablePass = document.select("div.disposablePass").first().attr("disposable") + val disposableData = document.select("div.disData").first().attr("contentKey") + val disposablePass = document.select("div.disPass").first().attr("contentKey") val pageJsonString = decryptChapterData(disposableData, disposablePass) val pageArray = JSONArray(pageJsonString) @@ -392,12 +391,15 @@ class CopyManga : ConfigurableSource, HttpSource() { return bytes } - private fun stringToUnixTimestamp(string: String, pattern: String = "yyyy-MM-dd", locale: Locale = Locale.CHINA): Long { + private fun stringToUnixTimestamp(string: String?, pattern: String = "yyyy-MM-dd", locale: Locale = Locale.CHINA): Long { + if (string == null) System.currentTimeMillis() + return try { val time = SimpleDateFormat(pattern, locale).parse(string)?.time - if (time != null) time / 1000 else Date().time / 1000 + if (time != null) time else System.currentTimeMillis() } catch (ex: Exception) { - Date().time / 1000 + // Set the time to current in order to display the updated manga in the "Recent updates" section + System.currentTimeMillis() } }