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:
parent
f5429b887f
commit
5f6e00499a
@ -1,7 +1,7 @@
|
|||||||
ext {
|
ext {
|
||||||
extName = 'MangaTaro'
|
extName = 'MangaTaro'
|
||||||
extClass = '.MangaTaro'
|
extClass = '.MangaTaro'
|
||||||
extVersionCode = 2
|
extVersionCode = 3
|
||||||
isNsfw = false
|
isNsfw = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -79,10 +79,10 @@ class MangaDetails(
|
|||||||
val slug: String,
|
val slug: String,
|
||||||
val title: Rendered,
|
val title: Rendered,
|
||||||
val content: Rendered,
|
val content: Rendered,
|
||||||
@SerialName("featured_media")
|
|
||||||
val featuredMedia: Int,
|
|
||||||
@SerialName("class_list")
|
@SerialName("class_list")
|
||||||
private val classList: List<String>,
|
private val classList: List<String>,
|
||||||
|
@SerialName("_embedded")
|
||||||
|
val embedded: Embedded,
|
||||||
) {
|
) {
|
||||||
fun getFromClassList(type: String): List<String> {
|
fun getFromClassList(type: String): List<String> {
|
||||||
return classList.filter { it.startsWith("$type-") }
|
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
|
@Serializable
|
||||||
class Thumbnail(
|
class Thumbnail(
|
||||||
@SerialName("source_url")
|
@SerialName("source_url")
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import okhttp3.Request
|
|||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
|
import org.jsoup.parser.Parser
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import java.lang.UnsupportedOperationException
|
import java.lang.UnsupportedOperationException
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
@ -193,6 +194,7 @@ class MangaTaro : HttpSource() {
|
|||||||
val url = baseUrl.toHttpUrl().newBuilder().apply {
|
val url = baseUrl.toHttpUrl().newBuilder().apply {
|
||||||
addPathSegments("wp-json/wp/v2/manga")
|
addPathSegments("wp-json/wp/v2/manga")
|
||||||
addPathSegment(id)
|
addPathSegment(id)
|
||||||
|
addQueryParameter("_embed", null)
|
||||||
fragment(status.toString())
|
fragment(status.toString())
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
@ -201,34 +203,22 @@ class MangaTaro : HttpSource() {
|
|||||||
|
|
||||||
override fun mangaDetailsParse(response: Response): SManga {
|
override fun mangaDetailsParse(response: Response): SManga {
|
||||||
val data = response.parseAs<MangaDetails>()
|
val data = response.parseAs<MangaDetails>()
|
||||||
val thumbnail = getThumbnail(data.featuredMedia)
|
|
||||||
|
|
||||||
return SManga.create().apply {
|
return SManga.create().apply {
|
||||||
url = MangaUrl(data.id.toString(), data.slug).toJsonString()
|
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()
|
description = Jsoup.parseBodyFragment(data.content.rendered).wholeText()
|
||||||
genre = buildSet {
|
genre = buildSet {
|
||||||
addAll(data.getFromClassList("tag"))
|
addAll(data.embedded.getTerms("post_tag"))
|
||||||
addAll(data.getFromClassList("type"))
|
addAll(data.getFromClassList("type"))
|
||||||
}.joinToString()
|
}.joinToString()
|
||||||
author = data.getFromClassList("manga_author").joinToString()
|
author = data.embedded.getTerms("manga_author").joinToString()
|
||||||
status = response.request.url.fragment!!.toInt()
|
status = response.request.url.fragment!!.toInt()
|
||||||
thumbnail_url = thumbnail
|
thumbnail_url = data.embedded.featuredMedia.firstOrNull()?.url
|
||||||
initialized = true
|
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 {
|
override fun getMangaUrl(manga: SManga): String {
|
||||||
val slug = manga.url.parseAs<MangaUrl>().slug
|
val slug = manga.url.parseAs<MangaUrl>().slug
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user