Create NetTruyenUU.kt
parent
7d71421c30
commit
78d64713a2
@ -0,0 +1,133 @@
|
||||
package org.koitharu.kotatsu.parsers.site.wpcomics.vi
|
||||
|
||||
import androidx.collection.ArrayMap
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.exception.NotFoundException
|
||||
import org.koitharu.kotatsu.parsers.model.*
|
||||
import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.util.*
|
||||
|
||||
@MangaSourceParser("NETTRUYENUU", "NetTruyenUU", "vi")
|
||||
internal class NetTruyenUU(context: MangaLoaderContext) :
|
||||
WpComicsParser(context, MangaParserSource.NETTRUYENUU, "nettruyenuu.com", 20) {
|
||||
|
||||
override val listUrl = "/tim-kiem-nang-cao"
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
||||
SortOrder.UPDATED,
|
||||
SortOrder.POPULARITY,
|
||||
SortOrder.RATING,
|
||||
SortOrder.NEWEST,
|
||||
SortOrder.ALPHABETICAL,
|
||||
SortOrder.ALPHABETICAL_DESC,
|
||||
)
|
||||
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = super.filterCapabilities.copy(
|
||||
isMultipleTagsSupported = true,
|
||||
isTagsExclusionSupported = true,
|
||||
)
|
||||
|
||||
override suspend fun getFilterOptions() = super.getFilterOptions().copy(
|
||||
availableStates = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED),
|
||||
)
|
||||
|
||||
override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List<Manga> {
|
||||
val response =
|
||||
when {
|
||||
!filter.query.isNullOrEmpty() -> {
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
append("/search")
|
||||
append('/')
|
||||
append(page.toString())
|
||||
append('/')
|
||||
append("?keyword=")
|
||||
append(filter.query.urlEncoded())
|
||||
}
|
||||
|
||||
val result = runCatchingCancellable { webClient.httpGet(url) }
|
||||
val exception = result.exceptionOrNull()
|
||||
if (exception is NotFoundException) {
|
||||
return emptyList()
|
||||
}
|
||||
result.getOrThrow()
|
||||
}
|
||||
|
||||
else -> {
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
append(listUrl)
|
||||
|
||||
append('/')
|
||||
append(page.toString())
|
||||
append('/')
|
||||
|
||||
val tagQuery = filter.tags.joinToString(",") { it.key }
|
||||
append("?genres=")
|
||||
append(tagQuery)
|
||||
|
||||
val tagQueryExclude = filter.tagsExclude.joinToString(",") { it.key }
|
||||
append("¬Genres=")
|
||||
append(tagQueryExclude)
|
||||
|
||||
append("&sex=All")
|
||||
|
||||
filter.states.oneOrThrowIfMany()?.let {
|
||||
append("&status=")
|
||||
append(
|
||||
when (it) {
|
||||
MangaState.ONGOING -> "on-going"
|
||||
MangaState.FINISHED -> "completed"
|
||||
MangaState.PAUSED -> "on-hold"
|
||||
MangaState.ABANDONED -> "canceled"
|
||||
else -> "-1"
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
append("&chapter_count=0")
|
||||
|
||||
append("&sort=")
|
||||
append(
|
||||
when (order) {
|
||||
SortOrder.UPDATED -> "latest-updated"
|
||||
SortOrder.POPULARITY -> "views"
|
||||
SortOrder.NEWEST -> "new"
|
||||
SortOrder.RATING -> "score"
|
||||
SortOrder.ALPHABETICAL -> "az"
|
||||
SortOrder.ALPHABETICAL_DESC -> "za"
|
||||
else -> null
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
webClient.httpGet(url)
|
||||
}
|
||||
}
|
||||
|
||||
val tagMap = getOrCreateTagMap()
|
||||
return parseMangaList(response.parseHtml(), tagMap)
|
||||
}
|
||||
|
||||
override suspend fun getOrCreateTagMap(): ArrayMap<String, MangaTag> = mutex.withLock {
|
||||
tagCache?.let { return@withLock it }
|
||||
val doc = webClient.httpGet(listUrl.toAbsoluteUrl(domain)).parseHtml()
|
||||
val tagItems = doc.select("div.genre-item")
|
||||
val result = ArrayMap<String, MangaTag>(tagItems.size)
|
||||
for (item in tagItems) {
|
||||
val title = item.text()
|
||||
val key = item.selectFirstOrThrow("span").attr("data-id")
|
||||
if (key.isNotEmpty() && title.isNotEmpty()) {
|
||||
result[title] = MangaTag(title = title, key = key, source = source)
|
||||
}
|
||||
}
|
||||
tagCache = result
|
||||
result
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue