Update dependencies
parent
4a854c7a23
commit
19567f9642
@ -1,5 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
|
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#Wed Aug 27 01:56:37 ICT 2025
|
#Wed Aug 27 01:56:37 ICT 2025
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
|
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@ -1,174 +1,184 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.es
|
package org.koitharu.kotatsu.parsers.site.es
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.parsers.Broken
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.core.PagedMangaParser
|
import org.koitharu.kotatsu.parsers.core.PagedMangaParser
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.util.*
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
import org.koitharu.kotatsu.parsers.Broken
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@Broken // Website closed
|
@Broken // Website closed
|
||||||
@MangaSourceParser("DRAGONTRANSLATION", "Dragon Translation", "es")
|
@MangaSourceParser("DRAGONTRANSLATION", "Dragon Translation", "es")
|
||||||
internal class DragonTranslationParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.DRAGONTRANSLATION, 30) {
|
internal class DragonTranslationParser(context: MangaLoaderContext) :
|
||||||
|
PagedMangaParser(context, MangaParserSource.DRAGONTRANSLATION, 30) {
|
||||||
override val configKeyDomain = ConfigKey.Domain("dragontranslation.net")
|
|
||||||
|
override val configKeyDomain = ConfigKey.Domain("dragontranslation.net")
|
||||||
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
|
||||||
super.onCreateConfig(keys)
|
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
||||||
keys.add(userAgentKey)
|
super.onCreateConfig(keys)
|
||||||
}
|
keys.add(userAgentKey)
|
||||||
|
}
|
||||||
override fun getRequestHeaders() = super.getRequestHeaders().newBuilder()
|
|
||||||
.add("referer", "no-referrer")
|
override fun getRequestHeaders() = super.getRequestHeaders().newBuilder()
|
||||||
.build()
|
.add("referer", "no-referrer")
|
||||||
|
.build()
|
||||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
|
||||||
|
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
||||||
override val filterCapabilities: MangaListFilterCapabilities
|
|
||||||
get() = MangaListFilterCapabilities(
|
override val filterCapabilities: MangaListFilterCapabilities
|
||||||
isSearchSupported = true,
|
get() = MangaListFilterCapabilities(
|
||||||
)
|
isSearchSupported = true,
|
||||||
|
)
|
||||||
override suspend fun getFilterOptions() = MangaListFilterOptions(
|
|
||||||
availableTags = emptySet(), // cant find any URLs for fetch tags
|
override suspend fun getFilterOptions() = MangaListFilterOptions(
|
||||||
availableContentTypes = EnumSet.of(ContentType.MANGA, ContentType.MANHWA, ContentType.MANHUA),
|
availableTags = emptySet(), // cant find any URLs for fetch tags
|
||||||
)
|
availableContentTypes = EnumSet.of(ContentType.MANGA, ContentType.MANHWA, ContentType.MANHUA),
|
||||||
|
)
|
||||||
override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List<Manga> {
|
|
||||||
val url = buildString {
|
override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List<Manga> {
|
||||||
append("https://")
|
val url = buildString {
|
||||||
append(domain)
|
append("https://")
|
||||||
when {
|
append(domain)
|
||||||
!filter.query.isNullOrEmpty() -> {
|
when {
|
||||||
append("/mangas?buscar=")
|
!filter.query.isNullOrEmpty() -> {
|
||||||
append(filter.query.urlEncoded())
|
append("/mangas?buscar=")
|
||||||
append("&page=")
|
append(filter.query.urlEncoded())
|
||||||
append(page.toString())
|
append("&page=")
|
||||||
}
|
append(page.toString())
|
||||||
|
}
|
||||||
else -> {
|
|
||||||
append("/mangas?page=")
|
else -> {
|
||||||
append(page.toString())
|
append("/mangas?page=")
|
||||||
|
append(page.toString())
|
||||||
val tag = filter.tags.oneOrThrowIfMany()
|
|
||||||
if (filter.tags.isNotEmpty()) {
|
val tag = filter.tags.oneOrThrowIfMany()
|
||||||
append("&tag=")
|
if (filter.tags.isNotEmpty()) {
|
||||||
append(tag?.key.orEmpty())
|
append("&tag=")
|
||||||
}
|
append(tag?.key.orEmpty())
|
||||||
|
}
|
||||||
if (filter.types.isNotEmpty()) {
|
|
||||||
append("&type=")
|
if (filter.types.isNotEmpty()) {
|
||||||
when (filter.types.oneOrThrowIfMany()) {
|
append("&type=")
|
||||||
ContentType.MANGA -> "manga"
|
append(
|
||||||
ContentType.MANHWA -> "manhwa"
|
when (filter.types.oneOrThrowIfMany()) {
|
||||||
ContentType.MANHUA -> "manhua"
|
ContentType.MANGA -> "manga"
|
||||||
else -> ""
|
ContentType.MANHWA -> "manhwa"
|
||||||
}
|
ContentType.MANHUA -> "manhua"
|
||||||
}
|
else -> ""
|
||||||
}
|
},
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
val doc = webClient.httpGet(url).parseHtml()
|
}
|
||||||
val row = doc.select("div.row.gy-3").firstOrNull() ?: return emptyList()
|
}
|
||||||
return row.select("article.position-relative.card").mapNotNull { div ->
|
|
||||||
val href = div.selectFirst("a.lanzador")?.attrAsRelativeUrlOrNull("href") ?: return@mapNotNull null
|
val doc = webClient.httpGet(url).parseHtml()
|
||||||
val coverUrl = div.selectFirst("img.card-img-top.wp-post-image.lazy.loaded")?.src().orEmpty()
|
val row = doc.select("div.row.gy-3").firstOrNull() ?: return emptyList()
|
||||||
Manga(
|
return row.select("article.position-relative.card").mapNotNull { div ->
|
||||||
id = generateUid(href),
|
val href = div.selectFirst("a.lanzador")?.attrAsRelativeUrlOrNull("href") ?: return@mapNotNull null
|
||||||
url = href,
|
val coverUrl = div.selectFirst("img.card-img-top.wp-post-image.lazy.loaded")?.src().orEmpty()
|
||||||
publicUrl = href,
|
Manga(
|
||||||
coverUrl = coverUrl,
|
id = generateUid(href),
|
||||||
title = div.selectFirst("h2.card-title.fs-6.entry-title").text(),
|
url = href,
|
||||||
altTitles = emptySet(),
|
publicUrl = href,
|
||||||
rating = RATING_UNKNOWN,
|
coverUrl = coverUrl,
|
||||||
tags = emptySet(),
|
title = div.selectFirst("h2.card-title.fs-6.entry-title")?.text().orEmpty(),
|
||||||
authors = emptySet(),
|
altTitles = emptySet(),
|
||||||
state = null,
|
rating = RATING_UNKNOWN,
|
||||||
source = source,
|
tags = emptySet(),
|
||||||
contentRating = if (isNsfwSource) ContentRating.ADULT else null,
|
authors = emptySet(),
|
||||||
)
|
state = null,
|
||||||
}
|
source = source,
|
||||||
}
|
contentRating = if (isNsfwSource) ContentRating.ADULT else null,
|
||||||
|
)
|
||||||
override suspend fun getDetails(manga: Manga): Manga {
|
}
|
||||||
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
}
|
||||||
val statusText = doc.selectFirst("p:contains(Status:)")?.text()
|
|
||||||
val status = when {
|
override suspend fun getDetails(manga: Manga): Manga {
|
||||||
statusText?.contains("publishing", ignoreCase = true) == true -> MangaState.ONGOING
|
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||||
else -> null
|
val statusText = doc.selectFirst("p:contains(Status:)")?.text()
|
||||||
}
|
val status = when {
|
||||||
|
statusText?.contains("publishing", ignoreCase = true) == true -> MangaState.ONGOING
|
||||||
val chapterElements = doc.select("ul.list-group a")
|
else -> null
|
||||||
val totalChapters = chapterElements.size
|
}
|
||||||
|
|
||||||
val chapters = chapterElements.mapIndexed { index, a ->
|
val chapterElements = doc.select("ul.list-group a")
|
||||||
val href = a.attrAsRelativeUrl("href")
|
val totalChapters = chapterElements.size
|
||||||
val title = a.text()
|
|
||||||
MangaChapter(
|
val chapters = chapterElements.mapIndexed { index, a ->
|
||||||
id = generateUid(href),
|
val href = a.attrAsRelativeUrl("href")
|
||||||
title = title,
|
val title = a.text()
|
||||||
number = totalChapters - index.toFloat(),
|
MangaChapter(
|
||||||
volume = 0,
|
id = generateUid(href),
|
||||||
url = href,
|
title = title,
|
||||||
scanlator = null,
|
number = totalChapters - index.toFloat(),
|
||||||
uploadDate = parseDate(a.selectFirst("span")?.text()),
|
volume = 0,
|
||||||
branch = null,
|
url = href,
|
||||||
source = source,
|
scanlator = null,
|
||||||
)
|
uploadDate = parseDate(a.selectFirst("span")?.text()),
|
||||||
}
|
branch = null,
|
||||||
|
source = source,
|
||||||
return manga.copy(
|
)
|
||||||
state = status,
|
}
|
||||||
chapters = chapters.reversed(),
|
|
||||||
)
|
return manga.copy(
|
||||||
}
|
state = status,
|
||||||
|
chapters = chapters.reversed(),
|
||||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
)
|
||||||
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
}
|
||||||
val doc = webClient.httpGet(fullUrl).parseHtml()
|
|
||||||
return doc.select("div#chapter_imgs img").map { img ->
|
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
||||||
val url = img.attr("src")
|
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
||||||
MangaPage(
|
val doc = webClient.httpGet(fullUrl).parseHtml()
|
||||||
id = generateUid(url),
|
return doc.select("div#chapter_imgs img").map { img ->
|
||||||
url = url,
|
val url = img.attr("src")
|
||||||
preview = null,
|
MangaPage(
|
||||||
source = source,
|
id = generateUid(url),
|
||||||
)
|
url = url,
|
||||||
}
|
preview = null,
|
||||||
}
|
source = source,
|
||||||
|
)
|
||||||
private fun parseDate(dateText: String?): Long {
|
}
|
||||||
if (dateText == null) return 0
|
}
|
||||||
|
|
||||||
val number = dateText.filter { it.isDigit() }.toIntOrNull() ?: return 0
|
private fun parseDate(dateText: String?): Long {
|
||||||
val now = System.currentTimeMillis()
|
if (dateText == null) return 0
|
||||||
|
|
||||||
return when {
|
val number = dateText.filter { it.isDigit() }.toIntOrNull() ?: return 0
|
||||||
dateText.contains("minutos") -> {
|
val now = System.currentTimeMillis()
|
||||||
now - (number * 60 * 1000L)
|
|
||||||
}
|
return when {
|
||||||
dateText.contains("horas") -> {
|
dateText.contains("minutos") -> {
|
||||||
now - (number * 60 * 60 * 1000L)
|
now - (number * 60 * 1000L)
|
||||||
}
|
}
|
||||||
dateText.contains("días") -> {
|
|
||||||
now - (number * 24 * 60 * 60 * 1000L)
|
dateText.contains("horas") -> {
|
||||||
}
|
now - (number * 60 * 60 * 1000L)
|
||||||
dateText.contains("día") -> {
|
}
|
||||||
now - (number * 24 * 60 * 60 * 1000L)
|
|
||||||
}
|
dateText.contains("días") -> {
|
||||||
dateText.contains("semanas") -> {
|
now - (number * 24 * 60 * 60 * 1000L)
|
||||||
now - (number * 7 * 24 * 60 * 60 * 1000L)
|
}
|
||||||
}
|
|
||||||
dateText.contains("meses") -> {
|
dateText.contains("día") -> {
|
||||||
now - (number * 30 * 24 * 60 * 60 * 1000L)
|
now - (number * 24 * 60 * 60 * 1000L)
|
||||||
}
|
}
|
||||||
dateText.contains("años") -> {
|
|
||||||
now - (number * 365 * 24 * 60 * 60 * 1000L)
|
dateText.contains("semanas") -> {
|
||||||
}
|
now - (number * 7 * 24 * 60 * 60 * 1000L)
|
||||||
else -> 0L
|
}
|
||||||
}
|
|
||||||
}
|
dateText.contains("meses") -> {
|
||||||
|
now - (number * 30 * 24 * 60 * 60 * 1000L)
|
||||||
|
}
|
||||||
|
|
||||||
|
dateText.contains("años") -> {
|
||||||
|
now - (number * 365 * 24 * 60 * 60 * 1000L)
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> 0L
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue