From 90c1cad44a29fab9dd4c1d71779e7bdbe472ff5e Mon Sep 17 00:00:00 2001 From: Bnyro Date: Mon, 3 Feb 2025 22:19:35 +0100 Subject: [PATCH] feat: add wikipedia picture of the day --- app/src/main/java/com/bnyro/wallpaper/App.kt | 3 +- .../java/com/bnyro/wallpaper/api/wi/WiAPi.kt | 57 +++++++++++++++++++ .../com/bnyro/wallpaper/api/wi/WikiPOTD.kt | 18 ++++++ .../wallpaper/api/wi/obj/WikiImageInfo.kt | 14 +++++ .../wallpaper/api/wi/obj/WikiImagePage.kt | 13 +++++ .../wallpaper/api/wi/obj/WikiImageQuery.kt | 8 +++ .../api/wi/obj/WikiImagesResponse.kt | 8 +++ 7 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/wi/WiAPi.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/wi/WikiPOTD.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageInfo.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagePage.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageQuery.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagesResponse.kt diff --git a/app/src/main/java/com/bnyro/wallpaper/App.kt b/app/src/main/java/com/bnyro/wallpaper/App.kt index 9602503..033c4ea 100644 --- a/app/src/main/java/com/bnyro/wallpaper/App.kt +++ b/app/src/main/java/com/bnyro/wallpaper/App.kt @@ -14,6 +14,7 @@ import com.bnyro.wallpaper.api.re.ReApi import com.bnyro.wallpaper.api.sp.SpApi import com.bnyro.wallpaper.api.us.UsApi import com.bnyro.wallpaper.api.wh.WhApi +import com.bnyro.wallpaper.api.wi.WiAPi import com.bnyro.wallpaper.db.DatabaseHolder import com.bnyro.wallpaper.util.Preferences @@ -48,6 +49,6 @@ class App : Application(), ImageLoaderFactory { companion object { val apis = - listOf(WhApi(), OwApi(), UsApi(), BiApi(), ReApi(), LeApi(), PxApi(), SpApi(), NaApi(), PsApi()) + listOf(WhApi(), OwApi(), UsApi(), BiApi(), ReApi(), LeApi(), PxApi(), SpApi(), NaApi(), WiAPi(), PsApi()) } } diff --git a/app/src/main/java/com/bnyro/wallpaper/api/wi/WiAPi.kt b/app/src/main/java/com/bnyro/wallpaper/api/wi/WiAPi.kt new file mode 100644 index 0000000..ee2ead7 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/wi/WiAPi.kt @@ -0,0 +1,57 @@ +package com.bnyro.wallpaper.api.wi + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Today +import androidx.compose.ui.graphics.vector.ImageVector +import com.bnyro.wallpaper.api.Api +import com.bnyro.wallpaper.db.obj.Wallpaper +import com.bnyro.wallpaper.util.RetrofitHelper +import java.time.LocalDate +import java.time.format.DateTimeFormatter + +class WiAPi : Api() { + override val name = "Wikipedia POTD" + override val icon: ImageVector = Icons.Default.Today + override val baseUrl = "https://en.wikipedia.org" + + private val api = RetrofitHelper.create(baseUrl, WikiPOTD::class.java) + private val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd") + + override suspend fun getWallpapers(page: Int): List { + val now = LocalDate.now() + val dates = mutableListOf() + + for (i in 0 until PAGE_SIZE) { + val offset = (page - 1) * PAGE_SIZE + i + val date = now.minusDays(offset.toLong()) + dates.add(date.format(dateFormat)) + } + + val titles = dates.map { POTD_ARTICLE_PREFIX + it } + return api.getImages(titles = titles.joinToString("|")).query.pages.values + .filter { it.imageInfo.isNotEmpty() } + .map { image -> + val imageInfo = image.imageInfo.first() + + Wallpaper( + imgSrc = imageInfo.url, + url = imageInfo.descriptionUrl, + title = image.title.substringAfter(":").substringBeforeLast("."), + resolution = "${imageInfo.width}x${imageInfo.height}", + thumb = imageInfo.thumbUrl + ) + } + } + + override suspend fun getRandomWallpaperUrl(): String? { + val today = LocalDate.now().format(dateFormat) + + return api.getImages(titles = POTD_ARTICLE_PREFIX + today).query.pages.values.firstOrNull() + ?.imageInfo?.firstOrNull()?.url + } + + companion object { + private const val POTD_ARTICLE_PREFIX = "Template:POTD/" + private const val PAGE_SIZE = 10 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/wi/WikiPOTD.kt b/app/src/main/java/com/bnyro/wallpaper/api/wi/WikiPOTD.kt new file mode 100644 index 0000000..40e2ed8 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/wi/WikiPOTD.kt @@ -0,0 +1,18 @@ +package com.bnyro.wallpaper.api.wi + +import com.bnyro.wallpaper.api.wi.obj.WikiImagesResponse +import retrofit2.http.GET +import retrofit2.http.Query + +interface WikiPOTD { + @GET("w/api.php") + suspend fun getImages( + @Query("action") action: String = "query", + @Query("format") format: String = "json", + @Query("generator") generator: String = "images", + @Query("prop") prop: String = "imageinfo", + @Query("iiprop") iiProp: String = "url|size", + @Query("iiurlwidth") iiUrlWidth: String = "300", + @Query("titles") titles: String, // separated by "|" + ): WikiImagesResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageInfo.kt b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageInfo.kt new file mode 100644 index 0000000..ebff04f --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageInfo.kt @@ -0,0 +1,14 @@ +package com.bnyro.wallpaper.api.wi.obj + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class WikiImageInfo( + @SerialName("descriptionshorturl") val descriptionShortUrl: String, + @SerialName("descriptionurl") val descriptionUrl: String, + val url: String, + val width: Int, + val height: Int, + @SerialName("thumburl") val thumbUrl: String? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagePage.kt b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagePage.kt new file mode 100644 index 0000000..4f69d69 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagePage.kt @@ -0,0 +1,13 @@ +package com.bnyro.wallpaper.api.wi.obj + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class WikiImagePage( + @SerialName("imageinfo") val imageInfo: List, + @SerialName("imagerepository") val imageRepository: String, + @SerialName("pageid") val pageId: Int, + val title: String, + val ns: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageQuery.kt b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageQuery.kt new file mode 100644 index 0000000..b4cdbb6 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImageQuery.kt @@ -0,0 +1,8 @@ +package com.bnyro.wallpaper.api.wi.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class WikiImageQuery( + val pages: Map +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagesResponse.kt b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagesResponse.kt new file mode 100644 index 0000000..bace1f9 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/wi/obj/WikiImagesResponse.kt @@ -0,0 +1,8 @@ +package com.bnyro.wallpaper.api.wi.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class WikiImagesResponse( + val query: WikiImageQuery +) \ No newline at end of file