Ver Fonte

added api for thumbnails

sirekanian há 3 anos atrás
pai
commit
c0c2c6fbbd

+ 6 - 0
app/build.gradle

@@ -2,6 +2,7 @@ plugins {
     id 'com.android.application'
     id 'org.jetbrains.kotlin.android'
     id 'org.jetbrains.kotlin.kapt'
+    id 'org.jetbrains.kotlin.plugin.serialization'
 }
 
 android {
@@ -76,4 +77,9 @@ dependencies {
     // datetime
     implementation 'org.jetbrains.kotlinx:kotlinx-datetime:0.4.0'
 
+    // ktor
+    implementation 'io.ktor:ktor-client-android:2.1.2'
+    implementation 'io.ktor:ktor-client-content-negotiation:2.1.2'
+    implementation 'io.ktor:ktor-serialization-kotlinx-json:2.1.2'
+
 }

+ 2 - 0
app/src/main/java/com/sirekanian/spacetime/App.kt

@@ -5,10 +5,12 @@ import androidx.room.Room
 import com.sirekanian.spacetime.data.DefaultDataCallback
 import com.sirekanian.spacetime.data.Repository
 import com.sirekanian.spacetime.data.RepositoryImpl
+import com.sirekanian.spacetime.data.api.ThumbnailApi
 import com.sirekanian.spacetime.data.local.Database
 
 class App : Application() {
 
+    val api by lazy { ThumbnailApi() }
     val repository: Repository by lazy {
         RepositoryImpl(
             Room.databaseBuilder(this, Database::class.java, "database")

+ 7 - 5
app/src/main/java/com/sirekanian/spacetime/MainPresenter.kt

@@ -5,12 +5,11 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.platform.LocalContext
 import com.sirekanian.spacetime.data.Repository
-import com.sirekanian.spacetime.data.URLS
+import com.sirekanian.spacetime.data.api.ThumbnailApi
 import com.sirekanian.spacetime.ext.app
 import com.sirekanian.spacetime.model.GalleryPage
 import com.sirekanian.spacetime.model.ImagePage
 import com.sirekanian.spacetime.model.Page
-import com.sirekanian.spacetime.model.Thumbnail
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
@@ -18,9 +17,9 @@ import kotlinx.coroutines.launch
 
 @Composable
 fun rememberMainPresenter(): MainPresenter {
-    val context = LocalContext.current
+    val app = LocalContext.current.app()
     val scope = rememberCoroutineScope()
-    return remember { MainPresenterImpl(context.app().repository, scope) }
+    return remember { MainPresenterImpl(app.api, app.repository, scope) }
 }
 
 interface MainPresenter {
@@ -34,6 +33,7 @@ interface MainPresenter {
 }
 
 class MainPresenterImpl(
+    private val api: ThumbnailApi,
     private val repository: Repository,
     private val scope: CoroutineScope,
 ) : MainPresenter {
@@ -56,7 +56,9 @@ class MainPresenterImpl(
     }
 
     override fun loadGallery() {
-        state.thumbnails = URLS.map(::Thumbnail)
+        scope.launch {
+            state.thumbnails = api.getThumbnails()
+        }
     }
 
 }

+ 0 - 36
app/src/main/java/com/sirekanian/spacetime/data/Urls.kt

@@ -1,36 +0,0 @@
-package com.sirekanian.spacetime.data
-
-private const val BASE_URL = "https://sirekanian.com/apod/image"
-
-val URLS = listOf(
-    "$BASE_URL/2209/SnakingFilament_Friedman_960.jpg",
-    "$BASE_URL/2209/sprites_scerba_960.jpg",
-    "$BASE_URL/2209/Traful-Lake1024.jpg",
-    "$BASE_URL/2209/voyager_modern_poster_crop.jpg",
-    "$BASE_URL/2209/NGC7000_NB_2022_1024.jpg",
-    "$BASE_URL/2209/TarantulaNearIr_Webb_960.jpg",
-    "$BASE_URL/2209/Pileus_Jiaqi_960.jpg",
-    "$BASE_URL/2209/CarinaCliffs_Webb_1080.jpg",
-    "$BASE_URL/2209/MilkyWayOregon_Montoya_960.jpg",
-    "$BASE_URL/2209/Interval29seconds_Transit1200.jpg",
-    "$BASE_URL/2209/m51_l2_1024.jpg",
-    "$BASE_URL/2209/TulipCygX-1_1024.jpg",
-    "$BASE_URL/2208/SiccarPoint_CuriosityGill_1080.jpg",
-    "$BASE_URL/2208/Jupiter2_WebbSchmidt_1080_annotated.jpg",
-    "$BASE_URL/2208/Horsehead_Chatzifrantzis_1080.jpg",
-    "$BASE_URL/2208/IC5146JenkinsAB3_1100.jpg",
-    "$BASE_URL/2208/Chokshi_DSC7584_Panorama_c1024.jpg",
-    "$BASE_URL/2208/Tiangong_transiting_moon_Lucy_Hu_c1024.jpg",
-    "$BASE_URL/2208/Cartwheel_Webb_960.jpg",
-    "$BASE_URL/2208/MeteorGalaxy_Looten_1000.jpg",
-    "$BASE_URL/2208/Crab_HubbleChandraSpitzer_1080.jpg",
-    "$BASE_URL/2208/C2017K2_220818_1050.jpg",
-    "$BASE_URL/2208/Saturn1993-2022Lb1024.jpg",
-    "$BASE_URL/2208/perseids2022jcc2k800.jpg",
-    "$BASE_URL/2208/StargateMilkyWay_Oudoux_960.jpg",
-    "$BASE_URL/2208/MeteorWind_Larnaout_960.jpg",
-    "$BASE_URL/2208/CygnusWall_Bogaerts_960.jpg",
-    "$BASE_URL/2208/PIA12572_1200.jpg",
-    "$BASE_URL/2208/M16_final_1024.jpg",
-    "$BASE_URL/2208/MagicPerseid001_1024.jpg",
-)

+ 30 - 0
app/src/main/java/com/sirekanian/spacetime/data/api/ThumbnailApi.kt

@@ -0,0 +1,30 @@
+package com.sirekanian.spacetime.data.api
+
+import com.sirekanian.spacetime.data.api.model.NasaMedia
+import com.sirekanian.spacetime.model.Thumbnail
+import io.ktor.client.*
+import io.ktor.client.call.*
+import io.ktor.client.plugins.contentnegotiation.*
+import io.ktor.client.request.*
+import io.ktor.serialization.kotlinx.json.*
+import kotlinx.serialization.json.Json
+
+private const val baseImageUrl = "https://apod.nasa.gov/"
+private const val baseThumbnailUrl = "https://sirekanian.com/"
+
+class ThumbnailApi {
+
+    private val httpClient = HttpClient {
+        install(ContentNegotiation) {
+            json(Json { ignoreUnknownKeys = true })
+        }
+    }
+
+    suspend fun getThumbnails(): List<Thumbnail> =
+        httpClient.get("https://sirekanian.com/apod/json/2022-10-01.json")
+            .body<List<NasaMedia>>()
+            .filter { it.media_type == "image" && it.url.startsWith(baseImageUrl) }
+            .map { Thumbnail(baseThumbnailUrl + it.url.removePrefix(baseImageUrl)) }
+            .reversed()
+
+}

+ 9 - 0
app/src/main/java/com/sirekanian/spacetime/data/api/model/NasaMedia.kt

@@ -0,0 +1,9 @@
+package com.sirekanian.spacetime.data.api.model
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class NasaMedia(
+    val url: String,
+    val media_type: String,
+)

+ 1 - 0
build.gradle

@@ -10,6 +10,7 @@ buildscript {
 plugins {
     id 'com.android.application' version "$androidPluginVersion" apply false
     id 'org.jetbrains.kotlin.android' version "$kotlinLanguageVersion" apply false
+    id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlinLanguageVersion" apply false
 }
 
 task clean(type: Delete) {