From 211e8d99f57716cf4157b0f3f7810adb8e382c1e Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 8 Apr 2025 18:17:18 +0200 Subject: [PATCH] feat: fallback to markdown instances list instead of hardcoded list --- .../com/github/libretube/api/ExternalApi.kt | 9 ++++- .../libretube/api/InstanceRepository.kt | 26 ++++++++------ .../libretube/ui/activities/MainActivity.kt | 2 +- app/src/main/res/values/array.xml | 34 ------------------- app/src/main/res/xml/instance_settings.xml | 4 --- update-instances.sh | 31 ----------------- 6 files changed, 25 insertions(+), 81 deletions(-) delete mode 100755 update-instances.sh diff --git a/app/src/main/java/com/github/libretube/api/ExternalApi.kt b/app/src/main/java/com/github/libretube/api/ExternalApi.kt index ccb10e575..aecdabd5f 100644 --- a/app/src/main/java/com/github/libretube/api/ExternalApi.kt +++ b/app/src/main/java/com/github/libretube/api/ExternalApi.kt @@ -9,6 +9,8 @@ import com.github.libretube.api.obj.SubmitSegmentResponse import com.github.libretube.api.obj.VoteInfo import com.github.libretube.obj.update.UpdateInfo import kotlinx.serialization.json.JsonElement +import okhttp3.ResponseBody +import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.Headers @@ -22,11 +24,16 @@ private const val SB_API_URL = "https://sponsor.ajay.app" private const val RYD_API_URL = "https://returnyoutubedislikeapi.com" private const val GOOGLE_API_KEY = "AIzaSyDyT5W0Jh49F30Pqqtyfdf7pDLFKLJoAnw" const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3" +private const val PIPED_INSTANCES_URL = "https://piped-instances.kavin.rocks" +private const val PIPED_INSTANCES_MARKDOWN_URL = "https://raw.githubusercontent.com/TeamPiped/documentation/refs/heads/main/content/docs/public-instances/index.md" interface ExternalApi { // only for fetching servers list @GET - suspend fun getInstances(@Url url: String): List + suspend fun getInstances(@Url url: String = PIPED_INSTANCES_URL): List + + @GET + suspend fun getInstancesMarkdown(@Url url: String = PIPED_INSTANCES_MARKDOWN_URL): Response @GET("config") suspend fun getInstanceConfig(@Url url: String): PipedConfig diff --git a/app/src/main/java/com/github/libretube/api/InstanceRepository.kt b/app/src/main/java/com/github/libretube/api/InstanceRepository.kt index 59115ce94..5344e990f 100644 --- a/app/src/main/java/com/github/libretube/api/InstanceRepository.kt +++ b/app/src/main/java/com/github/libretube/api/InstanceRepository.kt @@ -2,9 +2,11 @@ package com.github.libretube.api import android.content.Context import com.github.libretube.R +import com.github.libretube.api.RetrofitInstance.PIPED_API_URL import com.github.libretube.api.obj.PipedInstance import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import okhttp3.HttpUrl.Companion.toHttpUrl class InstanceRepository(private val context: Context) { @@ -13,19 +15,23 @@ class InstanceRepository(private val context: Context) { */ suspend fun getInstances(): Result> = withContext(Dispatchers.IO) { runCatching { - RetrofitInstance.externalApi.getInstances(PIPED_INSTANCES_URL) + RetrofitInstance.externalApi.getInstances() } } - fun getInstancesFallback(): List { - val instanceNames = context.resources.getStringArray(R.array.instances) - return context.resources.getStringArray(R.array.instancesValue) - .mapIndexed { index, instanceValue -> - PipedInstance(instanceNames[index], instanceValue) - } - } + suspend fun getInstancesFallback(): List = withContext(Dispatchers.IO) { + return@withContext try { + RetrofitInstance.externalApi.getInstancesMarkdown().body()!!.string().lines().reversed() + .takeWhile { !it.startsWith("---") } + .filter { it.isNotBlank() } + .map { line -> + val infoParts = line.split("|") - companion object { - private const val PIPED_INSTANCES_URL = "https://piped-instances.kavin.rocks" + PipedInstance(name = infoParts[0], apiUrl = infoParts[1], locations = infoParts[2], cdn = infoParts[3] == "Yes") + } + } catch (e: Exception) { + // worst case scenario: only return official instance + return@withContext listOf(PipedInstance(name = PIPED_API_URL.toHttpUrl().host, apiUrl = PIPED_API_URL)) + } } } diff --git a/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt index 00d199eee..73a2a6d08 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt @@ -112,7 +112,7 @@ class MainActivity : BaseActivity() { val isAppConfigured = PreferenceHelper.getBoolean(PreferenceKeys.LOCAL_FEED_EXTRACTION, false) || PreferenceHelper.getString(PreferenceKeys.FETCH_INSTANCE, "").isNotEmpty() - if (isAppConfigured) { + if (!isAppConfigured) { val welcomeIntent = Intent(this, WelcomeActivity::class.java) startActivity(welcomeIntent) finish() diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index ba12cc4af..b94643a23 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -1,39 +1,5 @@ - - kavin.rocks (Official) - syncpundit.io - lunar.icu - r4fo.com - kavin.rocks libre (Official) - projectsegfau.lt - projectsegfau.lt us - smnz.de - adminforge.de - astartes.nl - drgns.space - ducks.party - ngn.tf - coldforge.xyz - - - - https://pipedapi.kavin.rocks - https://pipedapi.syncpundit.io - https://piped-api.lunar.icu - https://pipedapi.r4fo.com - https://pipedapi-libre.kavin.rocks - https://api.piped.projectsegfau.lt - https://pipedapi.us.projectsegfau.lt - https://pipedapi.smnz.de - https://pipedapi.adminforge.de - https://pipedapi.astartes.nl - https://pipedapi.drgns.space - https://pipedapi.ducks.party - https://pipedapi.ngn.tf - https://pipedapi.coldforge.xyz - - @string/systemLanguage العربية diff --git a/app/src/main/res/xml/instance_settings.xml b/app/src/main/res/xml/instance_settings.xml index 522f24e89..5135d6f9a 100644 --- a/app/src/main/res/xml/instance_settings.xml +++ b/app/src/main/res/xml/instance_settings.xml @@ -27,8 +27,6 @@ @@ -70,8 +68,6 @@ android:dependency="auth_instance_toggle" android:icon="@drawable/ic_server" app:defaultValue="https://pipedapi.kavin.rocks" - app:entries="@array/instances" - app:entryValues="@array/instancesValue" app:key="selectAuthInstance" app:title="@string/auth_instances" /> diff --git a/update-instances.sh b/update-instances.sh deleted file mode 100755 index bfb36d04e..000000000 --- a/update-instances.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# fetch instances from public api -INSTANCES=$(curl -s 'https://piped-instances.kavin.rocks') - -# generate instances list for settings -echo -e "\nContent for res/values/array.xml\n" - -echo '' -echo $INSTANCES | jq '.[].name' | while read name; do - echo " $name" | tr -d '"' -done - -echo -e '\n\n' -echo $INSTANCES | jq '.[].api_url' | while read url; do - echo " $url" | tr -d '"' -done -echo -e '' - -# generate android url schemes -echo -e "\n\nContent for AndroidManifest.xml to be replaced\n" - -gen_frontends() { - echo $INSTANCES | jq '.[].api_url' | while read url; do - _url=$(echo "$url" | tr -d '"') - _frontend_url=$(curl -Ls -o /dev/null -w %{url_effective} "$_url") - _host=$(echo ${_frontend_url/https:\/\//} | tr -d '/') - echo " " - done -} -echo "$(gen_frontends)" | sort | uniq