Remove Sources that are down (#7361)

* Removed Sorces

* Delete multisrc/overrides/madara/atmsubs/src directory

* Delete multisrc/overrides/madara/doujinyosh/src directory

* Delete multisrc/overrides/madara/justforfun/src directory

* Delete multisrc/overrides/madara/mangaarabonline/src directory

* Delete multisrc/overrides/madara/mangazukiclub/src directory

* Delete multisrc/overrides/madara/mangazukionline/src directory

* Delete multisrc/overrides/madara/nazarickscans/src directory

* Delete multisrc/overrides/madara/spookyscanlations/src directory

* Delete multisrc/overrides/madara/toonpoint/src directory

* Delete multisrc/overrides/madara/tsubakinoscan/src directory

* Delete multisrc/overrides/madara/wescans/src directory

* Remove sources wpmangastream

* remove double ,

* Delete multisrc/overrides/wpmangastream/mangashiro/src directory

* Delete multisrc/overrides/wpmangastream/komikindowpms directory

* Delete multisrc/overrides/wpmangastream/komikru/src directory

* Delete multisrc/overrides/wpmangastream/komikgo/src directory

* Delete multisrc/overrides/wpmangastream/matakomik/src directory

* Update FoolSlideGenerator.kt

* Delete multisrc/overrides/foolslide/ajianoscantrad/src directory

* Delete multisrc/overrides/foolslide/storminheaven/src directory

* Delete multisrc/overrides/foolslide/fallenworldorder/src directory

* Remove azbivo.webd.pro

* Remove comiclatest.com

* Delete multisrc/overrides/wpcomics/comiclatest directory

* Removed more sources

* Delete multisrc/overrides/wpmangastream/chiotaku/src directory

* Delete multisrc/overrides/wpmangastream/mangap/src directory

* Remove Mangaindo

* Remove neumanga

* Remove Bacamanga.cc

* Remove MundoHentai

* Remove andromedascans

* Remove Manga-Zen.com
This commit is contained in:
Johannes Joens 2021-06-02 01:48:53 +12:00 committed by GitHub
parent 234598af5f
commit 0452d87b2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
93 changed files with 1 additions and 1802 deletions

View File

@ -1,5 +0,0 @@
package eu.kanade.tachiyomi.extension.fr.ajianoscantrad
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
class AjiaNoScantrad : FoolSlide("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", "/reader")

View File

@ -1,5 +0,0 @@
package eu.kanade.tachiyomi.extension.it.fallenworldorder
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
class FallenWorldOrder : FoolSlide("Fall World Reader", "https://faworeader.altervista.org", "it", "/slide")

View File

@ -1,5 +0,0 @@
package eu.kanade.tachiyomi.extension.it.storminheaven
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
class StormInHeaven : FoolSlide("Storm in Heaven", "https://www.storm-in-heaven.net", "it", "/reader-sih")

View File

@ -1,7 +0,0 @@
package eu.kanade.tachiyomi.extension.fr.atmsubs
import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
class ATMSubs : Madara("ATM-Subs", "https://atm-subs.fr", "fr", SimpleDateFormat("d MMMM yyyy", Locale("fr")))

View File

@ -1,96 +0,0 @@
package eu.kanade.tachiyomi.extension.id.doujinyosh
import eu.kanade.tachiyomi.multisrc.madara.Madara
class DoujinYosh : Madara("DoujinYosh", "https://doujinyosh.work", "id") {
// source issue, doing this limits results to one page but not doing it returns no results at all
override fun searchPage(page: Int) = ""
override fun getGenreList() = listOf(
Genre("4 Koma", "4koma"),
Genre("Adult", "adult"),
Genre("Ahegao", "ahegao"),
Genre("Anal", "anal"),
Genre("Animal", "animal"),
Genre("Artist CG", "artist-cg"),
Genre("Big Breast", "big-breast"),
Genre("Big Penis", "big-penis"),
Genre("Bikini", "bikini"),
Genre("Black Mail", "black-mail"),
Genre("Blowjob", "blowjob"),
Genre("Body Swap", "body-swap"),
Genre("Bondage", "bondage"),
Genre("Cheating", "cheating"),
Genre("Crossdressing", "crossdressing"),
Genre("DILF", "dilf"),
Genre("Dark Skin", "dark-skin"),
Genre("Defloration", "defloration"),
Genre("Demon Girl", "demon-girl"),
Genre("Doujin", "doujin"),
Genre("Drugs", "drugs"),
Genre("Drunk", "drunk"),
Genre("Elf", "elf"),
Genre("Famele Only", "famele-only"),
Genre("Femdom", "femdom"),
Genre("Filming", "filming"),
Genre("Footjob", "footjob"),
Genre("Full Color", "full-color"),
Genre("Furry", "furry"),
Genre("Futanari", "futanari"),
Genre("Glasses", "glasses"),
Genre("Gore", "gore"),
Genre("Group", "group"),
Genre("Gyaru", "gyaru"),
Genre("Harem", "harem"),
Genre("Humiliation", "humiliation"),
Genre("Impregnation", "impregnation"),
Genre("Incest", "incest"),
Genre("Inverted Nipples", "inverted-nipples"),
Genre("Kemomimi", "kemomimi"),
Genre("Lactation", "lactation"),
Genre("Loli", "loli"),
Genre("Lolipai", "lolipai"),
Genre("MILF", "milf"),
Genre("Maid", "maid"),
Genre("Male Only", "male-only"),
Genre("Miko", "miko"),
Genre("Mind Break", "mind-break"),
Genre("Mind Control", "mind-control"),
Genre("Monster", "monster"),
Genre("Monster Girl", "monster-girl"),
Genre("Multi-Work Series", "multi-work-series"),
Genre("Nakadashi", "nakadashi"),
Genre("Netorare", "netorare"),
Genre("Otona (R18)", "otona"),
Genre("Oyakodon", "oyakodon"),
Genre("Paizuri", "paizuri"),
Genre("Pantyhose", "pantyhose"),
Genre("Pregnant", "pregnant"),
Genre("Prostitution", "prostitution"),
Genre("Rape", "rape"),
Genre("School Uniform", "school-uniform"),
Genre("Sex Toy", "sex-toy"),
Genre("Shota", "shota"),
Genre("Sister", "sister"),
Genre("Sleep", "sleep"),
Genre("Slime", "slime"),
Genre("Small Breast", "small-breast"),
Genre("Sole Female", "sole-female"),
Genre("Sole Male", "sole-male"),
Genre("Stocking", "stocking"),
Genre("Story Arc", "story-arc"),
Genre("Sweating", "sweating"),
Genre("Swimsuit", "swimsuit"),
Genre("Teacher", "teacher"),
Genre("Tentacles", "tentacles"),
Genre("Tomboy", "tomboy"),
Genre("Tomgirl", "tomgirl"),
Genre("Torture", "torture"),
Genre("Twins", "twins"),
Genre("Virginity", "virginity"),
Genre("Webtoon", "webtoon"),
Genre("XRay", "xray"),
Genre("Yandere", "yandere"),
Genre("Yaoi", "yaoi"),
Genre("Yuri", "yuri")
)
}

View File

@ -1,12 +0,0 @@
package eu.kanade.tachiyomi.extension.ru.justforfun
import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
class JustForFun : Madara(
"Just For Fun",
"https://just-for-fun.ru",
"ru",
dateFormat = SimpleDateFormat("yy.MM.dd", Locale.US)
)

View File

@ -1,7 +0,0 @@
package eu.kanade.tachiyomi.extension.ar.mangaarabonline
import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
class MangaArabOnline : Madara("Manga Arab Online مانجا عرب اون لاين", "https://mangaarabonline.com", "ar", SimpleDateFormat("MMM d, yyyy", Locale.forLanguageTag("ar")))

View File

@ -1,14 +0,0 @@
package eu.kanade.tachiyomi.extension.all.mangazukiclub
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory
class MangazukiClubFactory : SourceFactory {
override fun createSources(): List<Source> = listOf(
MangazukiClubJP(),
MangazukiClubKO(),
)
}
class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club", "ja")
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club", "ko")

View File

@ -1,8 +0,0 @@
package eu.kanade.tachiyomi.extension.en.mangazukionline
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
class MangazukiOnline : Madara("Mangazuki.online", "http://mangazukinew.online", "en") {
override val client: OkHttpClient = super.client.newBuilder().followRedirects(true).build()
}

View File

@ -1,11 +0,0 @@
package eu.kanade.tachiyomi.extension.en.nazarickscans
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET
class NazarickScans : Madara("Nazarick Scans", "https://nazarickscans.com", "en") {
override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga/page/$page/?m_orderby=trending", headers)
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/manga/page/$page/?m_orderby=trending", headers)
override fun popularMangaNextPageSelector(): String? = null
override fun latestUpdatesNextPageSelector(): String? = null
}

View File

@ -1,7 +0,0 @@
package eu.kanade.tachiyomi.extension.es.spookyscanlations
import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
class SpookyScanlations : Madara("Spooky Scanlations", "https://spookyscanlations.xyz", "es", SimpleDateFormat("MMMM dd, yyyy", Locale("es")))

View File

@ -1,7 +0,0 @@
package eu.kanade.tachiyomi.extension.en.toonpoint
import eu.kanade.tachiyomi.multisrc.madara.Madara
class ToonPoint : Madara("ToonPoint", "https://toonpoint.com", "en") {
override val userAgentRandomizer = ""
}

View File

@ -1,12 +0,0 @@
package eu.kanade.tachiyomi.extension.fr.tsubakinoscan
import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
class TsubakiNoScan : Madara(
"Tsubaki No Scan",
"https://tsubakinoscan.com",
"fr",
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)
)

View File

@ -1,15 +0,0 @@
package eu.kanade.tachiyomi.extension.en.wescans
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.Request
class WeScans : Madara("WeScans", "https://wescans.xyz", "en") {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manhua/manga/?m_orderby=views", headers)
override fun popularMangaNextPageSelector(): String? = null
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manhua/manga/?m_orderby=latest", headers)
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/manhua/?s=$query&post_type=wp-manga")
override fun searchMangaNextPageSelector(): String? = null
override fun getFilterList(): FilterList = FilterList()
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

View File

@ -1,75 +0,0 @@
package eu.kanade.tachiyomi.extension.en.comiclatest
import eu.kanade.tachiyomi.multisrc.wpcomics.WPComics
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
class ComicLatest : WPComics("ComicLatest", "https://comiclatest.com", "en", SimpleDateFormat("MM/dd/yyyy", Locale.US), null) {
// Hot only has one page
override val popularPath = "popular-comics"
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
element.select("h3 a").let {
title = it.text()
setUrlWithoutDomain(it.attr("href"))
}
thumbnail_url = element.select("img").attr("data-original")
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
filters.forEach { filter ->
when (filter) {
is AuthorFilter -> {
val author = filter.state.trim().replace(" ", "-").toLowerCase()
return GET("$baseUrl/author/$author?page=$page", headers)
}
}
}
return GET("$baseUrl/search?keyword=$query&page=$page", headers)
}
override fun searchMangaSelector() = "div.item div.box_img > a[title]"
// For whatever reason, errors with author search if this isn't overridden
override fun searchMangaFromElement(element: Element): SManga {
return SManga.create().apply {
title = element.attr("title")
setUrlWithoutDomain(element.attr("href"))
}
}
override fun chapterListParse(response: Response): List<SChapter> {
val chapters = mutableListOf<SChapter>()
fun parseChapters(document: Document) {
document.select(chapterListSelector()).map { chapters.add(chapterFromElement(it)) }
document.select("ul.pagination a[rel=next]").firstOrNull()?.let { a ->
parseChapters(client.newCall(GET(a.attr("abs:href"), headers)).execute().asJsoup())
}
}
parseChapters(response.asJsoup())
return chapters
}
override fun pageListRequest(chapter: SChapter) = GET("$baseUrl${chapter.url}/all", headers)
private class AuthorFilter : Filter.Text("Author")
override fun getFilterList() = FilterList(
Filter.Header("NOTE: Cannot be used with search"),
Filter.Separator(),
AuthorFilter()
)
}

View File

@ -1,16 +0,0 @@
package eu.kanade.tachiyomi.extension.id.chiotaku
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
class ChiOtaku : WPMangaStream("ChiOtaku", "https://chiotaku.com", "id") {
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
}

View File

@ -1,238 +0,0 @@
package eu.kanade.tachiyomi.extension.id.komikgo
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import eu.kanade.tachiyomi.source.model.Filter
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import java.util.concurrent.TimeUnit
import okhttp3.OkHttpClient
class KomikGO : WPMangaStream("Komik GO", "https://komikgo.com", "id") {
// Formerly "Komik GO (WP Manga Stream)"
override val id = 1070674823324721554
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/page/$page?s&post_type=wp-manga&m_orderby=views", headers)
}
override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/page/$page?s&post_type=wp-manga&m_orderby=latest", headers)
}
override fun popularMangaSelector() = "div.c-tabs-item__content"
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
manga.thumbnail_url = element.select("div.tab-thumb > a > img").attr("data-src")
element.select("div.tab-thumb > a").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
}
return manga
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
url.addQueryParameter("post_type", "wp-manga")
val pattern = "\\s+".toRegex()
val q = query.replace(pattern, "+")
if (query.isNotEmpty()) {
url.addQueryParameter("s", q)
} else {
url.addQueryParameter("s", "")
}
var orderBy: String
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
// is Status -> url.addQueryParameter("manga_status", arrayOf("", "completed", "ongoing")[filter.state])
is GenreListFilter -> {
val genreInclude = mutableListOf<String>()
filter.state.forEach {
if (it.state == 1) {
genreInclude.add(it.id)
}
}
if (genreInclude.isNotEmpty()) {
genreInclude.forEach { genre ->
url.addQueryParameter("genre[]", genre)
}
}
}
is StatusList -> {
val statuses = mutableListOf<String>()
filter.state.forEach {
if (it.state == 1) {
statuses.add(it.id)
}
}
if (statuses.isNotEmpty()) {
statuses.forEach { status ->
url.addQueryParameter("status[]", status)
}
}
}
is SortBy -> {
orderBy = filter.toUriPart()
url.addQueryParameter("m_orderby", orderBy)
}
is TextField -> url.addQueryParameter(filter.key, filter.state)
}
}
return GET(url.toString(), headers)
}
override fun popularMangaNextPageSelector() = "#navigation-ajax"
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.site-content").first()
val manga = SManga.create()
manga.author = infoElement.select("div.author-content")?.text()
manga.artist = infoElement.select("div.artist-content")?.text()
val genres = mutableListOf<String>()
infoElement.select("div.genres-content a").forEach { element ->
val genre = element.text()
genres.add(genre)
}
manga.genre = genres.joinToString(", ")
manga.status = parseStatus(infoElement.select("div.post-status > div:nth-child(2) div").text())
manga.description = document.select("div.description-summary")?.text()
manga.thumbnail_url = document.select("div.summary_image > a > img").attr("data-src")
return manga
}
override fun chapterListSelector() = "li.wp-manga-chapter"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("a").first()
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.text()
chapter.date_upload = parseChapterDate(element.select("span.chapter-release-date i").text())
return chapter
}
override fun pageListParse(document: Document): List<Page> {
return document.select("div.reading-content * img").mapIndexed { i, img ->
Page(i, "", img.imgAttr())
}
}
private class TextField(name: String, val key: String) : Filter.Text(name)
private class SortBy : UriPartFilter(
"Sort by",
arrayOf(
Pair("Relevance", ""),
Pair("Latest", "latest"),
Pair("A-Z", "alphabet"),
Pair("Rating", "rating"),
Pair("Trending", "trending"),
Pair("Most View", "views"),
Pair("New", "new-manga")
)
)
private class Status(name: String, val id: String = name) : Filter.TriState(name)
private class StatusList(statuses: List<Status>) : Filter.Group<Status>("Status", statuses)
override fun getFilterList() = FilterList(
TextField("Author", "author"),
TextField("Year", "release"),
SortBy(),
StatusList(getStatusList()),
GenreListFilter(getGenreList())
)
private fun getStatusList() = listOf(
Status("Completed", "end"),
Status("Ongoing", "on-going"),
Status("Canceled", "canceled"),
Status("Onhold", "on-hold")
)
override fun getGenreList(): List<Genre> = listOf(
Genre("Adventure", "Adventure"),
Genre("Action", "action"),
Genre("Adventure", "adventure"),
Genre("Cars", "cars"),
Genre("4-Koma", "4-koma"),
Genre("Comedy", "comedy"),
Genre("Completed", "completed"),
Genre("Cooking", "cooking"),
Genre("Dementia", "dementia"),
Genre("Demons", "demons"),
Genre("Doujinshi", "doujinshi"),
Genre("Drama", "drama"),
Genre("Ecchi", "ecchi"),
Genre("Fantasy", "fantasy"),
Genre("Game", "game"),
Genre("Gender Bender", "gender-bender"),
Genre("Harem", "harem"),
Genre("Historical", "historical"),
Genre("Horror", "horror"),
Genre("Isekai", "isekai"),
Genre("Josei", "josei"),
Genre("Kids", "kids"),
Genre("Magic", "magic"),
Genre("Manga", "manga"),
Genre("Manhua", "manhua"),
Genre("Manhwa", "manhwa"),
Genre("Martial Arts", "martial-arts"),
Genre("Mature", "mature"),
Genre("Mecha", "mecha"),
Genre("Military", "military"),
Genre("Music", "music"),
Genre("Mystery", "mystery"),
Genre("Old Comic", "old-comic"),
Genre("One Shot", "one-shot"),
Genre("Oneshot", "oneshot"),
Genre("Parodi", "parodi"),
Genre("Parody", "parody"),
Genre("Police", "police"),
Genre("Psychological", "psychological"),
Genre("Romance", "romance"),
Genre("Samurai", "samurai"),
Genre("School", "school"),
Genre("School Life", "school-life"),
Genre("Sci-Fi", "sci-fi"),
Genre("Seinen", "seinen"),
Genre("Shoujo", "shoujo"),
Genre("Shoujo Ai", "shoujo-ai"),
Genre("Shounen", "shounen"),
Genre("Shounen ai", "shounen-ai"),
Genre("Slice of Life", "slice-of-life"),
Genre("Sports", "sports"),
Genre("Super Power", "super-power"),
Genre("Supernatural", "supernatural"),
Genre("Thriller", "thriller"),
Genre("Tragedy", "tragedy"),
Genre("Vampire", "vampire"),
Genre("Webtoons", "webtoons"),
Genre("Yaoi", "yaoi"),
Genre("Yuri", "yuri")
)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,20 +0,0 @@
package eu.kanade.tachiyomi.extension.id.komikindowpms
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import java.util.concurrent.TimeUnit
import okhttp3.OkHttpClient
class KomikIndoWPMS : WPMangaStream("Komik Indo", "https://www.komikindo.web.id", "id") {
// Formerly "Komik Indo (WP Manga Stream)"
override val id = 1481562643469779882
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
}

View File

@ -1,19 +0,0 @@
package eu.kanade.tachiyomi.extension.id.komikru
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import java.text.SimpleDateFormat
import java.util.Locale
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import java.util.concurrent.TimeUnit
import okhttp3.OkHttpClient
class KomikRu : WPMangaStream("KomikRu", "https://komikru.com", "id", SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id"))) {
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
}

View File

@ -1,16 +0,0 @@
package eu.kanade.tachiyomi.extension.ar.mangap
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
class MangaP : WPMangaStream("MangaP", "https://mangap.me", "ar") {
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
}

View File

@ -1,16 +0,0 @@
package eu.kanade.tachiyomi.extension.id.mangashiro
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
class MangaShiro : WPMangaStream("MangaShiro", "https://mangashiro.co", "id") {
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
}

View File

@ -1,24 +0,0 @@
package eu.kanade.tachiyomi.extension.id.matakomik
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
import eu.kanade.tachiyomi.source.model.Page
import org.jsoup.nodes.Document
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import java.util.concurrent.TimeUnit
import okhttp3.OkHttpClient
class Matakomik : WPMangaStream("Matakomik", "https://matakomik.com", "id") {
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor)
.build()
override fun pageListParse(document: Document): List<Page> {
return document.select("div#readerarea a").mapIndexed { i, a ->
Page(i, "", a.attr("abs:href"))
}
}
}

View File

@ -29,8 +29,6 @@ class FoolSlideGenerator : ThemeSourceGenerator {
SingleLang("Iskultrip Scans", "https://maryfaye.net", "en"), SingleLang("Iskultrip Scans", "https://maryfaye.net", "en"),
SingleLang("Anata no Motokare", "https://motokare.xyz", "en", className = "AnataNoMotokare"), SingleLang("Anata no Motokare", "https://motokare.xyz", "en", className = "AnataNoMotokare"),
SingleLang("Yuri-ism", "https://www.yuri-ism.net", "en", className = "YuriIsm"), SingleLang("Yuri-ism", "https://www.yuri-ism.net", "en", className = "YuriIsm"),
SingleLang("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", className = "AjiaNoScantrad"),
SingleLang("Storm in Heaven", "https://www.storm-in-heaven.net", "it", className = "StormInHeaven"),
SingleLang("LupiTeam", "https://lupiteam.net", "it"), SingleLang("LupiTeam", "https://lupiteam.net", "it"),
SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"), SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"),
SingleLang("Kirishima Fansub", "https://www.kirishimafansub.net", "es"), SingleLang("Kirishima Fansub", "https://www.kirishimafansub.net", "es"),
@ -38,7 +36,6 @@ class FoolSlideGenerator : ThemeSourceGenerator {
MultiLang("HNI-Scantrad", "https://hni-scantrad.com", listOf("fr", "en"), className = "HNIScantradFactory", pkgName = "hniscantrad", overrideVersionCode = 1), MultiLang("HNI-Scantrad", "https://hni-scantrad.com", listOf("fr", "en"), className = "HNIScantradFactory", pkgName = "hniscantrad", overrideVersionCode = 1),
SingleLang("The Phoenix Scans", "https://www.phoenixscans.com", "it", className = "PhoenixScans"), SingleLang("The Phoenix Scans", "https://www.phoenixscans.com", "it", className = "PhoenixScans"),
SingleLang("GTO The Great Site", "https://www.gtothegreatsite.net", "it", className = "GTO"), SingleLang("GTO The Great Site", "https://www.gtothegreatsite.net", "it", className = "GTO"),
SingleLang("Fall World Reader", "https://faworeader.altervista.org", "it", className = "FallenWorldOrder"),
SingleLang("NIFTeam", "http://read-nifteam.info", "it"), SingleLang("NIFTeam", "http://read-nifteam.info", "it"),
SingleLang("TuttoAnimeManga", "https://tuttoanimemanga.net", "it"), SingleLang("TuttoAnimeManga", "https://tuttoanimemanga.net", "it"),
SingleLang("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr"), SingleLang("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr"),

View File

@ -16,7 +16,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("24hRomance", "https://24hromance.com", "en", className = "Romance24h"), SingleLang("24hRomance", "https://24hromance.com", "en", className = "Romance24h"),
SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr"), SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr"),
SingleLang("AkuManga", "https://akumanga.com", "ar"), SingleLang("AkuManga", "https://akumanga.com", "ar"),
SingleLang("AlianzaMarcial", "https://alianzamarcial.xyz", "es"),
SingleLang("AllPornComic", "https://allporncomic.com", "en", isNsfw = true), SingleLang("AllPornComic", "https://allporncomic.com", "en", isNsfw = true),
SingleLang("Aloalivn", "https://aloalivn.com", "en", overrideVersionCode = 2), SingleLang("Aloalivn", "https://aloalivn.com", "en", overrideVersionCode = 2),
SingleLang("AniMangaEs", "https://animangaes.com", "en", overrideVersionCode = 1), SingleLang("AniMangaEs", "https://animangaes.com", "en", overrideVersionCode = 1),
@ -29,7 +28,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Arthur Scan", "https://arthurscan.xyz", "pt-BR"), SingleLang("Arthur Scan", "https://arthurscan.xyz", "pt-BR"),
SingleLang("Astral Library", "https://www.astrallibrary.net", "en", overrideVersionCode = 1), SingleLang("Astral Library", "https://www.astrallibrary.net", "en", overrideVersionCode = 1),
SingleLang("Atikrost", "https://atikrost.com", "tr"), SingleLang("Atikrost", "https://atikrost.com", "tr"),
SingleLang("ATM-Subs", "https://atm-subs.fr", "fr", className = "ATMSubs"),
SingleLang("AYATOON", "https://ayatoon.com", "tr"), SingleLang("AYATOON", "https://ayatoon.com", "tr"),
SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1), SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1),
SingleLang("BL Manhwa Club", "https://blmanhwa.club", "pt-BR", isNsfw = true, className = "BlManhwaClub"), SingleLang("BL Manhwa Club", "https://blmanhwa.club", "pt-BR", isNsfw = true, className = "BlManhwaClub"),
@ -56,10 +54,8 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"), SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"),
SingleLang("Disaster Scans", "https://disasterscans.com", "en", overrideVersionCode = 1), SingleLang("Disaster Scans", "https://disasterscans.com", "en", overrideVersionCode = 1),
SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true), SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true),
SingleLang("DoujinYosh", "https://doujinyosh.work", "id"),
SingleLang("Dream Manga", "https://en.ruyamanga.com", "en", overrideVersionCode = 1), SingleLang("Dream Manga", "https://en.ruyamanga.com", "en", overrideVersionCode = 1),
SingleLang("Drope Scan", "https://dropescan.com", "pt-BR", overrideVersionCode = 1), SingleLang("Drope Scan", "https://dropescan.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Einherjar Scan", "https://einherjarscans.space", "en"),
SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR", overrideVersionCode = 1), SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR", overrideVersionCode = 1),
SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1), SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1),
SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com", "en", className = "FirstKissManhua"), SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com", "en", className = "FirstKissManhua"),
@ -85,8 +81,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga"), SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga"),
SingleLang("Its Your Right Manhua", "https://itsyourightmanhua.com/", "en"), SingleLang("Its Your Right Manhua", "https://itsyourightmanhua.com/", "en"),
SingleLang("JJutsuScans", "https://jjutsuscans.com", "en", overrideVersionCode = 1), SingleLang("JJutsuScans", "https://jjutsuscans.com", "en", overrideVersionCode = 1),
SingleLang("Just For Fun", "https://just-for-fun.ru", "ru"),
SingleLang("KingzManga", "https://kingzmanga.com", "ar"),
SingleLang("KisekiManga", "https://kisekimanga.com", "en"), SingleLang("KisekiManga", "https://kisekimanga.com", "en"),
SingleLang("Kissmanga.in", "https://kissmanga.in", "en", className= "KissmangaIn"), SingleLang("Kissmanga.in", "https://kissmanga.in", "en", className= "KissmangaIn"),
SingleLang("KlikManga", "https://klikmanga.com", "id"), SingleLang("KlikManga", "https://klikmanga.com", "id"),
@ -95,14 +89,12 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Levelerscans", "https://levelerscans.xyz", "en"), SingleLang("Levelerscans", "https://levelerscans.xyz", "en"),
SingleLang("Lily Manga", "https://lilymanga.com", "en"), SingleLang("Lily Manga", "https://lilymanga.com", "en"),
SingleLang("LovableSubs", "https://lovablesubs.com", "tr"), SingleLang("LovableSubs", "https://lovablesubs.com", "tr"),
SingleLang("Manga18 Fun", "https://manga18.fun", "en"),
SingleLang("Manga18 Fx", "https://manga18fx.com", "en"), SingleLang("Manga18 Fx", "https://manga18fx.com", "en"),
SingleLang("Manga347", "https://manga347.com", "en", overrideVersionCode = 2), SingleLang("Manga347", "https://manga347.com", "en", overrideVersionCode = 2),
SingleLang("مانجا العاشق", "https://3asq.org", "ar", className = "Manga3asq"), SingleLang("مانجا العاشق", "https://3asq.org", "ar", className = "Manga3asq"),
SingleLang("Manga3S", "https://manga3s.com", "en"), SingleLang("Manga3S", "https://manga3s.com", "en"),
SingleLang("Manga68", "https://manga68.com", "en"), SingleLang("Manga68", "https://manga68.com", "en"),
SingleLang("Manga Action", "https://manga-action.com", "ar", overrideVersionCode = 1), SingleLang("Manga Action", "https://manga-action.com", "ar", overrideVersionCode = 1),
SingleLang("Manga Arab Online مانجا عرب اون لاين", "https://mangaarabonline.com", "ar", className = "MangaArabOnline"),
SingleLang("مانجا عرب تيم Manga Arab Team", "https://mangaarabteam.com", "ar", className = "MangaArabTeam"), SingleLang("مانجا عرب تيم Manga Arab Team", "https://mangaarabteam.com", "ar", className = "MangaArabTeam"),
SingleLang("MangaBaz", "https://mangabaz.com", "tr"), SingleLang("MangaBaz", "https://mangabaz.com", "tr"),
SingleLang("Manga Bin", "https://mangabin.com/", "en"), SingleLang("Manga Bin", "https://mangabin.com/", "en"),
@ -153,10 +145,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("MangaWT", "https://mangawt.com", "tr"), SingleLang("MangaWT", "https://mangawt.com", "tr"),
SingleLang("MangaYaku", "https://mangayaku.com", "id", overrideVersionCode = 1), SingleLang("MangaYaku", "https://mangayaku.com", "id", overrideVersionCode = 1),
SingleLang("MangaYosh", "https://mangayosh.xyz", "id"), SingleLang("MangaYosh", "https://mangayosh.xyz", "id"),
MultiLang("Mangazuki.club", "https://mangazuki.club", listOf("ja", "ko"),
className = "MangazukiClubFactory"),
SingleLang("Mangazuki.me", "https://mangazuki.me", "en", className = "MangazukiMe", overrideVersionCode = 1), SingleLang("Mangazuki.me", "https://mangazuki.me", "en", className = "MangazukiMe", overrideVersionCode = 1),
SingleLang("Mangazuki.online", "http://mangazukinew.online", "en", className = "MangazukiOnline"),
SingleLang("Mangceh", "https://mangceh.com", "id", isNsfw = true), SingleLang("Mangceh", "https://mangceh.com", "id", isNsfw = true),
SingleLang("ManhuaBox", "https://manhuabox.net", "en"), SingleLang("ManhuaBox", "https://manhuabox.net", "en"),
SingleLang("Manhua ES", "https://manhuaes.com", "en", overrideVersionCode = 4), SingleLang("Manhua ES", "https://manhuaes.com", "en", overrideVersionCode = 4),
@ -181,13 +170,11 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("MG Komik", "https://mgkomik.my.id", "id"), SingleLang("MG Komik", "https://mgkomik.my.id", "id"),
SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en", isNsfw = true, overrideVersionCode = 1), SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en", isNsfw = true, overrideVersionCode = 1),
SingleLang("Milftoon", "https://milftoon.xxx", "en", isNsfw = true, overrideVersionCode = 2), SingleLang("Milftoon", "https://milftoon.xxx", "en", isNsfw = true, overrideVersionCode = 2),
SingleLang("Miracle Scans", "https://miraclescans.com", "en"),
SingleLang("Mixed Manga", "https://mixedmanga.com", "en"), SingleLang("Mixed Manga", "https://mixedmanga.com", "en"),
SingleLang("MMScans", "https://mm-scans.com/", "en", overrideVersionCode = 1), SingleLang("MMScans", "https://mm-scans.com/", "en", overrideVersionCode = 1),
SingleLang("Mode Scanlator", "https://modescanlator.com", "pt-BR"), SingleLang("Mode Scanlator", "https://modescanlator.com", "pt-BR"),
SingleLang("Mundo Wuxia", "https://mundowuxia.com", "es"), SingleLang("Mundo Wuxia", "https://mundowuxia.com", "es"),
SingleLang("Mystical Merries", "https://mysticalmerries.com", "en"), SingleLang("Mystical Merries", "https://mysticalmerries.com", "en"),
SingleLang("Nazarick Scans", "https://nazarickscans.com", "en"),
SingleLang("NeatManga", "https://neatmanga.com", "en"), SingleLang("NeatManga", "https://neatmanga.com", "en"),
SingleLang("NekoScan", "https://nekoscan.com", "en", overrideVersionCode = 1), SingleLang("NekoScan", "https://nekoscan.com", "en", overrideVersionCode = 1),
SingleLang("Neox Scanlator", "https://neoxscans.net", "pt-BR", overrideVersionCode = 4), SingleLang("Neox Scanlator", "https://neoxscans.net", "pt-BR", overrideVersionCode = 4),
@ -197,7 +184,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Nitro Scans", "https://nitroscans.com", "en"), SingleLang("Nitro Scans", "https://nitroscans.com", "en"),
SingleLang("NovelMic", "https://novelmic.com", "en"), SingleLang("NovelMic", "https://novelmic.com", "en"),
SingleLang("Off Scan", "https://offscan.top", "pt-BR", overrideVersionCode = 1), SingleLang("Off Scan", "https://offscan.top", "pt-BR", overrideVersionCode = 1),
SingleLang("مانجا اولاو", "https://olaoe.giize.com", "ar", className = "OlaoeManga"),
SingleLang("OnManga", "https://onmanga.com", "en"), SingleLang("OnManga", "https://onmanga.com", "en"),
SingleLang("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR", overrideVersionCode = 1), SingleLang("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR", overrideVersionCode = 1),
SingleLang("Paean Scans", "https://paeanscans.com", "en"), SingleLang("Paean Scans", "https://paeanscans.com", "en"),
@ -205,10 +191,8 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Platinum Crown", "https://platinumscans.com", "en"), SingleLang("Platinum Crown", "https://platinumscans.com", "en"),
SingleLang("Pojok Manga", "https://pojokmanga.com", "id", overrideVersionCode = 1), SingleLang("Pojok Manga", "https://pojokmanga.com", "id", overrideVersionCode = 1),
SingleLang("PornComix", "https://www.porncomixonline.net", "en", isNsfw = true, overrideVersionCode = 1), SingleLang("PornComix", "https://www.porncomixonline.net", "en", isNsfw = true, overrideVersionCode = 1),
SingleLang("Prime Manga", "https://primemanga.com", "en"),
SingleLang("Projeto Scanlator", "https://projetoscanlator.com", "pt-BR", overrideVersionCode = 1), SingleLang("Projeto Scanlator", "https://projetoscanlator.com", "pt-BR", overrideVersionCode = 1),
SingleLang("QueensManga ملكات المانجا", "https://queensmanga.com", "ar", className = "QueensManga"), SingleLang("QueensManga ملكات المانجا", "https://queensmanga.com", "ar", className = "QueensManga"),
SingleLang("Raider Scans", "https://raiderscans.com", "en"),
SingleLang("Random Translations", "https://randomtranslations.com", "en"), SingleLang("Random Translations", "https://randomtranslations.com", "en"),
SingleLang("RawDEX", "https://rawdex.net", "ko", isNsfw = true), SingleLang("RawDEX", "https://rawdex.net", "ko", isNsfw = true),
SingleLang("Raw Mangas", "https://rawmangas.net", "ja", isNsfw = true, overrideVersionCode = 1), SingleLang("Raw Mangas", "https://rawmangas.net", "ja", isNsfw = true, overrideVersionCode = 1),
@ -229,7 +213,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Sleepy Translations", "https://sleepytranslations.com/", "en"), SingleLang("Sleepy Translations", "https://sleepytranslations.com/", "en"),
SingleLang("SocialWeebs", "https://socialweebs.in/", "en"), SingleLang("SocialWeebs", "https://socialweebs.in/", "en"),
SingleLang("SoloScanlation", "https://soloscanlation.site", "en"), SingleLang("SoloScanlation", "https://soloscanlation.site", "en"),
SingleLang("Spooky Scanlations", "https://spookyscanlations.xyz", "es"),
SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1), SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Sugar Babies", "https://sugarbscan.com", "en"), SingleLang("Sugar Babies", "https://sugarbscan.com", "en"),
SingleLang("Sweet Time Scan", "https://sweetscan.net", "pt-BR"), SingleLang("Sweet Time Scan", "https://sweetscan.net", "pt-BR"),
@ -238,12 +221,10 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("ToonGod", "https://www.toongod.com", "en"), SingleLang("ToonGod", "https://www.toongod.com", "en"),
SingleLang("Toonily", "https://toonily.com", "en", isNsfw = true, overrideVersionCode = 2), SingleLang("Toonily", "https://toonily.com", "en", isNsfw = true, overrideVersionCode = 2),
SingleLang("Toonily.net", "https://toonily.net", "en", isNsfw = true, className = "ToonilyNet", overrideVersionCode = 1), SingleLang("Toonily.net", "https://toonily.net", "en", isNsfw = true, className = "ToonilyNet", overrideVersionCode = 1),
SingleLang("ToonPoint", "https://toonpoint.com", "en"),
SingleLang("Top Manhua", "https://topmanhua.com", "en"), SingleLang("Top Manhua", "https://topmanhua.com", "en"),
SingleLang("TritiniaScans", "https://tritinia.com", "en", overrideVersionCode = 1), SingleLang("TritiniaScans", "https://tritinia.com", "en", overrideVersionCode = 1),
SingleLang("TruyenTranhAudio.com", "https://truyentranhaudio.com", "vi", className = "TruyenTranhAudioCom"), SingleLang("TruyenTranhAudio.com", "https://truyentranhaudio.com", "vi", className = "TruyenTranhAudioCom"),
SingleLang("TruyenTranhAudio.online", "https://truyentranhaudio.online", "vi", className = "TruyenTranhAudioOnline"), SingleLang("TruyenTranhAudio.online", "https://truyentranhaudio.online", "vi", className = "TruyenTranhAudioOnline"),
SingleLang("Tsubaki No Scan", "https://tsubakinoscan.com", "fr"),
SingleLang("Tsundoku Traduções", "https://tsundokutraducoes.com.br", "pt-BR", pkgName = "tsundokutraducoes", className = "TsundokuTraducoes", overrideVersionCode = 1), SingleLang("Tsundoku Traduções", "https://tsundokutraducoes.com.br", "pt-BR", pkgName = "tsundokutraducoes", className = "TsundokuTraducoes", overrideVersionCode = 1),
SingleLang("Türkçe Manga", "https://turkcemanga.com", "tr", className = "TurkceManga"), SingleLang("Türkçe Manga", "https://turkcemanga.com", "tr", className = "TurkceManga"),
SingleLang("Twilight Scans", "https://twilightscans.com", "en", overrideVersionCode = 1), SingleLang("Twilight Scans", "https://twilightscans.com", "en", overrideVersionCode = 1),
@ -257,7 +238,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("WebToonily", "https://webtoonily.com", "en"), SingleLang("WebToonily", "https://webtoonily.com", "en"),
SingleLang("WebtoonUK", "https://webtoon.uk", "en"), SingleLang("WebtoonUK", "https://webtoon.uk", "en"),
SingleLang("WebtoonXYZ", "https://www.webtoon.xyz", "en"), SingleLang("WebtoonXYZ", "https://www.webtoon.xyz", "en"),
SingleLang("WeScans", "https://wescans.xyz", "en"),
SingleLang("WoopRead", "https://woopread.com", "en"), SingleLang("WoopRead", "https://woopread.com", "en"),
SingleLang("WuxiaWorld", "https://wuxiaworld.site", "en"), SingleLang("WuxiaWorld", "https://wuxiaworld.site", "en"),
SingleLang("Yaoi Fan Clube", "https://yaoifanclube.com.br", "pt-BR", isNsfw = true), SingleLang("Yaoi Fan Clube", "https://yaoifanclube.com.br", "pt-BR", isNsfw = true),
@ -265,7 +245,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Yokai Jump", "https://yokaijump.fr", "fr"), SingleLang("Yokai Jump", "https://yokaijump.fr", "fr"),
SingleLang("Yuri Verso", "https://yuri.live", "pt-BR", overrideVersionCode = 1), SingleLang("Yuri Verso", "https://yuri.live", "pt-BR", overrideVersionCode = 1),
SingleLang("Zin Translator", "https://zinmanga.com", "en"), SingleLang("Zin Translator", "https://zinmanga.com", "en"),
SingleLang("ZManga", "https://zmanga.org", "es"),
SingleLang("Sleeping Knight Scans", "https://skscans.com", "en", overrideVersionCode = 2), SingleLang("Sleeping Knight Scans", "https://skscans.com", "en", overrideVersionCode = 2),
MultiLang("Leviatan Scans", "https://leviatanscans.com", listOf("en", "es"), MultiLang("Leviatan Scans", "https://leviatanscans.com", listOf("en", "es"),
className = "LeviatanScansFactory", overrideVersionCode = 3), className = "LeviatanScansFactory", overrideVersionCode = 3),

