From f09c11a01cc48a11d0b81eb4276f0bc80e6e7d66 Mon Sep 17 00:00:00 2001 From: beerpsi <92439990+beerpiss@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:53:19 +0700 Subject: [PATCH] Add MangaDig and make ColaManga a multisrc (#1139) * Add MangaDig and make ColaManga a multisrc * Make MangaDig NSFW * Fix linting * Fix next page selector --- .../colamanga/default/AndroidManifest.xml | 21 + .../colamanga/default/additional.gradle | 3 + .../mangadig/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2222 bytes .../mangadig/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1118 bytes .../mangadig/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2721 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5092 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6102 bytes .../colamanga/mangadig/src/MangaDig.kt | 123 +++++ .../onemanhua/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2381 bytes .../onemanhua/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1222 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3503 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6320 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8766 bytes .../colamanga/onemanhua/src/Onemanhua.kt | 120 +++++ .../tachiyomi/multisrc/colamanga/ColaManga.kt | 334 ++++++++++++ .../multisrc/colamanga/ColaMangaFilters.kt | 32 ++ .../multisrc/colamanga/ColaMangaGenerator.kt | 25 + .../colamanga/ColaMangaImageInterceptor.kt | 37 ++ .../multisrc/colamanga/ColaMangaIntl.kt | 51 ++ .../colamanga/ColaMangaUrlActivity.kt | 35 ++ src/zh/onemanhua/build.gradle | 11 - .../onemanhua/res/mipmap-hdpi/ic_launcher.png | Bin 3010 -> 0 bytes .../onemanhua/res/mipmap-mdpi/ic_launcher.png | Bin 1609 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 4274 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 7962 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 11454 -> 0 bytes .../extension/zh/onemanhua/Onemanhua.kt | 496 ------------------ 27 files changed, 781 insertions(+), 507 deletions(-) create mode 100644 multisrc/overrides/colamanga/default/AndroidManifest.xml create mode 100644 multisrc/overrides/colamanga/default/additional.gradle create mode 100644 multisrc/overrides/colamanga/mangadig/res/mipmap-hdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/mangadig/res/mipmap-mdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/mangadig/res/mipmap-xhdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/mangadig/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/mangadig/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/mangadig/src/MangaDig.kt create mode 100644 multisrc/overrides/colamanga/onemanhua/res/mipmap-hdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/onemanhua/res/mipmap-mdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/onemanhua/res/mipmap-xhdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/onemanhua/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/onemanhua/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/colamanga/onemanhua/src/Onemanhua.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaManga.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaFilters.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaGenerator.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaImageInterceptor.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaIntl.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaUrlActivity.kt delete mode 100644 src/zh/onemanhua/build.gradle delete mode 100644 src/zh/onemanhua/res/mipmap-hdpi/ic_launcher.png delete mode 100644 src/zh/onemanhua/res/mipmap-mdpi/ic_launcher.png delete mode 100644 src/zh/onemanhua/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 src/zh/onemanhua/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src/zh/onemanhua/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt diff --git a/multisrc/overrides/colamanga/default/AndroidManifest.xml b/multisrc/overrides/colamanga/default/AndroidManifest.xml new file mode 100644 index 000000000..52dcdacdb --- /dev/null +++ b/multisrc/overrides/colamanga/default/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/multisrc/overrides/colamanga/default/additional.gradle b/multisrc/overrides/colamanga/default/additional.gradle new file mode 100644 index 000000000..0ffbe4386 --- /dev/null +++ b/multisrc/overrides/colamanga/default/additional.gradle @@ -0,0 +1,3 @@ +dependencies { + implementation(project(":lib:synchrony")) +} diff --git a/multisrc/overrides/colamanga/mangadig/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/colamanga/mangadig/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e280e2d123c333232991852b96ffc2408a98c863 GIT binary patch literal 2222 zcmV;f2vPTmP)a)wzj)8P5Zrn5Mb7SFc_N zZiGmj&mBukOYe6arxj5O;^wcctbCZb?zF+~p|xvWUES9dEgMk^;^s6oG<-)~ciX^v z#FpEWF7ARTM}T91D|6mJf%YN?bw!jTz%jseV+7j!eJoJTOOW3oJ zoJoj8=$5NsYPlYr0u3+L@W66`1$sMC zLYv`WMum>gQzbsuCtpQ{>|k7}77&8P5=fRtZf0 zeR9W&Iukz<;ooxSVeQ7$9IJ~{|)E~J>VJ=)(5UGz^+Y!KC=>36*ylv} zf8LGOt`NE$2%*Q35c{4CGiL%q!ZzUul`vBJ)8}wCgsunC$K4CnBkOghUSAeB&J%OCY97tq& zdH5A@8ZyZdOCkP#010pw9H9c?;Ix%NBGM!hI}Vl>;v^H=l8-nZ%EY@71{^6V5b3_B zz^;t#SVh{*n@qLhPB^V4;J@dLr}*qaq_2Z3*CQ+(i)}Cbx;MmL$8rG;0y{{abRYab z?#$5%SA><>FK~UbN)~jyE@qR19KR2LL0k4Ixng&&A+8}}ZLlg=bHqd{oM!%11c9R} z4ZeT{vV1EL0(_l75!9A`%8~Ban^o6^JnA}jkiPO;t|e=O-INE3x|G=EAegz6))a`2 z3%~705!;m=7s`dwz;hsUJp@j30oDoE<{AjwjEq2zR0pmrT@HYeF#_uVj|5`x6L=i3 ze9I6FvtS0hM;dx@Xa`oThX041xQ4k(V{p-?p|S^`6;aLA#)$>gqPsPkTDfwZNcM5+e4&|`k4r?opzuyD+^pRKk) zrq(U?J&B%pX^8x&^z^CzP(7n4h8Aeq=U@j-x}Q5jJQ2*egw zXFbnzjk@4%tP6TlZwNh(;0Zev?3!eDk2v6rux>O`2C_iG5e~j(eWLL$7qQj%UN_9gTemQSRxLAgPGW`keQ0m-QnIvsT`1;`J z8tKEpo6(+r*61wPS&e`gieLkNFBi4kU9^~I20j@<5Ar4%z~LgSu_GWca9H7l42|N zJC(-=ss9-)5DPSDR!bB z^CRHek^j0FlW{DLSA@Z_C+Bi)TK87O`@*3okSCBQkS9>bgC~$DkSCBQkSCBQkS9=W zZLKHJ+I}3WprGIf$8n&6JQ z>s41>bt3)T>MBGj$USkl-+ue48}lQX+tS*J)&V!&bkoIod3mw2EQ_SLLykgcUI7l8 zrb+qv`3d*ld+!wij?9%gZy2_3SN4$e&p-dXfddD=MUm^hWXY1jop~)>xUkpo;ltm% z{PN2$AZ~}!+C3;<8zT~{d?c+CXq`ms90ZMP5=M^07*qoM6N<$f(JP(#sB~S literal 0 HcmV?d00001 diff --git a/multisrc/overrides/colamanga/mangadig/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/colamanga/mangadig/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fd935fa4e209fb587dcf85135cfe079ddc26d8aa GIT binary patch literal 1118 zcmV-k1flzhP)N)rILp=0zJ2?9EX!&sggA~=hBCw`OS`5`o8En;`EOBGwKdWhx~_NR9k~oQ zQr+WuUJPjr$|T3LamLH^{X(lUxqodz*>o>-4lGFlnESz7%Zoew)7@wM)mWE!#0? z<9bZmx(^fg*}N;mNT4U}#GsvtJ0Kh#-hpLsHVlP#Xf-a1=fIC`r`iViZpcIIyKvU@ zgErtds2$#d*7sLvy}yUt{4wlp{xYTytbpTk?3};%_;1us??P&HH{_-dLF-3rhW?Kr z?#>y|2LA=6^ZQWfe@pdl;m@H7_|k5u-M@f7I${tXfKLNG#dl1I) zv+LwN@D8tq-1<2flS?B2uQkRMggz<0ef|CBp`ff^gzt1<&%E~oVESHA-7H9klx`nxDZ;; zZ+NE?)@~gSss8Qo4z9$xSPPm!?e-}kyp+4hta%NommlVNxDfitY*4#=l(=S2JxC;d zZrcgZg52y;*sFTtf_OIkq#fZ4=tKYK!MzyT;J;boT(qJ8LGArRpxtKipn69)f`x1a z`q+H5d!IvY^(>^iH^H1zHhcl4%}X#RmBfV*j?Pcjp*Blg^CFDE8fX1r7VxD#Ah^Ap z4a4A*kbi75q&hcJyG{&Oz}F5_|KCO1-U}DPoK+qAh^&DDK1BV08|;2K@!$7>R4PPUJ8=z=0l@TR#uA>nGek z4DZBp$c^uV*5{|thnUZ05+IRjAmAtMgtKlCv?2eHKuZ=m1>d&r?l~|f6rm@5E4Pp~ z@Hg0N`koVZ1>}}bpSmMT(e7p88KW8C*9u+0-99CL0`ZwHw|J7C_@A&>bmb=)#N9KO zj>yk=cfFG?9l8MHyQkVjAUQCnSB5@1SM-J^ z61XlRfk+?{hy)(CEGr3V4BNKVc(%(4+(>o*#*G_$A&s$V)29CMY@G2j-0||uFTb*Q z@!|ooSWHzE1*uu_3@cWw81nx6@4pt$Ms+#Z@NTN7sotP^H`Μ* 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 bfXd<#S|$6Wq2!$C00000NkvXXu0mjfidsVs literal 0 HcmV?d00001 diff --git a/multisrc/overrides/colamanga/mangadig/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/colamanga/mangadig/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ad18e27b52cb77c1d5048f9be52b6dfa20e29327 GIT binary patch literal 5092 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 literal 0 HcmV?d00001 diff --git a/multisrc/overrides/colamanga/mangadig/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/colamanga/mangadig/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..07f2ab0f8b5a9d7d2974f9377f6ed0f9e0938ddf GIT binary patch literal 6102 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 literal 0 HcmV?d00001 diff --git a/multisrc/overrides/colamanga/onemanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/colamanga/onemanhua/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7317a3dc5d657bc20df0db69a685d491c061c9a2 GIT binary patch literal 3503 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.getSharedPreferences("source_$id", 0x0000) + } + + override val client = network.cloudflareClient.newBuilder() + .rateLimitHost( + baseUrl.toHttpUrl(), + preferences.getString(RATE_LIMIT_PREF_KEY, RATE_LIMIT_PREF_DEFAULT)!!.toInt(), + preferences.getString(RATE_LIMIT_PERIOD_PREF_KEY, RATE_LIMIT_PERIOD_PREF_DEFAULT)!!.toLong(), + TimeUnit.MILLISECONDS, + ) + .addInterceptor(ColaMangaImageInterceptor()) + .build() + + override fun headersBuilder() = super.headersBuilder() + .add("Origin", baseUrl) + .add("Referer", "$baseUrl/") + + override fun popularMangaRequest(page: Int) = + GET("$baseUrl/show?orderBy=dailyCount&page=$page", headers) + + override fun popularMangaSelector() = "li.fed-list-item" + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + element.selectFirst("a.fed-list-title")!!.let { + setUrlWithoutDomain(it.attr("href")) + title = it.text() + } + thumbnail_url = element.selectFirst("a.fed-list-pics")?.absUrl("data-original") + } + + override fun latestUpdatesRequest(page: Int) = + GET("$baseUrl/show?orderBy=update&page=$page", headers) + + override fun latestUpdatesSelector() = popularMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) + + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = if (query.isNotEmpty()) { + "$baseUrl/search".toHttpUrl().newBuilder().apply { + filters.ifEmpty { getFilterList() } + .firstOrNull { it is SearchTypeFilter } + ?.let { (it as SearchTypeFilter).addToUri(this) } + + addQueryParameter("searchString", query) + addQueryParameter("page", page.toString()) + }.build() + } else { + "$baseUrl/show".toHttpUrl().newBuilder().apply { + filters.ifEmpty { getFilterList() } + .filterIsInstance() + .filterNot { it is SearchTypeFilter } + .forEach { it.addToUri(this) } + + addQueryParameter("page", page.toString()) + }.build() + } + + return GET(url, headers) + } + + override fun fetchSearchManga( + page: Int, + query: String, + filters: FilterList, + ): Observable { + return if (query.startsWith(PREFIX_SLUG_SEARCH)) { + val slug = query.removePrefix(PREFIX_SLUG_SEARCH) + val url = "/$slug/" + + fetchMangaDetails(SManga.create().apply { this.url = url }) + .map { MangasPage(listOf(it.apply { this.url = url }), false) } + } else { + super.fetchSearchManga(page, query, filters) + } + } + + override fun searchMangaSelector() = "dl.fed-data-info, ${popularMangaSelector()}" + + override fun searchMangaFromElement(element: Element): SManga { + if (element.tagName() == "li") { + return popularMangaFromElement(element) + } + + return SManga.create().apply { + element.selectFirst("h1.fed-part-eone a")!!.let { + setUrlWithoutDomain(it.attr("href")) + title = it.text() + } + + thumbnail_url = element.selectFirst("a.fed-list-pics")?.absUrl("data-original") + } + } + + override fun searchMangaNextPageSelector() = popularMangaSelector() + + protected abstract val statusTitle: String + protected abstract val authorTitle: String + protected abstract val genreTitle: String + protected abstract val statusOngoing: String + protected abstract val statusCompleted: String + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst("h1.fed-part-eone")!!.text() + thumbnail_url = document.selectFirst("a.fed-list-pics")?.absUrl("data-orignal") + author = document.selectFirst("span.fed-text-muted:contains($authorTitle) + a")?.text() + genre = document.select("span.fed-text-muted:contains($genreTitle) ~ a").joinToString { it.text() } + description = document + .selectFirst("ul.fed-part-rows li.fed-col-xs12.fed-show-md-block .fed-part-esan") + ?.ownText() + status = when (document.selectFirst("span.fed-text-muted:contains($statusTitle) + a")?.text()) { + statusOngoing -> SManga.ONGOING + statusCompleted -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + } + + override fun chapterListSelector(): String = "div:not(.fed-hidden) > div.all_data_list > ul.fed-part-rows a" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + setUrlWithoutDomain(element.attr("href")) + name = element.attr("title") + } + + @SuppressLint("SetJavaScriptEnabled") + override fun pageListParse(document: Document): List { + val interfaceName = randomString() + + document.body().prepend( + """ + + """.trimIndent(), + ) + + val handler = Handler(Looper.getMainLooper()) + val latch = CountDownLatch(1) + val jsInterface = JsInterface(latch, json) + var webView: WebView? = null + + handler.post { + val innerWv = WebView(Injekt.get()) + webView = innerWv + innerWv.settings.javaScriptEnabled = true + innerWv.settings.domStorageEnabled = true + innerWv.settings.blockNetworkImage = true + innerWv.setLayerType(View.LAYER_TYPE_SOFTWARE, null) + innerWv.addJavascriptInterface(jsInterface, interfaceName) + + innerWv.loadDataWithBaseURL(document.location(), document.outerHtml(), "text/html", "UTF-8", null) + } + + latch.await(30L, TimeUnit.SECONDS) + handler.post { webView?.destroy() } + + if (latch.count == 1L) { + throw Exception(intl.timedOutDecryptingImageLinks) + } + + val key = if (jsInterface.keyType.isNotEmpty()) { + keyMapping[jsInterface.keyType] + ?: throw Exception(intl.couldNotFindKey(jsInterface.keyType)) + } else { + jsInterface.key + } + + return jsInterface.images.mapIndexed { i, it -> + val imageUrl = buildString(it.length + 6) { + if (it.startsWith("//")) { + append("https:") + } + + append(it) + + if (key.isNotEmpty()) { + append("#") + append(ColaMangaImageInterceptor.KEY_PREFIX) + append(key) + } + } + + Page(i, imageUrl = imageUrl) + } + } + + override fun imageUrlParse(document: Document) = throw UnsupportedOperationException() + + override fun getFilterList() = FilterList( + SearchTypeFilter(intl), + ) + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + ListPreference(screen.context).apply { + key = RATE_LIMIT_PREF_KEY + title = intl.rateLimitPrefTitle + summary = intl.rateLimitPrefSummary(RATE_LIMIT_PREF_DEFAULT) + entries = RATE_LIMIT_PREF_ENTRIES + entryValues = RATE_LIMIT_PREF_ENTRIES + + setDefaultValue(RATE_LIMIT_PREF_DEFAULT) + }.also(screen::addPreference) + + ListPreference(screen.context).apply { + key = RATE_LIMIT_PERIOD_PREF_KEY + title = intl.rateLimitPeriodPrefTitle + summary = intl.rateLimitPeriodPrefSummary(RATE_LIMIT_PERIOD_PREF_DEFAULT) + entries = RATE_LIMIT_PERIOD_PREF_ENTRIES + entryValues = RATE_LIMIT_PERIOD_PREF_ENTRIES + + setDefaultValue(RATE_LIMIT_PERIOD_PREF_DEFAULT) + }.also(screen::addPreference) + } + + private val keyMappingRegex = Regex("""[0-9A-Za-z_]+\s*==\s*['"](?\d+)['"]\s*&&\s*\([0-9A-Za-z_]+\s*=\s*['"](?[a-zA-Z0-9]+)['"]\)""") + + private val keyMapping by lazy { + val obfuscatedReadJs = client.newCall(GET("$baseUrl/js/manga.read.js")).execute().body.string() + val readJs = Deobfuscator.deobfuscateScript(obfuscatedReadJs) + ?: throw Exception(intl.couldNotDeobufscateScript) + + keyMappingRegex.findAll(readJs).associate { it.groups["keyType"]!!.value to it.groups["key"]!!.value } + } + + private fun randomString() = buildString(15) { + val charPool = ('a'..'z') + ('A'..'Z') + + for (i in 0 until 15) { + append(charPool.random()) + } + } + + @Suppress("UNUSED") + private class JsInterface(private val latch: CountDownLatch, private val json: Json) { + var images: List = listOf() + private set + + var key: String = "" + private set + + var keyType: String = "" + private set + + @JavascriptInterface + fun passData(rawData: String, keyType: String) { + val data = json.parseToJsonElement(rawData).jsonObject + + images = data["images"]!!.jsonArray.map { it.jsonPrimitive.content } + key = data["key"]!!.jsonPrimitive.content + + if (keyType != "0") { + this.keyType = keyType + } + + latch.countDown() + } + } + + companion object { + internal const val PREFIX_SLUG_SEARCH = "slug:" + } +} + +private const val RATE_LIMIT_PREF_KEY = "mainSiteRatePermitsPreference" +private const val RATE_LIMIT_PREF_DEFAULT = "1" +private val RATE_LIMIT_PREF_ENTRIES = (1..10).map { i -> i.toString() }.toTypedArray() + +private const val RATE_LIMIT_PERIOD_PREF_KEY = "mainSiteRatePeriodMillisPreference" +private const val RATE_LIMIT_PERIOD_PREF_DEFAULT = "2500" +private val RATE_LIMIT_PERIOD_PREF_ENTRIES = (2000..6000 step 500).map { i -> i.toString() }.toTypedArray() diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaFilters.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaFilters.kt new file mode 100644 index 000000000..8f21403da --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaFilters.kt @@ -0,0 +1,32 @@ +package eu.kanade.tachiyomi.multisrc.colamanga + +import eu.kanade.tachiyomi.source.model.Filter +import okhttp3.HttpUrl + +interface UriFilter { + fun addToUri(builder: HttpUrl.Builder) +} + +open class UriPartFilter( + name: String, + private val param: String, + private val vals: Array>, + state: Int = 0, +) : Filter.Select(name, vals.map { it.first }.toTypedArray(), state), UriFilter { + override fun addToUri(builder: HttpUrl.Builder) { + val uriPart = vals[state].second + + if (uriPart.isNotEmpty()) { + builder.addQueryParameter(param, uriPart) + } + } +} + +class SearchTypeFilter(intl: ColaMangaIntl) : UriPartFilter( + intl.searchType, + "type", + arrayOf( + intl.searchTypeFuzzy to "1", + intl.searchTypeExact to "2", + ), +) diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaGenerator.kt new file mode 100644 index 000000000..9b8f45423 --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaGenerator.kt @@ -0,0 +1,25 @@ +package eu.kanade.tachiyomi.multisrc.colamanga + +import generator.ThemeSourceData.SingleLang +import generator.ThemeSourceGenerator + +class ColaMangaGenerator : ThemeSourceGenerator { + + override val themePkg = "colamanga" + + override val themeClass = "ColaManga" + + override val baseVersionCode = 1 + + override val sources = listOf( + SingleLang("COLAMANGA", "https://www.colamanga.com", "zh", overrideVersionCode = 15, className = "Onemanhua"), + SingleLang("MangaDig", "https://mangadig.com", "en", isNsfw = true), + ) + + companion object { + @JvmStatic + fun main(args: Array) { + ColaMangaGenerator().createAll() + } + } +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaImageInterceptor.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaImageInterceptor.kt new file mode 100644 index 000000000..0a7d45126 --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaImageInterceptor.kt @@ -0,0 +1,37 @@ +package eu.kanade.tachiyomi.multisrc.colamanga + +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +class ColaMangaImageInterceptor : Interceptor { + private val iv = "0000000000000000".toByteArray() + private val mediaType = "image/jpeg".toMediaType() + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + + if (request.url.fragment?.startsWith(KEY_PREFIX) != true) { + return response + } + + val key = request.url.fragment!!.substringAfter(KEY_PREFIX).toByteArray() + val output = Cipher.getInstance("AES/CBC/PKCS7Padding").let { + it.init(Cipher.DECRYPT_MODE, SecretKeySpec(key, "AES"), IvParameterSpec(iv)) + it.doFinal(response.body.bytes()) + } + + return response.newBuilder() + .body(output.toResponseBody(mediaType)) + .build() + } + + companion object { + internal const val KEY_PREFIX = "key=" + } +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaIntl.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaIntl.kt new file mode 100644 index 000000000..0bebd6aee --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaIntl.kt @@ -0,0 +1,51 @@ +package eu.kanade.tachiyomi.multisrc.colamanga + +class ColaMangaIntl(private val lang: String) { + + val rateLimitPrefTitle = when (lang) { + "zh" -> "主站连接限制" + else -> "Rate limit" + } + + fun rateLimitPrefSummary(defaultValue: String) = when (lang) { + "zh" -> "此值影响主站的连接请求量。降低此值可以减少获得HTTP 403错误的几率,但加载速度也会变慢。需要重启软件以生效。\n默认值:$defaultValue\n当前值:%s" + else -> "Number of requests made to the website. Lowering this value may reduce the chance of getting HTTP 403. Tachiyomi restart required.\nDefault value: $defaultValue\nCurrent value: %s" + } + + val rateLimitPeriodPrefTitle = when (lang) { + "zh" -> "主站连接限制期" + else -> "Rate limit period" + } + + fun rateLimitPeriodPrefSummary(defaultValue: String) = when (lang) { + "zh" -> "此值影响主站点连接限制时的延迟(毫秒)。增加这个值可能会减少出现HTTP 403错误的机会,但加载速度也会变慢。需要重启软件以生效。\n默认值:$defaultValue\n当前值:%s" + else -> "Time in milliseconds to wait after using up all allowed requests. Lowering this value may reduce the chance of getting HTTP 403. Tachiyomi restart required.\nDefault value: $defaultValue\nCurrent value: %s" + } + + val timedOutDecryptingImageLinks = when (lang) { + else -> "Timed out decrypting image links" + } + + val couldNotDeobufscateScript = when (lang) { + else -> "Could not deobfuscate script" + } + + fun couldNotFindKey(forKeyType: String) = when (lang) { + else -> "Could not find key for keyType $forKeyType" + } + + val searchType = when (lang) { + "zh" -> "搜索类型" + else -> "Search type" + } + + val searchTypeFuzzy = when (lang) { + "zh" -> "模糊" + else -> "Fuzzy" + } + + val searchTypeExact = when (lang) { + "zh" -> "精确" + else -> "Exact" + } +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaUrlActivity.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaUrlActivity.kt new file mode 100644 index 000000000..309b1e765 --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/colamanga/ColaMangaUrlActivity.kt @@ -0,0 +1,35 @@ +package eu.kanade.tachiyomi.multisrc.colamanga + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class ColaMangaUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size > 0) { + val intent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${ColaManga.PREFIX_SLUG_SEARCH}${pathSegments[0]}") + putExtra("filter", packageName) + } + + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Log.e("ColaMangaUrlActivity", "Could not start activity", e) + } + } else { + Log.e("ColaMangaUrlActivity", "Could not parse URI from intent $intent") + } + + finish() + exitProcess(0) + } +} diff --git a/src/zh/onemanhua/build.gradle b/src/zh/onemanhua/build.gradle deleted file mode 100644 index 022ab9505..000000000 --- a/src/zh/onemanhua/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ -ext { - extName = 'COLAMANGA' - extClass = '.Onemanhua' - extVersionCode = 15 -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation(project(":lib:synchrony")) -} diff --git a/src/zh/onemanhua/res/mipmap-hdpi/ic_launcher.png b/src/zh/onemanhua/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 39a379fdf0a8049c71edea13c44772becadce4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3010 zcmV;z3qACSP)Px=d`Uz>RCr$PoC$1HjNk*CnqN*RE6J;^NvgwZ(@rU!TvnW$oIv zBU4gRW=kro?V7p(f<}qO#l_>=w{Jgg51>_Dc=Ny)WYT!@tr$&&T6WQ4`tr#)~(C#(xnRkZHoa^ z3t};Vf`m~FplAcgbzM1*X}|yL`sP{JHKAS~c<*qoi`oeC`CRSXDV3BsDk*VQQev+u zky^BnTD5Z2qJ>-ebFaOmxG?-X05QCcs&8|m4xq9!>8GEhFTRkz|6cm#7irZh>94;e z{>Iwkd?W_KKmFgH*IpXVS}`Oy`7Vo2w<)T4s>+=^-^kT=n)bO&PI(O3w1|Zwn(qN zCOz_qw0X1Cy0vt`0n*uLOX=xSa6)U8_|5hc4H{B#% zaDmjeZS^(5fT-*5jS3Kx`t3LA;fJMn-jNa#q|;851`U#qKVI5<@6eXDeY^C@C(`S$ zOK-d(m6l3po+*tTYZMHJQi1=mQ2~NdS6?mt_@mUarF8%O7BRdgT8NPEzB64Rg7}I4 zn82DIaa2^eDlK(XTr7R?f%M{wCfaCHPL9;QduTw{c2=VR#G(-1>#mcQEwjb4pi3^1 zMvgQACR^p^I=bc>qmBof2TD~UlFwHS)UI6;(R9#3c8`JrsaG%Qx#tWdkD}qg)hGb5 z;PK<7H{X;FI}A~k-hG!ykOmHvZoEd--&F+=Ly*=TX!eNuV3blh>$OD|b;4IggQ zBC?1ge^AV9+LHPC>8H}mFPpeO`K0vo&(c|Ek?o{=?y-A>J0b#*|D=BZ-6jnk5a*Lm zu3q5m*|yU}%Q@#r-+W^LZQ3Mt>Qpm}c~moST)D1gLv-l8^Q5Pqvh&}1%czSL$jg)V z-#j@3z|{fFSHAOt7f%2C18L4ZRTMuf8&XpvJUmuG+S(y*=ec5msU1M9YHH zryD?9w;I)6ctILAOnUUu(9EPar-%YXM!NJ;X~zzWp8oyqH597N0YjO~FSoQ!c5B|e zCZz%?hGih?PC3OW>Sen3-m@qIbU-}%=+L7mVgQkC&>MD`%!1~y^H*IZwP_<=afM|X zfA5o@Z|75s#l<<53$D&YMl0^Yy*Uth4(^WzdFPVZPCuQ9ban5&PUZg$wRVdbKuq$E zJ4{6HzFWHZVk;>C1{xsLWFKg7@WHAqCHQ?=nXAM^D>*Qd{yvB}@X|cMAn<4#5eF@~ zC)Y5hO_N5AGRmTJ{?x87o+1X&pMM%%mM)dvf8QJ~08o@tVvvq0F_=8NjXuqrXOY8h zv(Ug@_xD6z^Z*X8@j_2LVdBnMzTC3oF~^t&dcO}wwuk|QF(mz>BOiZUlS^p%E@umub=HUk@ETHmeKn5Rb|TqQ71Ezp-woVdZ|QaN=i*2h+wG4HPmmR zy6cDmMC*b&i%F7t16?ijfL2|*+Cp!?-4;lVMrtN1pa&pwJq0ZO=KS-`PrdR=H9%|x z(TPxZ>{x9h5PC!$ppWD^a0nw}06`)A519*r4mLc1aM&I|=+@GuuIA5oDkEgwI%&ud z1A&U(8~h(U5dis9iS$oKBZ2`dlo3&YsIUQO)~tU{jh!VTsN%_LH{UEh|Gd%3qgX+K ztIeAoWn>sdp$k?ZG0|0@K92@**jzCdIz~+G@P0qZlH6#u+Bk_#1z}!_HrOtyuu- zCEWIo9j+=WEQ4`)9?0JdRaf*iJrR1vc{I#CTYyN@n)QS|>O`6}kH{`rA}v^8<%BoT z3sO7%p$8r?UGdr>LlC&K^NUyW`6%WEQm2AIFWBZA0&(3h-*w}Pr^Y1NOGy#GP3oBk7< zgr$f&qsVSQ^Ne)oozf9USWN`YpabS`@?`0dL!`Igw#lOIS86a>=rwexb^UO;C!J(X`YW%r^n1e%)<_E+ z&=UZ;3TD>%$LCCjtjl`u1C^<#55cYig}|^DLbMSY~GJQ33VHidY8d_1I%k-0ooEv?Pce zcAZrI(MLwT{q{45TbDLKMJPff5K#@$0u6wZif1bGvC z{BbKKNW(l*rWT_M2vB4x&(AW3eAz-SSHze-D!jylSm_rCku zy@^yDH_?if2zN9JKrEUrA3{wQVj$FHGUx;lufA%JeRw3q0?`k$8}!0Y0SM&_jen>~ zjYgC)02zZxgwc@0Hqc45rzPQyMga&A&>l2_5(8mHa0d*q$rlyb>p%W5jiGN%gn5s1 z{JW2MAEM~XFHL8lDJ6>s7TrUv0~VmkJofSS5RlLmb|2bc5>GtQ9`8{7lj89{=tr;t z=uj2S!4^O->;wfX;Oy>blnC;lEbrc+X5z6iB0G4n9RL;RhU;1+x`f%pAwx|xjLb;t zC+Zq98XX{Zo(GAvKmdw{7~)Oal?+AoPlm!&`oDPrZQ&6TWeeBxmKn4Sai*5L@Itc! zyF)8~KpPz(|H)8N@O&O)hpu1+5L@~^)J~qr;+YU`oHiQ7IaKYqWjs;1sl2`jizh93l-^ROCH-T6XKx$1+?A zywAO16OQE7uIu^=3kxTA>(*`3?tC1o#lnRPGt<-4A52I{;KRIo+$b+E-R#w)i`Sa(mkhG=hL%sj_vVnR(7A}cS zO`G)e^yCpEM)XZiPVOEbAK#?ESfHY!qIAugH7lo2pS~zRKYvXXI6K4rSh&Y1-uIp; ziOAsqoT~T2H(AorxGk;H9CQb2?ba6ycnCl#-sr{wI8FI`JiPDh01&$691Z$v3J)X? zlwePx*14%?dRA@u(nt5ncXB5SMlf;Z9id9Qg)Ha|dDY#3)1*J$U?zkasw2Hj8?^sa)9I2_Pu_-Aji=0m9w?M@( zNBNoC?fxS@J^iNq=eb=HbEaJf8Oz6|Hj!~Oe$>L4!8L&Js+8Z>~InBw7kJRTg5;#*Tl0bIKV z%a_Anf5FqIP^l7Bt_&UzJbr9PY%Fx_2%|?s-MYFK*x`3HKNK0r%Y&s$AuSDR)`Wij z;G1utMh%FHG8gjm;r4CVy&G1of*Utr)F_xR0ivTzPspHWAU79=4~OH&VagQv{(C4_ z4l**#DLEGz>2t8K5cHiDD`5S4Xxr9aE0(g?2Nl4}moR7$96M$aR^+En1*a3bb_G$Y zdUcS~GEqtI^?KzB^zIEicS55^uxV52G7(e&3m3xb)v#d$96Sh%7enjT7STR^;FC{a z;6QWO-vpv>U-jk1foX|=+p_ibb+BmjW)7n%S<+R-SO8^YSPz5u9*6B6LSfifs! z$*9sjX%Y+>Vv;C_RKT-mLuRIUZ)1fbtfMNg90-;Rl7(X6<{1Gl*gg^g;FTU`7P624#7+SP|^z`ECqbot_ z1Nxz>S1r}kryGEM`|RA?n-$TlLkD>A!YC!@)p7lMgGTX*6D@0^Q6LK%04?&{Z`Kbq zmCC7IyUbB3jU1O!Y1AlR-XwMVcFTa~9Z@bm9x7BY*;IDa7fQ0A0#NET5-a*rAZhyF ze?!Zb7U4E+Y^c-Fr_88`CB19b7%-`olu6gs;7YTx2`T_Z>)A6KjYT8PGJ^+O2C7vn ze(x*bDq3}9)r`iFuxx0&>6SxMAI(6LRb@lXsaCBwx0JVT!Hyj^KIi1X*s-=JC{5(O zYXv<6{+tzk=FKxYXj5OMigjbzqenKKD$-Ic6>UicTU0%S6o7X@O_@>@?HBIdv$NV- zYU-3+2GaR5E#i_E3&r&^$v`L^FOwPwrQ`oU0B*NCCptPh!0xmx;{E0td3kxcPN!4z zZ;8(bDrRP8rX?gKd{_2v7QbRvR@U!{iHUl|^eoWx0sVqADJkjmjT<-4jE|4+7!?&2 z;C^!GA?D}jyRx&hcP1w%PtC~4$N}8`s}}i`5|GoCUq7KN7kW1XuJH18)I}ZF+mBm| zyBV+Zy0@&u@6JwGpy=+Zo=oa^=UMT`e>Dh8PW%@A;4|Px_Y)M2xRCr$Poe8v+V;9H&?`@D<(pR_0l*~oQl#)-GXJtx;R>+tkL=quF6w0i~ zlw?>DGOM*jhNy%JD=vwYzNnkJ_qy-5erMmudGG0*dxm?s@2RubI_pf&`@HY7|NGhd zzxVT;^Lollt!lul)wAbMt~>y>Yy^1#@&MGb25R~A`5BN0pq4dI%csxJfE)!N58T?o z`I%sut|Dpg9tDBdnVfrFIR?e^sHl8)?^7CIssQ}0^f6<`H1656=Yy*S0xbDY9bW?Xj7+u|Nc#f4IB1;UisBq79b25Fkrvo z!-p@c1fkm4kPHC6$NK9pS+Zn6QBl$L>!D$%J>;cJm)_XCdGleCN-IG~*heY=)Rk0N zQd06kVPRq0w6A78JYdzTRbMr1*sznNRg%gpgL7O>Bm*E~{gN70R8%Zl-ve%{wnShq zC@9!W(#pzNkT4)81E7wi4J0-8egEfFFCgDe@;tAlBpA_}>fBH&05p))#P|J$dBvu# z0nhU`m-M@&)!6{xKfdq(nEL7SEj`cMQquqO0MwE#H9#k0GP zHEZUnsK{5thW33)iKkzG_4V6t_PlCU^ftDdE0f<(>$@Xa^UMHfl)=bLis)|JjbU+UdEvEtKJ z2mn9ykaYLmQdyZDz0*$8O|cMZp8&^T+&~E`6?^(w0gBs*7x3%o_dPUt$$_!Zf}o0vZ;FO zEA#+h`M4K+wqr0*#xu^4uD&`-ADw#`I8b`*v1nVTvUtqMeHQO|lTD=EcenTeNW_In zlWaz0Q$hhiBG$8HiFEquQMXf6BrRPURqg=?NW+Fn!~rM6hf5L_XYbZM`> zq_^Le{`}M8%&V_jKPQ}E=g$^93Izc1X23Jgn2SOAO#5-;BxV5b$Bvb5xkXyN+TN2$ zVVO|TM<120xyD`-H<~uBwC^~ZKAcN)GlBP`M@z-UQil!(Ac|%t9(knn<(GE8`|p>| zJk#}S%qUX{1pu)Z&w!6T)_6XygaC*|nxZV>LgD@TnSXxxVaoxKv15G=9B2x0dWp?` zW3y!Xbnc13%lAP5=s#~*g=#~-g<%DCw!>E@fQKeA+ZeW@xuwq2+Iz`ve&qBL`+xsVS&Fbl)d zsm*-yiA{UxXQJ{kfqVRTz_Q>NoE<35k}z{iJVQMZ&Jlbt>qr1e;DW*|*l|bdN#>^B zeYa+%>`(#l-FMPqhZ*(572J294gLN1Eg6ILAe}l{Y``7F7TaJjYu4D}3(5;VI5z0A zg4r+>6aaXp3_)z6s27jmkefgZ3JaxAKb5wt!5;8X0Wfi*DHeh6ck5=a$!w{9Vtvk) zVBy`md6Bvev*D|+j4n26 zA`|!#a)O>cGj%{AD@EX5;P?#swb!azmaG56!ST^Zj~>RBP%gfC)TpYA2MQY-q@Ai_ z%MT6!0x>hdeUGA{xj`XL?7Od(wJ*HTj3ZMC)eImD#s8Dtl7*7Z#tIAsS~_Ef)$(0! zX2b|zx83GNVh3deH&ak7vjb((HrOXF4`4~ww%xXB{pjnjrQd!t1ryYRf&nlqIG%za ztSM6o4FD(#pZojowoVKEjP>tski-ZW3c=V3oS#{+!w!}tIU%qge6aMz7gkQ_*fIJY z3}(z2>Ex5`IVi*&YCyDctjvASwL+CY`bcWh#6V1Rt;v814FK?dN(%U3vRZs=I&#lF z5{VK3z@CBt9C)AsFnO}CPMxB8!DW|O=>b;L0RWI( z_8Y8OopzcrA%v1iix%lzZAbyY1>w6{3Z$x;NIv__7E7oPIhsfrngSgz!LcWfr`@DU zzLqWXB9+ddqM)~Av)gX#t4kO1g6J8EK?@dG47l^owXbBI0{|C9ki-R1^m_8i!~nob z@XI7^_-INNxCtmJQnmP2m3F%C<7LLt&s?HrGa)uU(1&wD&|K(m&buH28}5T3OdSS> zlPIuVd8N@+6h`?OWxVl*E!@CzC|6K|AP;~Q@f@V2%o;~K>4QK`VCUJr#vs@!(W;en z$|+Tifn!MmAp#q3YyjkZ5N3#E!H$Mf2&3Q?D-8aKBaDWkXfjdC6{+kcN;IdcJ2u{T z&`^xT(NId&nM!DaFauycm+4L-#^O4RCRUa&H@b?&5>Q`!(X1QGWtRj25#U@V%uI;2 zeykoKc`h%vh4`TL<4%Y{Sa&=j5o22;xdls>5P(c2Q~R=*HR2k`yRKezY6fa`Sw$&=AdC>J*wUD(gbDyy z2gwz_7bX-N{7@VNr%Zv*1+Xq%Z0J}p88UPh%cM$4dsq?0Gh#tiU~Cl(Ur#*YoCH*u z)TNh3S|(g-MB%O&2P4~l`%KjzvRV*IJmwhl@9gJca6#J0z951hO2$o)Tm|C<`+Mrt z@glVxHgU0clz_{Ox#br7&Ok8bx&`-_UNQyJ?v6XmWhD{{f>b{NjAhHIQ`ez#G=nCi zz5aT$-T?z_VcrQ#khmzmgVVE6pGc@=_UU8p1Yu_b3n;D@1Y;s*khB33i|iEDl5JBb z*>jmOTVmoZm!>lxLgj+EaIBkJ5Uyd1Eu?qeiOvG(ARDCsfVBc#OLc-PLa|UbBvU>m2dtigATy9nV~LhaQw1S(0C3@0mP`K$v@EiJ|GhB}YV|N1 z+!P!=nE)g+$?cYdVbKQ(A8~;K9@%bnZpWQt@Ze}+j#I-|~hZ)t)07}kXyV_a-+fv~E+1Mc$N&rwQ zJCfb%*w$N1@P8h-63PR(phWwjsQ=&|*j7ReAY*mQnZy9<|I8?a{s`n00;%!uwwski zSd+lLU;u1~q&&hJF#<&f&}>L(0YEWlon=%r$mtn0iI3Zv2FGU|7=Qllx3+Na3TZCc z;uw7P;fG7tT_*u3{C(s|U-RdC5qA_6w~9sygDe|%#;ip6ErKojXG8rVp`nRN0nkns z=c!l*g({}o3yQU)R0?rHpxoZ28{&0QFs+Rn} zNtPtEGr)}x{|yK~{bZlu64;{&Lvn&5Nyx~8aWSo1+j|zv*9PTC@ky<_mPQU=>+|=&yH?| zNBQj7aQjm;={M0aIRO9{j~gQRvcT?U0&4+K$V^wGVwHlQCr=<7cGi!@Q+CL<<-2p| z3;8FHq(mFbu2C$Zqiz`q?4aM|{fO`jhNdQJhr#iMu>#flhy z+W|pNKzV{%5`Ldw%@7ab{Y;fI1@4TDm^u(UFo+{g0F^yTxS>?yM@?K(&H>;Ci`7ys zh5fjVS`G{rYM_tq;R<$S#gr4EtUOby2ntk{Mfh{i%}$b)3NSeffEyfag`|xjNp&=+ z)Y$yN9TWTuDl(KP$Z1CXY|vfVrnK(;lSW`EfRph;38+&Wm=6-^XhZFd0AOmS^fI;TT5D=t$$D7c*&9_?-UgkW%+N7a$M61E`RCLrSqCM zZ+=iE05!US1OH7Jxr4@(DO0ZO(xuB4>!!-GJF2Nur;g~_wd);~chIQzMn1{*0001s zfQ{O>Z@$GD;~I`C2M+grzkK=f<=@YlGv|#V zLxwyxckWzv8u6QdmW6OX)!x!DnF~S%kvr*C-p;B}5A6dFAfRv*&(9)wjrF^`s%CdsxzU@uiz;pg5cuC0fZ#R%PMY)< zx2ep4APAA0dR9Jy%1@`C+)!<5R~fvOEg+zDcN5Q~%6IN1wNqIucUxN*8`f9F2X*EY z?ZEg)?k5}%q`dN@T1m;;^GZx-uK!DI^H%&XDLT<<@&M!ksAUb*^6B$4pq2snKmTa5 U*(k!!&j0`b07*qoM6N<$g7*0uIRF3v diff --git a/src/zh/onemanhua/res/mipmap-xxhdpi/ic_launcher.png b/src/zh/onemanhua/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index fd1d7c0b61154d5400d45b7fb42553c23279860b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7962 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 PkPN6QYAH0lu#Ws66bP&w diff --git a/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt b/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt deleted file mode 100644 index 074ea8fc1..000000000 --- a/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt +++ /dev/null @@ -1,496 +0,0 @@ -package eu.kanade.tachiyomi.extension.zh.onemanhua - -import android.annotation.SuppressLint -import android.app.Application -import android.content.SharedPreferences -import android.os.Handler -import android.os.Looper -import android.util.Log -import android.view.View -import android.webkit.ConsoleMessage -import android.webkit.CookieManager -import android.webkit.JavascriptInterface -import android.webkit.WebChromeClient -import android.webkit.WebView -import androidx.preference.PreferenceScreen -import eu.kanade.tachiyomi.lib.synchrony.Deobfuscator -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.interceptor.rateLimitHost -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -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.ParsedHttpSource -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonObject -import kotlinx.serialization.json.jsonPrimitive -import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.ResponseBody.Companion.toResponseBody -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import uy.kohesive.injekt.injectLazy -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit -import javax.crypto.Cipher -import javax.crypto.spec.IvParameterSpec -import javax.crypto.spec.SecretKeySpec - -// Originally, the site was called One漫画. The name has been changing every once in awhile -class Onemanhua : ConfigurableSource, ParsedHttpSource() { - override val id = 8252565807829914103 // name used to be "One漫画" - override val lang = "zh" - override val supportsLatest = true - override val name = "COLAMANGA" - override val baseUrl = "https://www.colamanga.com" - - // Preference setting - private val preferences: SharedPreferences by lazy { - Injekt.get().getSharedPreferences("source_$id", 0x0000) - } - - private val cookieManager by lazy { CookieManager.getInstance() } - - override val client: OkHttpClient = network.cloudflareClient.newBuilder() - .rateLimitHost( - baseUrl.toHttpUrl(), - preferences.getString(MAINSITE_RATEPERMITS_PREF, MAINSITE_RATEPERMITS_PREF_DEFAULT)!!.toInt(), - preferences.getString(MAINSITE_RATEPERIOD_PREF, MAINSITE_RATEPERIOD_PREF_DEFAULT)!!.toLong(), - TimeUnit.MILLISECONDS, - ) - .addInterceptor { chain -> - val response = chain.proceed(chain.request()) - - if (response.request.url.fragment?.contains("key") != true) { - return@addInterceptor response - } - - val keyStr = response.request.url.fragment!!.substringAfter("key=") - val key = keyStr.toByteArray() - - val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding") - cipher.init( - Cipher.DECRYPT_MODE, - SecretKeySpec(key, "AES"), - IvParameterSpec("0000000000000000".toByteArray()), - ) - - val output = cipher.doFinal(response.body.bytes()) - response.newBuilder() - .body(output.toResponseBody("image/jpeg".toMediaType())) - .build() - } - .build() - - override fun headersBuilder(): Headers.Builder = Headers.Builder() - .add("Origin", baseUrl) - .add("Referer", "$baseUrl/") - - // Common - private var commonSelector = "li.fed-list-item" - private var commonNextPageSelector = "a:contains(下页):not(.fed-btns-disad)" - private fun commonMangaFromElement(element: Element): SManga { - val picElement = element.selectFirst("a.fed-list-pics")!! - val manga = SManga.create().apply { - title = element.selectFirst("a.fed-list-title")!!.text() - thumbnail_url = picElement.attr("data-original") - } - - manga.setUrlWithoutDomain(picElement.attr("href")) - - return manga - } - - // Popular Manga - override fun popularMangaRequest(page: Int) = GET("$baseUrl/show?orderBy=dailyCount&page=$page", headers) - override fun popularMangaNextPageSelector() = commonNextPageSelector - override fun popularMangaSelector() = commonSelector - override fun popularMangaFromElement(element: Element) = commonMangaFromElement(element) - - // Latest Updates - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/show?orderBy=update&page=$page", headers) - override fun latestUpdatesNextPageSelector() = commonNextPageSelector - override fun latestUpdatesSelector() = commonSelector - override fun latestUpdatesFromElement(element: Element) = commonMangaFromElement(element) - - // Filter - open class UriPartFilter(displayName: String, private val vals: Array>) : - Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { - fun toUriPart() = vals[state].second - } - private class StatusFilter : UriPartFilter( - "状态", - arrayOf( - Pair("全部", ""), - Pair("连载中", "1"), - Pair("已完结", "2"), - ), - ) - private class SortFilter : UriPartFilter( - "排序", - arrayOf( - Pair("更新日", "update"), - Pair("日点击", "dailyCount"), - Pair("周点击", "weeklyCount"), - Pair("月点击", "monthlyCount"), - ), - ) - private class CategoryFilter : UriPartFilter( - "类型", - arrayOf( - Pair("全部", ""), - Pair("热血", "10023"), - Pair("玄幻", "10024"), - Pair("恋爱", "10126"), - Pair("冒险", "10210"), - Pair("古风", "10143"), - Pair("都市", "10124"), - Pair("穿越", "10129"), - Pair("奇幻", "10242"), - Pair("其他", "10560"), - Pair("少男", "10641"), - Pair("搞笑", "10122"), - Pair("战斗", "10309"), - Pair("冒险热血", "11224"), - Pair("重生", "10461"), - Pair("爆笑", "10201"), - Pair("逆袭", "10943"), - Pair("后宫", "10138"), - Pair("少年", "10321"), - Pair("少女", "10301"), - Pair("熱血", "12044"), - Pair("系统", "10722"), - Pair("动作", "10125"), - Pair("校园", "10131"), - Pair("冒險", "12123"), - Pair("修真", "10133"), - Pair("修仙", "10453"), - Pair("剧情", "10480"), - Pair("霸总", "10127"), - Pair("大女主", "10706"), - Pair("生活", "10142"), - ), - ) - private class CharFilter : UriPartFilter( - "字母", - arrayOf( - Pair("全部", ""), - Pair("A", "10182"), - Pair("B", "10081"), - Pair("C", "10134"), - Pair("D", "10001"), - Pair("E", "10238"), - Pair("F", "10161"), - Pair("G", "10225"), - Pair("H", "10137"), - Pair("I", "10284"), - Pair("J", "10141"), - Pair("K", "10283"), - Pair("L", "10132"), - Pair("M", "10136"), - Pair("N", "10130"), - Pair("O", "10282"), - Pair("P", "10262"), - Pair("Q", "10164"), - Pair("R", "10240"), - Pair("S", "10121"), - Pair("T", "10123"), - Pair("U", "11184"), - Pair("V", "11483"), - Pair("W", "10135"), - Pair("X", "10061"), - Pair("Y", "10082"), - Pair("Z", "10128"), - ), - ) - override fun getFilterList() = FilterList( - SortFilter(), - CategoryFilter(), - CharFilter(), - StatusFilter(), - ) - - // Search - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - return if (query.isNotBlank()) { - GET("$baseUrl/search?searchString=$query&page=$page", headers) - } else { - val url = "$baseUrl/show".toHttpUrl().newBuilder() - url.addQueryParameter("page", page.toString()) - - filters.forEach { filter -> - when (filter) { - is StatusFilter -> { - if (filter.state != 0) { - url.addQueryParameter("status", filter.toUriPart()) - } - } - is SortFilter -> { - url.addQueryParameter("orderBy", filter.toUriPart()) - } - is CategoryFilter -> { - if (filter.state != 0) { - url.addQueryParameter("mainCategoryId", filter.toUriPart()) - } - } - is CharFilter -> { - if (filter.state != 0) { - url.addQueryParameter("charCategoryId", filter.toUriPart()) - } - } - else -> {} - } - } - GET(url.toString(), headers) - } - } - - override fun searchMangaNextPageSelector() = commonNextPageSelector - override fun searchMangaSelector() = "dl.fed-deta-info, $commonSelector" - override fun searchMangaFromElement(element: Element): SManga { - if (element.tagName() == "li") { - return commonMangaFromElement(element) - } - - val picElement = element.selectFirst("a.fed-list-pics")!! - val manga = SManga.create().apply { - title = element.selectFirst("h1.fed-part-eone a")!!.text() - thumbnail_url = picElement.attr("data-original") - } - - manga.setUrlWithoutDomain(picElement.attr("href")) - - return manga - } - - override fun mangaDetailsParse(document: Document): SManga { - val picElement = document.selectFirst("a.fed-list-pics")!! - val detailElements = document.select("ul.fed-part-rows li.fed-col-xs12") - return SManga.create().apply { - title = document.selectFirst("h1.fed-part-eone")!!.text().trim() - thumbnail_url = picElement.attr("data-original") - - status = when ( - detailElements.firstOrNull { - it.children().firstOrNull { it2 -> - it2.hasClass("fed-text-muted") && it2.ownText() == "状态" - } != null - }?.select("a")?.first()?.text() - ) { - "连载中" -> SManga.ONGOING - "已完结" -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - author = detailElements.firstOrNull { - it.children().firstOrNull { it2 -> - it2.hasClass("fed-text-muted") && it2.ownText() == "作者" - } != null - }?.select("a")?.first()?.text() - - genre = detailElements.firstOrNull { - it.children().firstOrNull { it2 -> - it2.hasClass("fed-text-muted") && it2.ownText() == "类别" - } != null - }?.select("a")?.joinToString { it.text() } - - description = document.select("ul.fed-part-rows li.fed-col-xs12.fed-show-md-block .fed-part-esan") - .firstOrNull()?.text()?.trim() - } - } - - override fun chapterListSelector(): String = "div:not(.fed-hidden) > div.all_data_list > ul.fed-part-rows a" - - override fun chapterFromElement(element: Element): SChapter { - val chapter = SChapter.create().apply { - name = element.attr("title") - } - chapter.setUrlWithoutDomain(element.attr("href")) - return chapter - } - - private fun randomString(length: Int = 10): String { - val charPool = ('a'..'z') + ('A'..'Z') - return List(length) { charPool.random() }.joinToString("") - } - - internal class JsObject(val latch: CountDownLatch, val cookieManager: CookieManager) { - - private val json: Json by injectLazy() - - var images: List = listOf() - private set - - var key: String = "" - private set - - var keyType: String = "" - private set - - @JavascriptInterface - fun passJsonData(rawData: String) { - val data = json.parseToJsonElement(rawData).jsonObject - images = data["images"]!!.jsonArray.map { it.jsonPrimitive.content } - key = data["key"]!!.jsonPrimitive.content - - latch.countDown() - } - - @JavascriptInterface - fun passKeyType(key: String) { - keyType = key - } - } - - private val keyMappingRegex = Regex("""[0-9A-Za-z_]+\s*==\s*['"](?\d+)['"]\s*&&\s*\([0-9A-Za-z_]+\s*=\s*['"](?[a-zA-Z0-9]+)['"]\)""") - - private val keyMapping by lazy { - val obfuscatedReadJs = client.newCall(GET("$baseUrl/js/manga.read.js")).execute().body.string() - val readJs = Deobfuscator.deobfuscateScript(obfuscatedReadJs) - ?: throw Exception("Could not deobufuscate manga.read.js") - - keyMappingRegex.findAll(readJs).associate { it.groups["keyType"]!!.value to it.groups["key"]!!.value } - } - - @SuppressLint("SetJavaScriptEnabled") - override fun pageListParse(document: Document): List { - val interfaceName = randomString() - document.body().prepend( - """ - - """.trimIndent(), - ) - - val handler = Handler(Looper.getMainLooper()) - val latch = CountDownLatch(1) - val jsInterface = JsObject(latch, cookieManager) - var webView: WebView? = null - - handler.post { - val webview = WebView(Injekt.get()) - webView = webview - webview.settings.javaScriptEnabled = true - webview.settings.domStorageEnabled = true - webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null) - webview.settings.useWideViewPort = false - webview.settings.loadWithOverviewMode = false - webview.settings.userAgentString = webview.settings.userAgentString.replace("Mobile", "eliboM").replace("Android", "diordnA") - webview.addJavascriptInterface(jsInterface, interfaceName) - - webview.webChromeClient = object : WebChromeClient() { - override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean { - if (consoleMessage == null) { return false } - val logContent = "wv: ${consoleMessage.message()} (${consoleMessage.sourceId()}, line ${consoleMessage.lineNumber()})" - when (consoleMessage.messageLevel()) { - ConsoleMessage.MessageLevel.DEBUG -> Log.d("onemanhua", logContent) - ConsoleMessage.MessageLevel.ERROR -> Log.e("onemanhua", logContent) - ConsoleMessage.MessageLevel.LOG -> Log.i("onemanhua", logContent) - ConsoleMessage.MessageLevel.TIP -> Log.i("onemanhua", logContent) - ConsoleMessage.MessageLevel.WARNING -> Log.w("onemanhua", logContent) - else -> Log.d("onemanhua", logContent) - } - - return true - } - } - webview.loadDataWithBaseURL(document.location(), document.toString(), "text/html", "UTF-8", null) - } - - latch.await() - handler.post { webView?.destroy() } - - val key = if (jsInterface.keyType.isNotEmpty()) { - keyMapping[jsInterface.keyType] - ?: throw Exception("Could not find key mapping for keyType ${jsInterface.keyType}") - } else { - jsInterface.key - } - - return jsInterface.images.mapIndexed { i, url -> - var imageUrl = url - if (imageUrl.startsWith("//")) { - imageUrl = "https:$imageUrl" - } - // Empty key means image is not encrypted - if (key != "") { - imageUrl = "$imageUrl#key=$key" - } - Page(i, imageUrl = imageUrl) - } - } - - override fun imageUrlParse(document: Document) = "" - - override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { - val mainSiteRatePermitsPreference = androidx.preference.ListPreference(screen.context).apply { - key = MAINSITE_RATEPERMITS_PREF - title = MAINSITE_RATEPERMITS_PREF_TITLE - entries = MAINSITE_RATEPERMITS_PREF_ENTRIES_ARRAY - entryValues = MAINSITE_RATEPERMITS_PREF_ENTRIES_ARRAY - summary = MAINSITE_RATEPERMITS_PREF_SUMMARY - - setDefaultValue(MAINSITE_RATEPERMITS_PREF_DEFAULT) - } - - val mainSiteRatePeriodPreference = androidx.preference.ListPreference(screen.context).apply { - key = MAINSITE_RATEPERIOD_PREF - title = MAINSITE_RATEPERIOD_PREF_TITLE - entries = MAINSITE_RATEPERIOD_PREF_ENTRIES_ARRAY - entryValues = MAINSITE_RATEPERIOD_PREF_ENTRIES_ARRAY - summary = MAINSITE_RATEPERIOD_PREF_SUMMARY - - setDefaultValue(MAINSITE_RATEPERIOD_PREF_DEFAULT) - } - - screen.addPreference(mainSiteRatePermitsPreference) - screen.addPreference(mainSiteRatePeriodPreference) - } - - companion object { - private const val MAINSITE_RATEPERMITS_PREF = "mainSiteRatePermitsPreference" - private const val MAINSITE_RATEPERMITS_PREF_DEFAULT = "1" - - /** main site's connection limit */ - private const val MAINSITE_RATEPERMITS_PREF_TITLE = "主站连接限制" - - /** This value affects connection request amount to main site. Lowering this value may reduce the chance to get HTTP 403 error, but loading speed will be slower too. Tachiyomi restart required. Current value: %s" */ - private const val MAINSITE_RATEPERMITS_PREF_SUMMARY = "此值影响主站的连接请求量。降低此值可以减少获得HTTP 403错误的几率,但加载速度也会变慢。需要重启软件以生效。\n默认值:$MAINSITE_RATEPERMITS_PREF_DEFAULT \n当前值:%s" - private val MAINSITE_RATEPERMITS_PREF_ENTRIES_ARRAY = (1..10).map { i -> i.toString() }.toTypedArray() - - private const val MAINSITE_RATEPERIOD_PREF = "mainSiteRatePeriodMillisPreference" - private const val MAINSITE_RATEPERIOD_PREF_DEFAULT = "2500" - - /** main site's connection limit period */ - private const val MAINSITE_RATEPERIOD_PREF_TITLE = "主站连接限制期" - - /** This value affects the delay when hitting the connection limit to main site. Increasing this value may reduce the chance to get HTTP 403 error, but loading speed will be slower too. Tachiyomi restart required. Current value: %s" */ - private const val MAINSITE_RATEPERIOD_PREF_SUMMARY = "此值影响主站点连接限制时的延迟(毫秒)。增加这个值可能会减少出现HTTP 403错误的机会,但加载速度也会变慢。需要重启软件以生效。\n默认值:$MAINSITE_RATEPERIOD_PREF_DEFAULT\n当前值:%s" - private val MAINSITE_RATEPERIOD_PREF_ENTRIES_ARRAY = (2000..6000 step 500).map { i -> i.toString() }.toTypedArray() - } -}