Skip to content

Commit 3760530

Browse files
committed
Use Jikan to show last episodes with time and malId
1 parent 1433bca commit 3760530

File tree

6 files changed

+98
-78
lines changed

6 files changed

+98
-78
lines changed

src/main/kotlin/com/jeluchu/core/models/animeflv/lastepisodes/EpisodeEntity.kt

-10
This file was deleted.

src/main/kotlin/com/jeluchu/core/models/animeflv/lastepisodes/LastEpisodeData.kt

-19
This file was deleted.

src/main/kotlin/com/jeluchu/core/models/animeflv/lastepisodes/LastEpisodes.kt

-9
This file was deleted.

src/main/kotlin/com/jeluchu/features/anime/mappers/AnimeMappers.kt

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package com.jeluchu.features.anime.mappers
22

33
import com.jeluchu.core.extensions.*
4-
import com.jeluchu.core.models.animeflv.lastepisodes.EpisodeEntity
4+
import com.jeluchu.features.anime.models.lastepisodes.LastEpisodeData
55
import com.jeluchu.features.anime.models.anime.*
6-
import com.jeluchu.features.anime.models.directory.AnimeDirectoryEntity
76
import com.jeluchu.features.anime.models.directory.AnimeTypeEntity
87
import com.jeluchu.features.rankings.models.AnimeTopEntity
98
import com.jeluchu.features.rankings.models.CharacterTopEntity
@@ -233,6 +232,16 @@ fun documentToAnimeTopEntity(doc: Document) = AnimeTopEntity(
233232
page = doc.getIntSafe("page"),
234233
)
235234