View File

@ -44,7 +44,6 @@ class MMRCMSSources {
SourceData.Single("Scan VF", "https://www.scan-vf.net", "fr"), SourceData.Single("Scan VF", "https://www.scan-vf.net", "fr"),
SourceData.Single("Scan OP", "https://scan-op.cc", "fr"), SourceData.Single("Scan OP", "https://scan-op.cc", "fr"),
SourceData.Single("Komikid", "https://www.komikid.com", "id"), SourceData.Single("Komikid", "https://www.komikid.com", "id"),
SourceData.Single("Nikushima", "http://azbivo.webd.pro", "pl"),
SourceData.Single("MangaHanta", "http://mangahanta.com", "tr", overrideVersionCode = 1), SourceData.Single("MangaHanta", "http://mangahanta.com", "tr", overrideVersionCode = 1),
SourceData.Single("Fallen Angels Scans", "https://truyen.fascans.com", "vi"), SourceData.Single("Fallen Angels Scans", "https://truyen.fascans.com", "vi"),
SourceData.Single("LeoManga", "https://leomanga.me", "es", overrideVersionCode = 1), SourceData.Single("LeoManga", "https://leomanga.me", "es", overrideVersionCode = 1),
@ -88,6 +87,7 @@ class MMRCMSSources {
// SourceData("tr", "Epikmanga", "https://www.epikmanga.com"), // SourceData("tr", "Epikmanga", "https://www.epikmanga.com"),
// SourceData("en", "Hatigarm Scans", "https://hatigarmscans.net"), // SourceData("en", "Hatigarm Scans", "https://hatigarmscans.net"),
// Went offline // Went offline
// SourceData.Single("Nikushima", "http://azbivo.webd.pro", "pl"),
// SourceData("ru", "Japit Comics", "https://j-comics.ru"), // SourceData("ru", "Japit Comics", "https://j-comics.ru"),
// SourceData("es", "Universo Yuri", "https://universoyuri.com"), // SourceData("es", "Universo Yuri", "https://universoyuri.com"),
// SourceData("pl", "Dracaena", "https://dracaena.webd.pl/czytnik"), // SourceData("pl", "Dracaena", "https://dracaena.webd.pl/czytnik"),

View File

@ -13,7 +13,6 @@ class WPComicsGenerator : ThemeSourceGenerator {
override val baseVersionCode: Int = 1 override val baseVersionCode: Int = 1
override val sources = listOf( override val sources = listOf(
SingleLang("ComicLatest", "https://comiclatest.com", "en", overrideVersionCode = 1),
MultiLang("MangaSum", "https://mangasum.com", listOf("en", "ja")), MultiLang("MangaSum", "https://mangasum.com", listOf("en", "ja")),
SingleLang("NetTruyen", "https://www.nettruyen.com", "vi", overrideVersionCode = 1), SingleLang("NetTruyen", "https://www.nettruyen.com", "vi", overrideVersionCode = 1),
SingleLang("NhatTruyen", "http://nhattruyen.com", "vi", overrideVersionCode = 1), SingleLang("NhatTruyen", "http://nhattruyen.com", "vi", overrideVersionCode = 1),

View File

@ -14,32 +14,25 @@ class WPMangaStreamGenerator : ThemeSourceGenerator {
override val sources = listOf( override val sources = listOf(
SingleLang("Asura Scans", "override url", "en", overrideVersionCode = 1), SingleLang("Asura Scans", "override url", "en", overrideVersionCode = 1),
SingleLang("KlanKomik", "https://klankomik.com", "id"), SingleLang("KlanKomik", "https://klankomik.com", "id"),
SingleLang("ChiOtaku", "https://chiotaku.com", "id"),
SingleLang("MangaShiro", "https://mangashiro.co", "id"),
SingleLang("MasterKomik", "https://masterkomik.com", "id"), SingleLang("MasterKomik", "https://masterkomik.com", "id"),
SingleLang("Kaisar Komik", "https://kaisarkomik.com", "id"), SingleLang("Kaisar Komik", "https://kaisarkomik.com", "id"),
SingleLang("Rawkuma", "https://rawkuma.com/", "ja"), SingleLang("Rawkuma", "https://rawkuma.com/", "ja"),
SingleLang("MangaP", "https://mangap.me", "ar"),
SingleLang("Boosei", "https://boosei.com", "id"), SingleLang("Boosei", "https://boosei.com", "id"),
SingleLang("Mangakyo", "https://www.mangakyo.me", "id"), SingleLang("Mangakyo", "https://www.mangakyo.me", "id"),
SingleLang("Sekte Komik", "https://sektekomik.com", "id", overrideVersionCode = 2), SingleLang("Sekte Komik", "https://sektekomik.com", "id", overrideVersionCode = 2),
SingleLang("Komik Station", "https://komikstation.com", "id"), SingleLang("Komik Station", "https://komikstation.com", "id"),
SingleLang("Komik Indo", "https://www.komikindo.web.id", "id", className = "KomikIndoWPMS"),
SingleLang("Non-Stop Scans", "https://www.nonstopscans.com", "en", className = "NonStopScans"), SingleLang("Non-Stop Scans", "https://www.nonstopscans.com", "en", className = "NonStopScans"),
SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo"), SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo"),
SingleLang("Readkomik", "https://readkomik.com", "en", className = "ReadKomik"), SingleLang("Readkomik", "https://readkomik.com", "en", className = "ReadKomik"),
SingleLang("MangaIndonesia", "https://mangaindonesia.net", "id"), SingleLang("MangaIndonesia", "https://mangaindonesia.net", "id"),
SingleLang("Liebe Schnee Hiver", "https://www.liebeschneehiver.com", "tr"), SingleLang("Liebe Schnee Hiver", "https://www.liebeschneehiver.com", "tr"),
SingleLang("KomikRu", "https://komikru.com", "id"),
SingleLang("GURU Komik", "https://gurukomik.com", "id"), SingleLang("GURU Komik", "https://gurukomik.com", "id"),
SingleLang("Shea Manga", "https://sheamanga.my.id", "id"), SingleLang("Shea Manga", "https://sheamanga.my.id", "id"),
SingleLang("Komik AV", "https://komikav.com", "id"), SingleLang("Komik AV", "https://komikav.com", "id"),
SingleLang("Komik Cast", "https://komikcast.com", "id", overrideVersionCode = 6), SingleLang("Komik Cast", "https://komikcast.com", "id", overrideVersionCode = 6),
SingleLang("West Manga", "https://westmanga.info", "id"), SingleLang("West Manga", "https://westmanga.info", "id"),
SingleLang("Komik GO", "https://komikgo.com", "id", overrideVersionCode = 1),
SingleLang("MangaSwat", "https://mangaswat.com", "ar"), SingleLang("MangaSwat", "https://mangaswat.com", "ar"),
SingleLang("Manga Raw.org", "https://mangaraw.org", "ja", className = "MangaRawOrg", overrideVersionCode = 1), SingleLang("Manga Raw.org", "https://mangaraw.org", "ja", className = "MangaRawOrg", overrideVersionCode = 1),
SingleLang("Matakomik", "https://matakomik.com", "id"),
SingleLang("Manga Pro Z", "https://mangaproz.com", "ar"), SingleLang("Manga Pro Z", "https://mangaproz.com", "ar"),
SingleLang("Silence Scan", "https://silencescan.net", "pt-BR", overrideVersionCode = 1), SingleLang("Silence Scan", "https://silencescan.net", "pt-BR", overrideVersionCode = 1),
SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans"), SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans"),

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'AndromedaScans'
pkgNameSuffix = 'ar.andromedascans'
extClass = '.AndromedaScans'
extVersionCode = 1
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,89 +0,0 @@
package eu.kanade.tachiyomi.extension.ar.andromedascans
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
class AndromedaScans : ParsedHttpSource() {
override val name = "AndromedaScans"
override val baseUrl = "https://andromedax.net"
override val supportsLatest = true
override val lang = "ar"
override fun popularMangaRequest(page: Int) = GET("$baseUrl/projects", headers)
override fun popularMangaSelector() = "div.flexbox2-content"
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.select("a").attr("href"))
title = element.select("a").attr("title")
thumbnail_url = element.select("img").attr("abs:src").substringBeforeLast("resize")
}
override fun popularMangaNextPageSelector(): String? = null
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/$page", headers)
override fun latestUpdatesSelector() = "div.flexbox3-item"
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector() = "[rel=next]"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val type = "application/x-www-form-urlencoded; charset=UTF-8"
val body = "action=data_fetch&keyword=$query".toRequestBody(type.toMediaTypeOrNull())
return POST("$baseUrl/wp-admin/admin-ajax.php", headers, body)
}
override fun searchMangaSelector() = "div.searchbox"
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaNextPageSelector(): String? = null
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
author = document.select("ul.series-infolist span")[3].text()
genre = document.select("div.series-genres > a[rel=tag]").joinToString { it.text() }
description = document.select("div.series-synops").text().trim()
}
override fun chapterListSelector() = "ul.series-chapterlist > li"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
setUrlWithoutDomain(element.select("a").attr("href"))
name = element.select("span").first().ownText()
date_upload = dateFormat.parse(element.select("span.date").text())?.time ?: 0
}
companion object {
val dateFormat by lazy {
SimpleDateFormat("MMMM dd, yyyy", Locale.US)
}
}
override fun pageListParse(document: Document): List<Page> {
return document.select("noscript > img:not([alt=Andromeda Scans])").mapIndexed { i, element ->
Page(i, "", element.attr("abs:src"))
}
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
override fun getFilterList() = FilterList()
}

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'MangaZen'
pkgNameSuffix = 'ar.mangazen'
extClass = '.MangaZen'
extVersionCode = 1
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

View File

@ -1,86 +0,0 @@
package eu.kanade.tachiyomi.extension.ar.mangazen
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
class MangaZen : ParsedHttpSource() {
override val baseUrl = "https://manga-zen.com"
override val lang = "ar"
override val name = "MangaZen"
override val supportsLatest = true
override fun popularMangaRequest(page: Int) = GET("$baseUrl/قائمة-المانجا/page/$page", headers)
override fun popularMangaSelector() = "a[title][alt]"
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.attr("href"))
title = element.attr("title")
thumbnail_url = element.select("img").attr("abs:src").substringBeforeLast("?quality")
}
override fun popularMangaNextPageSelector() = "div.pagination:not(:has(span:last-child))"
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/قائمة-المانجا/page/$page/?order=update", headers)
override fun latestUpdatesSelector() = popularMangaSelector()
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/قائمة-المانجا/page/$page/?title=$query", headers)
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
description = document.select("div.desc").text()
genre = document.select("div.genre-info > a[itemprop=genre]").joinToString { it.text() }
status = parseStatus(document.select("div.spe").first().text())
}
private fun parseStatus(status: String) = when {
status.contains("مستمر") -> SManga.ONGOING
else -> SManga.COMPLETED
}
override fun chapterListSelector() = "div.epsleft"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
setUrlWithoutDomain(element.select("a").attr("href"))
name = element.select("a").text().trim()
date_upload = dateFormat.parse(element.select("span.date").text().trim())?.time ?: 0
}
companion object {
val dateFormat by lazy {
SimpleDateFormat("MMM dd, yyyy", Locale("ar"))
}
}
override fun pageListParse(document: Document): List<Page> {
return document.select("noscript > img#imagech").mapIndexed { i, element ->
Page(i, "", element.attr("abs:src"))
}
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
override fun getFilterList() = FilterList()
}

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Baca Manga'
pkgNameSuffix = 'id.bacamanga'
extClass = '.BacaManga'
extVersionCode = 3
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,273 +0,0 @@
package eu.kanade.tachiyomi.extension.id.bacamanga
import com.google.gson.JsonParser
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
class BacaManga : ParsedHttpSource() {
override val name = "BacaManga"
override val baseUrl = "https://bacamanga.cc"
override val lang = "id"
override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/komik-populer/page/$page/", headers)
}
override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/manga/page/$page/", headers)
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = if (query.isNotBlank()) {
val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
val pattern = "\\s+".toRegex()
val q = query.replace(pattern, "+")
if (query.isNotEmpty()) {
url.addQueryParameter("s", q)
} else {
url.addQueryParameter("s", "")
}
url.toString()
} else {
val url = "$baseUrl/daftar-komik/page/$page".toHttpUrlOrNull()!!.newBuilder()
var orderBy: String
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is Status -> url.addQueryParameter("status", arrayOf("", "ongoing", "completed")[filter.state])
is GenreList -> {
val genreInclude = mutableListOf<String>()
filter.state.forEach {
if (it.state == 1) {
genreInclude.add(it.id)
}
}
if (genreInclude.isNotEmpty()) {
genreInclude.forEach { genre ->
url.addQueryParameter("genre[]", genre)
}
}
}
is SortBy -> {
orderBy = filter.toUriPart()
url.addQueryParameter("order", orderBy)
}
}
}
url.toString()
}
return GET(url, headers)
}
override fun popularMangaSelector() = "div.animepost"
override fun latestUpdatesSelector() = popularMangaSelector()
override fun searchMangaSelector() = popularMangaSelector()
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
manga.thumbnail_url = element.select("img").attr("data-lazy-src")
manga.setUrlWithoutDomain(element.select(".bigor > a").attr("href"))
manga.title = element.select(".bigor .tt h2").text()
return manga
}
override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element)
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
override fun popularMangaNextPageSelector() = "a.next.page-numbers"
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select(".infox").first()
val sepName = infoElement.select(".spe > span:nth-child(4)").last()
val manga = SManga.create()
manga.author = infoElement.select(".spe span:contains(Pengarang)").text().replace("Pengarang: ", "").trim()
manga.artist = sepName.ownText()
val genres = mutableListOf<String>()
infoElement.select(".genre-info > a").forEach { element ->
val genre = element.text()
genres.add(genre)
}
manga.genre = genres.joinToString(", ")
manga.status = parseStatus(infoElement.select(".spe span:contains(Status)").text())
manga.description = document.select("div[^itemprop]").last().text()
manga.thumbnail_url = document.select(".thumb noscript img").first().attr("src")
return manga
}
private fun parseStatus(element: String): Int = when {
element.toLowerCase().contains("berjalan") -> SManga.ONGOING
element.toLowerCase().contains("tamat") -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "div#chapter_list ul li"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select(".lchx a").first()
val timeElement = element.select("span.rightoff").first()
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.text()
chapter.date_upload = 0
return chapter
}
override fun prepareNewChapter(chapter: SChapter, manga: SManga) {
val basic = Regex("""Chapter\s([0-9]+)""")
when {
basic.containsMatchIn(chapter.name) -> {
basic.find(chapter.name)?.let {
chapter.chapter_number = it.groups[1]?.value!!.toFloat()
}
}
}
}
override fun pageListParse(document: Document): List<Page> {
val pages = mutableListOf<Page>()
val scriptToParse = document.select("script[src*=cache]").first().attr("src")
val slideaid = client.newCall(GET(scriptToParse, headers)).execute().body!!.string()
val imagesList = slideaid.substringAfter("var imgch").substringBefore(";").substringAfter("=").trim()
val img_url = slideaid.substringAfter("#chimg").substringBefore("onError").substringAfter("src=\"").substringBefore("'").trim()
val json = JsonParser().parse(imagesList).asJsonArray
json.forEachIndexed { i, url ->
val url_clean = url.toString().removeSurrounding("\"")
// BASE URL HARD CODED
pages.add(Page(i, "", "$img_url$url_clean"))
}
return pages
}
override fun imageUrlParse(document: Document) = ""
override fun imageRequest(page: Page): Request {
val headers = Headers.Builder()
headers.apply {
add("Referer", baseUrl)
add("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.100 Mobile Safari/537.36")
}
if (page.imageUrl!!.contains("i0.wp.com")) {
headers.apply {
add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
}
}
return GET(page.imageUrl!!, headers.build())
}
private class SortBy : UriPartFilter(
"Sort by",
arrayOf(
Pair("Default", ""),
Pair("A-Z", "title"),
Pair("Z-A", "titlereverse"),
Pair("Latest Update", "update"),
Pair("Latest Added", "latest"),
Pair("Popular", "popular")
)
)
private class Status : UriPartFilter(
"Status",
arrayOf(
Pair("All", ""),
Pair("Ongoing", "Ongoing"),
Pair("Completed", "Completed")
)
)
private class Genre(name: String, val id: String = name) : Filter.TriState(name)
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
override fun getFilterList() = FilterList(
Filter.Header("NOTE: Ignored if using text search!"),
Filter.Separator(),
SortBy(),
Filter.Separator(),
Status(),
Filter.Separator(),
GenreList(getGenreList())
)
private fun getGenreList() = listOf(
Genre("Action", "action"),
Genre("Adult", "adult"),
Genre("Adventure", "adventure"),
Genre("Comedy", "comedy"),
Genre("Demon", "demon"),
Genre("Demons", "demons"),
Genre("Doujinshi", "doujinshi"),
Genre("Drama", "drama"),
Genre("Ecchi", "ecchi"),
Genre("Fantasy", "fantasy"),
Genre("Game", "game"),
Genre("Gender Bender", "gender-bender"),
Genre("Genres: Action", "genres-action"),
Genre("Gore", "gore"),
Genre("Harem", "harem"),
Genre("Historical", "historical"),
Genre("Horor", "horor"),
Genre("Horror", "horror"),
Genre("Isekai", "isekai"),
Genre("Josei", "josei"),
Genre("Lolicon", "lolicon"),
Genre("Magic", "magic"),
Genre("Manhua", "manhua"),
Genre("Martial Art", "martial-art"),
Genre("Martial Arts", "martial-arts"),
Genre("Mature", "mature"),
Genre("Mecha", "mecha"),
Genre("Medical", "medical"),
Genre("Military", "military"),
Genre("Mistery", "mistery"),
Genre("Music", "music"),
Genre("Mystery", "mystery"),
Genre("Project", "project"),
Genre("Psychological", "psychological"),
Genre("Reincarnation", "reincarnation"),
Genre("Romance", "romance"),
Genre("School", "school"),
Genre("School Life", "school-life"),
Genre("school of life", "school-of-life"),
Genre("Sci-fi", "sci-fi"),
Genre("Seinen", "seinen"),
Genre("sepernatural", "sepernatural"),
Genre("Shotacon", "shotacon"),
Genre("Shoujo", "shoujo"),
Genre("Shoujo Ai", "shoujo-ai"),
Genre("Shounen", "shounen"),
Genre("Shounen Ai", "shounen-ai"),
Genre("Slice of Life", "slice-of-life"),
Genre("Smut", "smut"),
Genre("Sports", "sports"),
Genre("Super Power", "super-power"),
Genre("Supernatural", "supernatural"),
Genre("Thriller", "thriller"),
Genre("Tragedy", "tragedy"),
Genre("Webtoons", "webtoons"),
Genre("Worn and Torn Newbie", "worn-and-torn-newbie"),
Genre("Yuri", "yuri")
)
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
fun toUriPart() = vals[state].second
}
}

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Manga Indo'
pkgNameSuffix = 'id.mangaindo'
extClass = '.MangaIndo'
extVersionCode = 1
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

