From 3e3087e91fc3fc54a42f0b24aa833eb7346e6266 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 4 Oct 2024 14:03:07 +0200 Subject: [PATCH] feat: support for Microsoft Spotlight (closes #207) --- app/src/main/java/com/bnyro/wallpaper/App.kt | 2 + .../java/com/bnyro/wallpaper/api/sp/SpApi.kt | 41 +++++++++++++++++++ .../com/bnyro/wallpaper/api/sp/Spotlight.kt | 28 +++++++++++++ .../wallpaper/api/sp/obj/SpotlightBatchrsp.kt | 9 ++++ .../wallpaper/api/sp/obj/SpotlightData.kt | 8 ++++ .../wallpaper/api/sp/obj/SpotlightImage.kt | 8 ++++ .../api/sp/obj/SpotlightImageItem.kt | 8 ++++ .../wallpaper/api/sp/obj/SpotlightInfo.kt | 19 +++++++++ .../wallpaper/api/sp/obj/SpotlightPage.kt | 8 ++++ .../bnyro/wallpaper/ui/nav/DrawerScreens.kt | 5 ++- .../com/bnyro/wallpaper/util/Preferences.kt | 1 + .../bnyro/wallpaper/util/RetrofitHelper.kt | 2 +- app/src/main/res/values/strings.xml | 1 + 13 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/SpApi.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/Spotlight.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightBatchrsp.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightData.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImage.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImageItem.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightInfo.kt create mode 100644 app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightPage.kt diff --git a/app/src/main/java/com/bnyro/wallpaper/App.kt b/app/src/main/java/com/bnyro/wallpaper/App.kt index 09227586..165e4e17 100644 --- a/app/src/main/java/com/bnyro/wallpaper/App.kt +++ b/app/src/main/java/com/bnyro/wallpaper/App.kt @@ -10,6 +10,7 @@ import com.bnyro.wallpaper.api.ow.OwApi import com.bnyro.wallpaper.api.ps.PsApi import com.bnyro.wallpaper.api.px.PxApi 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.db.DatabaseHolder @@ -53,5 +54,6 @@ class App : Application(), ImageLoaderFactory { val leApi = LeApi() val whApi = WhApi() val pxApi = PxApi() + val spApi = SpApi() } } diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/SpApi.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/SpApi.kt new file mode 100644 index 00000000..d774aa38 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/SpApi.kt @@ -0,0 +1,41 @@ +package com.bnyro.wallpaper.api.sp + +import com.bnyro.wallpaper.api.Api +import com.bnyro.wallpaper.api.sp.obj.SpotlightImage +import com.bnyro.wallpaper.db.obj.Wallpaper +import com.bnyro.wallpaper.util.RetrofitHelper +import kotlinx.serialization.decodeFromString +import java.util.Locale + +// Credits to https://github.com/ORelio/Spotlight-Downloader/blob/master/SpotlightAPI.md + +class SpApi: Api() { + override val name = "Windows Spotlight" + override val baseUrl = "https://fd.api.iris.microsoft.com" + override val filters: Map> = mapOf( + "country" to listOf("US") + Locale.getISOCountries().toList().filter { it != "US" }.sorted() + ) + + private val api = RetrofitHelper.create(baseUrl, Spotlight::class.java) + + override suspend fun getWallpapers(page: Int): List { + val country = getQuery("country") + val apiResp = api.getLatestPage(country = country, locale = "en-${country}") + val images = apiResp.batchrsp.items.map { + RetrofitHelper.json.decodeFromString(it.item) + } + return images.map { + Wallpaper( + title = it.ad.title, + imgSrc = it.ad.portraitImage.asset, + author = it.ad.copyright, + url = it.ad.ctaUri.replaceFirst("microsoft-edge:", "") + ) + } + } + + override suspend fun getRandomWallpaperUrl(): String { + val country = getQuery("country") + return api.getLatest(country = country, locale = "en-${country}").ad.portraitImage.asset + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/Spotlight.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/Spotlight.kt new file mode 100644 index 00000000..1589ddd8 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/Spotlight.kt @@ -0,0 +1,28 @@ +package com.bnyro.wallpaper.api.sp + +import com.bnyro.wallpaper.api.sp.obj.SpotlightImage +import com.bnyro.wallpaper.api.sp.obj.SpotlightImageItem +import com.bnyro.wallpaper.api.sp.obj.SpotlightPage +import retrofit2.http.GET +import retrofit2.http.Query + +private const val PLACEMENT_ID = "88000820" + +interface Spotlight { + @GET("v4/api/selection") + suspend fun getLatestPage( + @Query("country") country: String = "US", + @Query("locale") locale: String = "en-US", + @Query("fmt") format: String = "json", + @Query("placement") placement: String = PLACEMENT_ID, + @Query("bcnt") limit: Int = 4 + ): SpotlightPage + + @GET("v4/api/selection") + suspend fun getLatest( + @Query("country") country: String = "US", + @Query("locale") locale: String = "en-US", + @Query("fmt") format: String = "json", + @Query("placement") placement: String = PLACEMENT_ID + ): SpotlightImage +} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightBatchrsp.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightBatchrsp.kt new file mode 100644 index 00000000..51f58c0c --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightBatchrsp.kt @@ -0,0 +1,9 @@ +package com.bnyro.wallpaper.api.sp.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class SpotlightBatchrsp( + val items: List, + val ver: String +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightData.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightData.kt new file mode 100644 index 00000000..919c1c2c --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightData.kt @@ -0,0 +1,8 @@ +package com.bnyro.wallpaper.api.sp.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class SpotlightData( + val item: String +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImage.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImage.kt new file mode 100644 index 00000000..77a15a27 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImage.kt @@ -0,0 +1,8 @@ +package com.bnyro.wallpaper.api.sp.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class SpotlightImage( + val ad: SpotlightInfo, +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImageItem.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImageItem.kt new file mode 100644 index 00000000..67e9c9e8 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightImageItem.kt @@ -0,0 +1,8 @@ +package com.bnyro.wallpaper.api.sp.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class SpotlightImageItem( + val asset: String +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightInfo.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightInfo.kt new file mode 100644 index 00000000..a860985c --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightInfo.kt @@ -0,0 +1,19 @@ +package com.bnyro.wallpaper.api.sp.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class SpotlightInfo( + val copyright: String, + val ctaText: String, + val ctaUri: String, + val description: String, + val dislikeGlyph: String, + val entityId: String, + val iconHoverText: String, + val iconLabel: String, + val landscapeImage: SpotlightImageItem, + val likeGlyph: String, + val portraitImage: SpotlightImageItem, + val title: String +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightPage.kt b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightPage.kt new file mode 100644 index 00000000..52bb4007 --- /dev/null +++ b/app/src/main/java/com/bnyro/wallpaper/api/sp/obj/SpotlightPage.kt @@ -0,0 +1,8 @@ +package com.bnyro.wallpaper.api.sp.obj + +import kotlinx.serialization.Serializable + +@Serializable +data class SpotlightPage( + val batchrsp: SpotlightBatchrsp +) \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/nav/DrawerScreens.kt b/app/src/main/java/com/bnyro/wallpaper/ui/nav/DrawerScreens.kt index 5ebcd838..f9568a3c 100644 --- a/app/src/main/java/com/bnyro/wallpaper/ui/nav/DrawerScreens.kt +++ b/app/src/main/java/com/bnyro/wallpaper/ui/nav/DrawerScreens.kt @@ -8,6 +8,7 @@ import androidx.compose.material.icons.filled.Forum import androidx.compose.material.icons.filled.History import androidx.compose.material.icons.filled.Info import androidx.compose.material.icons.filled.Landscape +import androidx.compose.material.icons.filled.LightMode import androidx.compose.material.icons.filled.Nightlight import androidx.compose.material.icons.filled.Pix import androidx.compose.material.icons.filled.Settings @@ -32,6 +33,7 @@ sealed class DrawerScreens( object Reddit : DrawerScreens(R.string.reddit, "redd", Icons.Default.Forum) object Lemmy : DrawerScreens(R.string.lemmy, "le", Icons.Default.Book) object Pixel : DrawerScreens(R.string.pixel, "px", Icons.Default.Pix) + object Spotlight : DrawerScreens(R.string.spotlight, "sp", Icons.Default.LightMode) object Favorites : DrawerScreens(R.string.favorites, "favorites", Icons.Default.Favorite, true) object History : DrawerScreens(R.string.history, "history", Icons.Default.History) object Settings : DrawerScreens(R.string.settings, "settings", Icons.Default.Settings, true) @@ -47,7 +49,8 @@ sealed class DrawerScreens( BingDaily, Reddit, Lemmy, - Pixel + Pixel, + Spotlight ) } val screens by lazy { diff --git a/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt b/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt index 0fbd3ab0..47989cce 100644 --- a/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt +++ b/app/src/main/java/com/bnyro/wallpaper/util/Preferences.kt @@ -54,6 +54,7 @@ object Preferences { DrawerScreens.Reddit.route -> App.reApi DrawerScreens.Lemmy.route -> App.leApi DrawerScreens.Pixel.route -> App.pxApi + DrawerScreens.Spotlight.route -> App.spApi else -> App.whApi } diff --git a/app/src/main/java/com/bnyro/wallpaper/util/RetrofitHelper.kt b/app/src/main/java/com/bnyro/wallpaper/util/RetrofitHelper.kt index 1b84b122..4c3b35a1 100644 --- a/app/src/main/java/com/bnyro/wallpaper/util/RetrofitHelper.kt +++ b/app/src/main/java/com/bnyro/wallpaper/util/RetrofitHelper.kt @@ -21,7 +21,7 @@ object RetrofitHelper { if (BuildConfig.DEBUG) { val loggingInterceptor = HttpLoggingInterceptor() - loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC) + loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY) builder.addInterceptor(loggingInterceptor) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index acf67bb9..9b8f8677 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ Reddit Lemmy Google Pixel + Spotlight Favorites History