235+
fun documentToAnimeLastEpisodeEntity(doc: Document) = LastEpisodeData(
236+
malId = doc.getIntSafe("malId"),
237+
title = doc.getStringSafe("title"),
238+
image = doc.getStringSafe("image"),
239+
day = doc.getStringSafe("day"),
240+
time = doc.getStringSafe("time"),
241+
score = doc.getStringSafe("score"),
242+
timezone = doc.getStringSafe("timezone")
243+
)
244+
236245
fun documentToMangaTopEntity(doc: Document) = MangaTopEntity(
237246
malId = doc.getIntSafe("malId"),
238247
rank = doc.getIntSafe("rank"),
@@ -288,10 +297,4 @@ fun documentToAnimeDirectoryEntity(doc: Document) = AnimeTypeEntity(
288297
title = doc.getStringSafe("title"),
289298
image = doc.getStringSafe("image"),
290299
episodes = doc.getListSafe<Document>("episodes").size
291-
)
292-
293-
fun documentToLastEpisodesEntity(doc: Document) = EpisodeEntity(
294-
number = doc.getIntSafe("number"),
295-
title = doc.getStringSafe("title"),
296-
image = doc.getStringSafe("image")
297300
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.jeluchu.features.anime.models.lastepisodes
2+
3+
import com.jeluchu.core.models.jikan.anime.AnimeData
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class LastEpisodeData(
8+
val malId: Int = 0,
9+
val title: String?,
10+
val score: String?,
11+
val image: String?,
12+
val day: String?,
13+
val time: String?,
14+
val timezone: String?,
15+
) {
16+
companion object {
17+
fun AnimeData.toLastEpisodeData() = LastEpisodeData(
18+
malId = malId ?: 0,
19+
day = broadcast?.day.orEmpty(),
20+
time = broadcast?.time.orEmpty(),
21+
score = score?.toString().orEmpty(),
22+
image = images?.webp?.large.orEmpty(),
23+
timezone = broadcast?.timezone.orEmpty(),
24+
title = titles?.first()?.title.orEmpty()
25+
)
26+
}
27+
}

src/main/kotlin/com/jeluchu/features/anime/services/AnimeService.kt

+60-32
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
package com.jeluchu.features.anime.services
22

33
import com.jeluchu.core.connection.RestClient
4-
import com.jeluchu.core.enums.AnimeTypes
5-
import com.jeluchu.core.enums.Day
64
import com.jeluchu.core.enums.TimeUnit
75
import com.jeluchu.core.enums.parseAnimeType
86
import com.jeluchu.core.extensions.needsUpdate
97
import com.jeluchu.core.extensions.update
108
import com.jeluchu.core.messages.ErrorMessages
119
import com.jeluchu.core.models.ErrorResponse
1210
import com.jeluchu.core.models.PaginationResponse
13-
import com.jeluchu.core.models.animeflv.lastepisodes.LastEpisodeData.Companion.toEpisodeEntity
14-
import com.jeluchu.core.models.animeflv.lastepisodes.LastEpisodes
15-
import com.jeluchu.core.models.jikan.anime.AnimeData.Companion.toDayEntity
11+
import com.jeluchu.features.anime.models.lastepisodes.LastEpisodeData
12+
import com.jeluchu.features.anime.models.lastepisodes.LastEpisodeData.Companion.toLastEpisodeData
13+
import com.jeluchu.core.models.jikan.search.AnimeSearch
1614
import com.jeluchu.core.utils.BaseUrls
1715
import com.jeluchu.core.utils.Collections
18-
import com.jeluchu.core.utils.Endpoints
1916
import com.jeluchu.core.utils.TimerKey
20-
import com.jeluchu.features.anime.mappers.*
21-
import com.jeluchu.features.schedule.models.ScheduleEntity
17+
import com.jeluchu.core.utils.parseDataToDocuments
18+
import com.jeluchu.features.anime.mappers.documentToAnimeLastEpisodeEntity
19+
import com.jeluchu.features.anime.mappers.documentToAnimeTypeEntity
20+
import com.jeluchu.features.anime.mappers.documentToMoreInfoEntity
2221
import com.mongodb.client.MongoDatabase
23-
import com.mongodb.client.model.Filters
22+
import com.mongodb.client.model.Filters.eq
2423
import io.ktor.http.*
2524
import io.ktor.server.response.*
2625
import io.ktor.server.routing.*
26+
import kotlinx.coroutines.delay
2727
import kotlinx.serialization.encodeToString
2828
import kotlinx.serialization.json.Json
2929
import org.bson.Document
30+
import java.time.LocalDate
31+
import java.time.format.TextStyle
32+
import java.util.*
3033

3134
class AnimeService(
32-
database: MongoDatabase
35+
private val database: MongoDatabase
3336
) {
3437
private val timers = database.getCollection(Collections.TIMERS)
3538
private val directoryCollection = database.getCollection(Collections.ANIME_DETAILS)
@@ -61,7 +64,7 @@ class AnimeService(
6164
call.respond(HttpStatusCode.OK, Json.encodeToString(response))
6265
} else {
6366
val animes = directoryCollection
64-
.find(Filters.eq("type", type.uppercase()))
67+
.find(eq("type", type.uppercase()))
6568
.skip(skipCount)
6669
.limit(size)
6770
.toList()
@@ -82,7 +85,7 @@ class AnimeService(
8285

8386
suspend fun getAnimeByMalId(call: RoutingCall) = try {
8487
val id = call.parameters["id"]?.toInt() ?: throw IllegalArgumentException(ErrorMessages.InvalidMalId.message)
85-
directoryCollection.find(Filters.eq("malId", id)).firstOrNull()?.let { anime ->
88+
directoryCollection.find(eq("malId", id)).firstOrNull()?.let { anime ->
8689
val info = documentToMoreInfoEntity(anime)
8790
call.respond(HttpStatusCode.OK, Json.encodeToString(info))
8891
} ?: call.respond(HttpStatusCode.NotFound, ErrorResponse(ErrorMessages.AnimeNotFound.message))
@@ -91,36 +94,61 @@ class AnimeService(
9194
}
9295

9396
suspend fun getLastEpisodes(call: RoutingCall) = try {
97+
val dayOfWeek = LocalDate.now()
98+
.dayOfWeek
99+
.getDisplayName(TextStyle.FULL, Locale.ENGLISH)
100+
.plus("s")
101+
102+
val timerKey = TimerKey.LAST_EPISODES
103+
val collection = database.getCollection(timerKey)
104+
94105
val needsUpdate = timers.needsUpdate(
95-
amount = 3,
106+
amount = 6,
107+
key = timerKey,
96108
unit = TimeUnit.HOUR,
97-
key = TimerKey.LAST_EPISODES
98109
)
99110

100111
if (needsUpdate) {
101-
lastEpisodesCollection.deleteMany(Document())
112+
collection.deleteMany(Document())
113+
114+
val response = RestClient.request(
115+
BaseUrls.JIKAN + "anime?status=airing&type=tv",
116+
AnimeSearch.serializer()
117+
)
118+
119+
val animes = mutableListOf<LastEpisodeData>()
120+
val totalPage = response.pagination?.lastPage ?: 0
121+
response.data?.map { it.toLastEpisodeData() }.orEmpty().let { animes.addAll(it) }
122+
123+
for (page in 2..totalPage) {
124+
val responsePage = RestClient.request(
125+
BaseUrls.JIKAN + "anime?status=airing&type=tv&page=$page",
126+
AnimeSearch.serializer()
127+
).data?.map { it.toLastEpisodeData() }.orEmpty()
128+
129+
animes.addAll(responsePage)
130+
delay(1000)
131+
}
102132

103-
val episodes = getLastedEpisodes().data?.map { it.toEpisodeEntity() }.orEmpty()
104-
val documents = episodes.map { anime -> Document.parse(Json.encodeToString(anime)) }
105-
if (documents.isNotEmpty()) lastEpisodesCollection.insertMany(documents)
106-
timers.update(TimerKey.LAST_EPISODES)
133+
val documentsToInsert = parseDataToDocuments(animes, LastEpisodeData.serializer())
134+
if (documentsToInsert.isNotEmpty()) collection.insertMany(documentsToInsert)
135+
timers.update(timerKey)
107136

108-
call.respond(HttpStatusCode.OK, Json.encodeToString(episodes))
137+
val queryDb = collection
138+
.find(eq("day", dayOfWeek))
139+
.toList()
140+
141+
val elements = queryDb.map { documentToAnimeLastEpisodeEntity(it) }
142+
call.respond(HttpStatusCode.OK, Json.encodeToString(elements))
109143
} else {
110-
val elements = lastEpisodesCollection.find().toList()
111-
call.respond(HttpStatusCode.OK, elements.documentToLastEpisodesEntity())
144+
val elements = collection
145+
.find(eq("day", dayOfWeek))
146+
.toList()
147+
.map { documentToAnimeLastEpisodeEntity(it) }
148+
149+
call.respond(HttpStatusCode.OK, Json.encodeToString(elements))
112150
}
113151
} catch (ex: Exception) {
114152
call.respond(HttpStatusCode.Unauthorized, ErrorResponse(ErrorMessages.UnauthorizedMongo.message))
115153
}
116-
117-
private suspend fun getLastedEpisodes() = RestClient.requestWithDelay(
118-
url = BaseUrls.ANIME_FLV + Endpoints.LAST_EPISODES,
119-
deserializer = LastEpisodes.serializer()
120-
)
121-
122-
private fun List<Document>.documentToLastEpisodesEntity(): String {
123-
val directory = map { documentToLastEpisodesEntity(it) }
124-
return Json.encodeToString(directory)
125-
}
126154
}

0 commit comments

Comments
 (0)