diff --git a/lib-multisrc/keyoapp/build.gradle.kts b/lib-multisrc/keyoapp/build.gradle.kts index 6e70fd158..b45873b53 100644 --- a/lib-multisrc/keyoapp/build.gradle.kts +++ b/lib-multisrc/keyoapp/build.gradle.kts @@ -2,4 +2,4 @@ plugins { id("lib-multisrc") } -baseVersionCode = 4 +baseVersionCode = 5 diff --git a/lib-multisrc/keyoapp/src/eu/kanade/tachiyomi/multisrc/keyoapp/Keyoapp.kt b/lib-multisrc/keyoapp/src/eu/kanade/tachiyomi/multisrc/keyoapp/Keyoapp.kt index ee31d1855..6b0581c0d 100644 --- a/lib-multisrc/keyoapp/src/eu/kanade/tachiyomi/multisrc/keyoapp/Keyoapp.kt +++ b/lib-multisrc/keyoapp/src/eu/kanade/tachiyomi/multisrc/keyoapp/Keyoapp.kt @@ -197,7 +197,18 @@ abstract class Keyoapp( status = document.selectFirst("div[alt=Status]").parseStatus() author = document.selectFirst("div[alt=Author]")?.text() artist = document.selectFirst("div[alt=Artist]")?.text() - genre = document.select("div.grid:has(>h1) > div > a").joinToString { it.text() } + genre = buildList { + document.selectFirst("div[alt='Series Type']")?.text()?.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase( + Locale.getDefault(), + ) + } else { + it.toString() + } + }.let(::add) + document.select("div.grid:has(>h1) > div > a").forEach { add(it.text()) } + }.joinToString() } private fun Element?.parseStatus(): Int = when (this?.text()?.lowercase()) { @@ -247,7 +258,7 @@ abstract class Keyoapp( return url } - private fun Element.getImageUrl(selector: String): String? { + protected open fun Element.getImageUrl(selector: String): String? { return this.selectFirst(selector)?.let { element -> element.attr("style") .substringAfter(":url(", "") diff --git a/src/en/magusmanga/build.gradle b/src/en/magusmanga/build.gradle index e0cf86259..c406a9952 100644 --- a/src/en/magusmanga/build.gradle +++ b/src/en/magusmanga/build.gradle @@ -1,9 +1,9 @@ ext { extName = 'Magus Manga' extClass = '.MagusManga' - themePkg = 'mangathemesia' - baseUrl = 'https://recipeslik.online' - overrideVersionCode = 8 + themePkg = 'keyoapp' + baseUrl = 'https://magustoon.com' + overrideVersionCode = 34 } apply from: "$rootDir/common.gradle" diff --git a/src/en/magusmanga/res/mipmap-hdpi/ic_launcher.png b/src/en/magusmanga/res/mipmap-hdpi/ic_launcher.png index 6b21c095b..3a36ffb91 100644 Binary files a/src/en/magusmanga/res/mipmap-hdpi/ic_launcher.png and b/src/en/magusmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/en/magusmanga/res/mipmap-mdpi/ic_launcher.png b/src/en/magusmanga/res/mipmap-mdpi/ic_launcher.png index 59a43e340..25a84cd3c 100644 Binary files a/src/en/magusmanga/res/mipmap-mdpi/ic_launcher.png and b/src/en/magusmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/en/magusmanga/res/mipmap-xhdpi/ic_launcher.png b/src/en/magusmanga/res/mipmap-xhdpi/ic_launcher.png index 5b1fa3b6c..a063b604c 100644 Binary files a/src/en/magusmanga/res/mipmap-xhdpi/ic_launcher.png and b/src/en/magusmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/en/magusmanga/res/mipmap-xxhdpi/ic_launcher.png b/src/en/magusmanga/res/mipmap-xxhdpi/ic_launcher.png index 9ce043b8f..674ee7e8b 100644 Binary files a/src/en/magusmanga/res/mipmap-xxhdpi/ic_launcher.png and b/src/en/magusmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/en/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png index 124e7582a..f8295a36c 100644 Binary files a/src/en/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png and b/src/en/magusmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/en/magusmanga/src/eu/kanade/tachiyomi/extension/en/magusmanga/MagusManga.kt b/src/en/magusmanga/src/eu/kanade/tachiyomi/extension/en/magusmanga/MagusManga.kt index 746683274..41ac24b73 100644 --- a/src/en/magusmanga/src/eu/kanade/tachiyomi/extension/en/magusmanga/MagusManga.kt +++ b/src/en/magusmanga/src/eu/kanade/tachiyomi/extension/en/magusmanga/MagusManga.kt @@ -1,57 +1,78 @@ package eu.kanade.tachiyomi.extension.en.magusmanga -import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesiaAlt -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import okhttp3.Cookie +import eu.kanade.tachiyomi.multisrc.keyoapp.Keyoapp +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost +import eu.kanade.tachiyomi.source.model.Page +import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Interceptor -import okhttp3.OkHttpClient import okhttp3.Response +import okio.IOException import org.jsoup.Jsoup -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit +import org.jsoup.nodes.Document -class MagusManga : MangaThemesiaAlt( +class MagusManga : Keyoapp( "Magus Manga", - "https://recipeslik.online", + "https://magustoon.com", "en", - mangaUrlDirectory = "/series", - dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("en")), ) { - override val id = 7792477462646075400 + private val cdnUrl = "https://cdn.magustoon.com" - override val client: OkHttpClient = super.client.newBuilder() - .addInterceptor(::wafffCookieInterceptor) - .rateLimit(1, 1, TimeUnit.SECONDS) + override val versionId = 2 + + override val client = network.cloudflareClient.newBuilder() + .addInterceptor(::captchaInterceptor) + .addInterceptor(::fallbackCdnInterceptor) + .rateLimitHost(baseUrl.toHttpUrl(), 1) + .rateLimitHost(cdnUrl.toHttpUrl(), 1) .build() - private fun wafffCookieInterceptor(chain: Interceptor.Chain): Response { + private fun captchaInterceptor(chain: Interceptor.Chain): Response { val request = chain.request() val response = chain.proceed(request) - val document = Jsoup.parse( - response.peekBody(Long.MAX_VALUE).string(), - response.request.url.toString(), - ) - - return if (document.selectFirst("script:containsData(wafff)") != null) { - val script = document.selectFirst("script:containsData(wafff)")!!.data() - - val cookie = waffRegex.find(script)?.groups?.get("waff")?.value - ?.let { Cookie.parse(request.url, it) } - - client.cookieJar.saveFromResponse( - request.url, - listOfNotNull(cookie), + if (response.code == 401) { + val document = Jsoup.parse( + response.peekBody(Long.MAX_VALUE).string(), + response.request.url.toString(), ) - response.close() + if (document.selectFirst(".g-recaptcha") != null) { + response.close() + throw IOException("Solve Captcha in WebView") + } + } - chain.proceed(request) + return response + } + + override fun chapterListSelector(): String { + return "${super.chapterListSelector()}:not(:has(img[src*=coin]))" + } + + override fun pageListParse(document: Document): List { + return document.select("#pages > img").mapIndexed { idx, img -> + val uid = img.attr("uid") + + Page(idx, imageUrl = "$cdnUrl/x/$uid") + } + } + + private fun fallbackCdnInterceptor(chain: Interceptor.Chain): Response { + val request = chain.request() + val url = request.url.toString() + val response = chain.proceed(request) + + return if (url.startsWith(cdnUrl) && !response.isSuccessful) { + response.close() + val newRequest = request.newBuilder() + .url( + url.replace("/x/", "/v/"), + ) + .build() + + chain.proceed(newRequest) } else { response } } - - private val waffRegex = Regex("""document\.cookie\s*=\s*['"](?.*)['"]""") }