View File

@ -1,153 +0,0 @@
package eu.kanade.tachiyomi.extension.id.mangaindo
import com.github.salomonbrys.kotson.fromJson
import com.github.salomonbrys.kotson.get
import com.github.salomonbrys.kotson.int
import com.google.gson.Gson
import com.google.gson.JsonObject
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
class MangaIndo : ParsedHttpSource() {
override val name = "Manga Indo"
override val baseUrl = "https://mangaindo.web.id"
override val lang = "id"
override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient
private val gson = Gson()
// Popular
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/api/cpt/products/?limit=20&page=$page", headers)
}
override fun popularMangaParse(response: Response): MangasPage = searchMangaParse(response)
override fun popularMangaSelector() = throw UnsupportedOperationException("Not used")
override fun popularMangaFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
override fun popularMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
// Latest
override fun latestUpdatesRequest(page: Int): Request {
return GET(baseUrl, headers)
}
override fun latestUpdatesParse(response: Response): MangasPage {
return MangasPage(super.latestUpdatesParse(response).mangas.distinctBy { it.url }, false)
}
override fun latestUpdatesSelector() = "li.rpwe-li a"
override fun latestUpdatesFromElement(element: Element): SManga {
return SManga.create().apply {
title = element.text().substringBeforeLast("").trim()
setUrlWithoutDomain(element.attr("href").substringBeforeLast("-indonesia"))
}
}
override fun latestUpdatesNextPageSelector(): String? = null
// Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return GET("$baseUrl/api/cpt/products/?limit=20&page=$page&post_title=$query", headers)
}
override fun searchMangaParse(response: Response): MangasPage {
return gson.fromJson<JsonObject>(response.body!!.string()).let { json ->
val mangas = json["data"].asJsonArray.map { data ->
SManga.create().apply {
title = data["post"]["post_title"].asString
url = "/${data["post"]["post_name"].asString}/"
thumbnail_url = data["acf"]["m-cover"]["value"].asString
}
}
MangasPage(mangas, json["page"].int < json["total_page"].int && json["data"].asJsonArray.count() == 20)
}
}
override fun searchMangaSelector() = throw UnsupportedOperationException("Not used")
override fun searchMangaFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
override fun searchMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
// Details
override fun mangaDetailsParse(document: Document): SManga {
return document.select("div#main").let { info ->
SManga.create().apply {
title = info.select("h2").text()
author = info.select("span#m-author").text()
artist = info.select("span#m-artist").text()
status = info.select("span#m-status").text().toStatus()
genre = info.select("span#m-genre a").joinToString { it.text() }
description = info.select("span#m-synopsis").text()
thumbnail_url = info.select("div#m-cover img").attr("abs:src")
}
}
}
private fun String?.toStatus() = when {
this == null -> SManga.UNKNOWN
this.contains("Ongoing", ignoreCase = true) -> SManga.ONGOING
this.contains("Completed", ignoreCase = true) -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
// Chapters
override fun chapterListSelector() = "ul.lcp_catlist li"
override fun chapterFromElement(element: Element): SChapter {
return SChapter.create().apply {
element.select("a").let {
name = it.text()
setUrlWithoutDomain(it.attr("href"))
}
date_upload = parseChapterDate(element.select("span").text())
}
}
private fun parseChapterDate(date: String): Long {
return try {
SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()).parse(date)?.time ?: 0L
} catch (e: Exception) {
0L
}
}
// Pages
override fun pageListParse(document: Document): List<Page> {
return document.select("div.entry-content img").mapIndexed { i, img ->
Page(i, "", img.attr("abs:src"))
}
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
override fun getFilterList() = FilterList()
}

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Neumanga'
pkgNameSuffix = 'id.neumanga'
extClass = '.Neumanga'
extVersionCode = 3
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

