From 5e809fefd49efb5991e7a549b89a5ef12ac1836d Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Wed, 10 Jun 2026 22:29:27 +0600 Subject: [PATCH] Add auto migration support from legacy extension store index (mihonapp/mihon#3398) (cherry picked from commit d4327c8d48608ebc6eafc4a3df226c31d6586bbd) --- .../extension/model/NetworkLegacyExtensionRepo.kt | 3 +++ .../data/extension/service/ExtensionStoreService.kt | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/data/src/main/java/mihon/data/extension/model/NetworkLegacyExtensionRepo.kt b/data/src/main/java/mihon/data/extension/model/NetworkLegacyExtensionRepo.kt index 09a563c30..babc696bb 100644 --- a/data/src/main/java/mihon/data/extension/model/NetworkLegacyExtensionRepo.kt +++ b/data/src/main/java/mihon/data/extension/model/NetworkLegacyExtensionRepo.kt @@ -1,12 +1,15 @@ package mihon.data.extension.model import android.annotation.SuppressLint +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import mihon.domain.extension.model.ExtensionStore @SuppressLint("UnsafeOptInUsageError") @Serializable data class NetworkLegacyExtensionRepo( + @SerialName("index_v2") + val indexV2: String?, val meta: Meta, ) : BaseNetworkExtensionStore { @Serializable diff --git a/data/src/main/java/mihon/data/extension/service/ExtensionStoreService.kt b/data/src/main/java/mihon/data/extension/service/ExtensionStoreService.kt index 64696fee4..de08e9bf4 100644 --- a/data/src/main/java/mihon/data/extension/service/ExtensionStoreService.kt +++ b/data/src/main/java/mihon/data/extension/service/ExtensionStoreService.kt @@ -22,6 +22,10 @@ class ExtensionStoreService( private val protoBuf: ProtoBuf, ) { suspend fun fetch(indexUrl: String): Result { + return fetch(indexUrl, forceV2 = false) + } + + private suspend fun fetch(indexUrl: String, forceV2: Boolean): Result { var updatedIndexUrl: String = indexUrl return try { val store = network.client.newCall(GET(indexUrl)).awaitSuccess().body.source().use { source -> @@ -40,10 +44,11 @@ class ExtensionStoreService( } catch (e: Exception) { if (e is CancellationException) throw e // KMK <-- + if (forceV2) throw e logcat(LogPriority.ERROR, e) { "Failed to add extension store '$updatedIndexUrl'" } - try { + val legacyIndex = try { json.decodeFromBufferedSource(source.peek()) } catch (e: IllegalArgumentException) { if (!indexUrl.endsWith("/index.min.json")) { @@ -57,6 +62,12 @@ class ExtensionStoreService( json.decodeFromBufferedSource(it.body.source()) } } + + if (legacyIndex.indexV2 != null) { + return fetch(legacyIndex.indexV2, forceV2 = true) + } else { + legacyIndex + } } } .toExtensionStore(updatedIndexUrl)