Add new filter on sources
Url GekkouScans, SssScanlator Add LunarScan #435
This commit is contained in:
@@ -35,7 +35,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
|
||||
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java)
|
||||
|
||||
override val isTagsExclusionSupported = true
|
||||
override val isTagsExclusionSupported: Boolean = true
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = EnumSet.of(ContentRating.SAFE)
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
|
||||
override val availableStates: Set<MangaState> =
|
||||
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
||||
|
||||
override val isTagsExclusionSupported = true
|
||||
override val isTagsExclusionSupported: Boolean = true
|
||||
|
||||
|
||||
override suspend fun getList(offset: Int, filter: MangaListFilter?): List<Manga> {
|
||||
|
||||
@@ -22,7 +22,7 @@ internal class MangaPark(context: MangaLoaderContext) :
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = EnumSet.of(ContentRating.SAFE)
|
||||
|
||||
override val isTagsExclusionSupported = true
|
||||
override val isTagsExclusionSupported: Boolean = true
|
||||
|
||||
override val configKeyDomain = ConfigKey.Domain("mangapark.net")
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@ internal abstract class NineMangaParser(
|
||||
MangaState.FINISHED,
|
||||
)
|
||||
|
||||
override val isTagsExclusionSupported: Boolean = true
|
||||
|
||||
override fun intercept(chain: Interceptor.Chain): Response {
|
||||
val request = chain.request()
|
||||
val newRequest = if (request.url.host == domain) {
|
||||
@@ -64,12 +66,13 @@ internal abstract class NineMangaParser(
|
||||
}
|
||||
|
||||
is MangaListFilter.Advanced -> {
|
||||
if (filter.tags.isNotEmpty()) {
|
||||
|
||||
if (filter.tags.isNotEmpty() || filter.tagsExclude.isNotEmpty() || filter.states.isNotEmpty()) {
|
||||
append("/search/?category_id=")
|
||||
for (tag in filter.tags) {
|
||||
append(tag.key)
|
||||
append(',')
|
||||
}
|
||||
append(filter.tags.joinToString(separator = ",") { it.key })
|
||||
|
||||
append("&out_category_id=")
|
||||
append(filter.tagsExclude.joinToString(separator = ",") { it.key })
|
||||
|
||||
filter.states.oneOrThrowIfMany()?.let {
|
||||
append("&completed_series=")
|
||||
@@ -81,20 +84,9 @@ internal abstract class NineMangaParser(
|
||||
}
|
||||
append("&page=")
|
||||
} else {
|
||||
append("/category/")
|
||||
if (filter.states.isNotEmpty()) {
|
||||
filter.states.oneOrThrowIfMany()?.let {
|
||||
when (it) {
|
||||
MangaState.ONGOING -> append("updated_")
|
||||
MangaState.FINISHED -> append("completed_")
|
||||
else -> append("either")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
append("index_")
|
||||
}
|
||||
append("/category/index_")
|
||||
}
|
||||
append(page)
|
||||
append(page.toString())
|
||||
append(".html")
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
||||
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java)
|
||||
override val availableContentRating: Set<ContentRating> = EnumSet.of(ContentRating.ADULT)
|
||||
override val configKeyDomain = ConfigKey.Domain("flixscans.com")
|
||||
|
||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||
@@ -40,7 +41,7 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
|
||||
append("https://api.")
|
||||
append(domain)
|
||||
append("/api/v1/")
|
||||
if (filter.tags.isNotEmpty() || filter.states.isNotEmpty()) {
|
||||
if (filter.tags.isNotEmpty() || filter.states.isNotEmpty() || filter.contentRating.isNotEmpty()) {
|
||||
if (page > 1) {
|
||||
return emptyList()
|
||||
}
|
||||
@@ -64,6 +65,16 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
filter.contentRating.oneOrThrowIfMany()?.let {
|
||||
append("&adult=")
|
||||
append(
|
||||
when (it) {
|
||||
ContentRating.ADULT -> "true"
|
||||
else -> ""
|
||||
},
|
||||
)
|
||||
}
|
||||
append("&serie_type=webtoon")
|
||||
|
||||
} else {
|
||||
|
||||
@@ -32,7 +32,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
override val availableStates: Set<MangaState> =
|
||||
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
||||
|
||||
override val isTagsExclusionSupported = true
|
||||
override val isTagsExclusionSupported: Boolean = true
|
||||
|
||||
init {
|
||||
paginator.firstPage = 0
|
||||
|
||||
@@ -35,6 +35,8 @@ internal abstract class MadaraParser(
|
||||
|
||||
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java)
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = EnumSet.of(ContentRating.SAFE, ContentRating.ADULT)
|
||||
|
||||
protected open val tagPrefix = "manga-genre/"
|
||||
protected open val datePattern = "MMMM d, yyyy"
|
||||
protected open val stylePage = "?style=list"
|
||||
@@ -215,6 +217,18 @@ internal abstract class MadaraParser(
|
||||
MangaState.UPCOMING -> append("upcoming")
|
||||
}
|
||||
}
|
||||
|
||||
filter.contentRating.oneOrThrowIfMany()?.let {
|
||||
append("&adult=")
|
||||
append(
|
||||
when (it) {
|
||||
ContentRating.SAFE -> "0"
|
||||
ContentRating.ADULT -> "1"
|
||||
else -> ""
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
append("&")
|
||||
}
|
||||
|
||||
@@ -279,6 +293,16 @@ internal abstract class MadaraParser(
|
||||
MangaState.UPCOMING -> "upcoming"
|
||||
}
|
||||
}
|
||||
|
||||
filter.contentRating.oneOrThrowIfMany()?.let {
|
||||
payload["vars[meta_query][0][1][key]"] = "manga_adult_content"
|
||||
payload["vars[meta_query][0][1][value]"] =
|
||||
when (it) {
|
||||
ContentRating.SAFE -> ""
|
||||
ContentRating.ADULT -> "a%3A1%3A%7Bi%3A0%3Bs%3A3%3A%22yes%22%3B%7D"
|
||||
else -> ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
null -> {
|
||||
|
||||
@@ -25,6 +25,8 @@ internal class Manga18Fx(context: MangaLoaderContext) :
|
||||
searchPaginator.firstPage = 1
|
||||
}
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
|
||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||
|
||||
@@ -26,6 +26,8 @@ internal class Manhwa18Cc(context: MangaLoaderContext) :
|
||||
searchPaginator.firstPage = 1
|
||||
}
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
|
||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentRating
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
import org.koitharu.kotatsu.parsers.model.Manga
|
||||
import org.koitharu.kotatsu.parsers.model.MangaListFilter
|
||||
@@ -23,8 +24,6 @@ internal class Hentai4Free(context: MangaLoaderContext) :
|
||||
override val datePattern = "MMMM dd, yyyy"
|
||||
override val selectGenre = "div.tags-content a"
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
searchPaginator.firstPage = 1
|
||||
@@ -54,14 +53,41 @@ internal class Hentai4Free(context: MangaLoaderContext) :
|
||||
append("page/")
|
||||
append(page.toString())
|
||||
}
|
||||
append("/?")
|
||||
} else {
|
||||
if (page > 1) {
|
||||
append("/page/")
|
||||
append(page.toString())
|
||||
}
|
||||
|
||||
append("/?s&post_type=wp-manga")
|
||||
|
||||
filter.contentRating.oneOrThrowIfMany()?.let {
|
||||
append("&adult=")
|
||||
append(
|
||||
when (it) {
|
||||
ContentRating.SAFE -> "0"
|
||||
ContentRating.ADULT -> "1"
|
||||
else -> ""
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
filter.states.forEach {
|
||||
append("&status[]=")
|
||||
when (it) {
|
||||
MangaState.ONGOING -> append("on-going")
|
||||
MangaState.FINISHED -> append("end")
|
||||
MangaState.ABANDONED -> append("canceled")
|
||||
MangaState.PAUSED -> append("on-hold")
|
||||
MangaState.UPCOMING -> append("upcoming")
|
||||
}
|
||||
}
|
||||
|
||||
append("&")
|
||||
}
|
||||
|
||||
append("/?m_orderby=")
|
||||
append("m_orderby=")
|
||||
when (filter.sortOrder) {
|
||||
SortOrder.POPULARITY -> append("views")
|
||||
SortOrder.UPDATED -> append("latest")
|
||||
@@ -70,6 +96,8 @@ internal class Hentai4Free(context: MangaLoaderContext) :
|
||||
SortOrder.RATING -> append("rating")
|
||||
else -> append("latest")
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
null -> {
|
||||
|
||||
@@ -16,14 +16,13 @@ internal class InstaManhwa(context: MangaLoaderContext) :
|
||||
override val listUrl = "latest/"
|
||||
override val postReq = true
|
||||
override val datePattern = "d MMMM, yyyy"
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
||||
SortOrder.ALPHABETICAL,
|
||||
SortOrder.UPDATED,
|
||||
SortOrder.NEWEST,
|
||||
)
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
|
||||
@@ -16,13 +16,12 @@ internal class IsekaiScan(context: MangaLoaderContext) :
|
||||
override val tagPrefix = "mangas/"
|
||||
override val listUrl = "latest-manga/"
|
||||
override val datePattern = "MMMM d, HH:mm"
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
||||
SortOrder.POPULARITY,
|
||||
SortOrder.UPDATED,
|
||||
)
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
|
||||
@@ -64,6 +64,18 @@ internal class IsekaiScanEuParser(context: MangaLoaderContext) :
|
||||
MangaState.UPCOMING -> append("upcoming")
|
||||
}
|
||||
}
|
||||
|
||||
filter.contentRating.oneOrThrowIfMany()?.let {
|
||||
append("&adult=")
|
||||
append(
|
||||
when (it) {
|
||||
ContentRating.SAFE -> "0"
|
||||
ContentRating.ADULT -> "1"
|
||||
else -> ""
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
append("&")
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ internal class MangaDass(context: MangaLoaderContext) :
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
searchPaginator.firstPage = 1
|
||||
|
||||
@@ -18,7 +18,8 @@ internal class MangaDna(context: MangaLoaderContext) :
|
||||
override val withoutAjax = true
|
||||
override val selectDesc = "div.dsct"
|
||||
override val selectChapter = "li.a-h"
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||
val url = buildString {
|
||||
|
||||
@@ -21,7 +21,9 @@ internal class MangaPure(context: MangaLoaderContext) :
|
||||
SortOrder.UPDATED,
|
||||
)
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
|
||||
@@ -16,7 +16,9 @@ internal class Manhwaz(context: MangaLoaderContext) :
|
||||
override val withoutAjax = true
|
||||
override val selectTestAsync = "div.list-chapter"
|
||||
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
|
||||
SortOrder.UPDATED,
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.parsers.site.madara.es
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentRating
|
||||
import org.koitharu.kotatsu.parsers.model.Manga
|
||||
import org.koitharu.kotatsu.parsers.model.MangaListFilter
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
@@ -16,7 +17,8 @@ internal class DragonTranslationParser(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.DRAGONTRANSLATION, "dragontranslation.net", 30) {
|
||||
override val selectPage = "div#chapter_imgs img"
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
|
||||
@@ -17,7 +17,8 @@ internal class TmoManga(context: MangaLoaderContext) :
|
||||
override val selectGenre = "div.summary-content a.tags_manga"
|
||||
override val withoutAjax = true
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.POPULARITY)
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
|
||||
init {
|
||||
paginator.firstPage = 1
|
||||
|
||||
@@ -17,7 +17,8 @@ internal class ManhwaHub(context: MangaLoaderContext) :
|
||||
override val withoutAjax = true
|
||||
override val listUrl = "genre/manhwa"
|
||||
override val selectTestAsync = "ul.box-list-chapter"
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
|
||||
|
||||
init {
|
||||
|
||||
@@ -9,6 +9,6 @@ import java.util.Locale
|
||||
|
||||
@MangaSourceParser("GEKKOUSCANS", "GekkouScans", "pt", ContentType.HENTAI)
|
||||
internal class GekkouScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.GEKKOUSCANS, "gekkouscans.top") {
|
||||
MadaraParser(context, MangaSource.GEKKOUSCANS, "gekkou.site") {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.pt
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("LUNARSCAN", "LunarScan", "pt")
|
||||
internal class LunarScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.LUNARSCAN, "lunarscan.com.br") {
|
||||
override val listUrl = "obra/"
|
||||
}
|
||||
@@ -16,7 +16,8 @@ internal class Saytruyenhay(context: MangaLoaderContext) :
|
||||
override val tagPrefix = "genre/"
|
||||
override val withoutAjax = true
|
||||
override val listUrl = "public/genre/manga/"
|
||||
override val availableStates: Set<MangaState> get() = emptySet()
|
||||
override val availableStates: Set<MangaState> = emptySet()
|
||||
override val availableContentRating: Set<ContentRating> = emptySet()
|
||||
override val availableSortOrders: Set<SortOrder> =
|
||||
EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.RATING, SortOrder.NEWEST)
|
||||
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("SSSSCANLATOR", "SssScanlator", "pt")
|
||||
internal class SssScanlator(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.SSSSCANLATOR, "sssscanlator.com", pageSize = 20, searchPageSize = 10)
|
||||
MangaReaderParser(context, MangaSource.SSSSCANLATOR, "sssscanlator.com.br", pageSize = 20, searchPageSize = 10)
|
||||
|
||||
Reference in New Issue
Block a user