From 7891b4de31a75413563ca7565dfda529e928a7a6 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 10 Jul 2021 11:35:43 -0400 Subject: [PATCH] Use jsDelivr as fallback when GitHub can't be reached for extensions list (closes #5517) (cherry picked from commit 24bb2f02dce135e0ceb2856618ecfc0e30dce875) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt --- .../extension/api/ExtensionGithubApi.kt | 67 +++++++++++++------ .../ui/browse/extension/ExtensionHolder.kt | 5 +- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt index 60074ba4c..b0e0ca38a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt @@ -23,22 +23,34 @@ internal class ExtensionGithubApi { private val networkService: NetworkHelper by injectLazy() private val preferences: PreferencesHelper by injectLazy() + private var requiresFallbackSource = false + suspend fun findExtensions(): List { return withIOContext { - networkService.client - .newCall(GET("${REPO_URL_PREFIX}index.min.json")) - .await() - .parseAs() - .let { parseResponse(it) } - } /* SY --> */ + preferences.extensionRepos().get().flatMap { repoPath -> - val url = "$BASE_URL$repoPath/repo/" - networkService.client - .newCall(GET("${url}index.min.json")) - .await() - .parseAs() - .let { - parseResponse(it, url) - } + val response = try { + networkService.client + .newCall(GET("${REPO_URL_PREFIX}index.min.json")) + .await() + } catch (e: Throwable) { + requiresFallbackSource = true + + networkService.client + .newCall(GET("${FALLBACK_REPO_URL_PREFIX}index.min.json")) + .await() + } + + parseResponse(response.parseAs()) + preferences.extensionRepos().get().flatMap { repoPath -> + try { + networkService.client + .newCall(GET("$BASE_URL$repoPath/repo/index.min.json")) + .await() + } catch (e: Exception) { + networkService.client + .newCall(GET("$FALLBACK_BASE_URL$repoPath@repo/index.min.json")) + .await() + }.parseAs() + .let { parseResponse(it, getUrlPrefix(repoPath)) } + } } // SY <-- } @@ -73,7 +85,7 @@ internal class ExtensionGithubApi { return extensionsWithUpdate } - private fun parseResponse(json: JsonArray /* SY --> */, repoUrl: String = REPO_URL_PREFIX /* SY <-- */): List { + private fun parseResponse(json: JsonArray /* SY --> */, repoUrl: String = getUrlPrefix() /* SY <-- */): List { return json .filter { element -> val versionName = element.jsonObject["version"]!!.jsonPrimitive.content @@ -97,19 +109,32 @@ internal class ExtensionGithubApi { } fun getApkUrl(extension: Extension.Available): String { - return /* SY --> */ "${extension.repoUrl}/apk/${extension.apkName}" /* SY <-- */ + return /* SY --> */ "${extension.repoUrl}apk/${extension.apkName}" /* SY <-- */ + } + + private fun getUrlPrefix(): String { + return when (requiresFallbackSource) { + true -> FALLBACK_REPO_URL_PREFIX + false -> REPO_URL_PREFIX + } } // SY --> + private fun getUrlPrefix(repoUrl: String): String { + return when (requiresFallbackSource) { + true -> "${FALLBACK_BASE_URL}$repoUrl@repo/" + false -> "${BASE_URL}$repoUrl/repo/" + } + } + private fun Extension.isBlacklisted( blacklistEnabled: Boolean = preferences.enableSourceBlacklist().get() ): Boolean { return pkgName in BlacklistedSources.BLACKLISTED_EXTENSIONS && blacklistEnabled } // SY <-- - - companion object { - const val BASE_URL = "https://raw.githubusercontent.com/" - const val REPO_URL_PREFIX = "${BASE_URL}tachiyomiorg/tachiyomi-extensions/repo/" - } } +const val BASE_URL = "https://raw.githubusercontent.com/" +const val FALLBACK_BASE_URL = "https://cdn.jsdelivr.net/gh/" +private const val REPO_URL_PREFIX = "${BASE_URL}tachiyomiorg/tachiyomi-extensions/repo/" +private const val FALLBACK_REPO_URL_PREFIX = "${FALLBACK_BASE_URL}tachiyomiorg/tachiyomi-extensions@repo/" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt index 52ca2f7dd..7146a1c34 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionHolder.kt @@ -8,7 +8,6 @@ import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.databinding.ExtensionCardItemBinding -import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.InstallStep import eu.kanade.tachiyomi.source.ConfigurableSource @@ -60,8 +59,8 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) : // SY --> private fun String.plusRepo(extension: Extension): String { return if (extension is Extension.Available) { - when (extension.repoUrl) { - ExtensionGithubApi.REPO_URL_PREFIX -> this + when { + extension.repoUrl.contains("tachiyomiorg/tachiyomi-extensions") -> this else -> { this + if (this.isEmpty()) { ""