From 48dd20cbe03d9d8cdc93429805af04d89b84eccf Mon Sep 17 00:00:00 2001 From: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> Date: Sun, 1 Oct 2023 19:03:42 +0500 Subject: [PATCH] AS: auto change domain (#18285) * AsuraScans: auto change domain also change AsuraScansTr domain also include potential self migration fix for j2k * revert asuraTr domain change being done in https://github.com/tachiyomiorg/tachiyomi-extensions/pull/18278 --- .../asurascans/src/AsuraScansEn.kt | 106 ++++++++++++++---- .../mangathemesia/MangaThemesiaGenerator.kt | 2 +- 2 files changed, 83 insertions(+), 25 deletions(-) diff --git a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt index 47fc9002c..371e8da6e 100644 --- a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt +++ b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt @@ -29,15 +29,22 @@ import java.util.concurrent.TimeUnit class AsuraScansEn : MangaThemesia( "Asura Scans", - "https://asuracomics.gg", + "https://asuratoon.com", "en", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.US), ) { - private val preferences = Injekt.get().getSharedPreferences("source_$id", 0x0000) + private val preferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override val baseUrl by lazy { + preferences.baseUrlHost.let { "https://$it" } + } override val client: OkHttpClient = super.client.newBuilder() .addInterceptor(::urlChangeInterceptor) + .addInterceptor(::domainChangeIntercept) .rateLimit(1, 3, TimeUnit.SECONDS) .build() @@ -96,7 +103,7 @@ class AsuraScansEn : MangaThemesia( .removeSuffix("/") .substringAfterLast("/") - val storedSlug = getSlugMap()[dbSlug] ?: dbSlug + val storedSlug = preferences.slugMap[dbSlug] ?: dbSlug return "$baseUrl$mangaUrlDirectory/$storedSlug/" } @@ -127,7 +134,7 @@ class AsuraScansEn : MangaThemesia( private fun SManga.tempUrlToPermIfNeeded(): SManga { if (!preferences.permaUrlPref) return this - val slugMap = getSlugMap().toMutableMap() + val slugMap = preferences.slugMap val sMangaTitleFirstWord = this.title.split(" ")[0] if (!this.url.contains("/$sMangaTitleFirstWord", ignoreCase = true)) { @@ -141,7 +148,7 @@ class AsuraScansEn : MangaThemesia( this.url = "$mangaUrlDirectory/$permaSlug/" } - putSlugMap(slugMap) + preferences.slugMap = slugMap return this } @@ -170,7 +177,7 @@ class AsuraScansEn : MangaThemesia( .removeSuffix("/") .substringAfterLast("/") - val slugMap = getSlugMap().toMutableMap() + val slugMap = preferences.slugMap val storedSlug = slugMap[dbSlug] ?: dbSlug @@ -187,7 +194,7 @@ class AsuraScansEn : MangaThemesia( ?: throw IOException("Migrate from Asura to Asura") slugMap[dbSlug] = newSlug - putSlugMap(slugMap) + preferences.slugMap = slugMap return chain.proceed( request.newBuilder() @@ -199,10 +206,12 @@ class AsuraScansEn : MangaThemesia( return response } - private fun getNewSlug(existingSlug: String, search: String): String? { + private fun getNewSlug(existingSlug: String, frag: String): String? { val permaSlug = existingSlug .replaceFirst(TEMP_TO_PERM_REGEX, "") + val search = frag.substringBefore("#") + val mangas = client.newCall(searchMangaRequest(1, search, FilterList())) .execute() .use { @@ -217,22 +226,6 @@ class AsuraScansEn : MangaThemesia( ?.substringAfterLast("/") } - private fun putSlugMap(slugMap: MutableMap) { - val serialized = json.encodeToString(slugMap) - - preferences.edit().putString(PREF_URL_MAP, serialized).commit() - } - - private fun getSlugMap(): Map { - val serialized = preferences.getString(PREF_URL_MAP, null) ?: return emptyMap() - - return try { - json.decodeFromString(serialized) - } catch (e: Exception) { - emptyMap() - } - } - private fun String.toSearchQuery(): String { return this.trim() .lowercase() @@ -240,6 +233,48 @@ class AsuraScansEn : MangaThemesia( .replace(trailingPlusRegex, "") } + private var lastDomain = "" + + private fun domainChangeIntercept(chain: Interceptor.Chain): Response { + val request = chain.request() + + if (request.url.host !in listOf(preferences.baseUrlHost, lastDomain)) { + return chain.proceed(request) + } + + if (lastDomain.isNotEmpty()) { + val newUrl = request.url.newBuilder() + .host(preferences.baseUrlHost) + .build() + + return chain.proceed( + request.newBuilder() + .url(newUrl) + .build(), + ) + } + + val response = chain.proceed(request) + + if (request.url.host == response.request.url.host) return response + + response.close() + + preferences.baseUrlHost = response.request.url.host + + lastDomain = request.url.host + + val newUrl = request.url.newBuilder() + .host(response.request.url.host) + .build() + + return chain.proceed( + request.newBuilder() + .url(newUrl) + .build(), + ) + } + override fun setupPreferenceScreen(screen: PreferenceScreen) { SwitchPreferenceCompat(screen.context).apply { key = PREF_PERM_MANGA_URL_KEY_PREFIX + lang @@ -254,11 +289,34 @@ class AsuraScansEn : MangaThemesia( private val SharedPreferences.permaUrlPref get() = getBoolean(PREF_PERM_MANGA_URL_KEY_PREFIX + lang, true) + private var SharedPreferences.slugMap: MutableMap + get() { + val serialized = getString(PREF_URL_MAP, null) ?: return mutableMapOf() + + return try { + json.decodeFromString(serialized) + } catch (e: Exception) { + mutableMapOf() + } + } + set(slugMap) { + val serialized = json.encodeToString(slugMap) + edit().putString(PREF_URL_MAP, serialized).commit() + } + + private var SharedPreferences.baseUrlHost + get() = getString(BASE_URL_PREF, defaultBaseUrlHost) ?: defaultBaseUrlHost + set(newHost) { + edit().putString(BASE_URL_PREF, newHost).commit() + } + companion object { private const val PREF_PERM_MANGA_URL_KEY_PREFIX = "pref_permanent_manga_url_2_" private const val PREF_PERM_MANGA_URL_TITLE = "Permanent Manga URL" private const val PREF_PERM_MANGA_URL_SUMMARY = "Turns all manga urls into permanent ones." private const val PREF_URL_MAP = "pref_url_map" + private const val BASE_URL_PREF = "pref_base_url_host" + private const val defaultBaseUrlHost = "asuratoon.com" private val TEMP_TO_PERM_REGEX = Regex("""^\d+-""") private val titleSpecialCharactersRegex = Regex("""[^a-z0-9]+""") private val trailingPlusRegex = Regex("""\++$""") diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt index 0b406af6c..22a666954 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt @@ -14,7 +14,7 @@ class MangaThemesiaGenerator : ThemeSourceGenerator { override val baseVersionCode: Int = 26 override val sources = listOf( - MultiLang("Asura Scans", "https://asuracomics.gg", listOf("en", "tr"), className = "AsuraScansFactory", pkgName = "asurascans", overrideVersionCode = 28), + MultiLang("Asura Scans", "https://asuratoon.com", listOf("en", "tr"), className = "AsuraScansFactory", pkgName = "asurascans", overrideVersionCode = 29), MultiLang("Flame Scans", "https://flamescans.org", listOf("en"), className = "FlameScansFactory", pkgName = "flamescans", overrideVersionCode = 4), MultiLang("Miau Scan", "https://miauscans.com", listOf("es", "pt-BR"), overrideVersionCode = 1), SingleLang("Animated Glitched Scans", "https://anigliscans.xyz", "en", overrideVersionCode = 1),