Add rate limiting to some sources (#6916)

* Add rate limiting to some Madara sources.

* Add rate limiting to some other sources.

* Add rate limiting to Hentaimimi (closes #6910).
This commit is contained in:
Alessandro Jean 2021-05-08 21:52:28 -03:00 committed by GitHub
parent 4906ee12e6
commit 050c71a011
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 381 additions and 75 deletions

View File

@ -2,14 +2,25 @@ package eu.kanade.tachiyomi.extension.pt.baixarhentai
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.OkHttpClient
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import java.util.concurrent.TimeUnit
@Nsfw @Nsfw
class BaixarHentai : FoolSlide("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR") { class BaixarHentai : FoolSlide(
"Baixar Hentai",
"https://leitura.baixarhentai.net",
"pt-BR"
) {
// Hardcode the id because the language wasn't specific. // Hardcode the id because the language wasn't specific.
override val id: Long = 8908032188831949972 override val id: Long = 8908032188831949972
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
return SManga.create().apply { return SManga.create().apply {
title = document.select("h1.title").text() title = document.select("h1.title").text()

View File

@ -0,0 +1,4 @@
dependencies {
implementation project(':lib-ratelimit')
}

View File

@ -1,7 +1,22 @@
package eu.kanade.tachiyomi.extension.pt.argosscan package eu.kanade.tachiyomi.extension.pt.argosscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class ArgosScan : Madara("Argos Scan", "https://argosscan.com", "pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))) class ArgosScan : Madara(
"Argos Scan",
"https://argosscan.com",
"pt-BR",
SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
}

View File

@ -0,0 +1,22 @@
package eu.kanade.tachiyomi.extension.pt.cervoscanlator
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class CervoScanlator : Madara(
"Cervo Scanlator",
"https://cervoscan.xyz",
"pt-BR",
SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
}

View File

@ -0,0 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.darkyurealm
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class DarkyuRealm : Madara(
"Darkyu Realm",
"https://darkyuerealm.site",
"pt-BR",
SimpleDateFormat("dd 'de' MMMMM, yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,10 +1,26 @@
package eu.kanade.tachiyomi.extension.pt.dropescan package eu.kanade.tachiyomi.extension.pt.dropescan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class DropeScan : Madara(
"Drope Scan",
"https://dropescan.com",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
class DropeScan : Madara("Drope Scan", "https://dropescan.com", "pt-BR") {
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=views", headers) override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=views", headers)
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=latest", headers) override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=latest", headers)
} }

View File

@ -1,7 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.fdmscan package eu.kanade.tachiyomi.extension.pt.fdmscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class FDMScan : Madara("FDM Scan", "https://fdmscan.com", "pt-BR", SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR"))) class FDMScan : Madara(
"FDM Scan",
"https://fdmscan.com",
"pt-BR",
SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,7 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.furioscans package eu.kanade.tachiyomi.extension.pt.furioscans
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class FurioScans : Madara("Furio Scans", "https://furioscans.com", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())) class FurioScans : Madara(
"Furio Scans",
"https://furioscans.com",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,7 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.ichirinnohanayuri package eu.kanade.tachiyomi.extension.pt.ichirinnohanayuri
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class IchirinNoHanaYuri : Madara("Ichirin No Hana Yuri", "https://ichirinnohanayuri.com.br", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale("pt"))) class IchirinNoHanaYuri : Madara(
"Ichirin No Hana Yuri",
"https://ichirinnohanayuri.com.br",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,8 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.littlemonsterscan package eu.kanade.tachiyomi.extension.pt.littlemonsterscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class LittleMonsterScan : Madara("Little Monster Scan", "https://littlemonsterscan.com.br", class LittleMonsterScan : Madara(
"pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))) "Little Monster Scan",
"https://littlemonsterscan.com.br",
"pt-BR",
SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,20 +1,27 @@
package eu.kanade.tachiyomi.extension.pt.mangateca package eu.kanade.tachiyomi.extension.pt.mangateca
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import okhttp3.Headers import okhttp3.Headers
import okhttp3.OkHttpClient
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class MangaTeca : Madara( class MangaTeca : Madara(
"MangaTeca", "MangaTeca",
"https://www.mangateca.com", "https://www.mangateca.com",
"pt-BR", "pt-BR",
SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR")) SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) { ) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun headersBuilder(): Headers.Builder = Headers.Builder() override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("User-Agent", USER_AGENT)
.add("Referer", baseUrl) .add("Referer", baseUrl)
.add("Origin", baseUrl) .add("Origin", baseUrl)
@ -27,9 +34,4 @@ class MangaTeca : Madara(
return parsedChapter return parsedChapter
} }
companion object {
private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
} }

View File

@ -0,0 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.markscans
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class MarkScans : Madara(
"Mark Scans",
"https://markscans.online",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,7 +0,0 @@
package eu.kanade.tachiyomi.extension.pt.nekobreaker
import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
class NekoBreaker : Madara("NekoBreaker", "https://nekobreaker.com", "pt-BR", SimpleDateFormat("MMMM dd, yyyy", Locale("pt")))

View File

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.extension.pt.neoxscanlator package eu.kanade.tachiyomi.extension.pt.neoxscanlator
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.Headers import okhttp3.Headers
@ -17,18 +18,13 @@ class NeoxScanlator : Madara(
override val client: OkHttpClient = network.cloudflareClient.newBuilder() override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(1, TimeUnit.MINUTES) .connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES) .readTimeout(1, TimeUnit.MINUTES)
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build() .build()
override fun headersBuilder(): Headers.Builder = Headers.Builder() override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("User-Agent", USER_AGENT)
.add("Referer", baseUrl) .add("Referer", baseUrl)
.add("Origin", baseUrl) .add("Origin", baseUrl)
// Only status and order by filter work. // Only status and order by filter work.
override fun getFilterList(): FilterList = FilterList(super.getFilterList().slice(3..4)) override fun getFilterList(): FilterList = FilterList(super.getFilterList().slice(3..4))
companion object {
private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
} }

View File

@ -1,12 +1,22 @@
package eu.kanade.tachiyomi.extension.pt.offscan package eu.kanade.tachiyomi.extension.pt.offscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class OffScan : Madara( class OffScan : Madara(
"Off Scan", "Off Scan",
"https://offscan.top", "https://offscan.top",
"pt-BR", "pt-BR",
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US) SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) ) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
}

View File

@ -0,0 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.origamiorpheans
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
class OrigamiOrpheans : Madara(
"Origami Orpheans",
"https://origami-orpheans.com.br",
"pt-BR",
SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,7 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.projetoscanlator package eu.kanade.tachiyomi.extension.pt.projetoscanlator
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class ProjetoScanlator : Madara("Projeto Scanlator", "https://projetoscanlator.com", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))) class ProjetoScanlator : Madara(
"Projeto Scanlator",
"https://projetoscanlator.com",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,7 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.randomscan package eu.kanade.tachiyomi.extension.pt.randomscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class RandomScan : Madara("Random Scan","https://randomscan.online","pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))) class RandomScan : Madara(
"Random Scan",
"https://randomscan.online",
"pt-BR",
SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,8 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.shinzooscan package eu.kanade.tachiyomi.extension.pt.shinzooscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class ShinzooScan : Madara(
"Shinzoo Scan",
"https://shinzooscan.xyz",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
class ShinzooScan : Madara("Shinzoo Scan", "https://shinzooscan.xyz", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))) override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,12 +1,27 @@
package eu.kanade.tachiyomi.extension.pt.stagecomics package eu.kanade.tachiyomi.extension.pt.stagecomics
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import okhttp3.OkHttpClient
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class StageComics : Madara(
"StageComics",
"https://stagecomics.com",
"pt-BR",
SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
class StageComics : Madara("StageComics", "https://stagecomics.com", "pt-BR", SimpleDateFormat("MMMM dd, yyyy", Locale("pt"))) {
override fun chapterFromElement(element: Element): SChapter { override fun chapterFromElement(element: Element): SChapter {
val parsedChapter = super.chapterFromElement(element) val parsedChapter = super.chapterFromElement(element)

View File

@ -1,8 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.threequeensscanlator package eu.kanade.tachiyomi.extension.pt.threequeensscanlator
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class ThreeQueensScanlator : Madara("Three Queens Scanlator", "https://tqscan.com.br", class ThreeQueensScanlator : Madara(
"pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))) "Three Queens Scanlator",
"https://tqscan.com.br",
"pt-BR",
SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,8 +1,22 @@
package eu.kanade.tachiyomi.extension.pt.warqueenscan package eu.kanade.tachiyomi.extension.pt.warqueenscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class WarQueenScan : Madara("War Queen Scan", "https://wqscan.com", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale.US)) class WarQueenScan : Madara(
"War Queen Scan",
"https://wqscan.com",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
}

View File

@ -1,8 +1,20 @@
package eu.kanade.tachiyomi.extension.pt.winterscan package eu.kanade.tachiyomi.extension.pt.winterscan
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class WinterScan : Madara("Winter Scan", "https://winterscan.com.br", class WinterScan : Madara(
"pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))) "Winter Scan",
"https://winterscan.com.br",
"pt-BR",
SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR"))
) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -1,12 +1,22 @@
package eu.kanade.tachiyomi.extension.pt.yuriverso package eu.kanade.tachiyomi.extension.pt.yuriverso
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.madara.Madara import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class YuriVerso : Madara( class YuriVerso : Madara(
"Yuri Verso", "Yuri Verso",
"https://yuri.live", "https://yuri.live",
"pt-BR", "pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")) SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
) ) {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
override fun popularMangaSelector() = "div.page-item-detail.manga"
}

View File

@ -1,7 +1,14 @@
package eu.kanade.tachiyomi.extension.pt.animaregia package eu.kanade.tachiyomi.extension.pt.animaregia
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.mmrcms.MMRCMS import eu.kanade.tachiyomi.multisrc.mmrcms.MMRCMS
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
class AnimaRegia : MMRCMS("AnimaRegia", "https://animaregia.net", "pt-BR"){ class AnimaRegia : MMRCMS("AnimaRegia", "https://animaregia.net", "pt-BR") {
override val id: Long = 4378659695320121364 override val id: Long = 4378659695320121364
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
} }

View File

@ -0,0 +1,13 @@
package eu.kanade.tachiyomi.extension.pt.remangas
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.multisrc.mmrcms.MMRCMS
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
class Remangas : MMRCMS("Remangas", "https://remangas.top", "pt-BR") {
override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
}

View File

@ -22,12 +22,11 @@ class SilenceScan : WPMangaStream(
"pt-BR", "pt-BR",
SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR")) SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR"))
) { ) {
private val rateLimitInterceptor = RateLimitInterceptor(4)
override val client: OkHttpClient = network.cloudflareClient.newBuilder() override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS)
.addNetworkInterceptor(rateLimitInterceptor) .addNetworkInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build() .build()
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
@ -79,7 +78,7 @@ class SilenceScan : WPMangaStream(
.data() .data()
.substringAfter("run(") .substringAfter("run(")
.substringBeforeLast(");") .substringBeforeLast(");")
.let { JSON_PARSER.parse(it) } .let { JsonParser.parseString(it) }
.obj .obj
if (chapterObj["sources"].array.size() == 0) { if (chapterObj["sources"].array.size() == 0) {
@ -127,8 +126,4 @@ class SilenceScan : WPMangaStream(
Genre("Violência sexual", "violencia-sexual"), Genre("Violência sexual", "violencia-sexual"),
Genre("Yuri", "yuri") Genre("Yuri", "yuri")
) )
companion object {
private val JSON_PARSER by lazy { JsonParser() }
}
} }

View File

@ -34,7 +34,7 @@ class FoolSlideGenerator : ThemeSourceGenerator {
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"),
SingleLang("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR", isNsfw = true, overrideVersionCode = 1), SingleLang("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR", isNsfw = true, overrideVersionCode = 2),
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"),

View File

@ -24,7 +24,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("ApollComics", "https://apollcomics.xyz", "es"), SingleLang("ApollComics", "https://apollcomics.xyz", "es"),
SingleLang("Arang Scans", "https://arangscans.com", "en", overrideVersionCode = 2), SingleLang("Arang Scans", "https://arangscans.com", "en", overrideVersionCode = 2),
SingleLang("ArazNovel", "https://www.araznovel.com", "tr"), SingleLang("ArazNovel", "https://www.araznovel.com", "tr"),
SingleLang("Argos Scan", "https://argosscan.com", "pt-BR"), SingleLang("Argos Scan", "https://argosscan.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Asgard Team", "https://www.asgard1team.com", "ar", overrideVersionCode = 1), SingleLang("Asgard Team", "https://www.asgard1team.com", "ar", overrideVersionCode = 1),
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"),
@ -47,7 +47,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Comics Valley", "https://comicsvalley.com", "hi", isNsfw = true), SingleLang("Comics Valley", "https://comicsvalley.com", "hi", isNsfw = true),
SingleLang("CopyPasteScan", "https://copypastescan.xyz", "es"), SingleLang("CopyPasteScan", "https://copypastescan.xyz", "es"),
SingleLang("Cutie Pie", "https://cutiepie.ga", "tr"), SingleLang("Cutie Pie", "https://cutiepie.ga", "tr"),
SingleLang("Darkyu Realm", "https://darkyuerealm.site", "pt-BR"), SingleLang("Darkyu Realm", "https://darkyuerealm.site", "pt-BR", overrideVersionCode = 1),
SingleLang("Decadence Scans", "https://reader.decadencescans.com", "en", overrideVersionCode = 1), SingleLang("Decadence Scans", "https://reader.decadencescans.com", "en", overrideVersionCode = 1),
SingleLang("شبكة كونان العربية", "https://www.manga.detectiveconanar.com", "ar", className = "DetectiveConanAr", overrideVersionCode = 1), SingleLang("شبكة كونان العربية", "https://www.manga.detectiveconanar.com", "ar", className = "DetectiveConanAr", overrideVersionCode = 1),
SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"), SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"),
@ -55,13 +55,13 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true), SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true),
SingleLang("DoujinYosh", "https://doujinyosh.work", "id"), 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"), SingleLang("Drope Scan", "https://dropescan.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Einherjar Scan", "https://einherjarscans.space", "en"), SingleLang("Einherjar Scan", "https://einherjarscans.space", "en"),
SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR"), 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"),
SingleLang("FreeWebtoonCoins", "https://freewebtooncoins.com", "en"), SingleLang("FreeWebtoonCoins", "https://freewebtooncoins.com", "en"),
SingleLang("Furio Scans", "https://furioscans.com", "pt-BR"), SingleLang("Furio Scans", "https://furioscans.com", "pt-BR", overrideVersionCode = 1),
SingleLang("موقع لترجمة المانجا", "https://golden-manga.com", "ar", className = "GoldenManga"), SingleLang("موقع لترجمة المانجا", "https://golden-manga.com", "ar", className = "GoldenManga"),
SingleLang("GalaxyDegenScans", "https://gdegenscans.xyz/", "en"), SingleLang("GalaxyDegenScans", "https://gdegenscans.xyz/", "en"),
SingleLang("Glory Scans", "https://gloryscan.com", "pt-BR", isNsfw = true), SingleLang("Glory Scans", "https://gloryscan.com", "pt-BR", isNsfw = true),
@ -73,7 +73,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Hiperdex", "https://hiperdex.com", "en", isNsfw = true, overrideVersionCode = 1), SingleLang("Hiperdex", "https://hiperdex.com", "en", isNsfw = true, overrideVersionCode = 1),
SingleLang("Hscans", "https://hscans.com", "en", overrideVersionCode = 1), SingleLang("Hscans", "https://hscans.com", "en", overrideVersionCode = 1),
SingleLang("Hunter Fansub", "https://hunterfansub.com", "es"), SingleLang("Hunter Fansub", "https://hunterfansub.com", "es"),
SingleLang("Ichirin No Hana Yuri", "https://ichirinnohanayuri.com.br", "pt-BR"), SingleLang("Ichirin No Hana Yuri", "https://ichirinnohanayuri.com.br", "pt-BR", overrideVersionCode = 1),
SingleLang("Immortal Updates", "https://immortalupdates.com", "en", overrideVersionCode = 1), SingleLang("Immortal Updates", "https://immortalupdates.com", "en", overrideVersionCode = 1),
SingleLang("IsekaiScan.com", "https://isekaiscan.com", "en", className = "IsekaiScanCom", overrideVersionCode = 2), SingleLang("IsekaiScan.com", "https://isekaiscan.com", "en", className = "IsekaiScanCom", overrideVersionCode = 2),
SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga"), SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga"),
@ -135,7 +135,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("MangaStein", "https://mangastein.com", "tr"), SingleLang("MangaStein", "https://mangastein.com", "tr"),
SingleLang("Mangasushi", "https://mangasushi.net", "en", overrideVersionCode = 1), SingleLang("Mangasushi", "https://mangasushi.net", "en", overrideVersionCode = 1),
SingleLang("Manga SY", "https://www.mangasy.com", "en"), SingleLang("Manga SY", "https://www.mangasy.com", "en"),
SingleLang("MangaTeca", "https://www.mangateca.com", "pt-BR"), SingleLang("MangaTeca", "https://www.mangateca.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Manga Too", "https://mangatoo.com/", "en"), SingleLang("Manga Too", "https://mangatoo.com/", "en"),
SingleLang("Manga Turf", "https://mangaturf.com", "en"), SingleLang("Manga Turf", "https://mangaturf.com", "en"),
SingleLang("MangaTX", "https://mangatx.com", "en"), SingleLang("MangaTX", "https://mangatx.com", "en"),
@ -169,7 +169,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("ManyToon", "https://manytoon.com", "en"), SingleLang("ManyToon", "https://manytoon.com", "en"),
SingleLang("ManyToonClub", "https://manytoon.club", "ko"), SingleLang("ManyToonClub", "https://manytoon.club", "ko"),
SingleLang("ManyToon.me", "https://manytoon.me", "en", className = "ManyToonMe"), SingleLang("ManyToon.me", "https://manytoon.me", "en", className = "ManyToonMe"),
SingleLang("Mark Scans", "https://markscans.online", "pt-BR"), SingleLang("Mark Scans", "https://markscans.online", "pt-BR", overrideVersionCode = 1),
SingleLang("MG Komik", "https://mgkomik.my.id", "id"), SingleLang("MG Komik", "https://mgkomik.my.id", "id"),
SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en"), SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en"),
SingleLang("Milftoon", "https://milftoon.xxx", "en", isNsfw = true, overrideVersionCode = 1), SingleLang("Milftoon", "https://milftoon.xxx", "en", isNsfw = true, overrideVersionCode = 1),
@ -180,18 +180,17 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Mystical Merries", "https://mysticalmerries.com", "en"), SingleLang("Mystical Merries", "https://mysticalmerries.com", "en"),
SingleLang("Nazarick Scans", "https://nazarickscans.com", "en"), SingleLang("Nazarick Scans", "https://nazarickscans.com", "en"),
SingleLang("NeatManga", "https://neatmanga.com", "en"), SingleLang("NeatManga", "https://neatmanga.com", "en"),
SingleLang("NekoBreaker", "https://nekobreaker.com", "pt-BR"),
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 = 1), SingleLang("Neox Scanlator", "https://neoxscans.net", "pt-BR", overrideVersionCode = 2),
SingleLang("Night Comic", "https://www.nightcomic.com", "en"), SingleLang("Night Comic", "https://www.nightcomic.com", "en"),
SingleLang("Niji Translations", "https://niji-translations.com", "ar"), SingleLang("Niji Translations", "https://niji-translations.com", "ar"),
SingleLang("Ninjavi", "https://ninjavi.com", "ar", overrideVersionCode = 1), SingleLang("Ninjavi", "https://ninjavi.com", "ar", overrideVersionCode = 1),
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"), SingleLang("Off Scan", "https://offscan.top", "pt-BR", overrideVersionCode = 1),
SingleLang("مانجا اولاو", "https://olaoe.giize.com", "ar", className = "OlaoeManga"), 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"), 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"),
SingleLang("Painful Nightz Scan", "https://painfulnightzscan.com", "en"), SingleLang("Painful Nightz Scan", "https://painfulnightzscan.com", "en"),
SingleLang("Pied Piper", "https://piedpiperfb.com", "tr"), SingleLang("Pied Piper", "https://piedpiperfb.com", "tr"),
@ -199,7 +198,7 @@ class MadaraGenerator : ThemeSourceGenerator {
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), SingleLang("PornComix", "https://www.porncomixonline.net", "en", isNsfw = true),
SingleLang("Prime Manga", "https://primemanga.com", "en"), SingleLang("Prime Manga", "https://primemanga.com", "en"),
SingleLang("Projeto Scanlator", "https://projetoscanlator.com", "pt-BR"), 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("Raider Scans", "https://raiderscans.com", "en"),
SingleLang("Random Translations", "https://randomtranslations.com", "en"), SingleLang("Random Translations", "https://randomtranslations.com", "en"),
@ -212,7 +211,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("SamuraiScan", "https://samuraiscan.com", "es"), SingleLang("SamuraiScan", "https://samuraiscan.com", "es"),
SingleLang("Setsu Scans", "https://setsuscans.com", "en"), SingleLang("Setsu Scans", "https://setsuscans.com", "en"),
SingleLang("Shield Manga", "https://shieldmanga.club", "en", overrideVersionCode = 2), SingleLang("Shield Manga", "https://shieldmanga.club", "en", overrideVersionCode = 2),
SingleLang("Shinzoo Scan", "https://shinzooscan.xyz", "pt-BR", overrideVersionCode = 1), SingleLang("Shinzoo Scan", "https://shinzooscan.xyz", "pt-BR", overrideVersionCode = 2),
SingleLang("Shooting Star Scans", "https://shootingstarscans.xyz", "en"), SingleLang("Shooting Star Scans", "https://shootingstarscans.xyz", "en"),
SingleLang("ShoujoHearts", "https://shoujohearts.com", "en", overrideVersionCode = 1), SingleLang("ShoujoHearts", "https://shoujohearts.com", "en", overrideVersionCode = 1),
SingleLang("SISI GELAP", "https://sisigelap.club/", "id"), SingleLang("SISI GELAP", "https://sisigelap.club/", "id"),
@ -223,7 +222,7 @@ class MadaraGenerator : ThemeSourceGenerator {
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("Spooky Scanlations", "https://spookyscanlations.xyz", "es"),
SingleLang("StageComics", "https://stagecomics.com", "pt-BR"), SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1),
SingleLang("Sugar Babies", "https://sugarbscan.com", "en"), SingleLang("Sugar Babies", "https://sugarbscan.com", "en"),
SingleLang("TheTopComic", "https://thetopcomic.com", "en"), SingleLang("TheTopComic", "https://thetopcomic.com", "en"),
SingleLang("365Manga", "https://365manga.com", "en", className = "ThreeSixtyFiveManga"), SingleLang("365Manga", "https://365manga.com", "en", className = "ThreeSixtyFiveManga"),
@ -243,7 +242,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Uyuyan Balik", "https://uyuyanbalik.com/", "tr"), SingleLang("Uyuyan Balik", "https://uyuyanbalik.com/", "tr"),
SingleLang("Vanguard Bun", "https://vanguardbun.com/", "en"), SingleLang("Vanguard Bun", "https://vanguardbun.com/", "en"),
SingleLang("Wakascan", "https://wakascan.com", "fr"), SingleLang("Wakascan", "https://wakascan.com", "fr"),
SingleLang("War Queen Scan", "https://wqscan.com", "pt-BR"), SingleLang("War Queen Scan", "https://wqscan.com", "pt-BR", overrideVersionCode = 1),
SingleLang("WebNovel", "https://webnovel.live", "en", className = "WebNovelLive", overrideVersionCode = 1), SingleLang("WebNovel", "https://webnovel.live", "en", className = "WebNovelLive", overrideVersionCode = 1),
SingleLang("WebToonily", "https://webtoonily.com", "en"), SingleLang("WebToonily", "https://webtoonily.com", "en"),
SingleLang("WebtoonUK", "https://webtoon.uk", "en"), SingleLang("WebtoonUK", "https://webtoon.uk", "en"),
@ -254,7 +253,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Yaoi Fan Clube", "https://yaoifanclube.com.br", "pt-BR", isNsfw = true), SingleLang("Yaoi Fan Clube", "https://yaoifanclube.com.br", "pt-BR", isNsfw = true),
SingleLang("Yaoi Toshokan", "https://yaoitoshokan.net", "pt-BR", isNsfw = true, overrideVersionCode = 2), SingleLang("Yaoi Toshokan", "https://yaoitoshokan.net", "pt-BR", isNsfw = true, overrideVersionCode = 2),
SingleLang("Yokai Jump", "https://yokaijump.fr", "fr"), SingleLang("Yokai Jump", "https://yokaijump.fr", "fr"),
SingleLang("Yuri Verso", "https://yuri.live", "pt-BR"), 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("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),
@ -266,16 +265,16 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Imperfect Comics", "https://imperfectcomic.com", "en"), SingleLang("Imperfect Comics", "https://imperfectcomic.com", "en"),
SingleLang("Ookamii Manga", "https://manga.ookamii.xyz/", "en"), SingleLang("Ookamii Manga", "https://manga.ookamii.xyz/", "en"),
SingleLang("Mortals Groove", "https://mortalsgroove.com", "en"), SingleLang("Mortals Groove", "https://mortalsgroove.com", "en"),
SingleLang("Cervo Scanlator", "https://cervoscan.xyz", "pt-BR"), SingleLang("Cervo Scanlator", "https://cervoscan.xyz", "pt-BR", overrideVersionCode = 1),
SingleLang("Comic Star", "https://comicstar.org", "en"), SingleLang("Comic Star", "https://comicstar.org", "en"),
SingleLang("Reset Scans", "https://reset-scans.com", "en", overrideVersionCode = 2), SingleLang("Reset Scans", "https://reset-scans.com", "en", overrideVersionCode = 2),
SingleLang("XuN Scans", "https://reader.xunscans.xyz", "en"), SingleLang("XuN Scans", "https://reader.xunscans.xyz", "en"),
SingleLang("Sani-Go", "https://sani-go.net", "ar", className = "SaniGo"), SingleLang("Sani-Go", "https://sani-go.net", "ar", className = "SaniGo"),
SingleLang("Random Scan", "https://randomscan.online", "pt-BR", overrideVersionCode = 1), SingleLang("Random Scan", "https://randomscan.online", "pt-BR", overrideVersionCode = 2),
SingleLang("Fukushuu no Yuusha", "https://fny-scantrad.com", "fr"), SingleLang("Fukushuu no Yuusha", "https://fny-scantrad.com", "fr"),
SingleLang("Three Queens Scanlator", "https://tqscan.com.br", "pt-BR"), SingleLang("Three Queens Scanlator", "https://tqscan.com.br", "pt-BR", overrideVersionCode = 1),
SingleLang("Winter Scan", "https://winterscan.com.br", "pt-BR"), SingleLang("Winter Scan", "https://winterscan.com.br", "pt-BR", overrideVersionCode = 1),
SingleLang("Little Monster Scan", "https://littlemonsterscan.com.br", "pt-BR"), SingleLang("Little Monster Scan", "https://littlemonsterscan.com.br", "pt-BR", overrideVersionCode = 1),
SingleLang("Wonderland", "https://landwebtoons.site", "pt-BR", overrideVersionCode = 1), SingleLang("Wonderland", "https://landwebtoons.site", "pt-BR", overrideVersionCode = 1),
SingleLang("Pornwha", "https://pornwha.com", "en", isNsfw = true), SingleLang("Pornwha", "https://pornwha.com", "en", isNsfw = true),
SingleLang("Wakamics", "https://wakamics.net", "en"), SingleLang("Wakamics", "https://wakamics.net", "en"),

View File

@ -59,8 +59,8 @@ class MMRCMSSources {
SourceData.Single("Komik Manga", "https://adm.komikmanga.com", "id"), SourceData.Single("Komik Manga", "https://adm.komikmanga.com", "id"),
SourceData.Single("Mangazuki Raws", "https://raws.mangazuki.co", "ko"), SourceData.Single("Mangazuki Raws", "https://raws.mangazuki.co", "ko"),
SourceData.Single("Mangazuki", "https://mangazuki.co", "en"), SourceData.Single("Mangazuki", "https://mangazuki.co", "en"),
SourceData.Single("Remangas", "https://remangas.top", "pt-BR"), SourceData.Single("Remangas", "https://remangas.top", "pt-BR", overrideVersionCode = 1),
SourceData.Single("AnimaRegia", "https://animaregia.net", "pt-BR"), SourceData.Single("AnimaRegia", "https://animaregia.net", "pt-BR", overrideVersionCode = 1),
SourceData.Single("MangaVadisi", "http://manga-v2.mangavadisi.org", "tr"), SourceData.Single("MangaVadisi", "http://manga-v2.mangavadisi.org", "tr"),
SourceData.Single("MangaID", "https://mangaid.click", "id"), SourceData.Single("MangaID", "https://mangaid.click", "id"),
SourceData.Single("Jpmangas", "https://jpmangas.co", "fr"), SourceData.Single("Jpmangas", "https://jpmangas.co", "fr"),

View File

@ -41,7 +41,7 @@ class WPMangaStreamGenerator : ThemeSourceGenerator {
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("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"), 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"),
SingleLang("Tempest Manga", "https://manga.tempestfansub.com", "tr"), SingleLang("Tempest Manga", "https://manga.tempestfansub.com", "tr"),
SingleLang("xCaliBR Scans", "https://xcalibrscans.com", "en", overrideVersionCode = 2), SingleLang("xCaliBR Scans", "https://xcalibrscans.com", "en", overrideVersionCode = 2),

View File

@ -5,9 +5,13 @@ ext {
extName = 'HentaiMimi' extName = 'HentaiMimi'
pkgNameSuffix = 'en.hentaimimi' pkgNameSuffix = 'en.hentaimimi'
extClass = '.HentaiMimi' extClass = '.HentaiMimi'
extVersionCode = 2 extVersionCode = 3
libVersion = '1.2' libVersion = '1.2'
containsNsfw = true containsNsfw = true
} }
dependencies {
implementation project(':lib-ratelimit')
}
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.extension.en.hentaimimi package eu.kanade.tachiyomi.extension.en.hentaimimi
import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
@ -9,10 +10,12 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable import rx.Observable
import java.util.concurrent.TimeUnit
/* /*
* To Update Filter Values Run "FilterOptGen.kt" * To Update Filter Values Run "FilterOptGen.kt"
@ -27,6 +30,10 @@ class HentaiMimi : ParsedHttpSource() {
override val name = "HentaiMimi" override val name = "HentaiMimi"
override val supportsLatest = true override val supportsLatest = true
override val client: OkHttpClient = network.client.newBuilder()
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
.build()
// Latest // Latest
override fun latestUpdatesFromElement(element: Element): SManga { override fun latestUpdatesFromElement(element: Element): SManga {