Skip to content

Commit 8e1f685

Browse files
committed
✨ Added link for single anime in translationCount ✨
1 parent f483964 commit 8e1f685

File tree

3 files changed

+86
-12
lines changed

3 files changed

+86
-12
lines changed
Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
11
package club.anifox.backend.domain.model.anime.translation
22

3+
import club.anifox.backend.util.serializer.AnimeTranslationCountSerializer
4+
import kotlinx.serialization.Polymorphic
35
import kotlinx.serialization.SerialName
46
import kotlinx.serialization.Serializable
57

8+
@Serializable(with = AnimeTranslationCountSerializer::class)
9+
@Polymorphic
10+
sealed interface AnimeTranslationCount {
11+
val translation: AnimeTranslation
12+
13+
@SerialName("count_episodes")
14+
val countEpisodes: Int
15+
}
16+
17+
@Serializable
18+
@SerialName("default")
19+
data class AnimeTranslationCountDefault(
20+
override val translation: AnimeTranslation,
21+
@SerialName("count_episodes")
22+
override val countEpisodes: Int,
23+
) : AnimeTranslationCount
24+
625
@Serializable
7-
data class AnimeTranslationCount(
8-
val translation: AnimeTranslation = AnimeTranslation(),
26+
@SerialName("single")
27+
data class AnimeTranslationCountSingle(
28+
override val translation: AnimeTranslation,
929
@SerialName("count_episodes")
10-
val countEpisodes: Int = 0,
11-
)
30+
override val countEpisodes: Int,
31+
val link: String,
32+
) : AnimeTranslationCount

src/main/kotlin/club/anifox/backend/service/anime/components/episodes/AnimeTranslationsComponent.kt

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ package club.anifox.backend.service.anime.components.episodes
33
import club.anifox.backend.domain.constants.Constants
44
import club.anifox.backend.domain.dto.anime.kodik.KodikResponseDto
55
import club.anifox.backend.domain.dto.anime.kodik.KodikTranslationsDto
6+
import club.anifox.backend.domain.enums.anime.AnimeStatus
67
import club.anifox.backend.domain.mappers.anime.toAnimeTranslation
78
import club.anifox.backend.domain.model.anime.translation.AnimeTranslationCount
9+
import club.anifox.backend.domain.model.anime.translation.AnimeTranslationCountDefault
10+
import club.anifox.backend.domain.model.anime.translation.AnimeTranslationCountSingle
11+
import club.anifox.backend.jpa.entity.anime.episodes.AnimeEpisodeTable
812
import club.anifox.backend.jpa.entity.anime.episodes.AnimeEpisodeTranslationCountTable
913
import club.anifox.backend.jpa.entity.anime.episodes.AnimeTranslationTable
1014
import club.anifox.backend.jpa.repository.anime.AnimeTranslationRepository
@@ -37,14 +41,32 @@ class AnimeTranslationsComponent {
3741

3842
val translationsCountEpisodes: Set<AnimeEpisodeTranslationCountTable> = anime.translationsCountEpisodes
3943

40-
return translationsCountEpisodes
41-
.map { translationEpisodes ->
42-
AnimeTranslationCount(
43-
translation = translationEpisodes.translation.toAnimeTranslation(),
44-
countEpisodes = translationEpisodes.countEpisodes,
45-
)
46-
}
47-
.sortedByDescending { it.countEpisodes }
44+
return if (anime.status == AnimeStatus.Released && anime.episodesCount == 1) {
45+
val episodes: Set<AnimeEpisodeTable> = anime.episodes
46+
val episode = episodes.first()
47+
val translationLinks = episode.translations.associate { it.translation.id to it.link }
48+
49+
translationsCountEpisodes
50+
.map { translationEpisodes ->
51+
val translation = translationEpisodes.translation.toAnimeTranslation()
52+
val link = translationLinks[translationEpisodes.translation.id] ?: ""
53+
AnimeTranslationCountSingle(
54+
translation = translation,
55+
countEpisodes = translationEpisodes.countEpisodes,
56+
link = link,
57+
)
58+
}
59+
.sortedByDescending { it.countEpisodes }
60+
} else {
61+
translationsCountEpisodes
62+
.map { translationEpisodes ->
63+
AnimeTranslationCountDefault(
64+
translation = translationEpisodes.translation.toAnimeTranslation(),
65+
countEpisodes = translationEpisodes.countEpisodes,
66+
)
67+
}
68+
.sortedByDescending { it.countEpisodes }
69+
}
4870
}
4971

5072
fun getAnimeTranslations(): List<AnimeTranslationTable> {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package club.anifox.backend.util.serializer
2+
3+
import club.anifox.backend.domain.model.anime.translation.AnimeTranslationCount
4+
import club.anifox.backend.domain.model.anime.translation.AnimeTranslationCountDefault
5+
import club.anifox.backend.domain.model.anime.translation.AnimeTranslationCountSingle
6+
import kotlinx.serialization.KSerializer
7+
import kotlinx.serialization.descriptors.SerialDescriptor
8+
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
9+
import kotlinx.serialization.encoding.Decoder
10+
import kotlinx.serialization.encoding.Encoder
11+
import kotlinx.serialization.json.JsonEncoder
12+
import kotlinx.serialization.json.encodeToJsonElement
13+
14+
object AnimeTranslationCountSerializer : KSerializer<AnimeTranslationCount> {
15+
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("AnimeTranslationCount")
16+
17+
override fun serialize(encoder: Encoder, value: AnimeTranslationCount) {
18+
val jsonEncoder = encoder as? JsonEncoder ?: error("Only JSON is supported")
19+
val json = jsonEncoder.json
20+
21+
val jsonElement = when (value) {
22+
is AnimeTranslationCountDefault -> json.encodeToJsonElement(value)
23+
is AnimeTranslationCountSingle -> json.encodeToJsonElement(value)
24+
}
25+
jsonEncoder.encodeJsonElement(jsonElement)
26+
}
27+
28+
override fun deserialize(decoder: Decoder): AnimeTranslationCount {
29+
throw UnsupportedOperationException("Deserialization is not supported")
30+
}
31+
}

0 commit comments

Comments
 (0)