MangaTaro: unescape title & get thumbnail directly (#11273)

* MangaTaro: use `_embed` on /wp-json/ endpoint

- saves a network call to get thumbnail

* unescape entities
This commit is contained in:
AwkwardPeak7 2025-10-28 19:36:43 +05:00 committed by Draff
parent f5429b887f
commit 5f6e00499a
Signed by: Draff
GPG Key ID: E8A89F3211677653
3 changed files with 27 additions and 19 deletions

View File

@ -1,7 +1,7 @@
ext {
extName = 'MangaTaro'
extClass = '.MangaTaro'
extVersionCode = 2
extVersionCode = 3
isNsfw = false
}

View File

@ -79,10 +79,10 @@ class MangaDetails(
val slug: String,
val title: Rendered,
val content: Rendered,
@SerialName("featured_media")
val featuredMedia: Int,
@SerialName("class_list")
private val classList: List<String>,
@SerialName("_embedded")
val embedded: Embedded,
) {
fun getFromClassList(type: String): List<String> {
return classList.filter { it.startsWith("$type-") }
@ -94,6 +94,24 @@ class MangaDetails(
}
}
@Serializable
class Embedded(
@SerialName("wp:featuredmedia")
val featuredMedia: List<Thumbnail>,
@SerialName("wp:term")
private val terms: List<List<Term>>,
) {
fun getTerms(type: String): List<String> {
return terms.find { it.firstOrNull()?.taxonomy == type }.orEmpty().map { it.name }
}
}
@Serializable
class Term(
val name: String,
val taxonomy: String,
)
@Serializable
class Thumbnail(
@SerialName("source_url")

View File

@ -21,6 +21,7 @@ import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.jsoup.Jsoup
import org.jsoup.parser.Parser
import rx.Observable
import java.lang.UnsupportedOperationException
import java.util.Calendar
@ -193,6 +194,7 @@ class MangaTaro : HttpSource() {
val url = baseUrl.toHttpUrl().newBuilder().apply {
addPathSegments("wp-json/wp/v2/manga")
addPathSegment(id)
addQueryParameter("_embed", null)
fragment(status.toString())
}.build()
@ -201,34 +203,22 @@ class MangaTaro : HttpSource() {
override fun mangaDetailsParse(response: Response): SManga {
val data = response.parseAs<MangaDetails>()
val thumbnail = getThumbnail(data.featuredMedia)
return SManga.create().apply {
url = MangaUrl(data.id.toString(), data.slug).toJsonString()
title = data.title.rendered
title = Parser.unescapeEntities(data.title.rendered, false)
description = Jsoup.parseBodyFragment(data.content.rendered).wholeText()
genre = buildSet {
addAll(data.getFromClassList("tag"))
addAll(data.embedded.getTerms("post_tag"))
addAll(data.getFromClassList("type"))
}.joinToString()
author = data.getFromClassList("manga_author").joinToString()
author = data.embedded.getTerms("manga_author").joinToString()
status = response.request.url.fragment!!.toInt()
thumbnail_url = thumbnail
thumbnail_url = data.embedded.featuredMedia.firstOrNull()?.url
initialized = true
}
}
private fun getThumbnail(mediaId: Int): String {
val url = baseUrl.toHttpUrl().newBuilder().apply {
addPathSegments("wp-json/wp/v2/media")
addPathSegment(mediaId.toString())
}.build()
return client.newCall(GET(url, headers)).execute()
.parseAs<Thumbnail>()
.url
}
override fun getMangaUrl(manga: SManga): String {
val slug = manga.url.parseAs<MangaUrl>().slug