diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index 63f98f5db..1c8a18aed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -128,6 +128,8 @@ class AppModule(val app: Application) : InjektModule { Json { ignoreUnknownKeys = true explicitNulls = false + // Gitea/Forgejo often uses JSON null for empty release body or assets array. + coerceInputValues = true } } addSingletonFactory { diff --git a/data/src/main/java/tachiyomi/data/release/GithubRelease.kt b/data/src/main/java/tachiyomi/data/release/GithubRelease.kt index c5ee9f708..44aa026cf 100644 --- a/data/src/main/java/tachiyomi/data/release/GithubRelease.kt +++ b/data/src/main/java/tachiyomi/data/release/GithubRelease.kt @@ -5,17 +5,19 @@ import kotlinx.serialization.Serializable /** * Contains information about the latest release from GitHub. + * Forgejo/Gitea may send JSON `null` for empty [info] or [assets]; defaults + `Json.coerceInputValues` + * keep deserialization from failing. */ @Serializable data class GithubRelease( @SerialName("tag_name") val version: String, @SerialName("body") - val info: String, + val info: String = "", @SerialName("html_url") val releaseLink: String, @SerialName("assets") - val assets: List, + val assets: List = emptyList(), // KMK --> @SerialName("prerelease") val preRelease: Boolean = false, @@ -29,7 +31,7 @@ data class GithubRelease( */ @Serializable data class GitHubAsset( - val name: String, + val name: String = "", @SerialName("browser_download_url") - val downloadLink: String, + val downloadLink: String = "", ) diff --git a/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt b/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt index e170f007a..ce34356d0 100644 --- a/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt +++ b/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt @@ -74,9 +74,11 @@ class ReleaseServiceImpl( // KMK <-- private fun getDownloadLink(release: GithubRelease, isFoss: Boolean): String? { - val map = release.assets.associate { asset -> - BUILD_TYPES.find { "-$it" in asset.name } to asset.downloadLink - } + val map = release.assets + .filter { it.name.isNotBlank() && it.downloadLink.isNotBlank() } + .associate { asset -> + BUILD_TYPES.find { "-$it" in asset.name } to asset.downloadLink + } return if (!isFoss) { map[Build.SUPPORTED_ABIS[0]] ?: map[null]