View File

@ -1,251 +0,0 @@
package eu.kanade.tachiyomi.extension.id.neumanga
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
import org.json.JSONArray
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.X509TrustManager
class Neumanga : ParsedHttpSource() {
override val name = "Neumanga"
override val baseUrl = "https://neumanga.tv"
override val lang = "id"
override val supportsLatest = true
private val trustManager = object : X509TrustManager {
override fun getAcceptedIssuers(): Array<X509Certificate> {
return emptyArray()
}
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
}
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
}
}
private val sslContext = SSLContext.getInstance("SSL").apply {
init(null, arrayOf(trustManager), SecureRandom())
}
override val client = super.client.newBuilder()
.sslSocketFactory(sslContext.socketFactory, trustManager)
.build()
override fun popularMangaSelector() = "div#gov-result div.bolx"
override fun latestUpdatesSelector() = "div#gov-result div.bolx"
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/advanced_search?sortby=rating&advpage=$page", headers)
}
override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/advanced_search?sortby=latest&advpage=$page", headers)
}
private fun mangaFromElement(query: String, element: Element): SManga {
val manga = SManga.create()
element.select(query).first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.text()
}
return manga
}
override fun popularMangaFromElement(element: Element): SManga {
return mangaFromElement("h2 a", element)
}
override fun latestUpdatesFromElement(element: Element): SManga {
return mangaFromElement("h2 a", element)
}
override fun popularMangaNextPageSelector() = "div#gov-result ul.pagination li.active + li a"
override fun latestUpdatesNextPageSelector() = "div#gov-result ul.pagination li.active + li a"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/advanced_search".toHttpUrlOrNull()!!.newBuilder()
.addQueryParameter("advpage", page.toString())
.addQueryParameter("name_search_mode", "contain")
.addQueryParameter("artist_search_mode", "contain")
.addQueryParameter("author_search_mode", "contain")
.addQueryParameter("year_search_mode", "on")
.addQueryParameter("rating_search_mode", "is")
.addQueryParameter("name_search_query", query)
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) {
is Status -> url.addQueryParameter("manga_status", arrayOf("", "completed", "ongoing")[filter.state])
is GenreList -> {
val genreInclude = mutableListOf<String>()
val genreExclude = mutableListOf<String>()
filter.state.forEach {
if (it.state == 1) {
genreInclude.add(it.id)
} else if (it.state == 2) {
genreExclude.add(it.id)
}
}
url.addQueryParameter("genre1", JSONArray(genreInclude).toString())
url.addQueryParameter("genre2", JSONArray(genreExclude).toString())
}
is SelectField -> url.addQueryParameter(filter.key, filter.values[filter.state])
is TextField -> url.addQueryParameter(filter.key, filter.state)
}
}
return GET(url.toString(), headers)
}
override fun searchMangaSelector() = "div#gov-result div.bolx"
override fun searchMangaFromElement(element: Element): SManga {
return mangaFromElement("h2 a", element)
}
override fun searchMangaNextPageSelector() = "div#gov-result ul.pagination li.active + li a"
override fun mangaDetailsParse(document: Document): SManga {
val mangaInformationWrapper = document.select("#main .info").first()
val manga = SManga.create()
manga.author = mangaInformationWrapper.select("span a[href*=author_search_mode]").first().text()
manga.artist = mangaInformationWrapper.select("span a[href*=artist_search_mode]").first().text()
manga.genre = mangaInformationWrapper.select("a[href*=genre]").joinToString { it.text() }
manga.thumbnail_url = mangaInformationWrapper.select("img.imagemg").first().attr("src")
manga.description = document.select(".summary").first().textNodes()[1].toString()
manga.status = parseStatus(mangaInformationWrapper.select("span a[href*=manga_status]").first().text())
return manga
}
private fun parseStatus(status: String) = when {
status.contains("ongoing") -> SManga.ONGOING
status.contains("completed") -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = ".chapter .item:first-child .item-content a"
override fun chapterFromElement(element: Element): SChapter {
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(element.attr("href") + "/1")
chapter.name = element.select("h3").text()
return chapter
}
override fun pageListParse(document: Document): List<Page> {
val pages = mutableListOf<Page>()
document.select(".readnav select.page").first()?.getElementsByTag("option")?.forEach {
pages.add(Page(pages.size, it.attr("value")))
}
pages.getOrNull(0)?.imageUrl = imageUrlParse(document)
return pages
}
override fun imageUrlParse(document: Document) = document.select(".readarea img.imagechap").attr("src")
private class Status : Filter.TriState("Completed")
private class TextField(name: String, val key: String) : Filter.Text(name)
private class Genre(name: String, val id: String = name) : Filter.TriState(name)
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
private class SelectField(name: String, val key: String, values: Array<String>, state: Int = 0) : Filter.Select<String>(name, values, state)
override fun getFilterList() = FilterList(
SelectField("Sort", "sortby", arrayOf("rating", "name", "views", "latest")),
TextField("Author", "author_search_query"),
TextField("Artist", "artist_search_query"),
TextField("Release Year", "year_value"),
Status(),
GenreList(getGenreList())
)
private fun getGenreList() = listOf(
Genre("Adventure", "Adventure"),
Genre("Demons", "Demons"),
Genre("fighting", "fighting"),
Genre("Horor", "Horor"),
Genre("legend", "legend"),
Genre("Manhua", "Manhua"),
Genre("Mecha", "Mecha"),
Genre("Romance", "Romance"),
Genre("neco", "neco"),
Genre("Seinen", "Seinen"),
Genre("Slice Of Life", "Slice Of Life"),
Genre("Superhero", "Superhero"),
Genre("Tragedy", "Tragedy"),
Genre("Vampire", "Vampire"),
Genre("Supernatural", "Supernatural"),
Genre("Shoujo", "Shoujo"),
Genre("Smut", "Smut"),
Genre("School", "School"),
Genre("Oneshot", "Oneshot"),
Genre("Miatery", "Miatery"),
Genre("Manhwa", "Manhwa"),
Genre("live School", "live School"),
Genre("Horror", "Horror"),
Genre("Game", "Game"),
Genre("Antihero", "Antihero"),
Genre("Action", "Action"),
Genre("Comedy", "Comedy"),
Genre("Drama", "Drama"),
Genre("Ecchi", "Ecchi"),
Genre("Action. Adventure", "Action. Adventure"),
Genre("Gender Bender", "Gender Bender"),
Genre("Inaka", "Inaka"),
Genre("Lolicon", "Lolicon"),
Genre("Adult", "Adult"),
Genre("Cooking", "Cooking"),
Genre("Harem", "Harem"),
Genre("Isekai", "Isekai"),
Genre("Magic", "Magic"),
Genre("Music", "Music"),
Genre("Martial Arts", "Martial Arts"),
Genre("Project", "Project"),
Genre("sci fi", "sci fi"),
Genre("Shounen", "Shounen"),
Genre("Military", "Military"),
Genre("Martial Art", "Martial Art"),
Genre("Over Power", "Over Power"),
Genre("School Life", "School Life"),
Genre("Shoujo Ai", "Shoujo Ai"),
Genre("sport", "sport"),
Genre("Supranatural", "Supranatural"),
Genre("Webtoon", "Webtoon"),
Genre("Webtoons", "Webtoons"),
Genre("Suspense", "Suspense"),
Genre("Sports", "Sports"),
Genre("Yuri", "Yuri"),
Genre("Thriller", "Thriller"),
Genre("Super Power", "Super Power"),
Genre("ShounenS", "ShounenS"),
Genre("Sci-fi", "Sci-fi"),
Genre("Psychological", "Psychological"),
Genre("Mystery", "Mystery"),
Genre("Mature", "Mature"),
Genre("Manga", "Manga"),
Genre("Josei", "Josei"),
Genre("Historical", "Historical"),
Genre("Fantasy", "Fantasy"),
Genre("Dachima", "Dachima"),
Genre("Advanture", "Advanture"),
Genre("Echi", "Echi"),
Genre("4-Koma", "4-Koma")
)
}

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />

