Madara split: part 1 (#5662)
* madara 161 * 50 of madara sources * remove moved classes part 1
This commit is contained in:
parent
f275fc07c2
commit
ee33c8fa02
Binary file not shown.
After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
|
@ -0,0 +1,13 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.tr.adonisfansub
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import okhttp3.Request
|
||||||
|
|
||||||
|
@Nsfw
|
||||||
|
class AdonisFansub : Madara("Adonis Fansub", "https://manga.adonisfansub.com", "tr") {
|
||||||
|
override val userAgentRandomizer = ""
|
||||||
|
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)
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.agentofchangetranslations
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.Response
|
||||||
|
|
||||||
|
class AgentofChangeTranslations : Madara("Agent of Change Translations", "https://aoc.moe", "en") {
|
||||||
|
override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
|
||||||
|
override fun popularMangaSelector() = "div.page-item-detail.manga:has(span.chapter)"
|
||||||
|
override fun chapterListSelector() = "li.wp-manga-chapter:has(a)"
|
||||||
|
|
||||||
|
@SuppressLint("DefaultLocale")
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
return response.asJsoup().let { document ->
|
||||||
|
document.select(chapterListSelector()).let { normalChapters ->
|
||||||
|
if (normalChapters.isNotEmpty()) {
|
||||||
|
normalChapters.map { chapterFromElement(it) }
|
||||||
|
} else {
|
||||||
|
// For their "fancy" volume/chapter lists
|
||||||
|
document.select("div.wpb_wrapper:contains(volume) a")
|
||||||
|
.filter { it.attr("href").contains(baseUrl) && !it.attr("href").contains("imgur") }
|
||||||
|
.map { volumeChapter ->
|
||||||
|
SChapter.create().apply {
|
||||||
|
volumeChapter.attr("href").let { url ->
|
||||||
|
name = if (url.contains("volume")) {
|
||||||
|
val volume = url.substringAfter("volume-").substringBefore("/")
|
||||||
|
val volChap = url.substringAfter("volume-$volume/").substringBefore("/").replace("-", " ").capitalize()
|
||||||
|
"Volume $volume - $volChap"
|
||||||
|
} else {
|
||||||
|
url.substringBefore("/p").substringAfterLast("/").replace("-", " ").capitalize()
|
||||||
|
}
|
||||||
|
setUrlWithoutDomain(url.substringBefore("?") + "?style=list")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.reversed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.allporncomic
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import okhttp3.Request
|
||||||
|
|
||||||
|
@Nsfw
|
||||||
|
class AllPornComic : Madara("AllPornComic", "https://allporncomic.com", "en") {
|
||||||
|
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 searchMangaNextPageSelector() = "a[rel=next]"
|
||||||
|
override fun getGenreList() = listOf(
|
||||||
|
Genre("3D", "3d"),
|
||||||
|
Genre("Ahegao", "ahegao"),
|
||||||
|
Genre("Alien Girl", "alien-girl"),
|
||||||
|
Genre("Anal", "anal"),
|
||||||
|
Genre("Anime", "anime"),
|
||||||
|
Genre("Anthology", "anthology"),
|
||||||
|
Genre("Artbook", "artbook"),
|
||||||
|
Genre("BBW / Chubby / Fat Woman", "bbw"),
|
||||||
|
Genre("BDSM", "bdsm"),
|
||||||
|
Genre("Big Areolae", "big-areolae"),
|
||||||
|
Genre("Big Ass", "big-ass"),
|
||||||
|
Genre("Big Balls", "big-balls"),
|
||||||
|
Genre("Big Breasts", "big-breasts"),
|
||||||
|
Genre("Big Clit", "big-clit"),
|
||||||
|
Genre("Big Nipples", "big-nipples"),
|
||||||
|
Genre("Big Penis", "big-penis"),
|
||||||
|
Genre("Bikini", "bikini"),
|
||||||
|
Genre("Blackmail", "blackmail"),
|
||||||
|
Genre("Blindfold", "blindfold"),
|
||||||
|
Genre("Body Modification", "body-modification"),
|
||||||
|
Genre("Body Swap", "body-swap"),
|
||||||
|
Genre("Body Writing", "body-writing"),
|
||||||
|
Genre("BodyStocking", "bodystocking"),
|
||||||
|
Genre("Bodysuit", "bodysuit"),
|
||||||
|
Genre("Bondage", "bondage"),
|
||||||
|
Genre("Brain Fuck", "brain-fuck"),
|
||||||
|
Genre("Cartoon", "cartoon"),
|
||||||
|
Genre("Cheerleader", "cheerleader"),
|
||||||
|
Genre("Chinese Dress", "chinese-dress"),
|
||||||
|
Genre("Collar / Choker", "collar"),
|
||||||
|
Genre("Comedy", "comedy"),
|
||||||
|
Genre("Corruption", "corruption"),
|
||||||
|
Genre("Corset", "corset"),
|
||||||
|
Genre("Crotch Tattoo", "crotch-tattoo"),
|
||||||
|
Genre("Dark Skin", "dark-skin"),
|
||||||
|
Genre("Demon Girl / Succubus", "demon-girl"),
|
||||||
|
Genre("Dick Growth", "dick-growth"),
|
||||||
|
Genre("Dickgirl On Dickgirl", "dickgirl-on-dickgirl"),
|
||||||
|
Genre("Dickgirl On Male", "dickgirl-on-male"),
|
||||||
|
Genre("Dickgirls Only", "dickgirls-only"),
|
||||||
|
Genre("Drugs", "drugs"),
|
||||||
|
Genre("Drunk", "drunk"),
|
||||||
|
Genre("Exhibitionism", "exhibitionism"),
|
||||||
|
Genre("FFM Threesome", "ffm-threesome"),
|
||||||
|
Genre("FFT Threesome", "fft-threesome"),
|
||||||
|
Genre("Females Only", "females-only"),
|
||||||
|
Genre("Femdom", "femdom"),
|
||||||
|
Genre("Feminization", "feminization"),
|
||||||
|
Genre("Full Body Tattoo", "full-body-tattoo"),
|
||||||
|
Genre("Full Color", "full-color"),
|
||||||
|
Genre("Futanari", "futanari"),
|
||||||
|
Genre("Gender Bender", "gender-bender"),
|
||||||
|
Genre("Glasses", "glasses"),
|
||||||
|
Genre("Group", "group"),
|
||||||
|
Genre("Gyaru", "gyaru"),
|
||||||
|
Genre("Gyaru-OH", "gyaru-oh"),
|
||||||
|
Genre("Harem", "harem"),
|
||||||
|
Genre("Hentai", "hentai"),
|
||||||
|
Genre("Human Pet", "human-pet"),
|
||||||
|
Genre("Humiliation", "humiliation"),
|
||||||
|
Genre("Impregnation", "impregnation"),
|
||||||
|
Genre("Incest", "incest"),
|
||||||
|
Genre("Interracial", "interracial"),
|
||||||
|
Genre("Kimono", "kimono"),
|
||||||
|
Genre("Latex", "latex"),
|
||||||
|
Genre("Leash", "leash"),
|
||||||
|
Genre("Lingerie", "lingerie"),
|
||||||
|
Genre("Lolicon", "lolicon"),
|
||||||
|
Genre("MILF", "milf"),
|
||||||
|
Genre("MMF Threesome", "mmf-threesome"),
|
||||||
|
Genre("MMT Threesome", "mmt-threesome"),
|
||||||
|
Genre("Magical Girl", "magical-girl"),
|
||||||
|
Genre("Maid", "maid"),
|
||||||
|
Genre("Male On Dickgirl", "male-on-dickgirl"),
|
||||||
|
Genre("Manhwa", "manhwa"),
|
||||||
|
Genre("Military", "military"),
|
||||||
|
Genre("Milking", "milking"),
|
||||||
|
Genre("Mind Break", "mind-break"),
|
||||||
|
Genre("Mind Control", "mind-control"),
|
||||||
|
Genre("Monster Girl", "monster-girl"),
|
||||||
|
Genre("Moral Degeneration", "moral-degeneration"),
|
||||||
|
Genre("Muscle", "muscle"),
|
||||||
|
Genre("Muscle Growth", "muscle-growth"),
|
||||||
|
Genre("Nakadashi", "nakadashi"),
|
||||||
|
Genre("Netorare", "netorare"),
|
||||||
|
Genre("Netori", "netori"),
|
||||||
|
Genre("Ninja", "ninja"),
|
||||||
|
Genre("Nun", "nun"),
|
||||||
|
Genre("Nurse", "nurse"),
|
||||||
|
Genre("Orgy", "orgy"),
|
||||||
|
Genre("Paizuri", "paizuri"),
|
||||||
|
Genre("Pegging", "pegging"),
|
||||||
|
Genre("Piercing", "piercing"),
|
||||||
|
Genre("Pixie Cut", "pixie-cut"),
|
||||||
|
Genre("Policewoman", "policewoman"),
|
||||||
|
Genre("Possession", "possession"),
|
||||||
|
Genre("Retro", "retro"),
|
||||||
|
Genre("Ryona", "ryona"),
|
||||||
|
Genre("School Swimsuit", "school-swimsuit"),
|
||||||
|
Genre("Schoolboy Uniform", "schoolboy-uniform"),
|
||||||
|
Genre("Schoolgirl Uniform", "schoolgirl-uniform"),
|
||||||
|
Genre("Shared Senses", "shared-senses"),
|
||||||
|
Genre("Shemale", "shemale"),
|
||||||
|
Genre("Shibari", "shibari"),
|
||||||
|
Genre("Shotacon", "shotacon"),
|
||||||
|
Genre("Slave", "slave"),
|
||||||
|
Genre("Slime Girl", "slime-girl"),
|
||||||
|
Genre("Small Breasts", "small-breasts"),
|
||||||
|
Genre("Stockings", "stockings"),
|
||||||
|
Genre("Strap-on", "strap-on"),
|
||||||
|
Genre("Stuck In Wall", "stuck-in-wall"),
|
||||||
|
Genre("Superhero", "superhero"),
|
||||||
|
Genre("Superheroine", "superheroine"),
|
||||||
|
Genre("Tail", "tail"),
|
||||||
|
Genre("Tail Plug", "tail-plug"),
|
||||||
|
Genre("Tankoubon", "tankoubon"),
|
||||||
|
Genre("Tentacles", "tentacles"),
|
||||||
|
Genre("Thigh High Boots", "thigh-high-boots"),
|
||||||
|
Genre("Tights", "tights"),
|
||||||
|
Genre("Time Stop", "time-stop"),
|
||||||
|
Genre("Tomboy", "tomboy"),
|
||||||
|
Genre("Tomgirl", "tomgirl"),
|
||||||
|
Genre("Torture", "torture"),
|
||||||
|
Genre("Transformation", "transformation"),
|
||||||
|
Genre("Uncensored", "uncensored"),
|
||||||
|
Genre("Unusual Pupils", "unusual-pupils"),
|
||||||
|
Genre("Unusual Teeth", "unusual-teeth"),
|
||||||
|
Genre("Vampire", "vampire"),
|
||||||
|
Genre("Virginity", "virginity"),
|
||||||
|
Genre("Voyeurism", "voyeurism"),
|
||||||
|
Genre("Webtoon", "webtoon"),
|
||||||
|
Genre("Western", "western"),
|
||||||
|
Genre("Witch", "witch"),
|
||||||
|
Genre("Yandere", "yandere"),
|
||||||
|
Genre("Yaoi", "yaoi"),
|
||||||
|
Genre("Yuri", "yuri")
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.aloalivn
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
|
||||||
|
class Aloalivn : Madara("Aloalivn", "https://aloalivn.com", "en") {
|
||||||
|
override val pageListParseSelector = "li.blocks-gallery-item"
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.animangaes
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import okhttp3.Response
|
||||||
|
|
||||||
|
class AniMangaEs : Madara("AniMangaEs", "http://animangaes.com", "en") {
|
||||||
|
override val pageListParseSelector = "div.text-left noscript"
|
||||||
|
override val chapterUrlSuffix = ""
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> = super.chapterListParse(response).reversed()
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.es.apollcomics
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class ApollComics : Madara("ApollComics", "https://apollcomics.xyz", "es", SimpleDateFormat("dd MMMM, yyyy", Locale("es")))
|
|
@ -0,0 +1,15 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.arangscans
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import okhttp3.Request
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class ArangScans : Madara("Arang Scans", "https://www.arangscans.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
||||||
|
// has very few manga
|
||||||
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga?m_orderby=views", headers)
|
||||||
|
override fun popularMangaNextPageSelector(): String? = null
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga?m_orderby=latest", headers)
|
||||||
|
override fun latestUpdatesNextPageSelector(): String? = null
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.tr.araznovel
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.FormBody
|
||||||
|
import okhttp3.Response
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class ArazNovel : Madara("ArazNovel", "https://www.araznovel.com", "tr", SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())) {
|
||||||
|
override fun formBuilder(page: Int, popular: Boolean): FormBody.Builder = super.formBuilder(page, popular)
|
||||||
|
.add("vars[meta_query][0][0][value]", "manga")
|
||||||
|
|
||||||
|
override fun getGenreList() = listOf(
|
||||||
|
Genre("Aksiyon", "action"),
|
||||||
|
Genre("Macera", "adventure"),
|
||||||
|
Genre("Cartoon", "cartoon"),
|
||||||
|
Genre("Comic", "comic"),
|
||||||
|
Genre("Komedi", "comedy"),
|
||||||
|
Genre("Yemek", "cooking"),
|
||||||
|
Genre("Doujinshi", "doujinshi"),
|
||||||
|
Genre("Dram", "drama"),
|
||||||
|
Genre("Ecchi", "ecchi"),
|
||||||
|
Genre("Fantastik", "fantasy"),
|
||||||
|
Genre("Harem", "harem"),
|
||||||
|
Genre("Tarihi", "historical"),
|
||||||
|
Genre("Korku", "horror"),
|
||||||
|
Genre("Manga", "manga"),
|
||||||
|
Genre("Manhua", "manhua"),
|
||||||
|
Genre("Manhwa", "manhwa"),
|
||||||
|
Genre("Olgun", "mature"),
|
||||||
|
Genre("Mecha", "mecha"),
|
||||||
|
Genre("Yetişkin", "adult"),
|
||||||
|
Genre("Gizem", "mystery"),
|
||||||
|
Genre("One Shot", "one-shot"),
|
||||||
|
Genre("Isekai", "isekai"),
|
||||||
|
Genre("Josei", "josei"),
|
||||||
|
Genre("Dedektif", "detective"),
|
||||||
|
Genre("Karanlık", "smut"),
|
||||||
|
Genre("Romantizm", "romance"),
|
||||||
|
Genre("Okul Yaşamı", "school-life"),
|
||||||
|
Genre("Yaşamdan Kesit", "slice-of-life"),
|
||||||
|
Genre("Spor", "sports"),
|
||||||
|
Genre("Doğa Üstü", "supernatural"),
|
||||||
|
Genre("Trajedi", "tragedy"),
|
||||||
|
Genre("Webtoon ", "webtoon"),
|
||||||
|
Genre("Dövüş Sanatları ", "martial-arts"),
|
||||||
|
Genre("Bilim Kurgu", "sci-fi"),
|
||||||
|
Genre("Seinen", "seinen"),
|
||||||
|
Genre("Shoujo", "shoujo"),
|
||||||
|
Genre("Shoujo Ai", "shoujo-ai"),
|
||||||
|
Genre("Shounen", "shounen"),
|
||||||
|
Genre("Shounen Ai", "shounen-ai"),
|
||||||
|
Genre("Soft Yaoi", "soft-yaoi"),
|
||||||
|
Genre("Soft Yuri", "soft-yuri"),
|
||||||
|
Genre("Yaoi", "yaoi"),
|
||||||
|
Genre("Yuri", "yuri")
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
return getXhrChapters(response.asJsoup().select("div#manga-chapters-holder").attr("data-id")).let { document ->
|
||||||
|
document.select("li.parent").let { elements ->
|
||||||
|
if (!elements.isNullOrEmpty()) {
|
||||||
|
elements.reversed()
|
||||||
|
.map { volumeElement -> volumeElement.select(chapterListSelector()).map { chapterFromElement(it) } }
|
||||||
|
.flatten()
|
||||||
|
} else {
|
||||||
|
document.select(chapterListSelector()).map { chapterFromElement(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.pt.argosscan
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class ArgosScan : Madara("Argos Scan", "https://argosscan.com", "pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR")))
|
|
@ -0,0 +1,20 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.astrallibrary
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class AstralLibrary : Madara("Astral Library", "https://www.astrallibrary.net", "en", SimpleDateFormat("d MMM", Locale.US)) {
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> = super.chapterListParse(response).reversed()
|
||||||
|
override fun popularMangaRequest(page: Int): Request {
|
||||||
|
return GET("$baseUrl/manga-tag/manga/?m_orderby=views&page=$page", headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request {
|
||||||
|
return GET("$baseUrl/manga-tag/manga/?m_orderby=latest&page=$page", headers)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.tr.atikrost
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class Atikrost : Madara("Atikrost", "https://atikrost.com", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale("tr")))
|
|
@ -0,0 +1,7 @@
|
||||||
|
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")))
|
|
@ -0,0 +1,22 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.fr.atmsubs
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import okhttp3.Request
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
|
||||||
|
|
||||||
|
class Azora : Madara("Azora", "https://www.azoramanga.com", "ar") {
|
||||||
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=views", headers)
|
||||||
|
override fun chapterListSelector() = "li.wp-manga-chapter:not(.premium-block)" // Filter fake chapters
|
||||||
|
override fun chapterFromElement(element: Element): SChapter {
|
||||||
|
val chapter = SChapter.create()
|
||||||
|
|
||||||
|
element.select("a").let {
|
||||||
|
chapter.url = it.attr("href").substringAfter(baseUrl)
|
||||||
|
chapter.name = it.text()
|
||||||
|
}
|
||||||
|
return chapter
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.ru.bestmanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class BestManga : Madara("BestManga", "https://bestmanga.club", "ru", SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()))
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.bestmanhua
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
|
||||||
|
class BestManhua : Madara("BestManhua", "https://bestmanhua.com", "en") {
|
||||||
|
override val pageListParseSelector = "li.blocks-gallery-item"
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.th.cattranslator
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.POST
|
||||||
|
import okhttp3.CacheControl
|
||||||
|
import okhttp3.Request
|
||||||
|
|
||||||
|
class CatTranslator : Madara("CAT-translator", "https://cat-translator.com", "th") {
|
||||||
|
override fun popularMangaRequest(page: Int): Request =
|
||||||
|
POST("$baseUrl/manga/wp-admin/admin-ajax.php", formHeaders, formBuilder(page, true).build(), CacheControl.FORCE_NETWORK)
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request =
|
||||||
|
POST("$baseUrl/manga/wp-admin/admin-ajax.php", formHeaders, formBuilder(page, false).build(), CacheControl.FORCE_NETWORK)
|
||||||
|
|
||||||
|
override fun searchPage(page: Int): String = "manga/page/$page/"
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.chibimanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class ChibiManga : Madara("Chibi Manga", "https://www.cmreader.info", "en", dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.US))
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.chibimanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class CloverManga : Madara("Clover Manga", "Clover Manga", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale("tr")))
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.comickiba
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
|
||||||
|
class ComicKiba : Madara("ComicKiba", "https://comickiba.com", "en") {
|
||||||
|
override val pageListParseSelector = "li.blocks-gallery-item img:nth-child(1), div.reading-content p > img, .read-container .reading-content img"
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.tr.cutiepie
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class CutiePie : Madara("Cutie Pie", "https://cutiepie.ga", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.tr.diamondfansub
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class DiamondFansub : Madara("DiamondFansub", "https://diamondfansub.com", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("tr")))
|
|
@ -0,0 +1,21 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.disasterscans
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
|
||||||
|
class DisasterScans : Madara("Disaster Scans", "https://disasterscans.com", "en") {
|
||||||
|
override val popularMangaUrlSelector = "div.post-title a:last-child"
|
||||||
|
|
||||||
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
|
val manga = super.mangaDetailsParse(document)
|
||||||
|
|
||||||
|
with(document) {
|
||||||
|
select("div.post-title h1").first()?.let {
|
||||||
|
manga.title = it.ownText()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return manga
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.es.doujinhentai
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
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.SManga
|
||||||
|
import okhttp3.HttpUrl
|
||||||
|
import okhttp3.Request
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
@Nsfw
|
||||||
|
class DoujinHentai : Madara("DoujinHentai", "https://doujinhentai.net", "es", SimpleDateFormat("d MMM. yyyy", Locale.ENGLISH)) {
|
||||||
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/lista-manga-hentai?orderby=views&page=$page", headers)
|
||||||
|
override fun popularMangaSelector() = "div.col-md-3 a"
|
||||||
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
|
val manga = SManga.create()
|
||||||
|
|
||||||
|
manga.setUrlWithoutDomain(element.attr("href"))
|
||||||
|
manga.title = element.select("h5").text()
|
||||||
|
manga.thumbnail_url = element.select("img").attr("abs:data-src")
|
||||||
|
|
||||||
|
return manga
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun popularMangaNextPageSelector() = "a[rel=next]"
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/lista-manga-hentai?orderby=last&page=$page", headers)
|
||||||
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
|
val url = HttpUrl.parse(baseUrl)!!.newBuilder()
|
||||||
|
if (query.isNotBlank()) {
|
||||||
|
url.addPathSegment("search")
|
||||||
|
url.addQueryParameter("query", query) // query returns results all on one page
|
||||||
|
} else {
|
||||||
|
filters.forEach { filter ->
|
||||||
|
when (filter) {
|
||||||
|
is GenreSelectFilter -> {
|
||||||
|
if (filter.state != 0) {
|
||||||
|
url.addPathSegments("lista-manga-hentai/category/${filter.toUriPart()}")
|
||||||
|
url.addQueryParameter("page", page.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GET(url.build().toString(), headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun searchMangaSelector() = "div.c-tabs-item__content > div.c-tabs-item__content, ${popularMangaSelector()}"
|
||||||
|
override fun searchMangaFromElement(element: Element): SManga {
|
||||||
|
return if (element.hasAttr("href")) {
|
||||||
|
popularMangaFromElement(element) // genre search results
|
||||||
|
} else {
|
||||||
|
super.searchMangaFromElement(element) // query search results
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
||||||
|
override fun chapterListSelector() = "ul.main.version-chap > li.wp-manga-chapter:not(:last-child)" // removing empty li
|
||||||
|
override val pageListParseSelector = "div#all > img.img-responsive"
|
||||||
|
override fun getFilterList() = FilterList(
|
||||||
|
Filter.Header("Solo funciona si la consulta está en blanco"),
|
||||||
|
GenreSelectFilter()
|
||||||
|
)
|
||||||
|
|
||||||
|
class GenreSelectFilter : UriPartFilter(
|
||||||
|
"Búsqueda de género",
|
||||||
|
arrayOf(
|
||||||
|
Pair("<seleccionar>", ""),
|
||||||
|
Pair("Ecchi", "ecchi"),
|
||||||
|
Pair("Yaoi", "yaoi"),
|
||||||
|
Pair("Yuri", "yuri"),
|
||||||
|
Pair("Anal", "anal"),
|
||||||
|
Pair("Tetonas", "tetonas"),
|
||||||
|
Pair("Escolares", "escolares"),
|
||||||
|
Pair("Incesto", "incesto"),
|
||||||
|
Pair("Virgenes", "virgenes"),
|
||||||
|
Pair("Masturbacion", "masturbacion"),
|
||||||
|
Pair("Maduras", "maduras"),
|
||||||
|
Pair("Lolicon", "lolicon"),
|
||||||
|
Pair("Bikini", "bikini"),
|
||||||
|
Pair("Sirvientas", "sirvientas"),
|
||||||
|
Pair("Enfermera", "enfermera"),
|
||||||
|
Pair("Embarazada", "embarazada"),
|
||||||
|
Pair("Ahegao", "ahegao"),
|
||||||
|
Pair("Casadas", "casadas"),
|
||||||
|
Pair("Chica Con Pene", "chica-con-pene"),
|
||||||
|
Pair("Juguetes Sexuales", "juguetes-sexuales"),
|
||||||
|
Pair("Orgias", "orgias"),
|
||||||
|
Pair("Harem", "harem"),
|
||||||
|
Pair("Romance", "romance"),
|
||||||
|
Pair("Profesores", "profesores"),
|
||||||
|
Pair("Tentaculos", "tentaculos"),
|
||||||
|
Pair("Mamadas", "mamadas"),
|
||||||
|
Pair("Shota", "shota"),
|
||||||
|
Pair("Interracial", "interracial"),
|
||||||
|
Pair("Full Color", "full-colo"),
|
||||||
|
Pair("Sin Censura", "sin-censura"),
|
||||||
|
Pair("Futanari", "futanari"),
|
||||||
|
Pair("Doble Penetracion", "doble-penetracion"),
|
||||||
|
Pair("Cosplay", "cosplay")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
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")
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.pt.dropescan
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import okhttp3.Request
|
||||||
|
|
||||||
|
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 latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=latest", headers)
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.pt.fdmscan
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class FDMScan : Madara("FDM Scan", "https://fdmscan.com", "pt-BR", SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR")))
|
|
@ -0,0 +1,10 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.firstkissmanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import okhttp3.Headers
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com", "en", dateFormat = SimpleDateFormat("dd MMM yyyy", Locale.US)) {
|
||||||
|
override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.firstkissmanhua
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import okhttp3.Request
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class FirstKissManhua : Madara("1st Kiss Manhua", "https://1stkissmanhua.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
||||||
|
override fun imageRequest(page: Page): Request = GET(page.imageUrl!!, headersBuilder().add("Referer", "https://1stkissmanga.com").build())
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.pt.furioscans
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class FurioScans : Madara("Furio Scans", "https://furioscans.com", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()))
|
|
@ -0,0 +1,12 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.ar.goldenmanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
|
||||||
|
class GeceninLordu : Madara("Gecenin Lordu", "https://geceninlordu.com/", "tr", SimpleDateFormat("dd MMM yyyy", Locale("tr"))) {
|
||||||
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/?s=$query&post_type=wp-manga")
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.ar.goldenmanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class GoldenManga : Madara("موقع لترجمة المانجا", "https://golden-manga.com", "ar", SimpleDateFormat("yyyy-MM-dd", Locale.US)) {
|
||||||
|
override fun searchMangaSelector() = "div.c-image-hover a"
|
||||||
|
override fun searchMangaFromElement(element: Element): SManga {
|
||||||
|
return SManga.create().apply {
|
||||||
|
setUrlWithoutDomain(element.attr("href"))
|
||||||
|
title = element.attr("title")
|
||||||
|
thumbnail_url = element.select("img").firstOrNull()?.let { imageFromElement(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun chapterListSelector() = "div.main a"
|
||||||
|
override fun chapterFromElement(element: Element): SChapter {
|
||||||
|
return SChapter.create().apply {
|
||||||
|
setUrlWithoutDomain(element.attr("href"))
|
||||||
|
name = element.select("h6:first-of-type").text()
|
||||||
|
date_upload = parseChapterDate(element.select("h6:last-of-type").firstOrNull()?.ownText())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.pt.hikariscan
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class HikariScan : Madara("Hikari Scan", "https://hikariscan.com.br", "pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR")))
|
|
@ -0,0 +1,7 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.tr.himerafansub
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class HimeraFansub : Madara("Himera Fansub", "https://himera-fansub.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
|
@ -0,0 +1,40 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.hiperdex
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
|
||||||
|
class Hiperdex : Madara("Hiperdex", "https://hiperdex.com", "en") {
|
||||||
|
override fun getGenreList() = listOf(
|
||||||
|
Genre("Adult", "adult"),
|
||||||
|
Genre("Action", "action"),
|
||||||
|
Genre("Adventure", "adventure"),
|
||||||
|
Genre("Bully", "bully"),
|
||||||
|
Genre("Comedy", "comedy"),
|
||||||
|
Genre("Drama", "drama"),
|
||||||
|
Genre("Ecchi", "ecchi"),
|
||||||
|
Genre("Fantasy", "fantasy"),
|
||||||
|
Genre("Gender Bender", "gender-bender"),
|
||||||
|
Genre("Harem", "harem"),
|
||||||
|
Genre("Historical", "historical"),
|
||||||
|
Genre("Horror", "horror"),
|
||||||
|
Genre("Isekai", "isekai"),
|
||||||
|
Genre("Josei", "josei"),
|
||||||
|
Genre("Martial Arts", "martial-arts"),
|
||||||
|
Genre("Mature", "mature"),
|
||||||
|
Genre("Mystery", "mystery"),
|
||||||
|
Genre("Psychological", "psychological"),
|
||||||
|
Genre("Romance", "romance"),
|
||||||
|
Genre("School Life", "school-life"),
|
||||||
|
Genre("Sci-Fi", "sci-fi"),
|
||||||
|
Genre("Seinen", "seinen"),
|
||||||
|
Genre("Shoujo", "shoujo"),
|
||||||
|
Genre("Shounen", "shounen"),
|
||||||
|
Genre("Slice of Life", "slice-of-life"),
|
||||||
|
Genre("Smut", "smut"),
|
||||||
|
Genre("Sports", "sports"),
|
||||||
|
Genre("Supernatural", "supernatural"),
|
||||||
|
Genre("Thriller", "thriller"),
|
||||||
|
Genre("Tragedy", "tragedy"),
|
||||||
|
Genre("Yaoi", "yaoi"),
|
||||||
|
Genre("Yuri", "yuri")
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,523 @@
|
||||||
|
package eu.kanade.tachiyomi.multisrc.madara
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.network.POST
|
||||||
|
import eu.kanade.tachiyomi.network.asObservable
|
||||||
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
|
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 eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.CacheControl
|
||||||
|
import okhttp3.FormBody
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.HttpUrl
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.RequestBody
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
import rx.Observable
|
||||||
|
import java.text.ParseException
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Calendar
|
||||||
|
import java.util.Locale
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
import kotlin.math.absoluteValue
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
abstract class Madara(
|
||||||
|
override val name: String,
|
||||||
|
override val baseUrl: String,
|
||||||
|
override val lang: String,
|
||||||
|
private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
|
||||||
|
) : ParsedHttpSource() {
|
||||||
|
|
||||||
|
override val supportsLatest = true
|
||||||
|
|
||||||
|
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||||
|
.connectTimeout(10, TimeUnit.SECONDS)
|
||||||
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
// helps with cloudflare for some sources, makes it worse for others; override with empty string if the latter is true
|
||||||
|
protected open val userAgentRandomizer = " ${Random.nextInt().absoluteValue}"
|
||||||
|
|
||||||
|
override fun headersBuilder(): Headers.Builder = Headers.Builder()
|
||||||
|
.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/78.0$userAgentRandomizer")
|
||||||
|
|
||||||
|
// Popular Manga
|
||||||
|
|
||||||
|
override fun popularMangaSelector() = "div.page-item-detail"
|
||||||
|
|
||||||
|
open val popularMangaUrlSelector = "div.post-title a"
|
||||||
|
|
||||||
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
|
val manga = SManga.create()
|
||||||
|
|
||||||
|
with(element) {
|
||||||
|
select(popularMangaUrlSelector).first()?.let {
|
||||||
|
manga.setUrlWithoutDomain(it.attr("abs:href"))
|
||||||
|
manga.title = it.ownText()
|
||||||
|
}
|
||||||
|
|
||||||
|
select("img").first()?.let {
|
||||||
|
manga.thumbnail_url = imageFromElement(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return manga
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun formBuilder(page: Int, popular: Boolean) = FormBody.Builder().apply {
|
||||||
|
add("action", "madara_load_more")
|
||||||
|
add("page", (page - 1).toString())
|
||||||
|
add("template", "madara-core/content/content-archive")
|
||||||
|
add("vars[orderby]", "meta_value_num")
|
||||||
|
add("vars[paged]", "1")
|
||||||
|
add("vars[posts_per_page]", "20")
|
||||||
|
add("vars[post_type]", "wp-manga")
|
||||||
|
add("vars[post_status]", "publish")
|
||||||
|
add("vars[meta_key]", if (popular) "_wp_manga_views" else "_latest_update")
|
||||||
|
add("vars[order]", "desc")
|
||||||
|
add("vars[sidebar]", if (popular) "full" else "right")
|
||||||
|
add("vars[manga_archives_item_layout]", "big_thumbnail")
|
||||||
|
}
|
||||||
|
|
||||||
|
open val formHeaders: Headers by lazy { headersBuilder().build() }
|
||||||
|
|
||||||
|
override fun popularMangaRequest(page: Int): Request {
|
||||||
|
return POST("$baseUrl/wp-admin/admin-ajax.php", formHeaders, formBuilder(page, true).build(), CacheControl.FORCE_NETWORK)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun popularMangaNextPageSelector(): String? = "body:not(:has(.no-posts))"
|
||||||
|
|
||||||
|
// Latest Updates
|
||||||
|
|
||||||
|
override fun latestUpdatesSelector() = popularMangaSelector()
|
||||||
|
|
||||||
|
override fun latestUpdatesFromElement(element: Element): SManga {
|
||||||
|
// Even if it's different from the popular manga's list, the relevant classes are the same
|
||||||
|
return popularMangaFromElement(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request {
|
||||||
|
return POST("$baseUrl/wp-admin/admin-ajax.php", formHeaders, formBuilder(page, false).build(), CacheControl.FORCE_NETWORK)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun latestUpdatesNextPageSelector(): String? = popularMangaNextPageSelector()
|
||||||
|
|
||||||
|
override fun latestUpdatesParse(response: Response): MangasPage {
|
||||||
|
val mp = super.latestUpdatesParse(response)
|
||||||
|
val mangas = mp.mangas.distinctBy { it.url }
|
||||||
|
return MangasPage(mangas, mp.hasNextPage)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
|
||||||
|
return client.newCall(searchMangaRequest(page, query, filters))
|
||||||
|
.asObservable().doOnNext { response ->
|
||||||
|
if (!response.isSuccessful) {
|
||||||
|
response.close()
|
||||||
|
// Error message for exceeding last page
|
||||||
|
if (response.code() == 404)
|
||||||
|
error("Already on the Last Page!")
|
||||||
|
else throw Exception("HTTP error ${response.code()}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.map { response ->
|
||||||
|
searchMangaParse(response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search Manga
|
||||||
|
|
||||||
|
protected open fun searchPage(page: Int): String = "page/$page/"
|
||||||
|
|
||||||
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
|
val url = HttpUrl.parse("$baseUrl/${searchPage(page)}")!!.newBuilder()
|
||||||
|
url.addQueryParameter("s", query)
|
||||||
|
url.addQueryParameter("post_type", "wp-manga")
|
||||||
|
filters.forEach { filter ->
|
||||||
|
when (filter) {
|
||||||
|
is AuthorFilter -> {
|
||||||
|
if (filter.state.isNotBlank()) {
|
||||||
|
url.addQueryParameter("author", filter.state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is ArtistFilter -> {
|
||||||
|
if (filter.state.isNotBlank()) {
|
||||||
|
url.addQueryParameter("artist", filter.state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is YearFilter -> {
|
||||||
|
if (filter.state.isNotBlank()) {
|
||||||
|
url.addQueryParameter("release", filter.state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is StatusFilter -> {
|
||||||
|
filter.state.forEach {
|
||||||
|
if (it.state) {
|
||||||
|
url.addQueryParameter("status[]", it.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is OrderByFilter -> {
|
||||||
|
if (filter.state != 0) {
|
||||||
|
url.addQueryParameter("m_orderby", filter.toUriPart())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is GenreConditionFilter -> {
|
||||||
|
url.addQueryParameter("op", filter.toUriPart())
|
||||||
|
}
|
||||||
|
is GenreList -> {
|
||||||
|
filter.state
|
||||||
|
.filter { it.state }
|
||||||
|
.let { list ->
|
||||||
|
if (list.isNotEmpty()) { list.forEach { genre -> url.addQueryParameter("genre[]", genre.id) } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GET(url.toString(), headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AuthorFilter : Filter.Text("Author")
|
||||||
|
private class ArtistFilter : Filter.Text("Artist")
|
||||||
|
private class YearFilter : Filter.Text("Year of Released")
|
||||||
|
private class StatusFilter(status: List<Tag>) : Filter.Group<Tag>("Status", status)
|
||||||
|
private class OrderByFilter : UriPartFilter(
|
||||||
|
"Order By",
|
||||||
|
arrayOf(
|
||||||
|
Pair("<select>", ""),
|
||||||
|
Pair("Latest", "latest"),
|
||||||
|
Pair("A-Z", "alphabet"),
|
||||||
|
Pair("Rating", "rating"),
|
||||||
|
Pair("Trending", "trending"),
|
||||||
|
Pair("Most Views", "views"),
|
||||||
|
Pair("New", "new-manga")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
private class GenreConditionFilter : UriPartFilter(
|
||||||
|
"Genre condition",
|
||||||
|
arrayOf(
|
||||||
|
Pair("or", ""),
|
||||||
|
Pair("and", "1")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
|
||||||
|
class Genre(name: String, val id: String = name) : Filter.CheckBox(name)
|
||||||
|
|
||||||
|
open fun getGenreList() = 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")
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun getFilterList() = FilterList(
|
||||||
|
AuthorFilter(),
|
||||||
|
ArtistFilter(),
|
||||||
|
YearFilter(),
|
||||||
|
StatusFilter(getStatusList()),
|
||||||
|
OrderByFilter(),
|
||||||
|
Filter.Separator(),
|
||||||
|
Filter.Header("Genres may not work for all sources"),
|
||||||
|
GenreConditionFilter(),
|
||||||
|
GenreList(getGenreList())
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun getStatusList() = listOf(
|
||||||
|
Tag("end", "Completed"),
|
||||||
|
Tag("on-going", "Ongoing"),
|
||||||
|
Tag("canceled", "Canceled"),
|
||||||
|
Tag("on-hold", "On Hold")
|
||||||
|
)
|
||||||
|
|
||||||
|
open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) :
|
||||||
|
Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
|
||||||
|
fun toUriPart() = vals[state].second
|
||||||
|
}
|
||||||
|
|
||||||
|
open class Tag(val id: String, name: String) : Filter.CheckBox(name)
|
||||||
|
|
||||||
|
override fun searchMangaSelector() = "div.c-tabs-item__content"
|
||||||
|
|
||||||
|
override fun searchMangaFromElement(element: Element): SManga {
|
||||||
|
val manga = SManga.create()
|
||||||
|
|
||||||
|
with(element) {
|
||||||
|
select("div.post-title a").first()?.let {
|
||||||
|
manga.setUrlWithoutDomain(it.attr("abs:href"))
|
||||||
|
manga.title = it.ownText()
|
||||||
|
}
|
||||||
|
select("img").first()?.let {
|
||||||
|
manga.thumbnail_url = imageFromElement(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return manga
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun searchMangaNextPageSelector(): String? = "div.nav-previous, nav.navigation-ajax, a.nextpostslink"
|
||||||
|
|
||||||
|
// Manga Details Parse
|
||||||
|
|
||||||
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
|
val manga = SManga.create()
|
||||||
|
|
||||||
|
with(document) {
|
||||||
|
select("div.post-title h3").first()?.let {
|
||||||
|
manga.title = it.ownText()
|
||||||
|
}
|
||||||
|
select("div.author-content").first()?.let {
|
||||||
|
manga.author = it.text()
|
||||||
|
}
|
||||||
|
select("div.artist-content").first()?.let {
|
||||||
|
manga.artist = it.text()
|
||||||
|
}
|
||||||
|
select("div.description-summary div.summary__content").let {
|
||||||
|
if (it.select("p").text().isNotEmpty()) {
|
||||||
|
manga.description = it.select("p").joinToString(separator = "\n\n") { p ->
|
||||||
|
p.text().replace("<br>", "\n")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
manga.description = it.text()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
select("div.summary_image img").first()?.let {
|
||||||
|
manga.thumbnail_url = imageFromElement(it)
|
||||||
|
}
|
||||||
|
select("div.summary-content").last()?.let {
|
||||||
|
manga.status = when (it.text()) {
|
||||||
|
// I don't know what's the corresponding for COMPLETED and LICENSED
|
||||||
|
// There's no support for "Canceled" or "On Hold"
|
||||||
|
"Completed", "Completo", "Concluído" -> SManga.COMPLETED
|
||||||
|
"OnGoing", "Продолжается", "Updating", "Em Lançamento", "Em andamento" -> SManga.ONGOING
|
||||||
|
else -> SManga.UNKNOWN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val genres = mutableListOf<String>()
|
||||||
|
select("div.genres-content a").forEach { element ->
|
||||||
|
val genre = element.text()
|
||||||
|
genres.add(genre)
|
||||||
|
}
|
||||||
|
manga.genre = genres.joinToString(", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
return manga
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun imageFromElement(element: Element): String? {
|
||||||
|
return when {
|
||||||
|
element.hasAttr("data-src") -> element.attr("abs:data-src")
|
||||||
|
element.hasAttr("data-lazy-src") -> element.attr("abs:data-lazy-src")
|
||||||
|
element.hasAttr("srcset") -> element.attr("abs:srcset").substringBefore(" ")
|
||||||
|
else -> element.attr("abs:src")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun getXhrChapters(mangaId: String): Document {
|
||||||
|
val xhrHeaders = headersBuilder().add("Content-Type: application/x-www-form-urlencoded; charset=UTF-8")
|
||||||
|
.add("Referer", baseUrl)
|
||||||
|
.build()
|
||||||
|
val body = RequestBody.create(null, "action=manga_get_chapters&manga=$mangaId")
|
||||||
|
return client.newCall(POST("$baseUrl/wp-admin/admin-ajax.php", xhrHeaders, body)).execute().asJsoup()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
val dataIdSelector = "div[id^=manga-chapters-holder]"
|
||||||
|
|
||||||
|
return document.select(chapterListSelector())
|
||||||
|
.let { elements ->
|
||||||
|
if (elements.isEmpty() && !document.select(dataIdSelector).isNullOrEmpty())
|
||||||
|
getXhrChapters(document.select(dataIdSelector).attr("data-id")).select(chapterListSelector())
|
||||||
|
else elements
|
||||||
|
}
|
||||||
|
.map { chapterFromElement(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun chapterListSelector() = "li.wp-manga-chapter"
|
||||||
|
|
||||||
|
open val chapterUrlSelector = "a"
|
||||||
|
|
||||||
|
open val chapterUrlSuffix = "?style=list"
|
||||||
|
|
||||||
|
override fun chapterFromElement(element: Element): SChapter {
|
||||||
|
val chapter = SChapter.create()
|
||||||
|
|
||||||
|
with(element) {
|
||||||
|
select(chapterUrlSelector).first()?.let { urlElement ->
|
||||||
|
chapter.url = urlElement.attr("abs:href").let {
|
||||||
|
it.substringBefore("?style=paged") + if (!it.endsWith(chapterUrlSuffix)) chapterUrlSuffix else ""
|
||||||
|
}
|
||||||
|
chapter.name = urlElement.text()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dates can be part of a "new" graphic or plain text
|
||||||
|
chapter.date_upload = select("img").firstOrNull()?.attr("alt")?.let { parseRelativeDate(it) }
|
||||||
|
?: parseChapterDate(select("span.chapter-release-date i").firstOrNull()?.text())
|
||||||
|
}
|
||||||
|
|
||||||
|
return chapter
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun parseChapterDate(date: String?): Long {
|
||||||
|
date ?: return 0
|
||||||
|
|
||||||
|
fun SimpleDateFormat.tryParse(string: String): Long {
|
||||||
|
return try {
|
||||||
|
parse(string)?.time ?: 0
|
||||||
|
} catch (_: ParseException) {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return when {
|
||||||
|
date.endsWith(" ago", ignoreCase = true) -> {
|
||||||
|
parseRelativeDate(date)
|
||||||
|
}
|
||||||
|
// Handle translated 'ago' in Portuguese.
|
||||||
|
date.endsWith(" atrás", ignoreCase = true) -> {
|
||||||
|
parseRelativeDate(date)
|
||||||
|
}
|
||||||
|
// Handle translated 'ago' in Turkish.
|
||||||
|
date.endsWith(" önce", ignoreCase = true) -> {
|
||||||
|
parseRelativeDate(date)
|
||||||
|
}
|
||||||
|
// Handle 'yesterday' and 'today', using midnight
|
||||||
|
date.startsWith("year", ignoreCase = true) -> {
|
||||||
|
Calendar.getInstance().apply {
|
||||||
|
add(Calendar.DAY_OF_MONTH, -1) // yesterday
|
||||||
|
set(Calendar.HOUR_OF_DAY, 0)
|
||||||
|
set(Calendar.MINUTE, 0)
|
||||||
|
set(Calendar.SECOND, 0)
|
||||||
|
set(Calendar.MILLISECOND, 0)
|
||||||
|
}.timeInMillis
|
||||||
|
}
|
||||||
|
date.startsWith("today", ignoreCase = true) -> {
|
||||||
|
Calendar.getInstance().apply {
|
||||||
|
set(Calendar.HOUR_OF_DAY, 0)
|
||||||
|
set(Calendar.MINUTE, 0)
|
||||||
|
set(Calendar.SECOND, 0)
|
||||||
|
set(Calendar.MILLISECOND, 0)
|
||||||
|
}.timeInMillis
|
||||||
|
}
|
||||||
|
date.contains(Regex("""\d(st|nd|rd|th)""")) -> {
|
||||||
|
// Clean date (e.g. 5th December 2019 to 5 December 2019) before parsing it
|
||||||
|
date.split(" ").map {
|
||||||
|
if (it.contains(Regex("""\d\D\D"""))) {
|
||||||
|
it.replace(Regex("""\D"""), "")
|
||||||
|
} else {
|
||||||
|
it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.let { dateFormat.tryParse(it.joinToString(" ")) }
|
||||||
|
}
|
||||||
|
else -> dateFormat.tryParse(date)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses dates in this form:
|
||||||
|
// 21 horas ago
|
||||||
|
private fun parseRelativeDate(date: String): Long {
|
||||||
|
val number = Regex("""(\d+)""").find(date)?.value?.toIntOrNull() ?: return 0
|
||||||
|
val cal = Calendar.getInstance()
|
||||||
|
|
||||||
|
return when {
|
||||||
|
WordSet("hari", "gün", "jour", "día", "dia", "day").anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis
|
||||||
|
WordSet("jam", "saat", "heure", "hora", "hour").anyWordIn(date) -> cal.apply { add(Calendar.HOUR, -number) }.timeInMillis
|
||||||
|
WordSet("menit", "dakika", "min", "minute", "minuto").anyWordIn(date) -> cal.apply { add(Calendar.MINUTE, -number) }.timeInMillis
|
||||||
|
WordSet("detik", "segundo", "second").anyWordIn(date) -> cal.apply { add(Calendar.SECOND, -number) }.timeInMillis
|
||||||
|
else -> 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun pageListRequest(chapter: SChapter): Request {
|
||||||
|
if (chapter.url.startsWith("http")) {
|
||||||
|
return GET(chapter.url, headers)
|
||||||
|
}
|
||||||
|
return super.pageListRequest(chapter)
|
||||||
|
}
|
||||||
|
|
||||||
|
open val pageListParseSelector = "div.page-break"
|
||||||
|
|
||||||
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
|
return document.select(pageListParseSelector).mapIndexed { index, element ->
|
||||||
|
Page(
|
||||||
|
index,
|
||||||
|
document.location(),
|
||||||
|
element.select("img").first()?.let {
|
||||||
|
it.absUrl(if (it.hasAttr("data-src")) "data-src" else "src")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun imageRequest(page: Page): Request {
|
||||||
|
return GET(page.imageUrl!!, headers.newBuilder().set("Referer", page.url).build())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("Not used")
|
||||||
|
}
|
||||||
|
|
||||||
|
class WordSet(private vararg val words: String) { fun anyWordIn(dateString: String): Boolean = words.any { dateString.contains(it, ignoreCase = true) } }
|
|
@ -0,0 +1,74 @@
|
||||||
|
package eu.kanade.tachiyomi.multisrc.madara
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.ThemeSourceGenerator
|
||||||
|
import eu.kanade.tachiyomi.multisrc.ThemeSourceGenerator.Companion.ThemeSourceData.SingleLang
|
||||||
|
|
||||||
|
class MadaraGenerator : ThemeSourceGenerator {
|
||||||
|
|
||||||
|
override val themePkg = "madara"
|
||||||
|
|
||||||
|
override val themeClass = "Madara"
|
||||||
|
|
||||||
|
override val baseVersionCode: Int = 1
|
||||||
|
|
||||||
|
override val sources = listOf(
|
||||||
|
SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr"),
|
||||||
|
SingleLang("AkuManga", "https://akumanga.com", "ar"),
|
||||||
|
SingleLang("AlianzaMarcial", "https://alianzamarcial.xyz", "es"),
|
||||||
|
SingleLang("AllPornComic", "https://allporncomic.com", "en"),
|
||||||
|
SingleLang("Aloalivn", "https://aloalivn.com", "en"),
|
||||||
|
SingleLang("AniMangaEs", "http://animangaes.com", "en"),
|
||||||
|
SingleLang("Agent of Change Translations", "https://aoc.moe", "en"),
|
||||||
|
SingleLang("ApollComics", "https://apollcomics.xyz", "es"),
|
||||||
|
SingleLang("Arang Scans", "https://www.arangscans.com", "en"),
|
||||||
|
SingleLang("ArazNovel", "https://www.araznovel.com", "tr"),
|
||||||
|
SingleLang("Argos Scan", "https://argosscan.com", "pt-BR"),
|
||||||
|
SingleLang("Asgard Team", "https://www.asgard1team.com", "ar"),
|
||||||
|
SingleLang("Astral Library", "https://www.astrallibrary.net", "en"),
|
||||||
|
SingleLang("Atikrost", "https://atikrost.com", "tr"),
|
||||||
|
SingleLang("ATM-Subs", "https://atm-subs.fr", "fr", className = "ATMSubs", pkgName = "atmsubs"),
|
||||||
|
SingleLang("Azora", "https://www.azoramanga.com", "ar"),
|
||||||
|
SingleLang("Bakaman", "https://bakaman.net", "th"),
|
||||||
|
SingleLang("BestManga", "https://bestmanga.club", "ru"),
|
||||||
|
SingleLang("BestManhua", "https://bestmanhua.com", "en"),
|
||||||
|
SingleLang("BoysLove", "https://boyslove.me", "en"),
|
||||||
|
SingleLang("CatOnHeadTranslations", "https://catonhead.com", "en"),
|
||||||
|
SingleLang("CAT-translator", "https://cat-translator.com", "th", className = "CatTranslator", pkgName = "cattranslator"),
|
||||||
|
SingleLang("Chibi Manga", "https://www.cmreader.info", "en"),
|
||||||
|
SingleLang("Clover Manga", "Clover Manga", "tr"),
|
||||||
|
SingleLang("ComicKiba", "https://comickiba.com", "en"),
|
||||||
|
SingleLang("Comics Valley", "https://comicsvalley.com", "hi", isNsfw = true),
|
||||||
|
SingleLang("CopyPasteScan", "https://copypastescan.xyz", "es"),
|
||||||
|
SingleLang("Cutie Pie", "https://cutiepie.ga", "tr"),
|
||||||
|
SingleLang("Darkyu Realm", "https://darkyuerealm.site", "pt-BR"),
|
||||||
|
SingleLang("Decadence Scans", "https://reader.decadencescans.com", "en"),
|
||||||
|
SingleLang("شبكة كونان العربية", "https://www.manga.detectiveconanar.com", "ar", className="DetectiveConanAr"),
|
||||||
|
SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"),
|
||||||
|
SingleLang("Disaster Scans", "https://disasterscans.com", "en"),
|
||||||
|
SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true),
|
||||||
|
SingleLang("DoujinYosh", "https://doujinyosh.work", "id"),
|
||||||
|
SingleLang("Dream Manga", "https://dreammanga.com/", "en"),
|
||||||
|
SingleLang("Drope Scan", "https://dropescan.com", "pt-BR"),
|
||||||
|
SingleLang("Einherjar Scan", "https://einherjarscans.space", "en"),
|
||||||
|
SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR"),
|
||||||
|
SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga"),
|
||||||
|
SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com","en", className="FirstKissManhua"),
|
||||||
|
SingleLang("FreeWebtoonCoins", "https://freewebtooncoins.com", "en"),
|
||||||
|
SingleLang("Furio Scans", "https://furioscans.com", "pt-BR"),
|
||||||
|
SingleLang("Gecenin Lordu", "https://geceninlordu.com/", "tr"),
|
||||||
|
SingleLang("موقع لترجمة المانجا", "https://golden-manga.com", "ar", className = "GoldenManga"),
|
||||||
|
SingleLang("GuncelManga", "https://guncelmanga.com", "tr"),
|
||||||
|
SingleLang("Hero Manhua", "https://heromanhua.com", "en"),
|
||||||
|
SingleLang("Heroz Scanlation", "https://herozscans.com", "en"),
|
||||||
|
SingleLang("Hikari Scan", "https://hikariscan.com.br", "pt-BR"),
|
||||||
|
SingleLang("Himera Fansub", "https://himera-fansub.com", "tr"),
|
||||||
|
SingleLang("Hiperdex", "https://hiperdex.com", "en"),
|
||||||
|
)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
MadaraGenerator().createAll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
extName = 'Madara (multiple sources)'
|
extName = 'Madara (multiple sources)'
|
||||||
pkgNameSuffix = "all.madara"
|
pkgNameSuffix = "all.madara"
|
||||||
extClass = '.MadaraFactory'
|
extClass = '.MadaraFactory'
|
||||||
extVersionCode = 178
|
extVersionCode = 179
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
containsNsfw = true
|
containsNsfw = true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,16 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.madara
|
package eu.kanade.tachiyomi.extension.all.madara
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import eu.kanade.tachiyomi.annotations.Nsfw
|
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
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.util.asJsoup
|
|
||||||
import okhttp3.CacheControl
|
import okhttp3.CacheControl
|
||||||
import okhttp3.FormBody
|
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.HttpUrl
|
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
|
@ -27,59 +22,59 @@ import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
class MadaraFactory : SourceFactory {
|
class MadaraFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = listOf(
|
override fun createSources(): List<Source> = listOf(
|
||||||
AdonisFansub(),
|
// AdonisFansub(),
|
||||||
AkuManga(),
|
// AkuManga(),
|
||||||
AlianzaMarcial(),
|
// AlianzaMarcial(),
|
||||||
AllPornComic(),
|
// AllPornComic(),
|
||||||
Aloalivn(),
|
// Aloalivn(),
|
||||||
AniMangaEs(),
|
// AniMangaEs(),
|
||||||
AoCTranslations(),
|
// AoCTranslations(),
|
||||||
ApollComics(),
|
// ApollComics(),
|
||||||
ArangScans(),
|
// ArangScans(),
|
||||||
ArazNovel(),
|
// ArazNovel(),
|
||||||
ArgosScan(),
|
// ArgosScan(),
|
||||||
AsgardTeam(),
|
// AsgardTeam(),
|
||||||
AstralLibrary(),
|
// AstralLibrary(),
|
||||||
Atikrost(),
|
// Atikrost(),
|
||||||
ATMSubs(),
|
// ATMSubs(),
|
||||||
Azora(),
|
// Azora(),
|
||||||
Bakaman(),
|
// Bakaman(),
|
||||||
BestManga(),
|
// BestManga(),
|
||||||
BestManhua(),
|
// BestManhua(),
|
||||||
BoysLove(),
|
// BoysLove(),
|
||||||
CatOnHeadTranslations(),
|
// CatOnHeadTranslations(),
|
||||||
CatTranslator(),
|
// CatTranslator(),
|
||||||
ChibiManga(),
|
// ChibiManga(),
|
||||||
CloverManga(),
|
// CloverManga(),
|
||||||
ComicKiba(),
|
// ComicKiba(),
|
||||||
ComicsValley(),
|
// ComicsValley(),
|
||||||
CopyPasteScan(),
|
// CopyPasteScan(),
|
||||||
CutiePie(),
|
// CutiePie(),
|
||||||
DarkyuRealm(),
|
// DarkyuRealm(),
|
||||||
DecadenceScans(),
|
// DecadenceScans(),
|
||||||
DetectiveConanAr(),
|
// DetectiveConanAr(),
|
||||||
DiamondFansub(),
|
// DiamondFansub(),
|
||||||
DisasterScans(),
|
// DisasterScans(),
|
||||||
DoujinHentai(),
|
// DoujinHentai(),
|
||||||
DoujinYosh(),
|
// DoujinYosh(),
|
||||||
DreamManga(),
|
// DreamManga(),
|
||||||
DropeScan(),
|
// DropeScan(),
|
||||||
EinherjarScan(),
|
// EinherjarScan(),
|
||||||
FdmScan(),
|
// FdmScan(),
|
||||||
FirstKissManga(),
|
// FirstKissManga(),
|
||||||
FirstKissManhua(),
|
// FirstKissManhua(),
|
||||||
FreeWebtoonCoins(),
|
// FreeWebtoonCoins(),
|
||||||
FurioScans(),
|
// FurioScans(),
|
||||||
GeceninLordu(),
|
// GeceninLordu(),
|
||||||
GoldenManga(),
|
// GoldenManga(),
|
||||||
GrazeScans(),
|
GrazeScans(),
|
||||||
GourmetScans(),
|
GourmetScans(),
|
||||||
GuncelManga(),
|
// GuncelManga(),
|
||||||
HeroManhua(),
|
// HeroManhua(),
|
||||||
HerozScanlation(),
|
// HerozScanlation(),
|
||||||
HikariScan(),
|
// HikariScan(),
|
||||||
HimeraFansub(),
|
// HimeraFansub(),
|
||||||
Hiperdex(),
|
// Hiperdex(),
|
||||||
Hscans(),
|
Hscans(),
|
||||||
HunterFansub(),
|
HunterFansub(),
|
||||||
IchirinNoHanaYuri(),
|
IchirinNoHanaYuri(),
|
||||||
|
@ -276,17 +271,10 @@ class SpookyScanlations : Madara("Spooky Scanlations", "https://spookyscanlation
|
||||||
|
|
||||||
class RandomTranslations : Madara("Random Translations", "https://randomtranslations.com", "en", SimpleDateFormat("dd/MM/yyyy", Locale.US))
|
class RandomTranslations : Madara("Random Translations", "https://randomtranslations.com", "en", SimpleDateFormat("dd/MM/yyyy", Locale.US))
|
||||||
|
|
||||||
class Atikrost : Madara("Atikrost", "https://atikrost.com", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale("tr"))) {
|
|
||||||
override val chapterUrlSelector = "a:not(:has(img))"
|
|
||||||
override val chapterDatesNewSelector = "img:not(.thumb)"
|
|
||||||
}
|
|
||||||
|
|
||||||
class ManhuaFast : Madara("ManhuaFast", "https://manhuafast.com", "en") {
|
class ManhuaFast : Madara("ManhuaFast", "https://manhuafast.com", "en") {
|
||||||
override val pageListParseSelector = "li.blocks-gallery-item"
|
override val pageListParseSelector = "li.blocks-gallery-item"
|
||||||
}
|
}
|
||||||
|
|
||||||
class BestManhua : Madara("BestManhua", "https://bestmanhua.com", "en")
|
|
||||||
|
|
||||||
class ManhuaSY : Madara("Manhua SY", "https://www.manhuasy.com", "en")
|
class ManhuaSY : Madara("Manhua SY", "https://www.manhuasy.com", "en")
|
||||||
|
|
||||||
class MangaRave : Madara("MangaRave", "http://www.mangarave.com", "en")
|
class MangaRave : Madara("MangaRave", "http://www.mangarave.com", "en")
|
||||||
|
@ -297,10 +285,6 @@ class Manga3S : Madara("Manga3S", "https://manga3s.com", "en")
|
||||||
|
|
||||||
class MGKomik : Madara("MG Komik", "https://mgkomik.my.id", "id")
|
class MGKomik : Madara("MG Komik", "https://mgkomik.my.id", "id")
|
||||||
|
|
||||||
class Aloalivn : Madara("Aloalivn", "https://aloalivn.com", "en") {
|
|
||||||
override val pageListParseSelector = "li.blocks-gallery-item"
|
|
||||||
}
|
|
||||||
|
|
||||||
class MangaSco : Madara("MangaSco", "https://mangasco.com", "en")
|
class MangaSco : Madara("MangaSco", "https://mangasco.com", "en")
|
||||||
|
|
||||||
class MangaCrimson : Madara("Manga Crimson", "https://mangacrimson.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale("tr")))
|
class MangaCrimson : Madara("Manga Crimson", "https://mangacrimson.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale("tr")))
|
||||||
|
@ -311,12 +295,8 @@ class NekoBreaker : Madara("NekoBreaker", "https://nekobreaker.com", "pt-BR", Si
|
||||||
|
|
||||||
class ManganeloLink : Madara("Manganelo.link", "https://manganelo.link", "en")
|
class ManganeloLink : Madara("Manganelo.link", "https://manganelo.link", "en")
|
||||||
|
|
||||||
class ApollComics : Madara("ApollComics", "https://apollcomics.xyz", "es", SimpleDateFormat("dd MMMM, yyyy", Locale("es")))
|
|
||||||
|
|
||||||
class KisekiManga : Madara("KisekiManga", "https://kisekimanga.com", "en")
|
class KisekiManga : Madara("KisekiManga", "https://kisekimanga.com", "en")
|
||||||
|
|
||||||
class FreeWebtoonCoins : Madara("FreeWebtoonCoins", "https://freewebtooncoins.com", "en")
|
|
||||||
|
|
||||||
class MangaRoma : Madara("MangaRoma", "https://mangaroma.com", "en")
|
class MangaRoma : Madara("MangaRoma", "https://mangaroma.com", "en")
|
||||||
|
|
||||||
class NTSVoidScans : Madara("NTS Void Scans", "https://ntsvoidscans.com", "en")
|
class NTSVoidScans : Madara("NTS Void Scans", "https://ntsvoidscans.com", "en")
|
||||||
|
@ -329,26 +309,16 @@ class WebToonily : Madara("WebToonily", "https://webtoonily.com", "en")
|
||||||
|
|
||||||
class Manga18Fun : Madara("Manga18 Fun", "https://manga18.fun", "en")
|
class Manga18Fun : Madara("Manga18 Fun", "https://manga18.fun", "en")
|
||||||
|
|
||||||
class CutiePie : Madara("Cutie Pie", "https://cutiepie.ga", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
|
||||||
|
|
||||||
class DiamondFansub : Madara("DiamondFansub", "https://diamondfansub.com", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("tr")))
|
|
||||||
|
|
||||||
class MangaYaku : Madara("MangaYaku", "https://mangayaku.my.id", "id")
|
class MangaYaku : Madara("MangaYaku", "https://mangayaku.my.id", "id")
|
||||||
|
|
||||||
class RuyaManga : Madara("Rüya Manga", "https://www.ruyamanga.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
class RuyaManga : Madara("Rüya Manga", "https://www.ruyamanga.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
||||||
|
|
||||||
class HimeraFansub : Madara("Himera Fansub", "https://himera-fansub.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
|
||||||
|
|
||||||
class MangaBaz : Madara("MangaBaz", "https://mangabaz.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
class MangaBaz : Madara("MangaBaz", "https://mangabaz.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr")))
|
||||||
|
|
||||||
class Manhuaga : Madara("Manhuaga", "https://manhuaga.com", "en")
|
class Manhuaga : Madara("Manhuaga", "https://manhuaga.com", "en")
|
||||||
|
|
||||||
class MangaCultivator : Madara("MangaCultivator", "https://mangacultivator.com", "en")
|
class MangaCultivator : Madara("MangaCultivator", "https://mangacultivator.com", "en")
|
||||||
|
|
||||||
class HerozScanlation : Madara("Heroz Scanlation", "https://herozscans.com", "en")
|
|
||||||
|
|
||||||
class CatOnHeadTranslations : Madara("CatOnHeadTranslations", "https://catonhead.com", "en")
|
|
||||||
|
|
||||||
class OffScan : Madara(
|
class OffScan : Madara(
|
||||||
"Off Scan",
|
"Off Scan",
|
||||||
"https://offscan.top",
|
"https://offscan.top",
|
||||||
|
@ -387,41 +357,6 @@ class JustForFun : Madara(
|
||||||
dateFormat = SimpleDateFormat("yy.MM.dd", Locale.US)
|
dateFormat = SimpleDateFormat("yy.MM.dd", Locale.US)
|
||||||
)
|
)
|
||||||
|
|
||||||
class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe", "en") {
|
|
||||||
override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
|
|
||||||
override fun popularMangaSelector() = "div.page-item-detail.manga:has(span.chapter)"
|
|
||||||
override fun chapterListSelector() = "li.wp-manga-chapter:has(a)"
|
|
||||||
|
|
||||||
@SuppressLint("DefaultLocale")
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
|
||||||
return response.asJsoup().let { document ->
|
|
||||||
document.select(chapterListSelector()).let { normalChapters ->
|
|
||||||
if (normalChapters.isNotEmpty()) {
|
|
||||||
normalChapters.map { chapterFromElement(it) }
|
|
||||||
} else {
|
|
||||||
// For their "fancy" volume/chapter lists
|
|
||||||
document.select("div.wpb_wrapper:contains(volume) a")
|
|
||||||
.filter { it.attr("href").contains(baseUrl) && !it.attr("href").contains("imgur") }
|
|
||||||
.map { volumeChapter ->
|
|
||||||
SChapter.create().apply {
|
|
||||||
volumeChapter.attr("href").let { url ->
|
|
||||||
name = if (url.contains("volume")) {
|
|
||||||
val volume = url.substringAfter("volume-").substringBefore("/")
|
|
||||||
val volChap = url.substringAfter("volume-$volume/").substringBefore("/").replace("-", " ").capitalize()
|
|
||||||
"Volume $volume - $volChap"
|
|
||||||
} else {
|
|
||||||
url.substringBefore("/p").substringAfterLast("/").replace("-", " ").capitalize()
|
|
||||||
}
|
|
||||||
setUrlWithoutDomain(url.substringBefore("?") + "?style=list")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.reversed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class KomikGo : Madara("KomikGo", "https://komikgo.com", "id")
|
class KomikGo : Madara("KomikGo", "https://komikgo.com", "id")
|
||||||
|
|
||||||
class TsubakiNoScan : Madara(
|
class TsubakiNoScan : Madara(
|
||||||
|
@ -450,15 +385,6 @@ class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club", "ja")
|
||||||
|
|
||||||
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club", "ko")
|
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club", "ko")
|
||||||
|
|
||||||
class FirstKissManga : Madara(
|
|
||||||
"1st Kiss",
|
|
||||||
"https://1stkissmanga.com",
|
|
||||||
"en",
|
|
||||||
SimpleDateFormat("MMM d, yyyy", Locale.US)
|
|
||||||
) {
|
|
||||||
override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
class MangaSY : Madara("Manga SY", "https://www.mangasy.com", "en") {
|
class MangaSY : Madara("Manga SY", "https://www.mangasy.com", "en") {
|
||||||
override fun imageRequest(page: Page): Request = super.imageRequest(page).newBuilder()
|
override fun imageRequest(page: Page): Request = super.imageRequest(page).newBuilder()
|
||||||
.cacheControl(CacheControl.FORCE_NETWORK)
|
.cacheControl(CacheControl.FORCE_NETWORK)
|
||||||
|
@ -480,13 +406,6 @@ class ManyToonMe : Madara("ManyToon.me", "https://manytoon.me", "en")
|
||||||
|
|
||||||
class BoysLove : Madara("BoysLove", "https://boyslove.me", "en")
|
class BoysLove : Madara("BoysLove", "https://boyslove.me", "en")
|
||||||
|
|
||||||
class ChibiManga : Madara(
|
|
||||||
"Chibi Manga",
|
|
||||||
"https://www.cmreader.info",
|
|
||||||
"en",
|
|
||||||
dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.US)
|
|
||||||
)
|
|
||||||
|
|
||||||
class ZinManga : Madara("Zin Translator", "https://zinmanga.com", "en") {
|
class ZinManga : Madara("Zin Translator", "https://zinmanga.com", "en") {
|
||||||
override fun headersBuilder(): Headers.Builder = super.headersBuilder()
|
override fun headersBuilder(): Headers.Builder = super.headersBuilder()
|
||||||
.add("Referer", "https://zinmanga.com/")
|
.add("Referer", "https://zinmanga.com/")
|
||||||
|
@ -496,306 +415,12 @@ class ManwahentaiMe : Madara("Manwahentai.me", "https://manhwahentai.me", "en")
|
||||||
|
|
||||||
class Manga3asq : Madara("مانجا العاشق", "https://3asq.org", "ar")
|
class Manga3asq : Madara("مانجا العاشق", "https://3asq.org", "ar")
|
||||||
|
|
||||||
class AdonisFansub : Madara("Adonis Fansub", "https://manga.adonisfansub.com", "tr") {
|
|
||||||
override val userAgentRandomizer = ""
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nsfw
|
|
||||||
class AllPornComic : Madara("AllPornComic", "https://allporncomic.com", "en") {
|
|
||||||
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 searchMangaNextPageSelector() = "a[rel=next]"
|
|
||||||
override fun getGenreList() = listOf(
|
|
||||||
Genre("3D", "3d"),
|
|
||||||
Genre("Ahegao", "ahegao"),
|
|
||||||
Genre("Alien Girl", "alien-girl"),
|
|
||||||
Genre("Anal", "anal"),
|
|
||||||
Genre("Anime", "anime"),
|
|
||||||
Genre("Anthology", "anthology"),
|
|
||||||
Genre("Artbook", "artbook"),
|
|
||||||
Genre("BBW / Chubby / Fat Woman", "bbw"),
|
|
||||||
Genre("BDSM", "bdsm"),
|
|
||||||
Genre("Big Areolae", "big-areolae"),
|
|
||||||
Genre("Big Ass", "big-ass"),
|
|
||||||
Genre("Big Balls", "big-balls"),
|
|
||||||
Genre("Big Breasts", "big-breasts"),
|
|
||||||
Genre("Big Clit", "big-clit"),
|
|
||||||
Genre("Big Nipples", "big-nipples"),
|
|
||||||
Genre("Big Penis", "big-penis"),
|
|
||||||
Genre("Bikini", "bikini"),
|
|
||||||
Genre("Blackmail", "blackmail"),
|
|
||||||
Genre("Blindfold", "blindfold"),
|
|
||||||
Genre("Body Modification", "body-modification"),
|
|
||||||
Genre("Body Swap", "body-swap"),
|
|
||||||
Genre("Body Writing", "body-writing"),
|
|
||||||
Genre("BodyStocking", "bodystocking"),
|
|
||||||
Genre("Bodysuit", "bodysuit"),
|
|
||||||
Genre("Bondage", "bondage"),
|
|
||||||
Genre("Brain Fuck", "brain-fuck"),
|
|
||||||
Genre("Cartoon", "cartoon"),
|
|
||||||
Genre("Cheerleader", "cheerleader"),
|
|
||||||
Genre("Chinese Dress", "chinese-dress"),
|
|
||||||
Genre("Collar / Choker", "collar"),
|
|
||||||
Genre("Comedy", "comedy"),
|
|
||||||
Genre("Corruption", "corruption"),
|
|
||||||
Genre("Corset", "corset"),
|
|
||||||
Genre("Crotch Tattoo", "crotch-tattoo"),
|
|
||||||
Genre("Dark Skin", "dark-skin"),
|
|
||||||
Genre("Demon Girl / Succubus", "demon-girl"),
|
|
||||||
Genre("Dick Growth", "dick-growth"),
|
|
||||||
Genre("Dickgirl On Dickgirl", "dickgirl-on-dickgirl"),
|
|
||||||
Genre("Dickgirl On Male", "dickgirl-on-male"),
|
|
||||||
Genre("Dickgirls Only", "dickgirls-only"),
|
|
||||||
Genre("Drugs", "drugs"),
|
|
||||||
Genre("Drunk", "drunk"),
|
|
||||||
Genre("Exhibitionism", "exhibitionism"),
|
|
||||||
Genre("FFM Threesome", "ffm-threesome"),
|
|
||||||
Genre("FFT Threesome", "fft-threesome"),
|
|
||||||
Genre("Females Only", "females-only"),
|
|
||||||
Genre("Femdom", "femdom"),
|
|
||||||
Genre("Feminization", "feminization"),
|
|
||||||
Genre("Full Body Tattoo", "full-body-tattoo"),
|
|
||||||
Genre("Full Color", "full-color"),
|
|
||||||
Genre("Futanari", "futanari"),
|
|
||||||
Genre("Gender Bender", "gender-bender"),
|
|
||||||
Genre("Glasses", "glasses"),
|
|
||||||
Genre("Group", "group"),
|
|
||||||
Genre("Gyaru", "gyaru"),
|
|
||||||
Genre("Gyaru-OH", "gyaru-oh"),
|
|
||||||
Genre("Harem", "harem"),
|
|
||||||
Genre("Hentai", "hentai"),
|
|
||||||
Genre("Human Pet", "human-pet"),
|
|
||||||
Genre("Humiliation", "humiliation"),
|
|
||||||
Genre("Impregnation", "impregnation"),
|
|
||||||
Genre("Incest", "incest"),
|
|
||||||
Genre("Interracial", "interracial"),
|
|
||||||
Genre("Kimono", "kimono"),
|
|
||||||
Genre("Latex", "latex"),
|
|
||||||
Genre("Leash", "leash"),
|
|
||||||
Genre("Lingerie", "lingerie"),
|
|
||||||
Genre("Lolicon", "lolicon"),
|
|
||||||
Genre("MILF", "milf"),
|
|
||||||
Genre("MMF Threesome", "mmf-threesome"),
|
|
||||||
Genre("MMT Threesome", "mmt-threesome"),
|
|
||||||
Genre("Magical Girl", "magical-girl"),
|
|
||||||
Genre("Maid", "maid"),
|
|
||||||
Genre("Male On Dickgirl", "male-on-dickgirl"),
|
|
||||||
Genre("Manhwa", "manhwa"),
|
|
||||||
Genre("Military", "military"),
|
|
||||||
Genre("Milking", "milking"),
|
|
||||||
Genre("Mind Break", "mind-break"),
|
|
||||||
Genre("Mind Control", "mind-control"),
|
|
||||||
Genre("Monster Girl", "monster-girl"),
|
|
||||||
Genre("Moral Degeneration", "moral-degeneration"),
|
|
||||||
Genre("Muscle", "muscle"),
|
|
||||||
Genre("Muscle Growth", "muscle-growth"),
|
|
||||||
Genre("Nakadashi", "nakadashi"),
|
|
||||||
Genre("Netorare", "netorare"),
|
|
||||||
Genre("Netori", "netori"),
|
|
||||||
Genre("Ninja", "ninja"),
|
|
||||||
Genre("Nun", "nun"),
|
|
||||||
Genre("Nurse", "nurse"),
|
|
||||||
Genre("Orgy", "orgy"),
|
|
||||||
Genre("Paizuri", "paizuri"),
|
|
||||||
Genre("Pegging", "pegging"),
|
|
||||||
Genre("Piercing", "piercing"),
|
|
||||||
Genre("Pixie Cut", "pixie-cut"),
|
|
||||||
Genre("Policewoman", "policewoman"),
|
|
||||||
Genre("Possession", "possession"),
|
|
||||||
Genre("Retro", "retro"),
|
|
||||||
Genre("Ryona", "ryona"),
|
|
||||||
Genre("School Swimsuit", "school-swimsuit"),
|
|
||||||
Genre("Schoolboy Uniform", "schoolboy-uniform"),
|
|
||||||
Genre("Schoolgirl Uniform", "schoolgirl-uniform"),
|
|
||||||
Genre("Shared Senses", "shared-senses"),
|
|
||||||
Genre("Shemale", "shemale"),
|
|
||||||
Genre("Shibari", "shibari"),
|
|
||||||
Genre("Shotacon", "shotacon"),
|
|
||||||
Genre("Slave", "slave"),
|
|
||||||
Genre("Slime Girl", "slime-girl"),
|
|
||||||
Genre("Small Breasts", "small-breasts"),
|
|
||||||
Genre("Stockings", "stockings"),
|
|
||||||
Genre("Strap-on", "strap-on"),
|
|
||||||
Genre("Stuck In Wall", "stuck-in-wall"),
|
|
||||||
Genre("Superhero", "superhero"),
|
|
||||||
Genre("Superheroine", "superheroine"),
|
|
||||||
Genre("Tail", "tail"),
|
|
||||||
Genre("Tail Plug", "tail-plug"),
|
|
||||||
Genre("Tankoubon", "tankoubon"),
|
|
||||||
Genre("Tentacles", "tentacles"),
|
|
||||||
Genre("Thigh High Boots", "thigh-high-boots"),
|
|
||||||
Genre("Tights", "tights"),
|
|
||||||
Genre("Time Stop", "time-stop"),
|
|
||||||
Genre("Tomboy", "tomboy"),
|
|
||||||
Genre("Tomgirl", "tomgirl"),
|
|
||||||
Genre("Torture", "torture"),
|
|
||||||
Genre("Transformation", "transformation"),
|
|
||||||
Genre("Uncensored", "uncensored"),
|
|
||||||
Genre("Unusual Pupils", "unusual-pupils"),
|
|
||||||
Genre("Unusual Teeth", "unusual-teeth"),
|
|
||||||
Genre("Vampire", "vampire"),
|
|
||||||
Genre("Virginity", "virginity"),
|
|
||||||
Genre("Voyeurism", "voyeurism"),
|
|
||||||
Genre("Webtoon", "webtoon"),
|
|
||||||
Genre("Western", "western"),
|
|
||||||
Genre("Witch", "witch"),
|
|
||||||
Genre("Yandere", "yandere"),
|
|
||||||
Genre("Yaoi", "yaoi"),
|
|
||||||
Genre("Yuri", "yuri")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class Milftoon : Madara("Milftoon", "https://milftoon.xxx", "en") {
|
class Milftoon : Madara("Milftoon", "https://milftoon.xxx", "en") {
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=views", headers)
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=views", headers)
|
||||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=latest", headers)
|
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=latest", headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
class Hiperdex : Madara("Hiperdex", "https://hiperdex.com", "en") {
|
|
||||||
override fun getGenreList() = listOf(
|
|
||||||
Genre("Adult", "adult"),
|
|
||||||
Genre("Action", "action"),
|
|
||||||
Genre("Adventure", "adventure"),
|
|
||||||
Genre("Bully", "bully"),
|
|
||||||
Genre("Comedy", "comedy"),
|
|
||||||
Genre("Drama", "drama"),
|
|
||||||
Genre("Ecchi", "ecchi"),
|
|
||||||
Genre("Fantasy", "fantasy"),
|
|
||||||
Genre("Gender Bender", "gender-bender"),
|
|
||||||
Genre("Harem", "harem"),
|
|
||||||
Genre("Historical", "historical"),
|
|
||||||
Genre("Horror", "horror"),
|
|
||||||
Genre("Isekai", "isekai"),
|
|
||||||
Genre("Josei", "josei"),
|
|
||||||
Genre("Martial Arts", "martial-arts"),
|
|
||||||
Genre("Mature", "mature"),
|
|
||||||
Genre("Mystery", "mystery"),
|
|
||||||
Genre("Psychological", "psychological"),
|
|
||||||
Genre("Romance", "romance"),
|
|
||||||
Genre("School Life", "school-life"),
|
|
||||||
Genre("Sci-Fi", "sci-fi"),
|
|
||||||
Genre("Seinen", "seinen"),
|
|
||||||
Genre("Shoujo", "shoujo"),
|
|
||||||
Genre("Shounen", "shounen"),
|
|
||||||
Genre("Slice of Life", "slice-of-life"),
|
|
||||||
Genre("Smut", "smut"),
|
|
||||||
Genre("Sports", "sports"),
|
|
||||||
Genre("Supernatural", "supernatural"),
|
|
||||||
Genre("Thriller", "thriller"),
|
|
||||||
Genre("Tragedy", "tragedy"),
|
|
||||||
Genre("Yaoi", "yaoi"),
|
|
||||||
Genre("Yuri", "yuri")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nsfw
|
|
||||||
class DoujinHentai : Madara("DoujinHentai", "https://doujinhentai.net", "es", SimpleDateFormat("d MMM. yyyy", Locale.ENGLISH)) {
|
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/lista-manga-hentai?orderby=views&page=$page", headers)
|
|
||||||
override fun popularMangaSelector() = "div.col-md-3 a"
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
|
||||||
val manga = SManga.create()
|
|
||||||
|
|
||||||
manga.setUrlWithoutDomain(element.attr("href"))
|
|
||||||
manga.title = element.select("h5").text()
|
|
||||||
manga.thumbnail_url = element.select("img").attr("abs:data-src")
|
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = "a[rel=next]"
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/lista-manga-hentai?orderby=last&page=$page", headers)
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
val url = HttpUrl.parse(baseUrl)!!.newBuilder()
|
|
||||||
if (query.isNotBlank()) {
|
|
||||||
url.addPathSegment("search")
|
|
||||||
url.addQueryParameter("query", query) // query returns results all on one page
|
|
||||||
} else {
|
|
||||||
filters.forEach { filter ->
|
|
||||||
when (filter) {
|
|
||||||
is GenreSelectFilter -> {
|
|
||||||
if (filter.state != 0) {
|
|
||||||
url.addPathSegments("lista-manga-hentai/category/${filter.toUriPart()}")
|
|
||||||
url.addQueryParameter("page", page.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GET(url.build().toString(), headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = "div.c-tabs-item__content > div.c-tabs-item__content, ${popularMangaSelector()}"
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga {
|
|
||||||
return if (element.hasAttr("href")) {
|
|
||||||
popularMangaFromElement(element) // genre search results
|
|
||||||
} else {
|
|
||||||
super.searchMangaFromElement(element) // query search results
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
|
||||||
override fun chapterListSelector() = "ul.main.version-chap > li.wp-manga-chapter:not(:last-child)" // removing empty li
|
|
||||||
override val pageListParseSelector = "div#all > img.img-responsive"
|
|
||||||
override fun getFilterList() = FilterList(
|
|
||||||
Filter.Header("Solo funciona si la consulta está en blanco"),
|
|
||||||
GenreSelectFilter()
|
|
||||||
)
|
|
||||||
|
|
||||||
class GenreSelectFilter : UriPartFilter(
|
|
||||||
"Búsqueda de género",
|
|
||||||
arrayOf(
|
|
||||||
Pair("<seleccionar>", ""),
|
|
||||||
Pair("Ecchi", "ecchi"),
|
|
||||||
Pair("Yaoi", "yaoi"),
|
|
||||||
Pair("Yuri", "yuri"),
|
|
||||||
Pair("Anal", "anal"),
|
|
||||||
Pair("Tetonas", "tetonas"),
|
|
||||||
Pair("Escolares", "escolares"),
|
|
||||||
Pair("Incesto", "incesto"),
|
|
||||||
Pair("Virgenes", "virgenes"),
|
|
||||||
Pair("Masturbacion", "masturbacion"),
|
|
||||||
Pair("Maduras", "maduras"),
|
|
||||||
Pair("Lolicon", "lolicon"),
|
|
||||||
Pair("Bikini", "bikini"),
|
|
||||||
Pair("Sirvientas", "sirvientas"),
|
|
||||||
Pair("Enfermera", "enfermera"),
|
|
||||||
Pair("Embarazada", "embarazada"),
|
|
||||||
Pair("Ahegao", "ahegao"),
|
|
||||||
Pair("Casadas", "casadas"),
|
|
||||||
Pair("Chica Con Pene", "chica-con-pene"),
|
|
||||||
Pair("Juguetes Sexuales", "juguetes-sexuales"),
|
|
||||||
Pair("Orgias", "orgias"),
|
|
||||||
Pair("Harem", "harem"),
|
|
||||||
Pair("Romance", "romance"),
|
|
||||||
Pair("Profesores", "profesores"),
|
|
||||||
Pair("Tentaculos", "tentaculos"),
|
|
||||||
Pair("Mamadas", "mamadas"),
|
|
||||||
Pair("Shota", "shota"),
|
|
||||||
Pair("Interracial", "interracial"),
|
|
||||||
Pair("Full Color", "full-colo"),
|
|
||||||
Pair("Sin Censura", "sin-censura"),
|
|
||||||
Pair("Futanari", "futanari"),
|
|
||||||
Pair("Doble Penetracion", "doble-penetracion"),
|
|
||||||
Pair("Cosplay", "cosplay")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class Azora : Madara("Azora", "https://www.azoramanga.com", "ar") {
|
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=views", headers)
|
|
||||||
override fun chapterListSelector() = "li.wp-manga-chapter:not(.premium-block)" // Filter fake chapters
|
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
|
||||||
val chapter = SChapter.create()
|
|
||||||
|
|
||||||
element.select("a").let {
|
|
||||||
chapter.url = it.attr("href").substringAfter(baseUrl)
|
|
||||||
chapter.name = it.text()
|
|
||||||
}
|
|
||||||
return chapter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class KMangaIn : Madara("Kissmanga.in", "https://kissmanga.in", "en")
|
class KMangaIn : Madara("Kissmanga.in", "https://kissmanga.in", "en")
|
||||||
|
|
||||||
class HunterFansub : Madara("Hunter Fansub", "https://hunterfansub.com", "es") {
|
class HunterFansub : Madara("Hunter Fansub", "https://hunterfansub.com", "es") {
|
||||||
|
@ -880,26 +505,6 @@ class YaoiToshokan : Madara("Yaoi Toshokan", "https://yaoitoshokan.com.br", "pt-
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GoldenManga : Madara("موقع لترجمة المانجا", "https://golden-manga.com", "ar", SimpleDateFormat("yyyy-MM-dd", Locale.US)) {
|
|
||||||
override fun searchMangaSelector() = "div.c-image-hover a"
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga {
|
|
||||||
return SManga.create().apply {
|
|
||||||
setUrlWithoutDomain(element.attr("href"))
|
|
||||||
title = element.attr("title")
|
|
||||||
thumbnail_url = element.select("img").firstOrNull()?.let { imageFromElement(it) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector() = "div.main a"
|
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
|
||||||
return SChapter.create().apply {
|
|
||||||
setUrlWithoutDomain(element.attr("href"))
|
|
||||||
name = element.select("h6:first-of-type").text()
|
|
||||||
date_upload = parseChapterDate(element.select("h6:last-of-type").firstOrNull()?.ownText())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mangalek : Madara("مانجا ليك", "https://mangalek.com", "ar", SimpleDateFormat("MMMM dd, yyyy", Locale("ar")))
|
class Mangalek : Madara("مانجا ليك", "https://mangalek.com", "ar", SimpleDateFormat("MMMM dd, yyyy", Locale("ar")))
|
||||||
|
|
||||||
class AstralLibrary : Madara("Astral Library", "https://www.astrallibrary.net", "en", SimpleDateFormat("d MMM", Locale.US)) {
|
class AstralLibrary : Madara("Astral Library", "https://www.astrallibrary.net", "en", SimpleDateFormat("d MMM", Locale.US)) {
|
||||||
|
@ -920,8 +525,6 @@ class Manhuasnet : Madara("Manhuas.net", "https://manhuas.net", "en")
|
||||||
|
|
||||||
class MangaTX : Madara("MangaTX", "https://mangatx.com", "en")
|
class MangaTX : Madara("MangaTX", "https://mangatx.com", "en")
|
||||||
|
|
||||||
class ATMSubs : Madara("ATM-Subs", "https://atm-subs.fr", "fr", SimpleDateFormat("d MMMM yyyy", Locale("fr")))
|
|
||||||
|
|
||||||
class OnManga : Madara("OnManga", "https://onmanga.com", "en")
|
class OnManga : Madara("OnManga", "https://onmanga.com", "en")
|
||||||
|
|
||||||
class MangaAction : Madara("Manga Action", "https://manga-action.com", "ar", SimpleDateFormat("yyyy-MM-dd", Locale("ar")))
|
class MangaAction : Madara("Manga Action", "https://manga-action.com", "ar", SimpleDateFormat("yyyy-MM-dd", Locale("ar")))
|
||||||
|
@ -939,22 +542,6 @@ class ThreeSixtyFiveManga : Madara("365Manga", "https://365manga.com", "en") {
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
class DisasterScans : Madara("Disaster Scans", "https://disasterscans.com", "en") {
|
|
||||||
override val popularMangaUrlSelector = "div.post-title a:last-child"
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
|
||||||
val manga = super.mangaDetailsParse(document)
|
|
||||||
|
|
||||||
with(document) {
|
|
||||||
select("div.post-title h1").first()?.let {
|
|
||||||
manga.title = it.ownText()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MangaDods : Madara("MangaDods", "https://www.mangadods.com", "en", SimpleDateFormat("yyyy-MM-dd", Locale.US))
|
class MangaDods : Madara("MangaDods", "https://www.mangadods.com", "en", SimpleDateFormat("yyyy-MM-dd", Locale.US))
|
||||||
|
|
||||||
class NeoxScanlator : Madara(
|
class NeoxScanlator : Madara(
|
||||||
|
@ -1015,8 +602,6 @@ class ManhuaUS : Madara("ManhuaUS", "https://manhuaus.com", "en") {
|
||||||
|
|
||||||
class MangaWT : Madara("MangaWT", "https://mangawt.com", "tr")
|
class MangaWT : Madara("MangaWT", "https://mangawt.com", "tr")
|
||||||
|
|
||||||
class DecadenceScans : Madara("Decadence Scans", "https://reader.decadencescans.com", "en")
|
|
||||||
|
|
||||||
class MangaRockTeam : Madara("Manga Rock Team", "https://mangarockteam.com", "en")
|
class MangaRockTeam : Madara("Manga Rock Team", "https://mangarockteam.com", "en")
|
||||||
|
|
||||||
class MixedManga : Madara("Mixed Manga", "https://mixedmanga.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
class MixedManga : Madara("Mixed Manga", "https://mixedmanga.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
||||||
|
@ -1025,75 +610,8 @@ class MixedManga : Madara("Mixed Manga", "https://mixedmanga.com", "en", SimpleD
|
||||||
|
|
||||||
class ManhuasWorld : Madara("Manhuas World", "https://manhuasworld.com", "en")
|
class ManhuasWorld : Madara("Manhuas World", "https://manhuasworld.com", "en")
|
||||||
|
|
||||||
class ArazNovel : Madara("ArazNovel", "https://www.araznovel.com", "tr", SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())) {
|
|
||||||
override fun formBuilder(page: Int, popular: Boolean): FormBody.Builder = super.formBuilder(page, popular)
|
|
||||||
.add("vars[meta_query][0][0][value]", "manga")
|
|
||||||
|
|
||||||
override fun getGenreList() = listOf(
|
|
||||||
Genre("Aksiyon", "action"),
|
|
||||||
Genre("Macera", "adventure"),
|
|
||||||
Genre("Cartoon", "cartoon"),
|
|
||||||
Genre("Comic", "comic"),
|
|
||||||
Genre("Komedi", "comedy"),
|
|
||||||
Genre("Yemek", "cooking"),
|
|
||||||
Genre("Doujinshi", "doujinshi"),
|
|
||||||
Genre("Dram", "drama"),
|
|
||||||
Genre("Ecchi", "ecchi"),
|
|
||||||
Genre("Fantastik", "fantasy"),
|
|
||||||
Genre("Harem", "harem"),
|
|
||||||
Genre("Tarihi", "historical"),
|
|
||||||
Genre("Korku", "horror"),
|
|
||||||
Genre("Manga", "manga"),
|
|
||||||
Genre("Manhua", "manhua"),
|
|
||||||
Genre("Manhwa", "manhwa"),
|
|
||||||
Genre("Olgun", "mature"),
|
|
||||||
Genre("Mecha", "mecha"),
|
|
||||||
Genre("Yetişkin", "adult"),
|
|
||||||
Genre("Gizem", "mystery"),
|
|
||||||
Genre("One Shot", "one-shot"),
|
|
||||||
Genre("Isekai", "isekai"),
|
|
||||||
Genre("Josei", "josei"),
|
|
||||||
Genre("Dedektif", "detective"),
|
|
||||||
Genre("Karanlık", "smut"),
|
|
||||||
Genre("Romantizm", "romance"),
|
|
||||||
Genre("Okul Yaşamı", "school-life"),
|
|
||||||
Genre("Yaşamdan Kesit", "slice-of-life"),
|
|
||||||
Genre("Spor", "sports"),
|
|
||||||
Genre("Doğa Üstü", "supernatural"),
|
|
||||||
Genre("Trajedi", "tragedy"),
|
|
||||||
Genre("Webtoon ", "webtoon"),
|
|
||||||
Genre("Dövüş Sanatları ", "martial-arts"),
|
|
||||||
Genre("Bilim Kurgu", "sci-fi"),
|
|
||||||
Genre("Seinen", "seinen"),
|
|
||||||
Genre("Shoujo", "shoujo"),
|
|
||||||
Genre("Shoujo Ai", "shoujo-ai"),
|
|
||||||
Genre("Shounen", "shounen"),
|
|
||||||
Genre("Shounen Ai", "shounen-ai"),
|
|
||||||
Genre("Soft Yaoi", "soft-yaoi"),
|
|
||||||
Genre("Soft Yuri", "soft-yuri"),
|
|
||||||
Genre("Yaoi", "yaoi"),
|
|
||||||
Genre("Yuri", "yuri")
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
|
||||||
return getXhrChapters(response.asJsoup().select("div#manga-chapters-holder").attr("data-id")).let { document ->
|
|
||||||
document.select("li.parent").let { elements ->
|
|
||||||
if (!elements.isNullOrEmpty()) {
|
|
||||||
elements.reversed()
|
|
||||||
.map { volumeElement -> volumeElement.select(chapterListSelector()).map { chapterFromElement(it) } }
|
|
||||||
.flatten()
|
|
||||||
} else {
|
|
||||||
document.select(chapterListSelector()).map { chapterFromElement(it) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ManhwaRaw : Madara("Manhwa Raw", "https://manhwaraw.com", "ko")
|
class ManhwaRaw : Madara("Manhwa Raw", "https://manhwaraw.com", "ko")
|
||||||
|
|
||||||
class GuncelManga : Madara("GuncelManga", "https://guncelmanga.com", "tr")
|
|
||||||
|
|
||||||
class WeScans : Madara("WeScans", "https://wescans.xyz", "en") {
|
class WeScans : Madara("WeScans", "https://wescans.xyz", "en") {
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manhua/manga/?m_orderby=views", headers)
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manhua/manga/?m_orderby=views", headers)
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
override fun popularMangaNextPageSelector(): String? = null
|
||||||
|
@ -1103,15 +621,6 @@ class WeScans : Madara("WeScans", "https://wescans.xyz", "en") {
|
||||||
override fun getFilterList(): FilterList = FilterList()
|
override fun getFilterList(): FilterList = FilterList()
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArangScans : Madara("Arang Scans", "https://arangscans.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
|
||||||
override val userAgentRandomizer = ""
|
|
||||||
// has very few manga
|
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga?m_orderby=views", headers)
|
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga?m_orderby=latest", headers)
|
|
||||||
override fun latestUpdatesNextPageSelector(): String? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nsfw
|
@Nsfw
|
||||||
class MangaHentai : Madara("Manga Hentai", "https://mangahentai.me", "en")
|
class MangaHentai : Madara("Manga Hentai", "https://mangahentai.me", "en")
|
||||||
|
|
||||||
|
@ -1120,12 +629,6 @@ class MangaPhoenix : Madara("Manga Diyari", "https://mangadiyari.com", "tr") {
|
||||||
override val id = 4308007020001642101
|
override val id = 4308007020001642101
|
||||||
}
|
}
|
||||||
|
|
||||||
class FirstKissManhua : Madara("1st Kiss Manhua", "https://1stkissmanhua.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
|
||||||
override fun imageRequest(page: Page): Request = GET(page.imageUrl!!, headersBuilder().add("Referer", "https://1stkissmanga.com").build())
|
|
||||||
}
|
|
||||||
|
|
||||||
class HeroManhua : Madara("Hero Manhua", "https://heromanhua.com", "en")
|
|
||||||
|
|
||||||
class MartialScans : Madara("Martial Scans", "https://martialscans.com", "en") {
|
class MartialScans : Madara("Martial Scans", "https://martialscans.com", "en") {
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
|
@ -1166,101 +669,6 @@ class TurkceManga : Madara("Türkçe Manga", "https://turkcemanga.com", "tr") {
|
||||||
override fun latestUpdatesFromElement(element: Element): SManga = searchMangaFromElement(element)
|
override fun latestUpdatesFromElement(element: Element): SManga = searchMangaFromElement(element)
|
||||||
}
|
}
|
||||||
|
|
||||||
class EinherjarScan : Madara("Einherjar Scan", "https://einherjarscans.space", "en")
|
|
||||||
|
|
||||||
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")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class Manga347 : Madara("Manga347", "https://manga347.com", "en", SimpleDateFormat("d MMM, yyyy", Locale.US)) {
|
class Manga347 : Madara("Manga347", "https://manga347.com", "en", SimpleDateFormat("d MMM, yyyy", Locale.US)) {
|
||||||
override val pageListParseSelector = "li.blocks-gallery-item"
|
override val pageListParseSelector = "li.blocks-gallery-item"
|
||||||
}
|
}
|
||||||
|
@ -1271,11 +679,6 @@ class QueensManga : Madara("QueensManga ملكات المانجا", "https://que
|
||||||
override fun chapterListSelector(): String = "div.listing-chapters_wrap a"
|
override fun chapterListSelector(): String = "div.listing-chapters_wrap a"
|
||||||
}
|
}
|
||||||
|
|
||||||
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 latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=latest", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
class TheTopComic : Madara("TheTopComic", "https://thetopcomic.com", "en")
|
class TheTopComic : Madara("TheTopComic", "https://thetopcomic.com", "en")
|
||||||
|
|
||||||
class WebNovel : Madara("WebNovel", "https://webnovel.live", "en")
|
class WebNovel : Madara("WebNovel", "https://webnovel.live", "en")
|
||||||
|
@ -1310,14 +713,8 @@ class TruyenTranhAudioOnline : Madara("TruyenTranhAudio.online", "https://truyen
|
||||||
|
|
||||||
class MangaTurf : Madara("Manga Turf", "https://mangaturf.com", "en")
|
class MangaTurf : Madara("Manga Turf", "https://mangaturf.com", "en")
|
||||||
|
|
||||||
class FurioScans : Madara("Furio Scans", "https://furioscans.com", "pt-BR", SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()))
|
|
||||||
|
|
||||||
class Mangareceh : Madara("Mangareceh", "https://mangareceh.id", "id")
|
class Mangareceh : Madara("Mangareceh", "https://mangareceh.id", "id")
|
||||||
|
|
||||||
class ComicKiba : Madara("ComicKiba", "https://comickiba.com", "en") {
|
|
||||||
override val pageListParseSelector = "li.blocks-gallery-item img:nth-child(1), div.reading-content p > img, .read-container .reading-content img"
|
|
||||||
}
|
|
||||||
|
|
||||||
class ToonPoint : Madara("ToonPoint", "https://toonpoint.com", "en") {
|
class ToonPoint : Madara("ToonPoint", "https://toonpoint.com", "en") {
|
||||||
override val userAgentRandomizer = ""
|
override val userAgentRandomizer = ""
|
||||||
}
|
}
|
||||||
|
@ -1328,19 +725,12 @@ class ManhuaPlus : Madara("Manhua Plus", "https://manhuaplus.com", "en") {
|
||||||
override val pageListParseSelector = "li.blocks-gallery-item"
|
override val pageListParseSelector = "li.blocks-gallery-item"
|
||||||
}
|
}
|
||||||
|
|
||||||
class AkuManga : Madara("AkuManga", "https://akumanga.com", "ar")
|
|
||||||
|
|
||||||
class AsgardTeam : Madara("Asgard Team", "https://www.asgard1team.com", "ar")
|
|
||||||
|
|
||||||
@Nsfw
|
@Nsfw
|
||||||
class ToonilyNet : Madara("Toonily.net", "https://toonily.net", "en")
|
class ToonilyNet : Madara("Toonily.net", "https://toonily.net", "en")
|
||||||
|
|
||||||
class BestManga : Madara("BestManga", "https://bestmanga.club", "ru", SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()))
|
|
||||||
|
|
||||||
class TwilightScans : Madara("Twilight Scans", "https://twilightscans.com", "en")
|
class TwilightScans : Madara("Twilight Scans", "https://twilightscans.com", "en")
|
||||||
|
|
||||||
class DetectiveConanAr : Madara("شبكة كونان العربية", "https://www.manga.detectiveconanar.com", "ar")
|
|
||||||
|
|
||||||
// mostly novels
|
// mostly novels
|
||||||
class WoopRead : Madara("WoopRead", "https://woopread.com", "en")
|
class WoopRead : Madara("WoopRead", "https://woopread.com", "en")
|
||||||
|
|
||||||
|
@ -1350,21 +740,6 @@ class ManhwaTop : Madara("Manhwatop", "https://manhwatop.com", "en")
|
||||||
|
|
||||||
class ImmortalUpdates : Madara("Immortal Updates", "https://immortalupdates.com", "en")
|
class ImmortalUpdates : Madara("Immortal Updates", "https://immortalupdates.com", "en")
|
||||||
|
|
||||||
class Bakaman : Madara("Bakaman", "https://bakaman.net", "th")
|
|
||||||
|
|
||||||
class CatTranslator : Madara("CAT-translator", "https://cat-translator.com", "th") {
|
|
||||||
override fun popularMangaRequest(page: Int): Request =
|
|
||||||
POST("$baseUrl/manga/wp-admin/admin-ajax.php", formHeaders, formBuilder(page, true).build(), CacheControl.FORCE_NETWORK)
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request =
|
|
||||||
POST("$baseUrl/manga/wp-admin/admin-ajax.php", formHeaders, formBuilder(page, false).build(), CacheControl.FORCE_NETWORK)
|
|
||||||
|
|
||||||
override fun searchPage(page: Int): String = "manga/page/$page/"
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nsfw
|
|
||||||
class ComicsValley : Madara("Comics Valley", "https://comicsvalley.com", "hi")
|
|
||||||
|
|
||||||
class Wakascan : Madara("Wakascan", "https://wakascan.com", "fr")
|
class Wakascan : Madara("Wakascan", "https://wakascan.com", "fr")
|
||||||
|
|
||||||
class ShoujoHearts : Madara("ShoujoHearts", "http://shoujohearts.com", "en") {
|
class ShoujoHearts : Madara("ShoujoHearts", "http://shoujohearts.com", "en") {
|
||||||
|
@ -1377,18 +752,10 @@ class ShoujoHearts : Madara("ShoujoHearts", "http://shoujohearts.com", "en") {
|
||||||
override fun searchPage(page: Int): String = "reader/page/$page/"
|
override fun searchPage(page: Int): String = "reader/page/$page/"
|
||||||
}
|
}
|
||||||
|
|
||||||
class AlianzaMarcial : Madara("AlianzaMarcial", "https://alianzamarcial.xyz", "es")
|
|
||||||
|
|
||||||
class OlaoeManga : Madara("مانجا اولاو", "https://olaoe.giize.com", "ar")
|
class OlaoeManga : Madara("مانجا اولاو", "https://olaoe.giize.com", "ar")
|
||||||
|
|
||||||
class FdmScan : Madara("FDM Scan", "https://fdmscan.com", "pt-BR", SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR")))
|
|
||||||
|
|
||||||
class ArgosScan : Madara("Argos Scan", "https://argosscan.com", "pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR")))
|
|
||||||
|
|
||||||
class OrigamiOrpheans : Madara("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR")
|
class OrigamiOrpheans : Madara("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR")
|
||||||
|
|
||||||
class DarkyuRealm : Madara("Darkyu Realm", "https://darkyuerealm.site", "pt-BR")
|
|
||||||
|
|
||||||
class MangaKiss : Madara("Manga Kiss", "https://mangakiss.org", "en")
|
class MangaKiss : Madara("Manga Kiss", "https://mangakiss.org", "en")
|
||||||
|
|
||||||
class MangaRocky : Madara("Manga Rocky", "https://mangarocky.com", "en")
|
class MangaRocky : Madara("Manga Rocky", "https://mangarocky.com", "en")
|
||||||
|
@ -1403,8 +770,6 @@ class Kombatch : Madara("Kombatch", "https://kombatch.com", "id", SimpleDateForm
|
||||||
|
|
||||||
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")))
|
||||||
|
|
||||||
class HikariScan : Madara("Hikari Scan", "https://hikariscan.com.br", "pt-BR", SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR")))
|
|
||||||
|
|
||||||
class NazarickScans : Madara("Nazarick Scans", "https://nazarickscans.com", "en") {
|
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 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 latestUpdatesRequest(page: Int) = GET("$baseUrl/manga/page/$page/?m_orderby=trending", headers)
|
||||||
|
@ -1455,12 +820,6 @@ class MysticalMerries : Madara("Mystical Merries", "https://mysticalmerries.com"
|
||||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/genre/manhwa/page/$page/?m_orderby=latest", headers)
|
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/genre/manhwa/page/$page/?m_orderby=latest", headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
class AniMangaEs : Madara("AniMangaEs", "http://animangaes.com", "en") {
|
|
||||||
override val pageListParseSelector = "div.text-left noscript"
|
|
||||||
override val chapterUrlSuffix = ""
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> = super.chapterListParse(response).reversed()
|
|
||||||
}
|
|
||||||
|
|
||||||
class MangaNine : Madara("Manga Nine", "https://manganine.com", "en")
|
class MangaNine : Madara("Manga Nine", "https://manganine.com", "en")
|
||||||
|
|
||||||
class MarkScans : Madara("Mark Scans", "https://markscans.online", "pt-BR")
|
class MarkScans : Madara("Mark Scans", "https://markscans.online", "pt-BR")
|
||||||
|
@ -1505,10 +864,6 @@ class Voidscans : Madara("Void Scans", "https://voidscans.com", "en") {
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/?s=$query&post_type=wp-manga")
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/?s=$query&post_type=wp-manga")
|
||||||
}
|
}
|
||||||
|
|
||||||
class GeceninLordu : Madara("Gecenin Lordu", "https://geceninlordu.com/", "tr", SimpleDateFormat("dd MMM yyyy", Locale("tr"))) {
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/?s=$query&post_type=wp-manga")
|
|
||||||
}
|
|
||||||
|
|
||||||
class GrazeScans : Madara("Graze Scans", "https://grazescans.com/", "en")
|
class GrazeScans : Madara("Graze Scans", "https://grazescans.com/", "en")
|
||||||
|
|
||||||
class UyuyanBalik : Madara("Uyuyan Balik", "https://uyuyanbalik.com/", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.US))
|
class UyuyanBalik : Madara("Uyuyan Balik", "https://uyuyanbalik.com/", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.US))
|
||||||
|
@ -1527,16 +882,12 @@ class MundoWuxia : Madara("Mundo Wuxia", "https://mundowuxia.com", "es", SimpleD
|
||||||
|
|
||||||
class WorldRomanceTranslation : Madara("World Romance Translation", "https://wrt.my.id/", "id", SimpleDateFormat("dd MMMM yyyy", Locale("id")))
|
class WorldRomanceTranslation : Madara("World Romance Translation", "https://wrt.my.id/", "id", SimpleDateFormat("dd MMMM yyyy", Locale("id")))
|
||||||
|
|
||||||
class CloverManga : Madara("Clover Manga", "https://clover-manga.com/", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale("tr")))
|
|
||||||
|
|
||||||
class VanguardBun : Madara("Vanguard Bun", "https://vanguardbun.com/", "en")
|
class VanguardBun : Madara("Vanguard Bun", "https://vanguardbun.com/", "en")
|
||||||
|
|
||||||
class MangaBin : Madara("Manga Bin", "https://mangabin.com/", "en")
|
class MangaBin : Madara("Manga Bin", "https://mangabin.com/", "en")
|
||||||
|
|
||||||
class MangaChill : Madara("Manga Chill", "https://mangachill.com/", "en")
|
class MangaChill : Madara("Manga Chill", "https://mangachill.com/", "en")
|
||||||
|
|
||||||
class DreamManga : Madara("Dream Manga", "https://dreammanga.com/", "en")
|
|
||||||
|
|
||||||
class GourmetScans : Madara("Gourmet Scans", "https://gourmetscans.net/", "en")
|
class GourmetScans : Madara("Gourmet Scans", "https://gourmetscans.net/", "en")
|
||||||
|
|
||||||
class ItsYourRightManhua : Madara("Its Your Right Manhua", "https://itsyourightmanhua.com/", "en")
|
class ItsYourRightManhua : Madara("Its Your Right Manhua", "https://itsyourightmanhua.com/", "en")
|
||||||
|
|
Loading…
Reference in New Issue