From 083dace2a98fca127a0344854a0a013597a85ba4 Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Sat, 31 Oct 2026 05:30:44 +0000 Subject: [PATCH 1/2] Make profile fetching more resilient --- .../java/moe/apex/breadboard/image/ImageBoard.kt | 16 ++++++++++++++++ .../viewmodel/ArtistProfileViewModel.kt | 11 +++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/image/ImageBoard.kt b/app/src/main/java/moe/apex/breadboard/image/ImageBoard.kt index 252108de..f4e09dfd 100644 --- a/app/src/main/java/moe/apex/breadboard/image/ImageBoard.kt +++ b/app/src/main/java/moe/apex/breadboard/image/ImageBoard.kt @@ -456,6 +456,7 @@ object Danbooru : ImageBoard { ) override val imageSearchUrl = "${baseUrl}posts.json?tags=%s&page=%d&limit=100" override val authenticatedImageSearchUrl = "$imageSearchUrl&api_key=%s&login=%s" + private val popularUrl = "${baseUrl}posts.json?tags=%s order:favcount&limit=20" override val totalPostCountUrl = "${baseUrl}counts/posts.json?tags=%s" override val firstPageIndex = 1 override val apiKeyCreationUrl = "${baseUrl}/profile" @@ -617,6 +618,21 @@ object Danbooru : ImageBoard { ) } + suspend fun getMostPopularPosts(artistTag: String): List { + val url = popularUrl.format(formatTagNameString(listOf(artistTag, "rating:g"))) + val body = RequestUtil.get(url) + if (body.isEmpty()) return emptyList() + + val json = JSONArray(body) + val subjects = mutableListOf() + + for (i in 0 until json.length()) { + val e = json.getJSONObject(i) + parseImage(e)?.let { subjects.add(it) } + } + + return subjects.toList() + } override fun getRatingFromString(rating: String): ImageRating { return when (rating) { diff --git a/app/src/main/java/moe/apex/breadboard/viewmodel/ArtistProfileViewModel.kt b/app/src/main/java/moe/apex/breadboard/viewmodel/ArtistProfileViewModel.kt index a8b7e7db..3bc9fa7a 100644 --- a/app/src/main/java/moe/apex/breadboard/viewmodel/ArtistProfileViewModel.kt +++ b/app/src/main/java/moe/apex/breadboard/viewmodel/ArtistProfileViewModel.kt @@ -27,8 +27,15 @@ class ArtistProfileViewModel(private val artistTag: String): ViewModel() { Log.i("ArtistProfileViewModel", "Loading artist profile for $artistTag") - _artistProfile.value = Danbooru.getArtist(artistTag) - _images.value = DanbooruSafe.getMostPopularPosts(artistTag) + _artistProfile.value = runCatching { Danbooru.getArtist(artistTag) } + .onFailure { Log.e("ArtistProfileViewModel", "Failed to load artist profile for $artistTag", it) } + .getOrThrow() + + runCatching { DanbooruSafe.getMostPopularPosts(artistTag) } + .onFailure { Log.e("ArtistProfileViewModel", "Failed to load posts with DanbooruSafe for artist $artistTag. Attempting regular Danbooru.", it) } + .recoverCatching { Danbooru.getMostPopularPosts(artistTag) } + .onFailure { Log.e("ArtistProfileViewModel", "Failed to load posts with Danbooru for artist $artistTag", it) } + .onSuccess { _images.value = it } _isInitialised.value = true } From 6e2fe2b13a2a91cb8262b7055d33ed2a04fa2f29 Mon Sep 17 00:00:00 2001 From: Rob Wainwright <47543882+apex2504@users.noreply.github.com> Date: Sat, 31 Oct 2026 05:32:44 +0000 Subject: [PATCH 2/2] Update version --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ebef699e..c4241d49 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { applicationId "moe.apex.breadboard" minSdk 26 targetSdk 36 - versionCode 337 - versionName "3.3.7" + versionCode 338 + versionName "3.3.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables {