DragonTranslation.net (ES): Migrate to HttpSource (#7629)

* fix extension

* fix details

* migrate to ParsedHttpSource

* migrate to HttpSource

* Update src/es/dragontranslationnet/src/eu/kanade/tachiyomi/extension/es/dragontranslationnet/DragonTranslationNet.kt

Co-authored-by: Vetle Ledaal <vetle.ledaal@gmail.com>

---------

Co-authored-by: Vetle Ledaal <vetle.ledaal@gmail.com>
This commit is contained in:
dngonz 2025-02-16 10:31:09 +01:00 committed by Draff
parent 78a055915d
commit 7408c2e05a
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 68 additions and 41 deletions

View File

@ -1,9 +1,7 @@
ext { ext {
extName = 'DragonTranslation.net' extName = 'DragonTranslation.net'
extClass = '.DragonTranslationNet' extClass = '.DragonTranslationNet'
themePkg = 'madara' extVersionCode = 40
baseUrl = 'https://dragontranslation.net'
overrideVersionCode = 0
isNsfw = true isNsfw = true
} }

View File

@ -1,34 +1,48 @@
package eu.kanade.tachiyomi.extension.es.dragontranslationnet package eu.kanade.tachiyomi.extension.es.dragontranslationnet
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
class DragonTranslationNet : Madara("DragonTranslation.net", "https://dragontranslation.net", "es") { open class DragonTranslationNet : HttpSource() {
override val name = "DragonTranslation.net"
override val baseUrl = "https://dragontranslation.net"
override val lang = "es"
override val supportsLatest = true
// Popular
override fun popularMangaRequest(page: Int): Request { override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/mangas?page=$page", headers) return GET("$baseUrl/mangas?page=$page", headers)
} }
override fun popularMangaSelector() = "div:has(> div.series-card)" override fun popularMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
override fun popularMangaNextPageSelector() = "li.page-item a[rel=next]" val entries = document.select("article.card").map {
SManga.create().apply {
override fun popularMangaFromElement(element: Element) = SManga.create().apply { setUrlWithoutDomain(it.selectFirst("a.lanzador")!!.attr("href"))
setUrlWithoutDomain(element.select("div.series-box a").attr("href")) thumbnail_url = it.selectFirst("img")?.attr("abs:src")
thumbnail_url = element.select("img.thumb-img").attr("abs:src") title = it.selectFirst("h2")!!.text()
title = element.select(".series-title").text()
} }
}
val hasNextPage = document.selectFirst("li.page-item a[rel=next]") != null
return MangasPage(entries, hasNextPage)
}
// Latest
override fun latestUpdatesRequest(page: Int): Request { override fun latestUpdatesRequest(page: Int): Request {
return GET(baseUrl, headers) return GET(baseUrl, headers)
@ -36,49 +50,54 @@ class DragonTranslationNet : Madara("DragonTranslation.net", "https://dragontran
override fun latestUpdatesParse(response: Response): MangasPage { override fun latestUpdatesParse(response: Response): MangasPage {
val document = response.asJsoup() val document = response.asJsoup()
val latestMangaContainer = document.selectFirst("div.d-flex:has(div.series-card)") val mangaList = document.select("div#pills-home:lt(1) article").map {
val mangaList = latestMangaContainer!!.select("> div").map { element ->
SManga.create().apply { SManga.create().apply {
setUrlWithoutDomain(element.select("div.series-box a").attr("href")) setUrlWithoutDomain(it.selectFirst("a[rel=bookmark]")!!.attr("href"))
title = element.select(".series-title").text() title = it.selectFirst("h2")!!.text()
thumbnail_url = element.select("img.thumb-img").attr("abs:src") thumbnail_url = it.selectFirst("img")?.attr("abs:src")
} }
} }
return MangasPage(mangaList, false) return MangasPage(mangaList, false)
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { // Search
val url = baseUrl.toHttpUrl().newBuilder()
.addPathSegment("mangas")
.addQueryParameter("buscar", query)
.addQueryParameter("page", page.toString())
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = baseUrl.toHttpUrl().newBuilder().addPathSegment("mangas")
.addQueryParameter("buscar", query).addQueryParameter("page", page.toString())
return GET(url.build(), headers) return GET(url.build(), headers)
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response)
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) // Chapters
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup()
override fun getFilterList() = FilterList(emptyList()) return document.select("ul.list-group a").map {
SChapter.create().apply {
override fun chapterFromElement(element: Element): SChapter { name = it.selectFirst("li")!!.text()
val chapter = SChapter.create() setUrlWithoutDomain(it.attr("abs:href"))
}
with(element) {
select(chapterUrlSelector).first()?.let { urlElement ->
chapter.url = urlElement.attr("abs:href")
chapter.name = urlElement.select("p.chapter-manhwa-title").text()
chapter.date_upload = parseChapterDate(select("span.chapter-release-date").text())
} }
} }
return chapter // Details
override fun mangaDetailsParse(response: Response): SManga {
val document = response.asJsoup()
val infoRow = document.selectFirst("div.section-main > div.row")
return SManga.create().apply {
description = infoRow?.selectFirst("> :eq(1)")?.ownText()
status = infoRow?.selectFirst("p:contains(Status) > a").parseStatus()
genre = infoRow?.select("p:contains(Tag(s)) a")?.joinToString { it.text() }
}
} }
override fun pageListParse(document: Document): List<Page> { // Pages
override fun pageListParse(response: Response): List<Page> {
val document = response.asJsoup()
return document.select("div#chapter_imgs img").mapIndexed { index, element -> return document.select("div#chapter_imgs img").mapIndexed { index, element ->
Page( Page(
index, index,
@ -87,4 +106,14 @@ class DragonTranslationNet : Madara("DragonTranslation.net", "https://dragontran
) )
} }
} }
override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException()
// Helpers
private fun Element?.parseStatus(): Int = when (this?.text()?.lowercase()) {
"publishing", "ongoing" -> SManga.ONGOING
"ended" -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
} }