From db928a168f4f404539d663323a6beaa4b8a9bc07 Mon Sep 17 00:00:00 2001 From: tom5079 <7948651+tom5079@users.noreply.github.com> Date: Sun, 23 Mar 2025 09:44:53 -0700 Subject: [PATCH] fix loading --- app/build.gradle.kts | 2 +- app/release/baselineProfiles/0/app-release.dm | Bin 3985 -> 3983 bytes app/release/baselineProfiles/1/app-release.dm | Bin 3935 -> 3935 bytes app/release/output-metadata.json | 2 +- .../java/xyz/quaver/pupil/hitomi/common.kt | 93 +++++++++++------- 5 files changed, 58 insertions(+), 39 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4cf6892b..5efe84d3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ android { minSdk = 21 targetSdk = 35 versionCode = 70 - versionName = "5.3.18" + versionName = "5.3.19" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm index f964a47cc5f08c358409d121be405953e0cff519..68f6ae9eed3f093834071fabf8c4d109d72d97f8 100644 GIT binary patch delta 3865 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 b000000000000000Et6{xAO-{v00000H}8$l delta 3867 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ÕGkKA~0eM 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 = emptyList(), val characters: List? = null, val scene_indexes: List? = emptyList(), - val files: List = emptyList() + val files: List = emptyList(), ) val json = Json { @@ -104,13 +104,16 @@ val json = Json { } typealias HeaderSetter = (Request.Builder) -> Request.Builder + fun URL.readText(settings: HeaderSetter? = null): String { val request = Request.Builder() .url(this).let { settings?.invoke(it) ?: it }.build() - return client.newCall(request).execute().also{ if (it.code() != 200) throw IOException("CODE ${it.code()}") }.body()?.use { it.string() } ?: throw IOException() + return client.newCall(request).execute() + .also { if (it.code() != 200) throw IOException("CODE ${it.code()}") }.body() + ?.use { it.string() } ?: throw IOException() } fun URL.readBytes(settings: HeaderSetter? = null): ByteArray { @@ -119,7 +122,9 @@ fun URL.readBytes(settings: HeaderSetter? = null): ByteArray { settings?.invoke(it) ?: it }.build() - return client.newCall(request).execute().also { if (it.code() != 200) throw IOException("CODE ${it.code()}") }.body()?.use { it.bytes() } ?: throw IOException() + return client.newCall(request).execute() + .also { if (it.code() != 200) throw IOException("CODE ${it.code()}") }.body() + ?.use { it.bytes() } ?: throw IOException() } @Suppress("EXPERIMENTAL_API_USAGE") @@ -130,7 +135,7 @@ fun getGalleryInfo(galleryID: Int) = ) //common.js -const val domain = "ltn.hitomi.la" +const val domain = "ltn.gold-usergeneratedcontent.net" const val galleryblockextension = ".html" const val galleryblockdir = "galleryblock" const val nozomiextension = ".nozomi" @@ -152,9 +157,13 @@ object gg { mutex.withLock { if (lastRetrieval == null || (lastRetrieval!! + 60000) < System.currentTimeMillis()) { val ggjs: String = suspendCancellableCoroutine { continuation -> - val call = client.newCall(Request.Builder().url("https://ltn.hitomi.la/gg.js").build()) + val call = + client.newCall( + Request.Builder().url("https://ltn.gold-usergeneratedcontent.net/gg.js") + .build() + ) - call.enqueue(object: Callback { + call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { if (continuation.isCancelled) return continuation.resumeWithException(e) @@ -202,13 +211,14 @@ object gg { refresh() return b } + fun s(h: String): String { val m = Regex("(..)(.)$").find(h) - return m!!.groupValues.let { it[2]+it[1] }.toInt(16).toString(10) + return m!!.groupValues.let { it[2] + it[1] }.toInt(16).toString(10) } } -suspend fun subdomainFromURL(url: String, base: String? = null) : String { +suspend fun subdomainFromURL(url: String, base: String? = null): String { var retval = "b" if (!base.isNullOrBlank()) @@ -219,46 +229,55 @@ suspend fun subdomainFromURL(url: String, base: String? = null) : String { val r = Regex("""/[0-9a-f]{61}([0-9a-f]{2})([0-9a-f])""") val m = r.find(url) ?: return "a" - val g = m.groupValues.let { it[2]+it[1] }.toIntOrNull(b) + val g = m.groupValues.let { it[2] + it[1] }.toIntOrNull(b) if (g != null) { - retval = (97+ gg.m(g)).toChar().toString() + retval + retval = (97 + gg.m(g)).toChar().toString() + retval } return retval } -suspend fun urlFromUrl(url: String, base: String? = null) : String { - return url.replace(Regex("""//..?\.hitomi\.la/"""), "//${subdomainFromURL(url, base)}.hitomi.la/") +suspend fun urlFromUrl(url: String, base: String? = null): String { + return url.replace( + Regex("""//..?\.(?:gold-usergeneratedcontent\.net|hitomi\.la)/"""), + "//${subdomainFromURL(url, base)}.gold-usergeneratedcontent.net/" + ) } -suspend fun fullPathFromHash(hash: String) : String = +suspend fun fullPathFromHash(hash: String): String = "${gg.b()}${gg.s(hash)}/$hash" fun realFullPathFromHash(hash: String): String = hash.replace(Regex("""^.*(..)(.)$"""), "$2/$1/$hash") -suspend fun urlFromHash(galleryID: Int, image: GalleryFiles, dir: String? = null, ext: String? = null) : String { +suspend fun urlFromHash( + galleryID: Int, + image: GalleryFiles, + dir: String? = null, + ext: String? = null, +): String { val ext = ext ?: dir ?: image.name.takeLastWhile { it != '.' } val dir = dir ?: "images" - return "https://a.hitomi.la/$dir/${fullPathFromHash(image.hash)}.$ext" + return "https://a.gold-usergeneratedcontent.net/$dir/${fullPathFromHash(image.hash)}.$ext" } -suspend fun urlFromUrlFromHash(galleryID: Int, image: GalleryFiles, dir: String? = null, ext: String? = null, base: String? = null) = +suspend fun urlFromUrlFromHash( + galleryID: Int, + image: GalleryFiles, + dir: String? = null, + ext: String? = null, + base: String? = null, +) = if (base == "tn") - urlFromUrl("https://a.hitomi.la/$dir/${realFullPathFromHash(image.hash)}.$ext", base) + urlFromUrl( + "https://a.gold-usergeneratedcontent.net/$dir/${realFullPathFromHash(image.hash)}.$ext", + base + ) else urlFromUrl(urlFromHash(galleryID, image, dir, ext), base) -suspend fun rewriteTnPaths(html: String) { - html.replace(Regex("""//tn\.hitomi\.la/[^/]+/[0-9a-f]/[0-9a-f]{2}/[0-9a-f]{64}""")) { url -> - runBlocking { - urlFromUrl(url.value, "tn") - } - } -} - -suspend fun imageUrlFromImage(galleryID: Int, image: GalleryFiles, noWebp: Boolean) : String { +suspend fun imageUrlFromImage(galleryID: Int, image: GalleryFiles, noWebp: Boolean): String { return urlFromUrlFromHash(galleryID, image, "webp", null, "a") // return when { // noWebp ->