Add new filter on sources

Url GekkouScans, SssScanlator
Add LunarScan #435
pull/421/head^2
devi 2 years ago
parent 3feb84ac9e
commit 704f589b6d

@ -35,7 +35,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java) 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) 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> = override val availableStates: Set<MangaState> =
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED) 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> { 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 availableContentRating: Set<ContentRating> = EnumSet.of(ContentRating.SAFE)
override val isTagsExclusionSupported = true override val isTagsExclusionSupported: Boolean = true
override val configKeyDomain = ConfigKey.Domain("mangapark.net") override val configKeyDomain = ConfigKey.Domain("mangapark.net")

@ -40,6 +40,8 @@ internal abstract class NineMangaParser(
MangaState.FINISHED, MangaState.FINISHED,
) )
override val isTagsExclusionSupported: Boolean = true
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request() val request = chain.request()
val newRequest = if (request.url.host == domain) { val newRequest = if (request.url.host == domain) {
@ -64,12 +66,13 @@ internal abstract class NineMangaParser(
} }
is MangaListFilter.Advanced -> { is MangaListFilter.Advanced -> {
if (filter.tags.isNotEmpty()) {
if (filter.tags.isNotEmpty() || filter.tagsExclude.isNotEmpty() || filter.states.isNotEmpty()) {
append("/search/?category_id=") append("/search/?category_id=")
for (tag in filter.tags) { append(filter.tags.joinToString(separator = ",") { it.key })
append(tag.key)
append(',') append("&out_category_id=")
} append(filter.tagsExclude.joinToString(separator = ",") { it.key })
filter.states.oneOrThrowIfMany()?.let { filter.states.oneOrThrowIfMany()?.let {
append("&completed_series=") append("&completed_series=")
@ -81,20 +84,9 @@ internal abstract class NineMangaParser(
} }
append("&page=") append("&page=")
} else { } else {
append("/category/") append("/category/index_")
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(page) append(page.toString())
append(".html") append(".html")
} }

@ -20,6 +20,7 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED) override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java) 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 val configKeyDomain = ConfigKey.Domain("flixscans.com")
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> { 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("https://api.")
append(domain) append(domain)
append("/api/v1/") append("/api/v1/")
if (filter.tags.isNotEmpty() || filter.states.isNotEmpty()) { if (filter.tags.isNotEmpty() || filter.states.isNotEmpty() || filter.contentRating.isNotEmpty()) {
if (page > 1) { if (page > 1) {
return emptyList() 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") append("&serie_type=webtoon")
} else { } else {

@ -32,7 +32,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
override val availableStates: Set<MangaState> = override val availableStates: Set<MangaState> =
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED) EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
override val isTagsExclusionSupported = true override val isTagsExclusionSupported: Boolean = true
init { init {
paginator.firstPage = 0 paginator.firstPage = 0

@ -35,6 +35,8 @@ internal abstract class MadaraParser(
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java) 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 tagPrefix = "manga-genre/"
protected open val datePattern = "MMMM d, yyyy" protected open val datePattern = "MMMM d, yyyy"
protected open val stylePage = "?style=list" protected open val stylePage = "?style=list"
@ -215,6 +217,18 @@ internal abstract class MadaraParser(
MangaState.UPCOMING -> append("upcoming") MangaState.UPCOMING -> append("upcoming")
} }
} }
filter.contentRating.oneOrThrowIfMany()?.let {
append("&adult=")
append(
when (it) {
ContentRating.SAFE -> "0"
ContentRating.ADULT -> "1"
else -> ""
},
)
}
append("&") append("&")
} }
@ -279,6 +293,16 @@ internal abstract class MadaraParser(
MangaState.UPCOMING -> "upcoming" 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 -> { null -> {

@ -25,6 +25,8 @@ internal class Manga18Fx(context: MangaLoaderContext) :
searchPaginator.firstPage = 1 searchPaginator.firstPage = 1
} }
override val availableContentRating: Set<ContentRating> = emptySet()
override val availableStates: Set<MangaState> get() = emptySet() override val availableStates: Set<MangaState> get() = emptySet()
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> { override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {

@ -26,6 +26,8 @@ internal class Manhwa18Cc(context: MangaLoaderContext) :
searchPaginator.firstPage = 1 searchPaginator.firstPage = 1
} }
override val availableContentRating: Set<ContentRating> = emptySet()
override val availableStates: Set<MangaState> get() = emptySet() override val availableStates: Set<MangaState> get() = emptySet()
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> { 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.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser 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.ContentType
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaListFilter
@ -23,8 +24,6 @@ internal class Hentai4Free(context: MangaLoaderContext) :
override val datePattern = "MMMM dd, yyyy" override val datePattern = "MMMM dd, yyyy"
override val selectGenre = "div.tags-content a" override val selectGenre = "div.tags-content a"
override val availableStates: Set<MangaState> get() = emptySet()
init { init {
paginator.firstPage = 1 paginator.firstPage = 1
searchPaginator.firstPage = 1 searchPaginator.firstPage = 1
@ -54,14 +53,41 @@ internal class Hentai4Free(context: MangaLoaderContext) :
append("page/") append("page/")
append(page.toString()) append(page.toString())
} }
append("/?")
} else { } else {
if (page > 1) { if (page > 1) {
append("/page/") append("/page/")
append(page.toString()) 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) { when (filter.sortOrder) {
SortOrder.POPULARITY -> append("views") SortOrder.POPULARITY -> append("views")
SortOrder.UPDATED -> append("latest") SortOrder.UPDATED -> append("latest")
@ -70,6 +96,8 @@ internal class Hentai4Free(context: MangaLoaderContext) :
SortOrder.RATING -> append("rating") SortOrder.RATING -> append("rating")
else -> append("latest") else -> append("latest")
} }
} }
null -> { null -> {

@ -16,14 +16,13 @@ internal class InstaManhwa(context: MangaLoaderContext) :
override val listUrl = "latest/" override val listUrl = "latest/"
override val postReq = true override val postReq = true
override val datePattern = "d MMMM, yyyy" override val datePattern = "d MMMM, yyyy"
override val availableSortOrders: Set<SortOrder> = EnumSet.of( override val availableSortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.ALPHABETICAL, SortOrder.ALPHABETICAL,
SortOrder.UPDATED, SortOrder.UPDATED,
SortOrder.NEWEST, SortOrder.NEWEST,
) )
override val availableStates: Set<MangaState> get() = emptySet() override val availableStates: Set<MangaState> get() = emptySet()
override val availableContentRating: Set<ContentRating> = emptySet()
init { init {
paginator.firstPage = 1 paginator.firstPage = 1

@ -16,13 +16,12 @@ internal class IsekaiScan(context: MangaLoaderContext) :
override val tagPrefix = "mangas/" override val tagPrefix = "mangas/"
override val listUrl = "latest-manga/" override val listUrl = "latest-manga/"
override val datePattern = "MMMM d, HH:mm" override val datePattern = "MMMM d, HH:mm"
override val availableSortOrders: Set<SortOrder> = EnumSet.of( override val availableSortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.POPULARITY, SortOrder.POPULARITY,
SortOrder.UPDATED, SortOrder.UPDATED,
) )
override val availableContentRating: Set<ContentRating> = emptySet()
override val availableStates: Set<MangaState> get() = emptySet() override val availableStates: Set<MangaState> = emptySet()
init { init {
paginator.firstPage = 1 paginator.firstPage = 1

@ -64,6 +64,18 @@ internal class IsekaiScanEuParser(context: MangaLoaderContext) :
MangaState.UPCOMING -> append("upcoming") MangaState.UPCOMING -> append("upcoming")
} }
} }
filter.contentRating.oneOrThrowIfMany()?.let {
append("&adult=")
append(
when (it) {
ContentRating.SAFE -> "0"
ContentRating.ADULT -> "1"
else -> ""
},
)
}
append("&") append("&")
} }

@ -21,6 +21,8 @@ internal class MangaDass(context: MangaLoaderContext) :
override val availableStates: Set<MangaState> get() = emptySet() override val availableStates: Set<MangaState> get() = emptySet()
override val availableContentRating: Set<ContentRating> = emptySet()
init { init {
paginator.firstPage = 1 paginator.firstPage = 1
searchPaginator.firstPage = 1 searchPaginator.firstPage = 1

@ -18,7 +18,8 @@ internal class MangaDna(context: MangaLoaderContext) :
override val withoutAjax = true override val withoutAjax = true
override val selectDesc = "div.dsct" override val selectDesc = "div.dsct"
override val selectChapter = "li.a-h" 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> { override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString { val url = buildString {

@ -21,7 +21,9 @@ internal class MangaPure(context: MangaLoaderContext) :
SortOrder.UPDATED, SortOrder.UPDATED,
) )
override val availableStates: Set<MangaState> get() = emptySet() override val availableStates: Set<MangaState> = emptySet()
override val availableContentRating: Set<ContentRating> = emptySet()
init { init {
paginator.firstPage = 1 paginator.firstPage = 1

@ -16,7 +16,9 @@ internal class Manhwaz(context: MangaLoaderContext) :
override val withoutAjax = true override val withoutAjax = true
override val selectTestAsync = "div.list-chapter" 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( override val availableSortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.UPDATED, 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.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser 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.Manga
import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaListFilter
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@ -16,7 +17,8 @@ internal class DragonTranslationParser(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DRAGONTRANSLATION, "dragontranslation.net", 30) { MadaraParser(context, MangaSource.DRAGONTRANSLATION, "dragontranslation.net", 30) {
override val selectPage = "div#chapter_imgs img" override val selectPage = "div#chapter_imgs img"
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED) 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 { init {
paginator.firstPage = 1 paginator.firstPage = 1

@ -17,7 +17,8 @@ internal class TmoManga(context: MangaLoaderContext) :
override val selectGenre = "div.summary-content a.tags_manga" override val selectGenre = "div.summary-content a.tags_manga"
override val withoutAjax = true override val withoutAjax = true
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.POPULARITY) 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 { init {
paginator.firstPage = 1 paginator.firstPage = 1

@ -17,7 +17,8 @@ internal class ManhwaHub(context: MangaLoaderContext) :
override val withoutAjax = true override val withoutAjax = true
override val listUrl = "genre/manhwa" override val listUrl = "genre/manhwa"
override val selectTestAsync = "ul.box-list-chapter" 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) override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED)
init { init {

@ -9,6 +9,6 @@ import java.util.Locale
@MangaSourceParser("GEKKOUSCANS", "GekkouScans", "pt", ContentType.HENTAI) @MangaSourceParser("GEKKOUSCANS", "GekkouScans", "pt", ContentType.HENTAI)
internal class GekkouScans(context: MangaLoaderContext) : internal class GekkouScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GEKKOUSCANS, "gekkouscans.top") { MadaraParser(context, MangaSource.GEKKOUSCANS, "gekkou.site") {
override val sourceLocale: Locale = Locale.ENGLISH 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 tagPrefix = "genre/"
override val withoutAjax = true override val withoutAjax = true
override val listUrl = "public/genre/manga/" 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> = override val availableSortOrders: Set<SortOrder> =
EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.RATING, SortOrder.NEWEST) 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") @MangaSourceParser("SSSSCANLATOR", "SssScanlator", "pt")
internal class SssScanlator(context: MangaLoaderContext) : 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)

Loading…
Cancel
Save