Manga TV: decode image links, skip redirect (#10661)

* Manga TV: decode image links, skip redirect

* fix basic search
This commit is contained in:
Vetle Ledaal 2025-09-26 07:33:13 +02:00 committed by Draff
parent 1e32eb651c
commit 9b49a7d4f1
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 31 additions and 5 deletions

View File

@ -2,9 +2,13 @@ ext {
extName = 'Manga TV' extName = 'Manga TV'
extClass = '.MangaTV' extClass = '.MangaTV'
themePkg = 'mangathemesia' themePkg = 'mangathemesia'
baseUrl = 'https://www.mangatv.net' baseUrl = 'https://mangatv.net'
overrideVersionCode = 0 overrideVersionCode = 1
isNsfw = true isNsfw = true
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"
dependencies {
implementation(project(':lib:unpacker'))
}

View File

@ -1,16 +1,22 @@
package eu.kanade.tachiyomi.extension.es.mangatv package eu.kanade.tachiyomi.extension.es.mangatv
import android.util.Base64
import eu.kanade.tachiyomi.lib.unpacker.Unpacker
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
class MangaTV : MangaThemesia( class MangaTV : MangaThemesia(
"Manga TV", "Manga TV",
"https://www.mangatv.net", "https://mangatv.net",
"es", "es",
mangaUrlDirectory = "/lista", mangaUrlDirectory = "/lista",
dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.ROOT), dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.ROOT),
@ -19,17 +25,33 @@ class MangaTV : MangaThemesia(
override val seriesDescriptionSelector = "b:contains(Sinopsis) + span" override val seriesDescriptionSelector = "b:contains(Sinopsis) + span"
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
val imageListJson = JSON_IMAGE_LIST_REGEX.find(document.toString())?.destructured?.toList()?.get(0).orEmpty() val unpackedScript = document.selectFirst("script:containsData(eval)")!!.data()
.let(Unpacker::unpack)
val imageListJson = JSON_IMAGE_LIST_REGEX.find(unpackedScript)?.destructured?.toList()?.get(0).orEmpty()
val imageList = try { val imageList = try {
json.parseToJsonElement(imageListJson.replace(TRAILING_COMMA_REGEX, "]")).jsonArray json.parseToJsonElement(imageListJson.replace(TRAILING_COMMA_REGEX, "]")).jsonArray
} catch (_: IllegalArgumentException) { } catch (_: IllegalArgumentException) {
emptyList() emptyList()
} }
return imageList.mapIndexed { i, jsonEl -> return imageList.mapIndexed { i, jsonEl ->
Page(i, imageUrl = "https:${jsonEl.jsonPrimitive.content}") val encodedLink = jsonEl.jsonPrimitive.content
val decodedLink = String(Base64.decode(encodedLink, Base64.DEFAULT))
Page(i, imageUrl = "https:$decodedLink")
} }
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = baseUrl.toHttpUrl().newBuilder()
.addPathSegment(mangaUrlDirectory.substring(1))
.addQueryParameter("s", query)
.addQueryParameter("page", page.toString())
return GET(url.build(), headers)
}
// TODO: add demografia, order, tipos, genre
override fun getFilterList() = FilterList()
companion object { companion object {
val TRAILING_COMMA_REGEX = """,\s+]""".toRegex() val TRAILING_COMMA_REGEX = """,\s+]""".toRegex()
} }