View File

@ -1,17 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Mundo Hentai'
pkgNameSuffix = 'pt.mundohentai'
extClass = '.MundoHentai'
extVersionCode = 2
libVersion = '1.2'
containsNsfw = true
}
dependencies {
implementation project(':lib-ratelimit')
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

View File

@ -1,193 +0,0 @@
package eu.kanade.tachiyomi.extension.pt.mundohentai
import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.util.concurrent.TimeUnit
@Nsfw
class MundoHentai : ParsedHttpSource() {
override val name = "Mundo Hentai"
override val baseUrl = "https://mundohentaioficial.com"
override val lang = "pt-BR"
override val supportsLatest = false
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("User-Agent", USER_AGENT)
.add("Referer", baseUrl)
private fun genericMangaFromElement(element: Element): SManga =
SManga.create().apply {
title = element.select("div.menu a.title").text()
thumbnail_url = element.attr("style")
.substringAfter("url(\"")
.substringBefore("\")")
url = element.select("a.absolute").attr("href")
}
// The source does not have a popular list page, so we use the Doujin list instead.
override fun popularMangaRequest(page: Int): Request {
val newHeaders = headersBuilder()
.set("Referer", if (page == 1) baseUrl else "$baseUrl/tipo/doujin/${page - 1}")
.build()
val pageStr = if (page != 1) "/$page" else ""
return GET("$baseUrl/tipo/doujin$pageStr", newHeaders)
}
override fun popularMangaSelector(): String = "ul.post-list li div.card:has(a.absolute[href^=/])"
override fun popularMangaFromElement(element: Element): SManga = genericMangaFromElement(element)
override fun popularMangaNextPageSelector() = "div.buttons:not(:has(a.selected + a.material-icons))"
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isNotEmpty()) {
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
.addQueryParameter("q", query)
.toString()
return GET(url, headers)
}
val tagFilter = filters[1] as TagFilter
val tagSlug = tagFilter.values[tagFilter.state].slug
val newHeaders = headersBuilder()
.set("Referer", if (page == 1) "$baseUrl/categories" else "$baseUrl/tags/$tagSlug/${page - 1}")
.build()
val pageStr = if (page != 1) "/$page" else ""
return GET("$baseUrl/tags/$tagSlug$pageStr", newHeaders)
}
override fun searchMangaSelector() = popularMangaSelector() + ":not(:has(div.right-tape))"
override fun searchMangaFromElement(element: Element): SManga = genericMangaFromElement(element)
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
override fun mangaDetailsParse(document: Document): SManga {
val post = document.select("div.post")
return SManga.create().apply {
author = post.select("div.tags div.tag:contains(Artista:) a.value").text()
genre = post.select("div.tags div.tag:contains(Tags:) a.value").joinToString { it.text() }
description = post.select("div.tags div.tag:contains(Tipo:)").text()
.plus("\n" + post.select("div.tags div.tag:contains(Cor:)").text())
status = SManga.COMPLETED
thumbnail_url = post.select("div.cover img").attr("src")
}
}
override fun chapterListSelector(): String = "div.post header.data div.float-buttons a.read"
override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
name = "Capítulo"
scanlator = element.parent().parent()
.select("div.tags div.tag:contains(Tradutor:) a.value")
.text()
chapter_number = 1f
url = element.attr("href")
}
override fun pageListRequest(chapter: SChapter): Request {
val newHeader = headersBuilder()
.set("Referer", "$baseUrl${chapter.url}".substringBeforeLast("/"))
.build()
return GET(baseUrl + chapter.url, newHeader)
}
override fun pageListParse(document: Document): List<Page> {
return document.select("div.gallery > img")
.mapIndexed { i, el ->
Page(i, document.location(), el.attr("src"))
}
}
override fun imageUrlParse(document: Document) = ""
override fun imageRequest(page: Page): Request {
val newHeaders = headersBuilder()
.set("Referer", page.url)
.build()
return GET(page.imageUrl!!, newHeaders)
}
override fun getFilterList(): FilterList = FilterList(
Filter.Header("Os filtros são ignorados na busca!"),
TagFilter(getTags())
)
data class Tag(val name: String, val slug: String) {
override fun toString(): String = name
}
private class TagFilter(tags: Array<Tag>) : Filter.Select<Tag>("Tag", tags)
private fun getTags(): Array<Tag> = arrayOf(
Tag("-- Selecione --", ""),
Tag("Ahegao", "ahegao"),
Tag("Anal", "anal"),
Tag("Biquíni", "biquini"),
Tag("Chubby", "chubby"),
Tag("Colegial", "colegial"),
Tag("Creampie", "creampie"),
Tag("Dark Skin", "dark-skin"),
Tag("Dupla Penetração", "dupla-penetracao"),
Tag("Espanhola", "espanhola"),
Tag("Exibicionismo", "exibicionismo"),
Tag("Footjob", "footjob"),
Tag("Furry", "furry"),
Tag("Futanari", "futanari"),
Tag("Grupal", "grupal"),
Tag("Incesto", "incesto"),
Tag("Lingerie", "lingerie"),
Tag("MILF", "milf"),
Tag("Maiô", "maio"),
Tag("Masturbação", "masturbacao"),
Tag("Netorare", "netorare"),
Tag("Oral", "oral"),
Tag("Peitinhos", "peitinhos"),
Tag("Preservativo", "preservativo"),
Tag("Professora", "professora"),
Tag("Sex Toys", "sex-toys"),
Tag("Tentáculos", "tentaculos"),
Tag("Yaoi", "yaoi")
)
override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException("Not used")
override fun latestUpdatesSelector(): String = throw UnsupportedOperationException("Not used")
override fun latestUpdatesFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
override fun latestUpdatesNextPageSelector(): String = throw UnsupportedOperationException("Not used")
companion object {
private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"
}
}