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
This commit is contained in:
arkon 2021-07-10 11:35:43 -04:00 committed by Jobobby04
parent 15707d933a
commit 7891b4de31
2 changed files with 48 additions and 24 deletions

View File

@ -23,21 +23,33 @@ internal class ExtensionGithubApi {
private val networkService: NetworkHelper by injectLazy() private val networkService: NetworkHelper by injectLazy()
private val preferences: PreferencesHelper by injectLazy() private val preferences: PreferencesHelper by injectLazy()
private var requiresFallbackSource = false
suspend fun findExtensions(): List<Extension.Available> { suspend fun findExtensions(): List<Extension.Available> {
return withIOContext { return withIOContext {
val response = try {
networkService.client networkService.client
.newCall(GET("${REPO_URL_PREFIX}index.min.json")) .newCall(GET("${REPO_URL_PREFIX}index.min.json"))
.await() .await()
.parseAs<JsonArray>() } catch (e: Throwable) {
.let { parseResponse(it) } requiresFallbackSource = true
} /* SY --> */ + preferences.extensionRepos().get().flatMap { repoPath ->
val url = "$BASE_URL$repoPath/repo/"
networkService.client networkService.client
.newCall(GET("${url}index.min.json")) .newCall(GET("${FALLBACK_REPO_URL_PREFIX}index.min.json"))
.await() .await()
.parseAs<JsonArray>() }
.let {
parseResponse(it, url) 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<JsonArray>()
.let { parseResponse(it, getUrlPrefix(repoPath)) }
} }
} }
// SY <-- // SY <--
@ -73,7 +85,7 @@ internal class ExtensionGithubApi {
return extensionsWithUpdate return extensionsWithUpdate
} }
private fun parseResponse(json: JsonArray /* SY --> */, repoUrl: String = REPO_URL_PREFIX /* SY <-- */): List<Extension.Available> { private fun parseResponse(json: JsonArray /* SY --> */, repoUrl: String = getUrlPrefix() /* SY <-- */): List<Extension.Available> {
return json return json
.filter { element -> .filter { element ->
val versionName = element.jsonObject["version"]!!.jsonPrimitive.content val versionName = element.jsonObject["version"]!!.jsonPrimitive.content
@ -97,19 +109,32 @@ internal class ExtensionGithubApi {
} }
fun getApkUrl(extension: Extension.Available): String { 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 --> // 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( private fun Extension.isBlacklisted(
blacklistEnabled: Boolean = preferences.enableSourceBlacklist().get() blacklistEnabled: Boolean = preferences.enableSourceBlacklist().get()
): Boolean { ): Boolean {
return pkgName in BlacklistedSources.BLACKLISTED_EXTENSIONS && blacklistEnabled return pkgName in BlacklistedSources.BLACKLISTED_EXTENSIONS && blacklistEnabled
} }
// SY <-- // SY <--
}
companion object {
const val BASE_URL = "https://raw.githubusercontent.com/" const val BASE_URL = "https://raw.githubusercontent.com/"
const val REPO_URL_PREFIX = "${BASE_URL}tachiyomiorg/tachiyomi-extensions/repo/" 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/"

View File

@ -8,7 +8,6 @@ import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.ExtensionCardItemBinding 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.Extension
import eu.kanade.tachiyomi.extension.model.InstallStep import eu.kanade.tachiyomi.extension.model.InstallStep
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
@ -60,8 +59,8 @@ class ExtensionHolder(view: View, val adapter: ExtensionAdapter) :
// SY --> // SY -->
private fun String.plusRepo(extension: Extension): String { private fun String.plusRepo(extension: Extension): String {
return if (extension is Extension.Available) { return if (extension is Extension.Available) {
when (extension.repoUrl) { when {
ExtensionGithubApi.REPO_URL_PREFIX -> this extension.repoUrl.contains("tachiyomiorg/tachiyomi-extensions") -> this
else -> { else -> {
this + if (this.isEmpty()) { this + if (this.isEmpty()) {
"" ""