Skip to content

Commit 9e75821

Browse files
committed
feat: add support for wallpaper cave
1 parent 429af3a commit 9e75821

4 files changed

Lines changed: 83 additions & 5 deletions

File tree

app/src/main/java/com/bnyro/wallpaper/App.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.material.icons.Icons
55
import androidx.compose.material.icons.filled.Air
66
import androidx.compose.material.icons.filled.AreaChart
77
import androidx.compose.material.icons.filled.Book
8+
import androidx.compose.material.icons.filled.Deblur
89
import androidx.compose.material.icons.filled.Forum
910
import androidx.compose.material.icons.filled.Landscape
1011
import androidx.compose.material.icons.filled.LightMode
@@ -34,6 +35,7 @@ import net.youapps.wallpaper_apis.px.GooglePixelApi
3435
import net.youapps.wallpaper_apis.re.RedditApi
3536
import net.youapps.wallpaper_apis.sp.MicrosoftSpotlightApi
3637
import net.youapps.wallpaper_apis.us.UnsplashApi
38+
import net.youapps.wallpaper_apis.wc.WallpaperCaveApi
3739
import net.youapps.wallpaper_apis.wh.WallhavenApi
3840
import net.youapps.wallpaper_apis.wi.WikipediaPotdApi
3941
import net.youapps.wallpaper_apis.ze.ZedgeApi
@@ -76,14 +78,15 @@ class App : Application(), ImageLoaderFactory {
7678
WallpaperApiWrapper(UnsplashApi(), Icons.Default.WaterDrop),
7779
WallpaperApiWrapper(PixabayApi(), Icons.Default.Palette),
7880
WallpaperApiWrapper(ZedgeApi(), Icons.Default.ScreenLockLandscape),
81+
WallpaperApiWrapper(WallpaperCaveApi(), Icons.Default.Deblur),
7982
WallpaperApiWrapper(BingApi(), Icons.Default.Nightlight),
8083
WallpaperApiWrapper(RedditApi(), Icons.Default.Forum),
8184
WallpaperApiWrapper(LemmyApi(), Icons.Default.Book),
8285
WallpaperApiWrapper(GooglePixelApi(), Icons.Default.Pix),
8386
WallpaperApiWrapper(MicrosoftSpotlightApi(), Icons.Default.LightMode),
8487
WallpaperApiWrapper(NasaPotdApi(), Icons.Default.Star),
8588
WallpaperApiWrapper(WikipediaPotdApi(), Icons.Default.Today),
86-
WallpaperApiWrapper(PicsumApi(), Icons.Default.AreaChart)
89+
WallpaperApiWrapper(PicsumApi(), Icons.Default.AreaChart),
8790
)
8891
}
8992
}
Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
package net.youapps.wallpaper_apis.wc
22

3-
class WallpaperCave {
3+
import net.youapps.wallpaper_apis.wc.obj.WallpaperCaveMoreResponse
4+
import retrofit2.http.Multipart
5+
import retrofit2.http.POST
6+
import retrofit2.http.Part
7+
8+
interface WallpaperCave {
9+
@POST("/morefeatured")
10+
@Multipart
11+
suspend fun getFeaturedWallpapers(
12+
@Part("page") page: Int
13+
): List<WallpaperCaveMoreResponse>
14+
15+
@POST("/morelatest")
16+
@Multipart
17+
suspend fun getLatestWallpapers(
18+
@Part("page") page: Int
19+
): List<WallpaperCaveMoreResponse>
420
}
Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,57 @@
11
package net.youapps.wallpaper_apis.wc
22

3-
class WallpaperCaveApi {
3+
import com.fleeksoft.ksoup.Ksoup
4+
import net.youapps.wallpaper_apis.RetrofitHelper
5+
import net.youapps.wallpaper_apis.Wallpaper
6+
import net.youapps.wallpaper_apis.WallpaperApi
7+
8+
class WallpaperCaveApi: WallpaperApi() {
9+
override val name: String = "WallpaperCave"
10+
override val baseUrl: String = "https://wallpapercave.com"
11+
12+
override val availableFilters: Map<String, List<String>> = mapOf("page" to listOf("featured", "latest"))
13+
14+
private val api: WallpaperCave by lazy {
15+
RetrofitHelper.create(baseUrl)
16+
}
17+
18+
private fun parseHtml(html: String): List<Wallpaper> {
19+
val doc = Ksoup.parse(html)
20+
21+
return doc.select("a.wpimg").map {
22+
val thumbSrc = baseUrl + it.select("img").attr("src")
23+
println(thumbSrc)
24+
25+
Wallpaper(
26+
// "/wpr" seems to be for thumbs, "/wp" for full-res images
27+
imgSrc = thumbSrc.replace("/wpr/", "/wp/"),
28+
url = baseUrl + it.attr("href"),
29+
title = it.attr("title"),
30+
thumb = thumbSrc
31+
)
32+
}
33+
}
34+
35+
override suspend fun getWallpapers(page: Int): List<Wallpaper> {
36+
// page is 0-based
37+
val pageType = selectedFilters["page"]!!
38+
val responseHtml = when (pageType) {
39+
"featured" -> {
40+
api.getFeaturedWallpapers(page - 1).first().imgs
41+
}
42+
"latest" -> {
43+
api.getLatestWallpapers(page - 1).first().imgs
44+
}
45+
else -> {
46+
throw IllegalArgumentException("unsupported page type")
47+
}
48+
}
49+
50+
return parseHtml(responseHtml)
51+
}
52+
53+
override suspend fun getRandomWallpaperUrl(): String? {
54+
val response = api.getLatestWallpapers(0).first()
55+
return parseHtml(response.imgs).first().url
56+
}
457
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
package net.youapps.wallpaper_apis.wc.obj
22

3-
class WallpaperCaveMoreResponse {
4-
}
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class WallpaperCaveMoreResponse(
8+
@SerialName("next_page") val nextPage: Int,
9+
val imgs: String,
10+
)

0 commit comments

Comments
 (0)