fix(tr/animeler): Fix Json serialization in search, anime details and episode list pages (#2522)

This commit is contained in:
Claudemirovsky 2023-11-18 09:07:06 -03:00 committed by GitHub
parent 6f3b46c04c
commit 48eba9986e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 17 deletions

View File

@ -8,7 +8,7 @@ ext {
extName = 'Animeler' extName = 'Animeler'
pkgNameSuffix = 'tr.animeler' pkgNameSuffix = 'tr.animeler'
extClass = '.Animeler' extClass = '.Animeler'
extVersionCode = 5 extVersionCode = 6
libVersion = '13' libVersion = '13'
} }

View File

@ -4,7 +4,7 @@ import android.app.Application
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.EpisodeDto import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.AnimeEpisodes
import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.FullAnimeDto import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.FullAnimeDto
import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.SearchRequestDto import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.SearchRequestDto
import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.SearchResponseDto import eu.kanade.tachiyomi.animeextension.tr.animeler.dto.SearchResponseDto
@ -76,7 +76,7 @@ class Animeler : AnimeHttpSource(), ConfigurableAnimeSource {
val animes = results.data.map { val animes = results.data.map {
SAnime.create().apply { SAnime.create().apply {
setUrlWithoutDomain(it.url) setUrlWithoutDomain(it.url)
thumbnail_url = it.image thumbnail_url = it.thumbnail
title = it.title title = it.title
} }
} }
@ -161,14 +161,19 @@ class Animeler : AnimeHttpSource(), ConfigurableAnimeSource {
} }
// =========================== Anime Details ============================ // =========================== Anime Details ============================
private inline fun <reified T> Response.parseBody(): T {
val body = use { it.body.string() }
.substringAfter("const anime = ")
.substringBefore("};") + "}"
return json.decodeFromString<T>(body)
}
override fun animeDetailsParse(response: Response) = SAnime.create().apply { override fun animeDetailsParse(response: Response) = SAnime.create().apply {
val body = response.use { it.body.string() } val animeDto = response.parseBody<FullAnimeDto>()
.substringAfter("var anime = ")
.substringBefore("}<") + "}"
val animeDto = json.decodeFromString<FullAnimeDto>(body)
setUrlWithoutDomain(animeDto.url) setUrlWithoutDomain(animeDto.url)
thumbnail_url = animeDto.image thumbnail_url = animeDto.thumbnail
title = animeDto.title title = animeDto.title
artist = animeDto.studios artist = animeDto.studios
author = animeDto.producers author = animeDto.producers
@ -195,13 +200,9 @@ class Animeler : AnimeHttpSource(), ConfigurableAnimeSource {
// ============================== Episodes ============================== // ============================== Episodes ==============================
override fun episodeListParse(response: Response): List<SEpisode> { override fun episodeListParse(response: Response): List<SEpisode> {
val body = response.use { it.body.string() } val episodes = response.parseBody<AnimeEpisodes>().episodes
.substringAfter("var episodes = ")
.substringBefore("];") + "]"
val episodes = json.decodeFromString<List<EpisodeDto>>(body) return episodes.map {
return episodes.reversed().map {
SEpisode.create().apply { SEpisode.create().apply {
setUrlWithoutDomain(it.url) setUrlWithoutDomain(it.url)
name = "Bölüm " + it.meta.number name = "Bölüm " + it.meta.number

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.animeextension.tr.animeler.dto
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonPrimitive
@Serializable @Serializable
data class SearchResponseDto( data class SearchResponseDto(
@ -15,12 +16,19 @@ data class PostDto(
val post_content: String? = null, val post_content: String? = null,
) )
@Serializable
data class ThumbnailDto(private val featured_url: JsonPrimitive) {
val url = if (featured_url.isString) featured_url.content else null
}
@Serializable @Serializable
data class SimpleAnimeDto( data class SimpleAnimeDto(
val url: String, val url: String,
val image: String,
val post: PostDto, val post: PostDto,
private val image: String = "",
private val images: ThumbnailDto? = null,
) { ) {
val thumbnail = image.ifEmpty { images?.url }
val title = post.post_title val title = post.post_title
} }
@ -49,12 +57,13 @@ data class SingleDto(
@Serializable @Serializable
data class FullAnimeDto( data class FullAnimeDto(
val url: String, val url: String,
val image: String,
val post: PostDto, val post: PostDto,
val meta: MetaDto, val meta: MetaDto,
private val taxonomies: TaxonomiesDto, private val taxonomies: TaxonomiesDto,
private val image: String = "",
private val images: ThumbnailDto? = null,
) { ) {
val thumbnail = image.ifEmpty { images?.url }
val title = post.post_title val title = post.post_title
@Serializable @Serializable
@ -85,6 +94,9 @@ data class ItemDto(val name: String)
private fun List<ItemDto>.parseItems() = joinToString { it.name }.takeIf(String::isNotBlank) private fun List<ItemDto>.parseItems() = joinToString { it.name }.takeIf(String::isNotBlank)
@Serializable
data class AnimeEpisodes(val episodes: List<EpisodeDto>)
@Serializable @Serializable
data class EpisodeDto( data class EpisodeDto(
val url: String, val url: String,