From 40a959501234179da726f42805a869dae3cc0a0a Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 2 Aug 2020 22:40:31 -0400 Subject: [PATCH] Request gzipped version of extensions repo --- .../extension/api/ExtensionGithubApi.kt | 34 ++++----------- .../extension/api/ExtensionGithubService.kt | 42 +++++++++++++++++++ 2 files changed, 50 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt 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 98b0928b56..996f5de1e6 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 @@ -1,43 +1,29 @@ package eu.kanade.tachiyomi.extension.api import android.content.Context -import com.github.salomonbrys.kotson.fromJson import com.github.salomonbrys.kotson.get import com.github.salomonbrys.kotson.int import com.github.salomonbrys.kotson.string -import com.google.gson.Gson import com.google.gson.JsonArray import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.LoadResult import eu.kanade.tachiyomi.extension.util.ExtensionLoader -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.NetworkHelper -import eu.kanade.tachiyomi.network.await import java.util.Date import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import okhttp3.Response import uy.kohesive.injekt.injectLazy internal class ExtensionGithubApi { - private val network: NetworkHelper by injectLazy() private val preferences: PreferencesHelper by injectLazy() - private val gson: Gson by injectLazy() - suspend fun findExtensions(): List { - val call = GET(EXT_URL) + val service: ExtensionGithubService = ExtensionGithubService.create() return withContext(Dispatchers.IO) { - val response = network.client.newCall(call).await() - if (response.isSuccessful) { - parseResponse(response) - } else { - response.close() - throw Exception("Failed to get extensions") - } + val response = service.getRepo() + parseResponse(response) } } @@ -64,11 +50,7 @@ internal class ExtensionGithubApi { return extensionsWithUpdate } - private fun parseResponse(response: Response): List { - val text = response.body?.use { it.string() } ?: return emptyList() - - val json = gson.fromJson(text) - + private fun parseResponse(json: JsonArray): List { return json .filter { element -> val versionName = element["version"].string @@ -82,18 +64,18 @@ internal class ExtensionGithubApi { val versionName = element["version"].string val versionCode = element["code"].int val lang = element["lang"].string - val icon = "$REPO_URL/icon/${apkName.replace(".apk", ".png")}" + val icon = "$REPO_URL_PREFIX/icon/${apkName.replace(".apk", ".png")}" Extension.Available(name, pkgName, versionName, versionCode, lang, apkName, icon) } } fun getApkUrl(extension: Extension.Available): String { - return "$REPO_URL/apk/${extension.apkName}" + return "$REPO_URL_PREFIX/apk/${extension.apkName}" } companion object { - private const val REPO_URL = "https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo" - private const val EXT_URL = "$REPO_URL/index.json" + const val BASE_URL = "https://raw.githubusercontent.com/" + private const val REPO_URL_PREFIX = "${BASE_URL}inorichi/tachiyomi-extensions/repo/" } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt new file mode 100644 index 0000000000..37cf1040a4 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.extension.api + +import com.google.gson.JsonArray +import eu.kanade.tachiyomi.network.NetworkHelper +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.GET +import uy.kohesive.injekt.injectLazy + +/** + * Used to get the extension repo listing from GitHub. + */ +interface ExtensionGithubService { + + companion object { + private val client by lazy { + val network: NetworkHelper by injectLazy() + network.client.newBuilder() + .addNetworkInterceptor { chain -> + val originalResponse = chain.proceed(chain.request()) + originalResponse.newBuilder() + .header("Content-Encoding", "gzip") + .header("Content-Type", "application/json") + .build() + } + .build() + } + + fun create(): ExtensionGithubService { + val adapter = Retrofit.Builder() + .baseUrl(ExtensionGithubApi.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .client(client) + .build() + + return adapter.create(ExtensionGithubService::class.java) + } + } + + @GET("/inorichi/tachiyomi-extensions/repo/index.json.gz") + suspend fun getRepo(): JsonArray +}