From 9386947cc245570ebd6027a8ef3e94ac85e9a1e7 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 24 May 2025 10:53:47 +0800 Subject: [PATCH] Readcomiconline - Update Config and Fix Preference Errors (#8944) * unscuff code, update regexes as configurable * Update default values, improved pref * Update Readcomiconline.kt Add placeholders for future implementation * Updated page list parsing to use quickjs * add json config, remove decryption class * review changes, updated default config path * review changes, lint * lint * lint... * Fix RCO * Fix post decrypt eval --- src/en/readcomiconline/build.gradle | 2 +- src/en/readcomiconline/config.json | 4 ++-- .../extension/en/readcomiconline/Readcomiconline.kt | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/en/readcomiconline/build.gradle b/src/en/readcomiconline/build.gradle index 4d6be01ac..df5b497c7 100644 --- a/src/en/readcomiconline/build.gradle +++ b/src/en/readcomiconline/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'ReadComicOnline' extClass = '.Readcomiconline' - extVersionCode = 36 + extVersionCode = 37 } apply from: "$rootDir/common.gradle" diff --git a/src/en/readcomiconline/config.json b/src/en/readcomiconline/config.json index acea3ec09..91c5c1520 100644 --- a/src/en/readcomiconline/config.json +++ b/src/en/readcomiconline/config.json @@ -1,5 +1,5 @@ { - "imageDecryptEval": "const matches=[..._encryptedString.matchAll(/(cdk|pth)\\s*=\\s*['\"](.*?)['\"]\\s*;?/gs)];const pageLinks=new Array;matches.forEach((t=>{if(t[2])pageLinks.push(decryptLink(t[2]))}));function atob(t){const e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";let s=String(t).replace(/=+$/,\"\");if(s.length%4===1)throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\");let n=\"\";for(let t=0,r,c,i=0;c=s.charAt(i++);~c&&(r=t%4?r*64+c:c,t++%4)?n+=String.fromCharCode(255&r>>(-2*t&6)):0)c=e.indexOf(c);return n}function decryptLink(t){let e=t.replace(/\\w{5}__\\w{3}__/g,\"g\").replace(/\\w{2}__\\w{6}_/g,\"a\").replace(/b/g,\"pw_.g28x\").replace(/h/g,\"d2pr.x_27\").replace(/pw_.g28x/g,\"b\").replace(/d2pr.x_27/g,\"h\");if(!e.startsWith(\"https\")){const t=e.indexOf(\"?\");const s=e.substring(t);const n=e.includes(\"=s0?\");const r=n?e.indexOf(\"=s0?\"):e.indexOf(\"=s1600?\");let c=e.substring(0,r);c=c.substring(15,33)+c.substring(50);const i=c.length;c=c.substring(0,i-11)+c[i-2]+c[i-1];const o=atob(c);let g=decodeURIComponent(o);g=g.substring(0,13)+g.substring(17);g=g.substring(0,g.length-2)+(n?\"=s0\":\"=s1600\");e=`https://2.bp.blogspot.com/${g}${s}`}return e}JSON.stringify(pageLinks);", + "imageDecryptEval": "const matches=[..._encryptedString.matchAll(/(cdk|pht|jdkv)\\s*=\\s*['\"](.*?)['\"]\\s*;?/gs)];const pageLinks=new Array;matches.forEach((t=>{if(t[2])pageLinks.push(decryptLink(t[2]))}));function atob(t){const e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";let s=String(t).replace(/=+$/,\"\");if(s.length%4===1)throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\");let n=\"\";for(let t=0,r,c,i=0;c=s.charAt(i++);~c&&(r=t%4?r*64+c:c,t++%4)?n+=String.fromCharCode(255&r>>(-2*t&6)):0)c=e.indexOf(c);return n}function decryptLink(t){let e=t.replace(/\\w{5}__\\w{3}__/g,\"g\").replace(/\\w{2}__\\w{6}_/g,\"a\").replace(/b/g,\"pw_.g28x\").replace(/h/g,\"d2pr.x_27\").replace(/pw_.g28x/g,\"b\").replace(/d2pr.x_27/g,\"h\");if(!e.startsWith(\"https\")){const t=e.indexOf(\"?\");const s=e.substring(t);const n=e.includes(\"=s0?\");const r=n?e.indexOf(\"=s0?\"):e.indexOf(\"=s1600?\");let c=e.substring(0,r);c=c.substring(15,33)+c.substring(50);const i=c.length;c=c.substring(0,i-11)+c[i-2]+c[i-1];const o=atob(c);let g=decodeURIComponent(o);g=g.substring(0,13)+g.substring(17);g=g.substring(0,g.length-2)+(n?\"=s0\":\"=s1600\");const p=!_useServer2?\"https://2.bp.blogspot.com\":\"https://img1.whatsnew247.net/pic\";e=`${p}/${g}${s}${_useServer2?\"&t=10\":\"\"}`}return e}JSON.stringify(pageLinks);", "postDecryptEval": null, "shouldVerifyLinks": false -} \ No newline at end of file +} diff --git a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt index 7b714a197..83b2629e1 100644 --- a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt +++ b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt @@ -236,6 +236,7 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { override fun pageListParse(document: Document): List { // Declare some important values first var encryptedLinks = mutableListOf() + val useSecondServer = serverPref() == "s2" // Get script elements val scripts = document.select("script") @@ -248,7 +249,7 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { for (script in scripts) { QuickJs.create().use { val eval = - "let _encryptedString = `${script.data()}`;${remoteConfigItem!!.imageDecryptEval}" + "let _encryptedString = `${script.data()}`;let _useServer2 = $useSecondServer;${remoteConfigItem!!.imageDecryptEval}" val evalResult = (it.evaluate(eval) as String).parseAs>() // Add results to 'encryptedLinks' @@ -259,7 +260,7 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { encryptedLinks = encryptedLinks.let { links -> if (remoteConfigItem!!.postDecryptEval != null) { QuickJs.create().use { - val eval = "let _decryptedLinks = ${Json.encodeToString(links)}" + val eval = "let _decryptedLinks = ${Json.encodeToString(links)};let _useServer2 = $useSecondServer;${remoteConfigItem!!.postDecryptEval}" (it.evaluate(eval) as String).parseAs>() } } else { @@ -450,9 +451,9 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { } val configLink = preferences.getString( - IMAGE_REMOTE_CONFIG_PREF.addBustQuery(), - IMAGE_REMOTE_CONFIG_DEFAULT.addBustQuery(), - ) ?: return null + IMAGE_REMOTE_CONFIG_PREF, + IMAGE_REMOTE_CONFIG_DEFAULT, + )?.addBustQuery() ?: return null try { val configResponse = client.newCall(GET(configLink)).execute()