Remove Sources that are down (#7361)
* Removed Sorces * Delete multisrc/overrides/madara/atmsubs/src directory * Delete multisrc/overrides/madara/doujinyosh/src directory * Delete multisrc/overrides/madara/justforfun/src directory * Delete multisrc/overrides/madara/mangaarabonline/src directory * Delete multisrc/overrides/madara/mangazukiclub/src directory * Delete multisrc/overrides/madara/mangazukionline/src directory * Delete multisrc/overrides/madara/nazarickscans/src directory * Delete multisrc/overrides/madara/spookyscanlations/src directory * Delete multisrc/overrides/madara/toonpoint/src directory * Delete multisrc/overrides/madara/tsubakinoscan/src directory * Delete multisrc/overrides/madara/wescans/src directory * Remove sources wpmangastream * remove double , * Delete multisrc/overrides/wpmangastream/mangashiro/src directory * Delete multisrc/overrides/wpmangastream/komikindowpms directory * Delete multisrc/overrides/wpmangastream/komikru/src directory * Delete multisrc/overrides/wpmangastream/komikgo/src directory * Delete multisrc/overrides/wpmangastream/matakomik/src directory * Update FoolSlideGenerator.kt * Delete multisrc/overrides/foolslide/ajianoscantrad/src directory * Delete multisrc/overrides/foolslide/storminheaven/src directory * Delete multisrc/overrides/foolslide/fallenworldorder/src directory * Remove azbivo.webd.pro * Remove comiclatest.com * Delete multisrc/overrides/wpcomics/comiclatest directory * Removed more sources * Delete multisrc/overrides/wpmangastream/chiotaku/src directory * Delete multisrc/overrides/wpmangastream/mangap/src directory * Remove Mangaindo * Remove neumanga * Remove Bacamanga.cc * Remove MundoHentai * Remove andromedascans * Remove Manga-Zen.com
|
@ -1,5 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.fr.ajianoscantrad
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
|
|
||||||
|
|
||||||
class AjiaNoScantrad : FoolSlide("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", "/reader")
|
|
|
@ -1,5 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.it.fallenworldorder
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
|
|
||||||
|
|
||||||
class FallenWorldOrder : FoolSlide("Fall World Reader", "https://faworeader.altervista.org", "it", "/slide")
|
|
|
@ -1,5 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.it.storminheaven
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide
|
|
||||||
|
|
||||||
class StormInHeaven : FoolSlide("Storm in Heaven", "https://www.storm-in-heaven.net", "it", "/reader-sih")
|
|
|
@ -1,7 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.fr.atmsubs
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class ATMSubs : Madara("ATM-Subs", "https://atm-subs.fr", "fr", SimpleDateFormat("d MMMM yyyy", Locale("fr")))
|
|
|
@ -1,96 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.doujinyosh
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
|
|
||||||
class DoujinYosh : Madara("DoujinYosh", "https://doujinyosh.work", "id") {
|
|
||||||
// source issue, doing this limits results to one page but not doing it returns no results at all
|
|
||||||
override fun searchPage(page: Int) = ""
|
|
||||||
override fun getGenreList() = listOf(
|
|
||||||
Genre("4 Koma", "4koma"),
|
|
||||||
Genre("Adult", "adult"),
|
|
||||||
Genre("Ahegao", "ahegao"),
|
|
||||||
Genre("Anal", "anal"),
|
|
||||||
Genre("Animal", "animal"),
|
|
||||||
Genre("Artist CG", "artist-cg"),
|
|
||||||
Genre("Big Breast", "big-breast"),
|
|
||||||
Genre("Big Penis", "big-penis"),
|
|
||||||
Genre("Bikini", "bikini"),
|
|
||||||
Genre("Black Mail", "black-mail"),
|
|
||||||
Genre("Blowjob", "blowjob"),
|
|
||||||
Genre("Body Swap", "body-swap"),
|
|
||||||
Genre("Bondage", "bondage"),
|
|
||||||
Genre("Cheating", "cheating"),
|
|
||||||
Genre("Crossdressing", "crossdressing"),
|
|
||||||
Genre("DILF", "dilf"),
|
|
||||||
Genre("Dark Skin", "dark-skin"),
|
|
||||||
Genre("Defloration", "defloration"),
|
|
||||||
Genre("Demon Girl", "demon-girl"),
|
|
||||||
Genre("Doujin", "doujin"),
|
|
||||||
Genre("Drugs", "drugs"),
|
|
||||||
Genre("Drunk", "drunk"),
|
|
||||||
Genre("Elf", "elf"),
|
|
||||||
Genre("Famele Only", "famele-only"),
|
|
||||||
Genre("Femdom", "femdom"),
|
|
||||||
Genre("Filming", "filming"),
|
|
||||||
Genre("Footjob", "footjob"),
|
|
||||||
Genre("Full Color", "full-color"),
|
|
||||||
Genre("Furry", "furry"),
|
|
||||||
Genre("Futanari", "futanari"),
|
|
||||||
Genre("Glasses", "glasses"),
|
|
||||||
Genre("Gore", "gore"),
|
|
||||||
Genre("Group", "group"),
|
|
||||||
Genre("Gyaru", "gyaru"),
|
|
||||||
Genre("Harem", "harem"),
|
|
||||||
Genre("Humiliation", "humiliation"),
|
|
||||||
Genre("Impregnation", "impregnation"),
|
|
||||||
Genre("Incest", "incest"),
|
|
||||||
Genre("Inverted Nipples", "inverted-nipples"),
|
|
||||||
Genre("Kemomimi", "kemomimi"),
|
|
||||||
Genre("Lactation", "lactation"),
|
|
||||||
Genre("Loli", "loli"),
|
|
||||||
Genre("Lolipai", "lolipai"),
|
|
||||||
Genre("MILF", "milf"),
|
|
||||||
Genre("Maid", "maid"),
|
|
||||||
Genre("Male Only", "male-only"),
|
|
||||||
Genre("Miko", "miko"),
|
|
||||||
Genre("Mind Break", "mind-break"),
|
|
||||||
Genre("Mind Control", "mind-control"),
|
|
||||||
Genre("Monster", "monster"),
|
|
||||||
Genre("Monster Girl", "monster-girl"),
|
|
||||||
Genre("Multi-Work Series", "multi-work-series"),
|
|
||||||
Genre("Nakadashi", "nakadashi"),
|
|
||||||
Genre("Netorare", "netorare"),
|
|
||||||
Genre("Otona (R18)", "otona"),
|
|
||||||
Genre("Oyakodon", "oyakodon"),
|
|
||||||
Genre("Paizuri", "paizuri"),
|
|
||||||
Genre("Pantyhose", "pantyhose"),
|
|
||||||
Genre("Pregnant", "pregnant"),
|
|
||||||
Genre("Prostitution", "prostitution"),
|
|
||||||
Genre("Rape", "rape"),
|
|
||||||
Genre("School Uniform", "school-uniform"),
|
|
||||||
Genre("Sex Toy", "sex-toy"),
|
|
||||||
Genre("Shota", "shota"),
|
|
||||||
Genre("Sister", "sister"),
|
|
||||||
Genre("Sleep", "sleep"),
|
|
||||||
Genre("Slime", "slime"),
|
|
||||||
Genre("Small Breast", "small-breast"),
|
|
||||||
Genre("Sole Female", "sole-female"),
|
|
||||||
Genre("Sole Male", "sole-male"),
|
|
||||||
Genre("Stocking", "stocking"),
|
|
||||||
Genre("Story Arc", "story-arc"),
|
|
||||||
Genre("Sweating", "sweating"),
|
|
||||||
Genre("Swimsuit", "swimsuit"),
|
|
||||||
Genre("Teacher", "teacher"),
|
|
||||||
Genre("Tentacles", "tentacles"),
|
|
||||||
Genre("Tomboy", "tomboy"),
|
|
||||||
Genre("Tomgirl", "tomgirl"),
|
|
||||||
Genre("Torture", "torture"),
|
|
||||||
Genre("Twins", "twins"),
|
|
||||||
Genre("Virginity", "virginity"),
|
|
||||||
Genre("Webtoon", "webtoon"),
|
|
||||||
Genre("XRay", "xray"),
|
|
||||||
Genre("Yandere", "yandere"),
|
|
||||||
Genre("Yaoi", "yaoi"),
|
|
||||||
Genre("Yuri", "yuri")
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.ru.justforfun
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class JustForFun : Madara(
|
|
||||||
"Just For Fun",
|
|
||||||
"https://just-for-fun.ru",
|
|
||||||
"ru",
|
|
||||||
dateFormat = SimpleDateFormat("yy.MM.dd", Locale.US)
|
|
||||||
)
|
|
|
@ -1,7 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.ar.mangaarabonline
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class MangaArabOnline : Madara("Manga Arab Online مانجا عرب اون لاين", "https://mangaarabonline.com", "ar", SimpleDateFormat("MMM d, yyyy", Locale.forLanguageTag("ar")))
|
|
|
@ -1,14 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.mangazukiclub
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import eu.kanade.tachiyomi.source.Source
|
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
|
||||||
|
|
||||||
class MangazukiClubFactory : SourceFactory {
|
|
||||||
override fun createSources(): List<Source> = listOf(
|
|
||||||
MangazukiClubJP(),
|
|
||||||
MangazukiClubKO(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club", "ja")
|
|
||||||
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club", "ko")
|
|
|
@ -1,8 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.en.mangazukionline
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class MangazukiOnline : Madara("Mangazuki.online", "http://mangazukinew.online", "en") {
|
|
||||||
override val client: OkHttpClient = super.client.newBuilder().followRedirects(true).build()
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.en.nazarickscans
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
|
|
||||||
class NazarickScans : Madara("Nazarick Scans", "https://nazarickscans.com", "en") {
|
|
||||||
override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga/page/$page/?m_orderby=trending", headers)
|
|
||||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/manga/page/$page/?m_orderby=trending", headers)
|
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
|
||||||
override fun latestUpdatesNextPageSelector(): String? = null
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.es.spookyscanlations
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class SpookyScanlations : Madara("Spooky Scanlations", "https://spookyscanlations.xyz", "es", SimpleDateFormat("MMMM dd, yyyy", Locale("es")))
|
|
|
@ -1,7 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.en.toonpoint
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
|
|
||||||
class ToonPoint : Madara("ToonPoint", "https://toonpoint.com", "en") {
|
|
||||||
override val userAgentRandomizer = ""
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.fr.tsubakinoscan
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class TsubakiNoScan : Madara(
|
|
||||||
"Tsubaki No Scan",
|
|
||||||
"https://tsubakinoscan.com",
|
|
||||||
"fr",
|
|
||||||
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)
|
|
||||||
)
|
|
|
@ -1,15 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.en.wescans
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import okhttp3.Request
|
|
||||||
|
|
||||||
class WeScans : Madara("WeScans", "https://wescans.xyz", "en") {
|
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manhua/manga/?m_orderby=views", headers)
|
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manhua/manga/?m_orderby=latest", headers)
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/manhua/?s=$query&post_type=wp-manga")
|
|
||||||
override fun searchMangaNextPageSelector(): String? = null
|
|
||||||
override fun getFilterList(): FilterList = FilterList()
|
|
||||||
}
|
|
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 110 KiB |
|
@ -1,75 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.en.comiclatest
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpcomics.WPComics
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Request
|
|
||||||
import okhttp3.Response
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class ComicLatest : WPComics("ComicLatest", "https://comiclatest.com", "en", SimpleDateFormat("MM/dd/yyyy", Locale.US), null) {
|
|
||||||
// Hot only has one page
|
|
||||||
override val popularPath = "popular-comics"
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
|
|
||||||
element.select("h3 a").let {
|
|
||||||
title = it.text()
|
|
||||||
setUrlWithoutDomain(it.attr("href"))
|
|
||||||
}
|
|
||||||
thumbnail_url = element.select("img").attr("data-original")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
filters.forEach { filter ->
|
|
||||||
when (filter) {
|
|
||||||
is AuthorFilter -> {
|
|
||||||
val author = filter.state.trim().replace(" ", "-").toLowerCase()
|
|
||||||
return GET("$baseUrl/author/$author?page=$page", headers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GET("$baseUrl/search?keyword=$query&page=$page", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = "div.item div.box_img > a[title]"
|
|
||||||
|
|
||||||
// For whatever reason, errors with author search if this isn't overridden
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga {
|
|
||||||
return SManga.create().apply {
|
|
||||||
title = element.attr("title")
|
|
||||||
setUrlWithoutDomain(element.attr("href"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
|
||||||
val chapters = mutableListOf<SChapter>()
|
|
||||||
|
|
||||||
fun parseChapters(document: Document) {
|
|
||||||
document.select(chapterListSelector()).map { chapters.add(chapterFromElement(it)) }
|
|
||||||
document.select("ul.pagination a[rel=next]").firstOrNull()?.let { a ->
|
|
||||||
parseChapters(client.newCall(GET(a.attr("abs:href"), headers)).execute().asJsoup())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
parseChapters(response.asJsoup())
|
|
||||||
return chapters
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListRequest(chapter: SChapter) = GET("$baseUrl${chapter.url}/all", headers)
|
|
||||||
|
|
||||||
private class AuthorFilter : Filter.Text("Author")
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList(
|
|
||||||
Filter.Header("NOTE: Cannot be used with search"),
|
|
||||||
Filter.Separator(),
|
|
||||||
AuthorFilter()
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.chiotaku
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
class ChiOtaku : WPMangaStream("ChiOtaku", "https://chiotaku.com", "id") {
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
}
|
|
|
@ -1,238 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.komikgo
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import okhttp3.Request
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class KomikGO : WPMangaStream("Komik GO", "https://komikgo.com", "id") {
|
|
||||||
// Formerly "Komik GO (WP Manga Stream)"
|
|
||||||
override val id = 1070674823324721554
|
|
||||||
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/page/$page?s&post_type=wp-manga&m_orderby=views", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/page/$page?s&post_type=wp-manga&m_orderby=latest", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div.c-tabs-item__content"
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
|
||||||
val manga = SManga.create()
|
|
||||||
manga.thumbnail_url = element.select("div.tab-thumb > a > img").attr("data-src")
|
|
||||||
element.select("div.tab-thumb > a").first().let {
|
|
||||||
manga.setUrlWithoutDomain(it.attr("href"))
|
|
||||||
manga.title = it.attr("title")
|
|
||||||
}
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
|
|
||||||
url.addQueryParameter("post_type", "wp-manga")
|
|
||||||
val pattern = "\\s+".toRegex()
|
|
||||||
val q = query.replace(pattern, "+")
|
|
||||||
if (query.isNotEmpty()) {
|
|
||||||
url.addQueryParameter("s", q)
|
|
||||||
} else {
|
|
||||||
url.addQueryParameter("s", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
var orderBy: String
|
|
||||||
|
|
||||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
|
||||||
when (filter) {
|
|
||||||
// is Status -> url.addQueryParameter("manga_status", arrayOf("", "completed", "ongoing")[filter.state])
|
|
||||||
is GenreListFilter -> {
|
|
||||||
val genreInclude = mutableListOf<String>()
|
|
||||||
filter.state.forEach {
|
|
||||||
if (it.state == 1) {
|
|
||||||
genreInclude.add(it.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (genreInclude.isNotEmpty()) {
|
|
||||||
genreInclude.forEach { genre ->
|
|
||||||
url.addQueryParameter("genre[]", genre)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is StatusList -> {
|
|
||||||
val statuses = mutableListOf<String>()
|
|
||||||
filter.state.forEach {
|
|
||||||
if (it.state == 1) {
|
|
||||||
statuses.add(it.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (statuses.isNotEmpty()) {
|
|
||||||
statuses.forEach { status ->
|
|
||||||
url.addQueryParameter("status[]", status)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
is SortBy -> {
|
|
||||||
orderBy = filter.toUriPart()
|
|
||||||
url.addQueryParameter("m_orderby", orderBy)
|
|
||||||
}
|
|
||||||
is TextField -> url.addQueryParameter(filter.key, filter.state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GET(url.toString(), headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = "#navigation-ajax"
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
|
||||||
val infoElement = document.select("div.site-content").first()
|
|
||||||
|
|
||||||
val manga = SManga.create()
|
|
||||||
manga.author = infoElement.select("div.author-content")?.text()
|
|
||||||
manga.artist = infoElement.select("div.artist-content")?.text()
|
|
||||||
|
|
||||||
val genres = mutableListOf<String>()
|
|
||||||
infoElement.select("div.genres-content a").forEach { element ->
|
|
||||||
val genre = element.text()
|
|
||||||
genres.add(genre)
|
|
||||||
}
|
|
||||||
manga.genre = genres.joinToString(", ")
|
|
||||||
manga.status = parseStatus(infoElement.select("div.post-status > div:nth-child(2) div").text())
|
|
||||||
|
|
||||||
manga.description = document.select("div.description-summary")?.text()
|
|
||||||
manga.thumbnail_url = document.select("div.summary_image > a > img").attr("data-src")
|
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector() = "li.wp-manga-chapter"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
|
||||||
val urlElement = element.select("a").first()
|
|
||||||
val chapter = SChapter.create()
|
|
||||||
chapter.setUrlWithoutDomain(urlElement.attr("href"))
|
|
||||||
chapter.name = urlElement.text()
|
|
||||||
chapter.date_upload = parseChapterDate(element.select("span.chapter-release-date i").text())
|
|
||||||
return chapter
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
return document.select("div.reading-content * img").mapIndexed { i, img ->
|
|
||||||
Page(i, "", img.imgAttr())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TextField(name: String, val key: String) : Filter.Text(name)
|
|
||||||
|
|
||||||
private class SortBy : UriPartFilter(
|
|
||||||
"Sort by",
|
|
||||||
arrayOf(
|
|
||||||
Pair("Relevance", ""),
|
|
||||||
Pair("Latest", "latest"),
|
|
||||||
Pair("A-Z", "alphabet"),
|
|
||||||
Pair("Rating", "rating"),
|
|
||||||
Pair("Trending", "trending"),
|
|
||||||
Pair("Most View", "views"),
|
|
||||||
Pair("New", "new-manga")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
private class Status(name: String, val id: String = name) : Filter.TriState(name)
|
|
||||||
private class StatusList(statuses: List<Status>) : Filter.Group<Status>("Status", statuses)
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList(
|
|
||||||
TextField("Author", "author"),
|
|
||||||
TextField("Year", "release"),
|
|
||||||
SortBy(),
|
|
||||||
StatusList(getStatusList()),
|
|
||||||
GenreListFilter(getGenreList())
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun getStatusList() = listOf(
|
|
||||||
Status("Completed", "end"),
|
|
||||||
Status("Ongoing", "on-going"),
|
|
||||||
Status("Canceled", "canceled"),
|
|
||||||
Status("Onhold", "on-hold")
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun getGenreList(): List<Genre> = listOf(
|
|
||||||
Genre("Adventure", "Adventure"),
|
|
||||||
Genre("Action", "action"),
|
|
||||||
Genre("Adventure", "adventure"),
|
|
||||||
Genre("Cars", "cars"),
|
|
||||||
Genre("4-Koma", "4-koma"),
|
|
||||||
Genre("Comedy", "comedy"),
|
|
||||||
Genre("Completed", "completed"),
|
|
||||||
Genre("Cooking", "cooking"),
|
|
||||||
Genre("Dementia", "dementia"),
|
|
||||||
Genre("Demons", "demons"),
|
|
||||||
Genre("Doujinshi", "doujinshi"),
|
|
||||||
Genre("Drama", "drama"),
|
|
||||||
Genre("Ecchi", "ecchi"),
|
|
||||||
Genre("Fantasy", "fantasy"),
|
|
||||||
Genre("Game", "game"),
|
|
||||||
Genre("Gender Bender", "gender-bender"),
|
|
||||||
Genre("Harem", "harem"),
|
|
||||||
Genre("Historical", "historical"),
|
|
||||||
Genre("Horror", "horror"),
|
|
||||||
Genre("Isekai", "isekai"),
|
|
||||||
Genre("Josei", "josei"),
|
|
||||||
Genre("Kids", "kids"),
|
|
||||||
Genre("Magic", "magic"),
|
|
||||||
Genre("Manga", "manga"),
|
|
||||||
Genre("Manhua", "manhua"),
|
|
||||||
Genre("Manhwa", "manhwa"),
|
|
||||||
Genre("Martial Arts", "martial-arts"),
|
|
||||||
Genre("Mature", "mature"),
|
|
||||||
Genre("Mecha", "mecha"),
|
|
||||||
Genre("Military", "military"),
|
|
||||||
Genre("Music", "music"),
|
|
||||||
Genre("Mystery", "mystery"),
|
|
||||||
Genre("Old Comic", "old-comic"),
|
|
||||||
Genre("One Shot", "one-shot"),
|
|
||||||
Genre("Oneshot", "oneshot"),
|
|
||||||
Genre("Parodi", "parodi"),
|
|
||||||
Genre("Parody", "parody"),
|
|
||||||
Genre("Police", "police"),
|
|
||||||
Genre("Psychological", "psychological"),
|
|
||||||
Genre("Romance", "romance"),
|
|
||||||
Genre("Samurai", "samurai"),
|
|
||||||
Genre("School", "school"),
|
|
||||||
Genre("School Life", "school-life"),
|
|
||||||
Genre("Sci-Fi", "sci-fi"),
|
|
||||||
Genre("Seinen", "seinen"),
|
|
||||||
Genre("Shoujo", "shoujo"),
|
|
||||||
Genre("Shoujo Ai", "shoujo-ai"),
|
|
||||||
Genre("Shounen", "shounen"),
|
|
||||||
Genre("Shounen ai", "shounen-ai"),
|
|
||||||
Genre("Slice of Life", "slice-of-life"),
|
|
||||||
Genre("Sports", "sports"),
|
|
||||||
Genre("Super Power", "super-power"),
|
|
||||||
Genre("Supernatural", "supernatural"),
|
|
||||||
Genre("Thriller", "thriller"),
|
|
||||||
Genre("Tragedy", "tragedy"),
|
|
||||||
Genre("Vampire", "vampire"),
|
|
||||||
Genre("Webtoons", "webtoons"),
|
|
||||||
Genre("Yaoi", "yaoi"),
|
|
||||||
Genre("Yuri", "yuri")
|
|
||||||
)
|
|
||||||
}
|
|
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 26 KiB |
|
@ -1,20 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.komikindowpms
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class KomikIndoWPMS : WPMangaStream("Komik Indo", "https://www.komikindo.web.id", "id") {
|
|
||||||
// Formerly "Komik Indo (WP Manga Stream)"
|
|
||||||
override val id = 1481562643469779882
|
|
||||||
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.komikru
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class KomikRu : WPMangaStream("KomikRu", "https://komikru.com", "id", SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id"))) {
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.ar.mangap
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
class MangaP : WPMangaStream("MangaP", "https://mangap.me", "ar") {
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.mangashiro
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
class MangaShiro : WPMangaStream("MangaShiro", "https://mangashiro.co", "id") {
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.matakomik
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.wpmangastream.WPMangaStream
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class Matakomik : WPMangaStream("Matakomik", "https://matakomik.com", "id") {
|
|
||||||
private val rateLimitInterceptor = RateLimitInterceptor(4)
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
|
||||||
.addNetworkInterceptor(rateLimitInterceptor)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
return document.select("div#readerarea a").mapIndexed { i, a ->
|
|
||||||
Page(i, "", a.attr("abs:href"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -29,8 +29,6 @@ class FoolSlideGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Iskultrip Scans", "https://maryfaye.net", "en"),
|
SingleLang("Iskultrip Scans", "https://maryfaye.net", "en"),
|
||||||
SingleLang("Anata no Motokare", "https://motokare.xyz", "en", className = "AnataNoMotokare"),
|
SingleLang("Anata no Motokare", "https://motokare.xyz", "en", className = "AnataNoMotokare"),
|
||||||
SingleLang("Yuri-ism", "https://www.yuri-ism.net", "en", className = "YuriIsm"),
|
SingleLang("Yuri-ism", "https://www.yuri-ism.net", "en", className = "YuriIsm"),
|
||||||
SingleLang("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", className = "AjiaNoScantrad"),
|
|
||||||
SingleLang("Storm in Heaven", "https://www.storm-in-heaven.net", "it", className = "StormInHeaven"),
|
|
||||||
SingleLang("LupiTeam", "https://lupiteam.net", "it"),
|
SingleLang("LupiTeam", "https://lupiteam.net", "it"),
|
||||||
SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"),
|
SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"),
|
||||||
SingleLang("Kirishima Fansub", "https://www.kirishimafansub.net", "es"),
|
SingleLang("Kirishima Fansub", "https://www.kirishimafansub.net", "es"),
|
||||||
|
@ -38,7 +36,6 @@ class FoolSlideGenerator : ThemeSourceGenerator {
|
||||||
MultiLang("HNI-Scantrad", "https://hni-scantrad.com", listOf("fr", "en"), className = "HNIScantradFactory", pkgName = "hniscantrad", overrideVersionCode = 1),
|
MultiLang("HNI-Scantrad", "https://hni-scantrad.com", listOf("fr", "en"), className = "HNIScantradFactory", pkgName = "hniscantrad", overrideVersionCode = 1),
|
||||||
SingleLang("The Phoenix Scans", "https://www.phoenixscans.com", "it", className = "PhoenixScans"),
|
SingleLang("The Phoenix Scans", "https://www.phoenixscans.com", "it", className = "PhoenixScans"),
|
||||||
SingleLang("GTO The Great Site", "https://www.gtothegreatsite.net", "it", className = "GTO"),
|
SingleLang("GTO The Great Site", "https://www.gtothegreatsite.net", "it", className = "GTO"),
|
||||||
SingleLang("Fall World Reader", "https://faworeader.altervista.org", "it", className = "FallenWorldOrder"),
|
|
||||||
SingleLang("NIFTeam", "http://read-nifteam.info", "it"),
|
SingleLang("NIFTeam", "http://read-nifteam.info", "it"),
|
||||||
SingleLang("TuttoAnimeManga", "https://tuttoanimemanga.net", "it"),
|
SingleLang("TuttoAnimeManga", "https://tuttoanimemanga.net", "it"),
|
||||||
SingleLang("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr"),
|
SingleLang("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr"),
|
||||||
|
|
|
@ -16,7 +16,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("24hRomance", "https://24hromance.com", "en", className = "Romance24h"),
|
SingleLang("24hRomance", "https://24hromance.com", "en", className = "Romance24h"),
|
||||||
SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr"),
|
SingleLang("Adonis Fansub", "https://manga.adonisfansub.com", "tr"),
|
||||||
SingleLang("AkuManga", "https://akumanga.com", "ar"),
|
SingleLang("AkuManga", "https://akumanga.com", "ar"),
|
||||||
SingleLang("AlianzaMarcial", "https://alianzamarcial.xyz", "es"),
|
|
||||||
SingleLang("AllPornComic", "https://allporncomic.com", "en", isNsfw = true),
|
SingleLang("AllPornComic", "https://allporncomic.com", "en", isNsfw = true),
|
||||||
SingleLang("Aloalivn", "https://aloalivn.com", "en", overrideVersionCode = 2),
|
SingleLang("Aloalivn", "https://aloalivn.com", "en", overrideVersionCode = 2),
|
||||||
SingleLang("AniMangaEs", "https://animangaes.com", "en", overrideVersionCode = 1),
|
SingleLang("AniMangaEs", "https://animangaes.com", "en", overrideVersionCode = 1),
|
||||||
|
@ -29,7 +28,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Arthur Scan", "https://arthurscan.xyz", "pt-BR"),
|
SingleLang("Arthur Scan", "https://arthurscan.xyz", "pt-BR"),
|
||||||
SingleLang("Astral Library", "https://www.astrallibrary.net", "en", overrideVersionCode = 1),
|
SingleLang("Astral Library", "https://www.astrallibrary.net", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Atikrost", "https://atikrost.com", "tr"),
|
SingleLang("Atikrost", "https://atikrost.com", "tr"),
|
||||||
SingleLang("ATM-Subs", "https://atm-subs.fr", "fr", className = "ATMSubs"),
|
|
||||||
SingleLang("AYATOON", "https://ayatoon.com", "tr"),
|
SingleLang("AYATOON", "https://ayatoon.com", "tr"),
|
||||||
SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1),
|
SingleLang("Azora", "https://azoramanga.com", "ar", overrideVersionCode = 1),
|
||||||
SingleLang("BL Manhwa Club", "https://blmanhwa.club", "pt-BR", isNsfw = true, className = "BlManhwaClub"),
|
SingleLang("BL Manhwa Club", "https://blmanhwa.club", "pt-BR", isNsfw = true, className = "BlManhwaClub"),
|
||||||
|
@ -56,10 +54,8 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"),
|
SingleLang("DiamondFansub", "https://diamondfansub.com", "tr"),
|
||||||
SingleLang("Disaster Scans", "https://disasterscans.com", "en", overrideVersionCode = 1),
|
SingleLang("Disaster Scans", "https://disasterscans.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true),
|
SingleLang("DoujinHentai", "https://doujinhentai.net", "es", isNsfw = true),
|
||||||
SingleLang("DoujinYosh", "https://doujinyosh.work", "id"),
|
|
||||||
SingleLang("Dream Manga", "https://en.ruyamanga.com", "en", overrideVersionCode = 1),
|
SingleLang("Dream Manga", "https://en.ruyamanga.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Drope Scan", "https://dropescan.com", "pt-BR", overrideVersionCode = 1),
|
SingleLang("Drope Scan", "https://dropescan.com", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("Einherjar Scan", "https://einherjarscans.space", "en"),
|
|
||||||
SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR", overrideVersionCode = 1),
|
SingleLang("FDM Scan", "https://fdmscan.com", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1),
|
SingleLang("1st Kiss", "https://1stkissmanga.com", "en", className = "FirstKissManga", overrideVersionCode = 1),
|
||||||
SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com", "en", className = "FirstKissManhua"),
|
SingleLang("1st Kiss Manhua", "https://1stkissmanhua.com", "en", className = "FirstKissManhua"),
|
||||||
|
@ -85,8 +81,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga"),
|
SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga"),
|
||||||
SingleLang("Its Your Right Manhua", "https://itsyourightmanhua.com/", "en"),
|
SingleLang("Its Your Right Manhua", "https://itsyourightmanhua.com/", "en"),
|
||||||
SingleLang("JJutsuScans", "https://jjutsuscans.com", "en", overrideVersionCode = 1),
|
SingleLang("JJutsuScans", "https://jjutsuscans.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Just For Fun", "https://just-for-fun.ru", "ru"),
|
|
||||||
SingleLang("KingzManga", "https://kingzmanga.com", "ar"),
|
|
||||||
SingleLang("KisekiManga", "https://kisekimanga.com", "en"),
|
SingleLang("KisekiManga", "https://kisekimanga.com", "en"),
|
||||||
SingleLang("Kissmanga.in", "https://kissmanga.in", "en", className= "KissmangaIn"),
|
SingleLang("Kissmanga.in", "https://kissmanga.in", "en", className= "KissmangaIn"),
|
||||||
SingleLang("KlikManga", "https://klikmanga.com", "id"),
|
SingleLang("KlikManga", "https://klikmanga.com", "id"),
|
||||||
|
@ -95,14 +89,12 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Levelerscans", "https://levelerscans.xyz", "en"),
|
SingleLang("Levelerscans", "https://levelerscans.xyz", "en"),
|
||||||
SingleLang("Lily Manga", "https://lilymanga.com", "en"),
|
SingleLang("Lily Manga", "https://lilymanga.com", "en"),
|
||||||
SingleLang("LovableSubs", "https://lovablesubs.com", "tr"),
|
SingleLang("LovableSubs", "https://lovablesubs.com", "tr"),
|
||||||
SingleLang("Manga18 Fun", "https://manga18.fun", "en"),
|
|
||||||
SingleLang("Manga18 Fx", "https://manga18fx.com", "en"),
|
SingleLang("Manga18 Fx", "https://manga18fx.com", "en"),
|
||||||
SingleLang("Manga347", "https://manga347.com", "en", overrideVersionCode = 2),
|
SingleLang("Manga347", "https://manga347.com", "en", overrideVersionCode = 2),
|
||||||
SingleLang("مانجا العاشق", "https://3asq.org", "ar", className = "Manga3asq"),
|
SingleLang("مانجا العاشق", "https://3asq.org", "ar", className = "Manga3asq"),
|
||||||
SingleLang("Manga3S", "https://manga3s.com", "en"),
|
SingleLang("Manga3S", "https://manga3s.com", "en"),
|
||||||
SingleLang("Manga68", "https://manga68.com", "en"),
|
SingleLang("Manga68", "https://manga68.com", "en"),
|
||||||
SingleLang("Manga Action", "https://manga-action.com", "ar", overrideVersionCode = 1),
|
SingleLang("Manga Action", "https://manga-action.com", "ar", overrideVersionCode = 1),
|
||||||
SingleLang("Manga Arab Online مانجا عرب اون لاين", "https://mangaarabonline.com", "ar", className = "MangaArabOnline"),
|
|
||||||
SingleLang("مانجا عرب تيم Manga Arab Team", "https://mangaarabteam.com", "ar", className = "MangaArabTeam"),
|
SingleLang("مانجا عرب تيم Manga Arab Team", "https://mangaarabteam.com", "ar", className = "MangaArabTeam"),
|
||||||
SingleLang("MangaBaz", "https://mangabaz.com", "tr"),
|
SingleLang("MangaBaz", "https://mangabaz.com", "tr"),
|
||||||
SingleLang("Manga Bin", "https://mangabin.com/", "en"),
|
SingleLang("Manga Bin", "https://mangabin.com/", "en"),
|
||||||
|
@ -153,10 +145,7 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("MangaWT", "https://mangawt.com", "tr"),
|
SingleLang("MangaWT", "https://mangawt.com", "tr"),
|
||||||
SingleLang("MangaYaku", "https://mangayaku.com", "id", overrideVersionCode = 1),
|
SingleLang("MangaYaku", "https://mangayaku.com", "id", overrideVersionCode = 1),
|
||||||
SingleLang("MangaYosh", "https://mangayosh.xyz", "id"),
|
SingleLang("MangaYosh", "https://mangayosh.xyz", "id"),
|
||||||
MultiLang("Mangazuki.club", "https://mangazuki.club", listOf("ja", "ko"),
|
|
||||||
className = "MangazukiClubFactory"),
|
|
||||||
SingleLang("Mangazuki.me", "https://mangazuki.me", "en", className = "MangazukiMe", overrideVersionCode = 1),
|
SingleLang("Mangazuki.me", "https://mangazuki.me", "en", className = "MangazukiMe", overrideVersionCode = 1),
|
||||||
SingleLang("Mangazuki.online", "http://mangazukinew.online", "en", className = "MangazukiOnline"),
|
|
||||||
SingleLang("Mangceh", "https://mangceh.com", "id", isNsfw = true),
|
SingleLang("Mangceh", "https://mangceh.com", "id", isNsfw = true),
|
||||||
SingleLang("ManhuaBox", "https://manhuabox.net", "en"),
|
SingleLang("ManhuaBox", "https://manhuabox.net", "en"),
|
||||||
SingleLang("Manhua ES", "https://manhuaes.com", "en", overrideVersionCode = 4),
|
SingleLang("Manhua ES", "https://manhuaes.com", "en", overrideVersionCode = 4),
|
||||||
|
@ -181,13 +170,11 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("MG Komik", "https://mgkomik.my.id", "id"),
|
SingleLang("MG Komik", "https://mgkomik.my.id", "id"),
|
||||||
SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en", isNsfw = true, overrideVersionCode = 1),
|
SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en", isNsfw = true, overrideVersionCode = 1),
|
||||||
SingleLang("Milftoon", "https://milftoon.xxx", "en", isNsfw = true, overrideVersionCode = 2),
|
SingleLang("Milftoon", "https://milftoon.xxx", "en", isNsfw = true, overrideVersionCode = 2),
|
||||||
SingleLang("Miracle Scans", "https://miraclescans.com", "en"),
|
|
||||||
SingleLang("Mixed Manga", "https://mixedmanga.com", "en"),
|
SingleLang("Mixed Manga", "https://mixedmanga.com", "en"),
|
||||||
SingleLang("MMScans", "https://mm-scans.com/", "en", overrideVersionCode = 1),
|
SingleLang("MMScans", "https://mm-scans.com/", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Mode Scanlator", "https://modescanlator.com", "pt-BR"),
|
SingleLang("Mode Scanlator", "https://modescanlator.com", "pt-BR"),
|
||||||
SingleLang("Mundo Wuxia", "https://mundowuxia.com", "es"),
|
SingleLang("Mundo Wuxia", "https://mundowuxia.com", "es"),
|
||||||
SingleLang("Mystical Merries", "https://mysticalmerries.com", "en"),
|
SingleLang("Mystical Merries", "https://mysticalmerries.com", "en"),
|
||||||
SingleLang("Nazarick Scans", "https://nazarickscans.com", "en"),
|
|
||||||
SingleLang("NeatManga", "https://neatmanga.com", "en"),
|
SingleLang("NeatManga", "https://neatmanga.com", "en"),
|
||||||
SingleLang("NekoScan", "https://nekoscan.com", "en", overrideVersionCode = 1),
|
SingleLang("NekoScan", "https://nekoscan.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Neox Scanlator", "https://neoxscans.net", "pt-BR", overrideVersionCode = 4),
|
SingleLang("Neox Scanlator", "https://neoxscans.net", "pt-BR", overrideVersionCode = 4),
|
||||||
|
@ -197,7 +184,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Nitro Scans", "https://nitroscans.com", "en"),
|
SingleLang("Nitro Scans", "https://nitroscans.com", "en"),
|
||||||
SingleLang("NovelMic", "https://novelmic.com", "en"),
|
SingleLang("NovelMic", "https://novelmic.com", "en"),
|
||||||
SingleLang("Off Scan", "https://offscan.top", "pt-BR", overrideVersionCode = 1),
|
SingleLang("Off Scan", "https://offscan.top", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("مانجا اولاو", "https://olaoe.giize.com", "ar", className = "OlaoeManga"),
|
|
||||||
SingleLang("OnManga", "https://onmanga.com", "en"),
|
SingleLang("OnManga", "https://onmanga.com", "en"),
|
||||||
SingleLang("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR", overrideVersionCode = 1),
|
SingleLang("Origami Orpheans", "https://origami-orpheans.com.br", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("Paean Scans", "https://paeanscans.com", "en"),
|
SingleLang("Paean Scans", "https://paeanscans.com", "en"),
|
||||||
|
@ -205,10 +191,8 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Platinum Crown", "https://platinumscans.com", "en"),
|
SingleLang("Platinum Crown", "https://platinumscans.com", "en"),
|
||||||
SingleLang("Pojok Manga", "https://pojokmanga.com", "id", overrideVersionCode = 1),
|
SingleLang("Pojok Manga", "https://pojokmanga.com", "id", overrideVersionCode = 1),
|
||||||
SingleLang("PornComix", "https://www.porncomixonline.net", "en", isNsfw = true, overrideVersionCode = 1),
|
SingleLang("PornComix", "https://www.porncomixonline.net", "en", isNsfw = true, overrideVersionCode = 1),
|
||||||
SingleLang("Prime Manga", "https://primemanga.com", "en"),
|
|
||||||
SingleLang("Projeto Scanlator", "https://projetoscanlator.com", "pt-BR", overrideVersionCode = 1),
|
SingleLang("Projeto Scanlator", "https://projetoscanlator.com", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("QueensManga ملكات المانجا", "https://queensmanga.com", "ar", className = "QueensManga"),
|
SingleLang("QueensManga ملكات المانجا", "https://queensmanga.com", "ar", className = "QueensManga"),
|
||||||
SingleLang("Raider Scans", "https://raiderscans.com", "en"),
|
|
||||||
SingleLang("Random Translations", "https://randomtranslations.com", "en"),
|
SingleLang("Random Translations", "https://randomtranslations.com", "en"),
|
||||||
SingleLang("RawDEX", "https://rawdex.net", "ko", isNsfw = true),
|
SingleLang("RawDEX", "https://rawdex.net", "ko", isNsfw = true),
|
||||||
SingleLang("Raw Mangas", "https://rawmangas.net", "ja", isNsfw = true, overrideVersionCode = 1),
|
SingleLang("Raw Mangas", "https://rawmangas.net", "ja", isNsfw = true, overrideVersionCode = 1),
|
||||||
|
@ -229,7 +213,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Sleepy Translations", "https://sleepytranslations.com/", "en"),
|
SingleLang("Sleepy Translations", "https://sleepytranslations.com/", "en"),
|
||||||
SingleLang("SocialWeebs", "https://socialweebs.in/", "en"),
|
SingleLang("SocialWeebs", "https://socialweebs.in/", "en"),
|
||||||
SingleLang("SoloScanlation", "https://soloscanlation.site", "en"),
|
SingleLang("SoloScanlation", "https://soloscanlation.site", "en"),
|
||||||
SingleLang("Spooky Scanlations", "https://spookyscanlations.xyz", "es"),
|
|
||||||
SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1),
|
SingleLang("StageComics", "https://stagecomics.com", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("Sugar Babies", "https://sugarbscan.com", "en"),
|
SingleLang("Sugar Babies", "https://sugarbscan.com", "en"),
|
||||||
SingleLang("Sweet Time Scan", "https://sweetscan.net", "pt-BR"),
|
SingleLang("Sweet Time Scan", "https://sweetscan.net", "pt-BR"),
|
||||||
|
@ -238,12 +221,10 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("ToonGod", "https://www.toongod.com", "en"),
|
SingleLang("ToonGod", "https://www.toongod.com", "en"),
|
||||||
SingleLang("Toonily", "https://toonily.com", "en", isNsfw = true, overrideVersionCode = 2),
|
SingleLang("Toonily", "https://toonily.com", "en", isNsfw = true, overrideVersionCode = 2),
|
||||||
SingleLang("Toonily.net", "https://toonily.net", "en", isNsfw = true, className = "ToonilyNet", overrideVersionCode = 1),
|
SingleLang("Toonily.net", "https://toonily.net", "en", isNsfw = true, className = "ToonilyNet", overrideVersionCode = 1),
|
||||||
SingleLang("ToonPoint", "https://toonpoint.com", "en"),
|
|
||||||
SingleLang("Top Manhua", "https://topmanhua.com", "en"),
|
SingleLang("Top Manhua", "https://topmanhua.com", "en"),
|
||||||
SingleLang("TritiniaScans", "https://tritinia.com", "en", overrideVersionCode = 1),
|
SingleLang("TritiniaScans", "https://tritinia.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("TruyenTranhAudio.com", "https://truyentranhaudio.com", "vi", className = "TruyenTranhAudioCom"),
|
SingleLang("TruyenTranhAudio.com", "https://truyentranhaudio.com", "vi", className = "TruyenTranhAudioCom"),
|
||||||
SingleLang("TruyenTranhAudio.online", "https://truyentranhaudio.online", "vi", className = "TruyenTranhAudioOnline"),
|
SingleLang("TruyenTranhAudio.online", "https://truyentranhaudio.online", "vi", className = "TruyenTranhAudioOnline"),
|
||||||
SingleLang("Tsubaki No Scan", "https://tsubakinoscan.com", "fr"),
|
|
||||||
SingleLang("Tsundoku Traduções", "https://tsundokutraducoes.com.br", "pt-BR", pkgName = "tsundokutraducoes", className = "TsundokuTraducoes", overrideVersionCode = 1),
|
SingleLang("Tsundoku Traduções", "https://tsundokutraducoes.com.br", "pt-BR", pkgName = "tsundokutraducoes", className = "TsundokuTraducoes", overrideVersionCode = 1),
|
||||||
SingleLang("Türkçe Manga", "https://turkcemanga.com", "tr", className = "TurkceManga"),
|
SingleLang("Türkçe Manga", "https://turkcemanga.com", "tr", className = "TurkceManga"),
|
||||||
SingleLang("Twilight Scans", "https://twilightscans.com", "en", overrideVersionCode = 1),
|
SingleLang("Twilight Scans", "https://twilightscans.com", "en", overrideVersionCode = 1),
|
||||||
|
@ -257,7 +238,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("WebToonily", "https://webtoonily.com", "en"),
|
SingleLang("WebToonily", "https://webtoonily.com", "en"),
|
||||||
SingleLang("WebtoonUK", "https://webtoon.uk", "en"),
|
SingleLang("WebtoonUK", "https://webtoon.uk", "en"),
|
||||||
SingleLang("WebtoonXYZ", "https://www.webtoon.xyz", "en"),
|
SingleLang("WebtoonXYZ", "https://www.webtoon.xyz", "en"),
|
||||||
SingleLang("WeScans", "https://wescans.xyz", "en"),
|
|
||||||
SingleLang("WoopRead", "https://woopread.com", "en"),
|
SingleLang("WoopRead", "https://woopread.com", "en"),
|
||||||
SingleLang("WuxiaWorld", "https://wuxiaworld.site", "en"),
|
SingleLang("WuxiaWorld", "https://wuxiaworld.site", "en"),
|
||||||
SingleLang("Yaoi Fan Clube", "https://yaoifanclube.com.br", "pt-BR", isNsfw = true),
|
SingleLang("Yaoi Fan Clube", "https://yaoifanclube.com.br", "pt-BR", isNsfw = true),
|
||||||
|
@ -265,7 +245,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Yokai Jump", "https://yokaijump.fr", "fr"),
|
SingleLang("Yokai Jump", "https://yokaijump.fr", "fr"),
|
||||||
SingleLang("Yuri Verso", "https://yuri.live", "pt-BR", overrideVersionCode = 1),
|
SingleLang("Yuri Verso", "https://yuri.live", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("Zin Translator", "https://zinmanga.com", "en"),
|
SingleLang("Zin Translator", "https://zinmanga.com", "en"),
|
||||||
SingleLang("ZManga", "https://zmanga.org", "es"),
|
|
||||||
SingleLang("Sleeping Knight Scans", "https://skscans.com", "en", overrideVersionCode = 2),
|
SingleLang("Sleeping Knight Scans", "https://skscans.com", "en", overrideVersionCode = 2),
|
||||||
MultiLang("Leviatan Scans", "https://leviatanscans.com", listOf("en", "es"),
|
MultiLang("Leviatan Scans", "https://leviatanscans.com", listOf("en", "es"),
|
||||||
className = "LeviatanScansFactory", overrideVersionCode = 3),
|
className = "LeviatanScansFactory", overrideVersionCode = 3),
|
||||||
|
|
|
@ -44,7 +44,6 @@ class MMRCMSSources {
|
||||||
SourceData.Single("Scan VF", "https://www.scan-vf.net", "fr"),
|
SourceData.Single("Scan VF", "https://www.scan-vf.net", "fr"),
|
||||||
SourceData.Single("Scan OP", "https://scan-op.cc", "fr"),
|
SourceData.Single("Scan OP", "https://scan-op.cc", "fr"),
|
||||||
SourceData.Single("Komikid", "https://www.komikid.com", "id"),
|
SourceData.Single("Komikid", "https://www.komikid.com", "id"),
|
||||||
SourceData.Single("Nikushima", "http://azbivo.webd.pro", "pl"),
|
|
||||||
SourceData.Single("MangaHanta", "http://mangahanta.com", "tr", overrideVersionCode = 1),
|
SourceData.Single("MangaHanta", "http://mangahanta.com", "tr", overrideVersionCode = 1),
|
||||||
SourceData.Single("Fallen Angels Scans", "https://truyen.fascans.com", "vi"),
|
SourceData.Single("Fallen Angels Scans", "https://truyen.fascans.com", "vi"),
|
||||||
SourceData.Single("LeoManga", "https://leomanga.me", "es", overrideVersionCode = 1),
|
SourceData.Single("LeoManga", "https://leomanga.me", "es", overrideVersionCode = 1),
|
||||||
|
@ -88,6 +87,7 @@ class MMRCMSSources {
|
||||||
// SourceData("tr", "Epikmanga", "https://www.epikmanga.com"),
|
// SourceData("tr", "Epikmanga", "https://www.epikmanga.com"),
|
||||||
// SourceData("en", "Hatigarm Scans", "https://hatigarmscans.net"),
|
// SourceData("en", "Hatigarm Scans", "https://hatigarmscans.net"),
|
||||||
// Went offline
|
// Went offline
|
||||||
|
// SourceData.Single("Nikushima", "http://azbivo.webd.pro", "pl"),
|
||||||
// SourceData("ru", "Japit Comics", "https://j-comics.ru"),
|
// SourceData("ru", "Japit Comics", "https://j-comics.ru"),
|
||||||
// SourceData("es", "Universo Yuri", "https://universoyuri.com"),
|
// SourceData("es", "Universo Yuri", "https://universoyuri.com"),
|
||||||
// SourceData("pl", "Dracaena", "https://dracaena.webd.pl/czytnik"),
|
// SourceData("pl", "Dracaena", "https://dracaena.webd.pl/czytnik"),
|
||||||
|
|
|
@ -13,7 +13,6 @@ class WPComicsGenerator : ThemeSourceGenerator {
|
||||||
override val baseVersionCode: Int = 1
|
override val baseVersionCode: Int = 1
|
||||||
|
|
||||||
override val sources = listOf(
|
override val sources = listOf(
|
||||||
SingleLang("ComicLatest", "https://comiclatest.com", "en", overrideVersionCode = 1),
|
|
||||||
MultiLang("MangaSum", "https://mangasum.com", listOf("en", "ja")),
|
MultiLang("MangaSum", "https://mangasum.com", listOf("en", "ja")),
|
||||||
SingleLang("NetTruyen", "https://www.nettruyen.com", "vi", overrideVersionCode = 1),
|
SingleLang("NetTruyen", "https://www.nettruyen.com", "vi", overrideVersionCode = 1),
|
||||||
SingleLang("NhatTruyen", "http://nhattruyen.com", "vi", overrideVersionCode = 1),
|
SingleLang("NhatTruyen", "http://nhattruyen.com", "vi", overrideVersionCode = 1),
|
||||||
|
|
|
@ -14,32 +14,25 @@ class WPMangaStreamGenerator : ThemeSourceGenerator {
|
||||||
override val sources = listOf(
|
override val sources = listOf(
|
||||||
SingleLang("Asura Scans", "override url", "en", overrideVersionCode = 1),
|
SingleLang("Asura Scans", "override url", "en", overrideVersionCode = 1),
|
||||||
SingleLang("KlanKomik", "https://klankomik.com", "id"),
|
SingleLang("KlanKomik", "https://klankomik.com", "id"),
|
||||||
SingleLang("ChiOtaku", "https://chiotaku.com", "id"),
|
|
||||||
SingleLang("MangaShiro", "https://mangashiro.co", "id"),
|
|
||||||
SingleLang("MasterKomik", "https://masterkomik.com", "id"),
|
SingleLang("MasterKomik", "https://masterkomik.com", "id"),
|
||||||
SingleLang("Kaisar Komik", "https://kaisarkomik.com", "id"),
|
SingleLang("Kaisar Komik", "https://kaisarkomik.com", "id"),
|
||||||
SingleLang("Rawkuma", "https://rawkuma.com/", "ja"),
|
SingleLang("Rawkuma", "https://rawkuma.com/", "ja"),
|
||||||
SingleLang("MangaP", "https://mangap.me", "ar"),
|
|
||||||
SingleLang("Boosei", "https://boosei.com", "id"),
|
SingleLang("Boosei", "https://boosei.com", "id"),
|
||||||
SingleLang("Mangakyo", "https://www.mangakyo.me", "id"),
|
SingleLang("Mangakyo", "https://www.mangakyo.me", "id"),
|
||||||
SingleLang("Sekte Komik", "https://sektekomik.com", "id", overrideVersionCode = 2),
|
SingleLang("Sekte Komik", "https://sektekomik.com", "id", overrideVersionCode = 2),
|
||||||
SingleLang("Komik Station", "https://komikstation.com", "id"),
|
SingleLang("Komik Station", "https://komikstation.com", "id"),
|
||||||
SingleLang("Komik Indo", "https://www.komikindo.web.id", "id", className = "KomikIndoWPMS"),
|
|
||||||
SingleLang("Non-Stop Scans", "https://www.nonstopscans.com", "en", className = "NonStopScans"),
|
SingleLang("Non-Stop Scans", "https://www.nonstopscans.com", "en", className = "NonStopScans"),
|
||||||
SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo"),
|
SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo"),
|
||||||
SingleLang("Readkomik", "https://readkomik.com", "en", className = "ReadKomik"),
|
SingleLang("Readkomik", "https://readkomik.com", "en", className = "ReadKomik"),
|
||||||
SingleLang("MangaIndonesia", "https://mangaindonesia.net", "id"),
|
SingleLang("MangaIndonesia", "https://mangaindonesia.net", "id"),
|
||||||
SingleLang("Liebe Schnee Hiver", "https://www.liebeschneehiver.com", "tr"),
|
SingleLang("Liebe Schnee Hiver", "https://www.liebeschneehiver.com", "tr"),
|
||||||
SingleLang("KomikRu", "https://komikru.com", "id"),
|
|
||||||
SingleLang("GURU Komik", "https://gurukomik.com", "id"),
|
SingleLang("GURU Komik", "https://gurukomik.com", "id"),
|
||||||
SingleLang("Shea Manga", "https://sheamanga.my.id", "id"),
|
SingleLang("Shea Manga", "https://sheamanga.my.id", "id"),
|
||||||
SingleLang("Komik AV", "https://komikav.com", "id"),
|
SingleLang("Komik AV", "https://komikav.com", "id"),
|
||||||
SingleLang("Komik Cast", "https://komikcast.com", "id", overrideVersionCode = 6),
|
SingleLang("Komik Cast", "https://komikcast.com", "id", overrideVersionCode = 6),
|
||||||
SingleLang("West Manga", "https://westmanga.info", "id"),
|
SingleLang("West Manga", "https://westmanga.info", "id"),
|
||||||
SingleLang("Komik GO", "https://komikgo.com", "id", overrideVersionCode = 1),
|
|
||||||
SingleLang("MangaSwat", "https://mangaswat.com", "ar"),
|
SingleLang("MangaSwat", "https://mangaswat.com", "ar"),
|
||||||
SingleLang("Manga Raw.org", "https://mangaraw.org", "ja", className = "MangaRawOrg", overrideVersionCode = 1),
|
SingleLang("Manga Raw.org", "https://mangaraw.org", "ja", className = "MangaRawOrg", overrideVersionCode = 1),
|
||||||
SingleLang("Matakomik", "https://matakomik.com", "id"),
|
|
||||||
SingleLang("Manga Pro Z", "https://mangaproz.com", "ar"),
|
SingleLang("Manga Pro Z", "https://mangaproz.com", "ar"),
|
||||||
SingleLang("Silence Scan", "https://silencescan.net", "pt-BR", overrideVersionCode = 1),
|
SingleLang("Silence Scan", "https://silencescan.net", "pt-BR", overrideVersionCode = 1),
|
||||||
SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans"),
|
SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans"),
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
|
@ -1,12 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
ext {
|
|
||||||
extName = 'AndromedaScans'
|
|
||||||
pkgNameSuffix = 'ar.andromedascans'
|
|
||||||
extClass = '.AndromedaScans'
|
|
||||||
extVersionCode = 1
|
|
||||||
libVersion = '1.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
|
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 78 KiB |
|
@ -1,89 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.ar.andromedascans
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
|
||||||
import okhttp3.Request
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class AndromedaScans : ParsedHttpSource() {
|
|
||||||
override val name = "AndromedaScans"
|
|
||||||
|
|
||||||
override val baseUrl = "https://andromedax.net"
|
|
||||||
|
|
||||||
override val supportsLatest = true
|
|
||||||
|
|
||||||
override val lang = "ar"
|
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int) = GET("$baseUrl/projects", headers)
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div.flexbox2-content"
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
|
|
||||||
setUrlWithoutDomain(element.select("a").attr("href"))
|
|
||||||
title = element.select("a").attr("title")
|
|
||||||
thumbnail_url = element.select("img").attr("abs:src").substringBeforeLast("resize")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/$page", headers)
|
|
||||||
|
|
||||||
override fun latestUpdatesSelector() = "div.flexbox3-item"
|
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector() = "[rel=next]"
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
val type = "application/x-www-form-urlencoded; charset=UTF-8"
|
|
||||||
val body = "action=data_fetch&keyword=$query".toRequestBody(type.toMediaTypeOrNull())
|
|
||||||
|
|
||||||
return POST("$baseUrl/wp-admin/admin-ajax.php", headers, body)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = "div.searchbox"
|
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector(): String? = null
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
|
|
||||||
author = document.select("ul.series-infolist span")[3].text()
|
|
||||||
genre = document.select("div.series-genres > a[rel=tag]").joinToString { it.text() }
|
|
||||||
description = document.select("div.series-synops").text().trim()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector() = "ul.series-chapterlist > li"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element) = SChapter.create().apply {
|
|
||||||
setUrlWithoutDomain(element.select("a").attr("href"))
|
|
||||||
name = element.select("span").first().ownText()
|
|
||||||
date_upload = dateFormat.parse(element.select("span.date").text())?.time ?: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val dateFormat by lazy {
|
|
||||||
SimpleDateFormat("MMMM dd, yyyy", Locale.US)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
return document.select("noscript > img:not([alt=Andromeda Scans])").mapIndexed { i, element ->
|
|
||||||
Page(i, "", element.attr("abs:src"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList()
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
|
@ -1,12 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
ext {
|
|
||||||
extName = 'MangaZen'
|
|
||||||
pkgNameSuffix = 'ar.mangazen'
|
|
||||||
extClass = '.MangaZen'
|
|
||||||
extVersionCode = 1
|
|
||||||
libVersion = '1.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
|
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 88 KiB |
|
@ -1,86 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.ar.mangazen
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class MangaZen : ParsedHttpSource() {
|
|
||||||
|
|
||||||
override val baseUrl = "https://manga-zen.com"
|
|
||||||
|
|
||||||
override val lang = "ar"
|
|
||||||
|
|
||||||
override val name = "MangaZen"
|
|
||||||
|
|
||||||
override val supportsLatest = true
|
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int) = GET("$baseUrl/قائمة-المانجا/page/$page", headers)
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = "a[title][alt]"
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
|
|
||||||
setUrlWithoutDomain(element.attr("href"))
|
|
||||||
title = element.attr("title")
|
|
||||||
thumbnail_url = element.select("img").attr("abs:src").substringBeforeLast("?quality")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = "div.pagination:not(:has(span:last-child))"
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/قائمة-المانجا/page/$page/?order=update", headers)
|
|
||||||
|
|
||||||
override fun latestUpdatesSelector() = popularMangaSelector()
|
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/قائمة-المانجا/page/$page/?title=$query", headers)
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = popularMangaSelector()
|
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
|
|
||||||
description = document.select("div.desc").text()
|
|
||||||
genre = document.select("div.genre-info > a[itemprop=genre]").joinToString { it.text() }
|
|
||||||
status = parseStatus(document.select("div.spe").first().text())
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseStatus(status: String) = when {
|
|
||||||
status.contains("مستمر") -> SManga.ONGOING
|
|
||||||
else -> SManga.COMPLETED
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector() = "div.epsleft"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element) = SChapter.create().apply {
|
|
||||||
setUrlWithoutDomain(element.select("a").attr("href"))
|
|
||||||
name = element.select("a").text().trim()
|
|
||||||
date_upload = dateFormat.parse(element.select("span.date").text().trim())?.time ?: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val dateFormat by lazy {
|
|
||||||
SimpleDateFormat("MMM dd, yyyy", Locale("ar"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
return document.select("noscript > img#imagech").mapIndexed { i, element ->
|
|
||||||
Page(i, "", element.attr("abs:src"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList()
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
|
@ -1,12 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
ext {
|
|
||||||
extName = 'Baca Manga'
|
|
||||||
pkgNameSuffix = 'id.bacamanga'
|
|
||||||
extClass = '.BacaManga'
|
|
||||||
extVersionCode = 3
|
|
||||||
libVersion = '1.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
|
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 18 KiB |
|
@ -1,273 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.bacamanga
|
|
||||||
|
|
||||||
import com.google.gson.JsonParser
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
|
|
||||||
class BacaManga : ParsedHttpSource() {
|
|
||||||
|
|
||||||
override val name = "BacaManga"
|
|
||||||
override val baseUrl = "https://bacamanga.cc"
|
|
||||||
override val lang = "id"
|
|
||||||
override val supportsLatest = true
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient
|
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/komik-populer/page/$page/", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/manga/page/$page/", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
val url = if (query.isNotBlank()) {
|
|
||||||
val url = "$baseUrl/page/$page".toHttpUrlOrNull()!!.newBuilder()
|
|
||||||
val pattern = "\\s+".toRegex()
|
|
||||||
val q = query.replace(pattern, "+")
|
|
||||||
if (query.isNotEmpty()) {
|
|
||||||
url.addQueryParameter("s", q)
|
|
||||||
} else {
|
|
||||||
url.addQueryParameter("s", "")
|
|
||||||
}
|
|
||||||
url.toString()
|
|
||||||
} else {
|
|
||||||
val url = "$baseUrl/daftar-komik/page/$page".toHttpUrlOrNull()!!.newBuilder()
|
|
||||||
var orderBy: String
|
|
||||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
|
||||||
when (filter) {
|
|
||||||
is Status -> url.addQueryParameter("status", arrayOf("", "ongoing", "completed")[filter.state])
|
|
||||||
is GenreList -> {
|
|
||||||
val genreInclude = mutableListOf<String>()
|
|
||||||
filter.state.forEach {
|
|
||||||
if (it.state == 1) {
|
|
||||||
genreInclude.add(it.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (genreInclude.isNotEmpty()) {
|
|
||||||
genreInclude.forEach { genre ->
|
|
||||||
url.addQueryParameter("genre[]", genre)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is SortBy -> {
|
|
||||||
orderBy = filter.toUriPart()
|
|
||||||
url.addQueryParameter("order", orderBy)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
url.toString()
|
|
||||||
}
|
|
||||||
return GET(url, headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div.animepost"
|
|
||||||
override fun latestUpdatesSelector() = popularMangaSelector()
|
|
||||||
override fun searchMangaSelector() = popularMangaSelector()
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
|
||||||
val manga = SManga.create()
|
|
||||||
manga.thumbnail_url = element.select("img").attr("data-lazy-src")
|
|
||||||
manga.setUrlWithoutDomain(element.select(".bigor > a").attr("href"))
|
|
||||||
manga.title = element.select(".bigor .tt h2").text()
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element)
|
|
||||||
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = "a.next.page-numbers"
|
|
||||||
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
|
|
||||||
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
|
||||||
val infoElement = document.select(".infox").first()
|
|
||||||
val sepName = infoElement.select(".spe > span:nth-child(4)").last()
|
|
||||||
val manga = SManga.create()
|
|
||||||
manga.author = infoElement.select(".spe span:contains(Pengarang)").text().replace("Pengarang: ", "").trim()
|
|
||||||
manga.artist = sepName.ownText()
|
|
||||||
val genres = mutableListOf<String>()
|
|
||||||
infoElement.select(".genre-info > a").forEach { element ->
|
|
||||||
val genre = element.text()
|
|
||||||
genres.add(genre)
|
|
||||||
}
|
|
||||||
manga.genre = genres.joinToString(", ")
|
|
||||||
manga.status = parseStatus(infoElement.select(".spe span:contains(Status)").text())
|
|
||||||
manga.description = document.select("div[^itemprop]").last().text()
|
|
||||||
manga.thumbnail_url = document.select(".thumb noscript img").first().attr("src")
|
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseStatus(element: String): Int = when {
|
|
||||||
|
|
||||||
element.toLowerCase().contains("berjalan") -> SManga.ONGOING
|
|
||||||
element.toLowerCase().contains("tamat") -> SManga.COMPLETED
|
|
||||||
else -> SManga.UNKNOWN
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector() = "div#chapter_list ul li"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
|
||||||
val urlElement = element.select(".lchx a").first()
|
|
||||||
val timeElement = element.select("span.rightoff").first()
|
|
||||||
val chapter = SChapter.create()
|
|
||||||
chapter.setUrlWithoutDomain(urlElement.attr("href"))
|
|
||||||
chapter.name = urlElement.text()
|
|
||||||
chapter.date_upload = 0
|
|
||||||
return chapter
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun prepareNewChapter(chapter: SChapter, manga: SManga) {
|
|
||||||
val basic = Regex("""Chapter\s([0-9]+)""")
|
|
||||||
when {
|
|
||||||
basic.containsMatchIn(chapter.name) -> {
|
|
||||||
basic.find(chapter.name)?.let {
|
|
||||||
chapter.chapter_number = it.groups[1]?.value!!.toFloat()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
val pages = mutableListOf<Page>()
|
|
||||||
val scriptToParse = document.select("script[src*=cache]").first().attr("src")
|
|
||||||
val slideaid = client.newCall(GET(scriptToParse, headers)).execute().body!!.string()
|
|
||||||
val imagesList = slideaid.substringAfter("var imgch").substringBefore(";").substringAfter("=").trim()
|
|
||||||
val img_url = slideaid.substringAfter("#chimg").substringBefore("onError").substringAfter("src=\"").substringBefore("'").trim()
|
|
||||||
val json = JsonParser().parse(imagesList).asJsonArray
|
|
||||||
json.forEachIndexed { i, url ->
|
|
||||||
val url_clean = url.toString().removeSurrounding("\"")
|
|
||||||
// BASE URL HARD CODED
|
|
||||||
pages.add(Page(i, "", "$img_url$url_clean"))
|
|
||||||
}
|
|
||||||
return pages
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document) = ""
|
|
||||||
|
|
||||||
override fun imageRequest(page: Page): Request {
|
|
||||||
val headers = Headers.Builder()
|
|
||||||
headers.apply {
|
|
||||||
add("Referer", baseUrl)
|
|
||||||
add("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.100 Mobile Safari/537.36")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (page.imageUrl!!.contains("i0.wp.com")) {
|
|
||||||
headers.apply {
|
|
||||||
add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GET(page.imageUrl!!, headers.build())
|
|
||||||
}
|
|
||||||
|
|
||||||
private class SortBy : UriPartFilter(
|
|
||||||
"Sort by",
|
|
||||||
arrayOf(
|
|
||||||
Pair("Default", ""),
|
|
||||||
Pair("A-Z", "title"),
|
|
||||||
Pair("Z-A", "titlereverse"),
|
|
||||||
Pair("Latest Update", "update"),
|
|
||||||
Pair("Latest Added", "latest"),
|
|
||||||
Pair("Popular", "popular")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
private class Status : UriPartFilter(
|
|
||||||
"Status",
|
|
||||||
arrayOf(
|
|
||||||
Pair("All", ""),
|
|
||||||
Pair("Ongoing", "Ongoing"),
|
|
||||||
Pair("Completed", "Completed")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
private class Genre(name: String, val id: String = name) : Filter.TriState(name)
|
|
||||||
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList(
|
|
||||||
Filter.Header("NOTE: Ignored if using text search!"),
|
|
||||||
Filter.Separator(),
|
|
||||||
SortBy(),
|
|
||||||
Filter.Separator(),
|
|
||||||
Status(),
|
|
||||||
Filter.Separator(),
|
|
||||||
GenreList(getGenreList())
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun getGenreList() = listOf(
|
|
||||||
Genre("Action", "action"),
|
|
||||||
Genre("Adult", "adult"),
|
|
||||||
Genre("Adventure", "adventure"),
|
|
||||||
Genre("Comedy", "comedy"),
|
|
||||||
Genre("Demon", "demon"),
|
|
||||||
Genre("Demons", "demons"),
|
|
||||||
Genre("Doujinshi", "doujinshi"),
|
|
||||||
Genre("Drama", "drama"),
|
|
||||||
Genre("Ecchi", "ecchi"),
|
|
||||||
Genre("Fantasy", "fantasy"),
|
|
||||||
Genre("Game", "game"),
|
|
||||||
Genre("Gender Bender", "gender-bender"),
|
|
||||||
Genre("Genres: Action", "genres-action"),
|
|
||||||
Genre("Gore", "gore"),
|
|
||||||
Genre("Harem", "harem"),
|
|
||||||
Genre("Historical", "historical"),
|
|
||||||
Genre("Horor", "horor"),
|
|
||||||
Genre("Horror", "horror"),
|
|
||||||
Genre("Isekai", "isekai"),
|
|
||||||
Genre("Josei", "josei"),
|
|
||||||
Genre("Lolicon", "lolicon"),
|
|
||||||
Genre("Magic", "magic"),
|
|
||||||
Genre("Manhua", "manhua"),
|
|
||||||
Genre("Martial Art", "martial-art"),
|
|
||||||
Genre("Martial Arts", "martial-arts"),
|
|
||||||
Genre("Mature", "mature"),
|
|
||||||
Genre("Mecha", "mecha"),
|
|
||||||
Genre("Medical", "medical"),
|
|
||||||
Genre("Military", "military"),
|
|
||||||
Genre("Mistery", "mistery"),
|
|
||||||
Genre("Music", "music"),
|
|
||||||
Genre("Mystery", "mystery"),
|
|
||||||
Genre("Project", "project"),
|
|
||||||
Genre("Psychological", "psychological"),
|
|
||||||
Genre("Reincarnation", "reincarnation"),
|
|
||||||
Genre("Romance", "romance"),
|
|
||||||
Genre("School", "school"),
|
|
||||||
Genre("School Life", "school-life"),
|
|
||||||
Genre("school of life", "school-of-life"),
|
|
||||||
Genre("Sci-fi", "sci-fi"),
|
|
||||||
Genre("Seinen", "seinen"),
|
|
||||||
Genre("sepernatural", "sepernatural"),
|
|
||||||
Genre("Shotacon", "shotacon"),
|
|
||||||
Genre("Shoujo", "shoujo"),
|
|
||||||
Genre("Shoujo Ai", "shoujo-ai"),
|
|
||||||
Genre("Shounen", "shounen"),
|
|
||||||
Genre("Shounen Ai", "shounen-ai"),
|
|
||||||
Genre("Slice of Life", "slice-of-life"),
|
|
||||||
Genre("Smut", "smut"),
|
|
||||||
Genre("Sports", "sports"),
|
|
||||||
Genre("Super Power", "super-power"),
|
|
||||||
Genre("Supernatural", "supernatural"),
|
|
||||||
Genre("Thriller", "thriller"),
|
|
||||||
Genre("Tragedy", "tragedy"),
|
|
||||||
Genre("Webtoons", "webtoons"),
|
|
||||||
Genre("Worn and Torn Newbie", "worn-and-torn-newbie"),
|
|
||||||
Genre("Yuri", "yuri")
|
|
||||||
)
|
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
|
||||||
Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
|
|
||||||
fun toUriPart() = vals[state].second
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
|
@ -1,12 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
ext {
|
|
||||||
extName = 'Manga Indo'
|
|
||||||
pkgNameSuffix = 'id.mangaindo'
|
|
||||||
extClass = '.MangaIndo'
|
|
||||||
extVersionCode = 1
|
|
||||||
libVersion = '1.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
|
Before Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 266 KiB |
|
@ -1,153 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.mangaindo
|
|
||||||
|
|
||||||
import com.github.salomonbrys.kotson.fromJson
|
|
||||||
import com.github.salomonbrys.kotson.get
|
|
||||||
import com.github.salomonbrys.kotson.int
|
|
||||||
import com.google.gson.Gson
|
|
||||||
import com.google.gson.JsonObject
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import okhttp3.Response
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class MangaIndo : ParsedHttpSource() {
|
|
||||||
|
|
||||||
override val name = "Manga Indo"
|
|
||||||
|
|
||||||
override val baseUrl = "https://mangaindo.web.id"
|
|
||||||
|
|
||||||
override val lang = "id"
|
|
||||||
|
|
||||||
override val supportsLatest = true
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient
|
|
||||||
|
|
||||||
private val gson = Gson()
|
|
||||||
|
|
||||||
// Popular
|
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/api/cpt/products/?limit=20&page=$page", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaParse(response: Response): MangasPage = searchMangaParse(response)
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
// Latest
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request {
|
|
||||||
return GET(baseUrl, headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesParse(response: Response): MangasPage {
|
|
||||||
return MangasPage(super.latestUpdatesParse(response).mangas.distinctBy { it.url }, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesSelector() = "li.rpwe-li a"
|
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
|
||||||
return SManga.create().apply {
|
|
||||||
title = element.text().substringBeforeLast("–").trim()
|
|
||||||
setUrlWithoutDomain(element.attr("href").substringBeforeLast("-indonesia"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector(): String? = null
|
|
||||||
|
|
||||||
// Search
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
return GET("$baseUrl/api/cpt/products/?limit=20&page=$page&post_title=$query", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaParse(response: Response): MangasPage {
|
|
||||||
return gson.fromJson<JsonObject>(response.body!!.string()).let { json ->
|
|
||||||
val mangas = json["data"].asJsonArray.map { data ->
|
|
||||||
SManga.create().apply {
|
|
||||||
title = data["post"]["post_title"].asString
|
|
||||||
url = "/${data["post"]["post_name"].asString}/"
|
|
||||||
thumbnail_url = data["acf"]["m-cover"]["value"].asString
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MangasPage(mangas, json["page"].int < json["total_page"].int && json["data"].asJsonArray.count() == 20)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
// Details
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
|
||||||
return document.select("div#main").let { info ->
|
|
||||||
SManga.create().apply {
|
|
||||||
title = info.select("h2").text()
|
|
||||||
author = info.select("span#m-author").text()
|
|
||||||
artist = info.select("span#m-artist").text()
|
|
||||||
status = info.select("span#m-status").text().toStatus()
|
|
||||||
genre = info.select("span#m-genre a").joinToString { it.text() }
|
|
||||||
description = info.select("span#m-synopsis").text()
|
|
||||||
thumbnail_url = info.select("div#m-cover img").attr("abs:src")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun String?.toStatus() = when {
|
|
||||||
this == null -> SManga.UNKNOWN
|
|
||||||
this.contains("Ongoing", ignoreCase = true) -> SManga.ONGOING
|
|
||||||
this.contains("Completed", ignoreCase = true) -> SManga.COMPLETED
|
|
||||||
else -> SManga.UNKNOWN
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chapters
|
|
||||||
|
|
||||||
override fun chapterListSelector() = "ul.lcp_catlist li"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
|
||||||
return SChapter.create().apply {
|
|
||||||
element.select("a").let {
|
|
||||||
name = it.text()
|
|
||||||
setUrlWithoutDomain(it.attr("href"))
|
|
||||||
}
|
|
||||||
date_upload = parseChapterDate(element.select("span").text())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseChapterDate(date: String): Long {
|
|
||||||
return try {
|
|
||||||
SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()).parse(date)?.time ?: 0L
|
|
||||||
} catch (e: Exception) {
|
|
||||||
0L
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pages
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
return document.select("div.entry-content img").mapIndexed { i, img ->
|
|
||||||
Page(i, "", img.attr("abs:src"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList()
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
|
@ -1,12 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
ext {
|
|
||||||
extName = 'Neumanga'
|
|
||||||
pkgNameSuffix = 'id.neumanga'
|
|
||||||
extClass = '.Neumanga'
|
|
||||||
extVersionCode = 3
|
|
||||||
libVersion = '1.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
|
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 65 KiB |
|
@ -1,251 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.neumanga
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|
||||||
import okhttp3.Request
|
|
||||||
import org.json.JSONArray
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import java.security.SecureRandom
|
|
||||||
import java.security.cert.X509Certificate
|
|
||||||
import javax.net.ssl.SSLContext
|
|
||||||
import javax.net.ssl.X509TrustManager
|
|
||||||
|
|
||||||
class Neumanga : ParsedHttpSource() {
|
|
||||||
|
|
||||||
override val name = "Neumanga"
|
|
||||||
|
|
||||||
override val baseUrl = "https://neumanga.tv"
|
|
||||||
|
|
||||||
override val lang = "id"
|
|
||||||
|
|
||||||
override val supportsLatest = true
|
|
||||||
|
|
||||||
private val trustManager = object : X509TrustManager {
|
|
||||||
override fun getAcceptedIssuers(): Array<X509Certificate> {
|
|
||||||
return emptyArray()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private val sslContext = SSLContext.getInstance("SSL").apply {
|
|
||||||
init(null, arrayOf(trustManager), SecureRandom())
|
|
||||||
}
|
|
||||||
|
|
||||||
override val client = super.client.newBuilder()
|
|
||||||
.sslSocketFactory(sslContext.socketFactory, trustManager)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div#gov-result div.bolx"
|
|
||||||
|
|
||||||
override fun latestUpdatesSelector() = "div#gov-result div.bolx"
|
|
||||||
|
|
||||||
override fun popularMangaRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/advanced_search?sortby=rating&advpage=$page", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request {
|
|
||||||
return GET("$baseUrl/advanced_search?sortby=latest&advpage=$page", headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun mangaFromElement(query: String, element: Element): SManga {
|
|
||||||
val manga = SManga.create()
|
|
||||||
element.select(query).first().let {
|
|
||||||
manga.setUrlWithoutDomain(it.attr("href"))
|
|
||||||
manga.title = it.text()
|
|
||||||
}
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
|
||||||
return mangaFromElement("h2 a", element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
|
||||||
return mangaFromElement("h2 a", element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = "div#gov-result ul.pagination li.active + li a"
|
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector() = "div#gov-result ul.pagination li.active + li a"
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
val url = "$baseUrl/advanced_search".toHttpUrlOrNull()!!.newBuilder()
|
|
||||||
.addQueryParameter("advpage", page.toString())
|
|
||||||
.addQueryParameter("name_search_mode", "contain")
|
|
||||||
.addQueryParameter("artist_search_mode", "contain")
|
|
||||||
.addQueryParameter("author_search_mode", "contain")
|
|
||||||
.addQueryParameter("year_search_mode", "on")
|
|
||||||
.addQueryParameter("rating_search_mode", "is")
|
|
||||||
.addQueryParameter("name_search_query", query)
|
|
||||||
|
|
||||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
|
||||||
when (filter) {
|
|
||||||
is Status -> url.addQueryParameter("manga_status", arrayOf("", "completed", "ongoing")[filter.state])
|
|
||||||
is GenreList -> {
|
|
||||||
val genreInclude = mutableListOf<String>()
|
|
||||||
val genreExclude = mutableListOf<String>()
|
|
||||||
filter.state.forEach {
|
|
||||||
if (it.state == 1) {
|
|
||||||
genreInclude.add(it.id)
|
|
||||||
} else if (it.state == 2) {
|
|
||||||
genreExclude.add(it.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
url.addQueryParameter("genre1", JSONArray(genreInclude).toString())
|
|
||||||
url.addQueryParameter("genre2", JSONArray(genreExclude).toString())
|
|
||||||
}
|
|
||||||
is SelectField -> url.addQueryParameter(filter.key, filter.values[filter.state])
|
|
||||||
is TextField -> url.addQueryParameter(filter.key, filter.state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GET(url.toString(), headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = "div#gov-result div.bolx"
|
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga {
|
|
||||||
return mangaFromElement("h2 a", element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector() = "div#gov-result ul.pagination li.active + li a"
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
|
||||||
val mangaInformationWrapper = document.select("#main .info").first()
|
|
||||||
|
|
||||||
val manga = SManga.create()
|
|
||||||
manga.author = mangaInformationWrapper.select("span a[href*=author_search_mode]").first().text()
|
|
||||||
manga.artist = mangaInformationWrapper.select("span a[href*=artist_search_mode]").first().text()
|
|
||||||
manga.genre = mangaInformationWrapper.select("a[href*=genre]").joinToString { it.text() }
|
|
||||||
manga.thumbnail_url = mangaInformationWrapper.select("img.imagemg").first().attr("src")
|
|
||||||
manga.description = document.select(".summary").first().textNodes()[1].toString()
|
|
||||||
manga.status = parseStatus(mangaInformationWrapper.select("span a[href*=manga_status]").first().text())
|
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseStatus(status: String) = when {
|
|
||||||
status.contains("ongoing") -> SManga.ONGOING
|
|
||||||
status.contains("completed") -> SManga.COMPLETED
|
|
||||||
else -> SManga.UNKNOWN
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector() = ".chapter .item:first-child .item-content a"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element): SChapter {
|
|
||||||
val chapter = SChapter.create()
|
|
||||||
chapter.setUrlWithoutDomain(element.attr("href") + "/1")
|
|
||||||
chapter.name = element.select("h3").text()
|
|
||||||
return chapter
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
val pages = mutableListOf<Page>()
|
|
||||||
document.select(".readnav select.page").first()?.getElementsByTag("option")?.forEach {
|
|
||||||
pages.add(Page(pages.size, it.attr("value")))
|
|
||||||
}
|
|
||||||
pages.getOrNull(0)?.imageUrl = imageUrlParse(document)
|
|
||||||
return pages
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document) = document.select(".readarea img.imagechap").attr("src")
|
|
||||||
|
|
||||||
private class Status : Filter.TriState("Completed")
|
|
||||||
private class TextField(name: String, val key: String) : Filter.Text(name)
|
|
||||||
private class Genre(name: String, val id: String = name) : Filter.TriState(name)
|
|
||||||
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
|
|
||||||
private class SelectField(name: String, val key: String, values: Array<String>, state: Int = 0) : Filter.Select<String>(name, values, state)
|
|
||||||
|
|
||||||
override fun getFilterList() = FilterList(
|
|
||||||
SelectField("Sort", "sortby", arrayOf("rating", "name", "views", "latest")),
|
|
||||||
TextField("Author", "author_search_query"),
|
|
||||||
TextField("Artist", "artist_search_query"),
|
|
||||||
TextField("Release Year", "year_value"),
|
|
||||||
Status(),
|
|
||||||
GenreList(getGenreList())
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun getGenreList() = listOf(
|
|
||||||
Genre("Adventure", "Adventure"),
|
|
||||||
Genre("Demons", "Demons"),
|
|
||||||
Genre("fighting", "fighting"),
|
|
||||||
Genre("Horor", "Horor"),
|
|
||||||
Genre("legend", "legend"),
|
|
||||||
Genre("Manhua", "Manhua"),
|
|
||||||
Genre("Mecha", "Mecha"),
|
|
||||||
Genre("Romance", "Romance"),
|
|
||||||
Genre("neco", "neco"),
|
|
||||||
Genre("Seinen", "Seinen"),
|
|
||||||
Genre("Slice Of Life", "Slice Of Life"),
|
|
||||||
Genre("Superhero", "Superhero"),
|
|
||||||
Genre("Tragedy", "Tragedy"),
|
|
||||||
Genre("Vampire", "Vampire"),
|
|
||||||
Genre("Supernatural", "Supernatural"),
|
|
||||||
Genre("Shoujo", "Shoujo"),
|
|
||||||
Genre("Smut", "Smut"),
|
|
||||||
Genre("School", "School"),
|
|
||||||
Genre("Oneshot", "Oneshot"),
|
|
||||||
Genre("Miatery", "Miatery"),
|
|
||||||
Genre("Manhwa", "Manhwa"),
|
|
||||||
Genre("live School", "live School"),
|
|
||||||
Genre("Horror", "Horror"),
|
|
||||||
Genre("Game", "Game"),
|
|
||||||
Genre("Antihero", "Antihero"),
|
|
||||||
Genre("Action", "Action"),
|
|
||||||
Genre("Comedy", "Comedy"),
|
|
||||||
Genre("Drama", "Drama"),
|
|
||||||
Genre("Ecchi", "Ecchi"),
|
|
||||||
Genre("Action. Adventure", "Action. Adventure"),
|
|
||||||
Genre("Gender Bender", "Gender Bender"),
|
|
||||||
Genre("Inaka", "Inaka"),
|
|
||||||
Genre("Lolicon", "Lolicon"),
|
|
||||||
Genre("Adult", "Adult"),
|
|
||||||
Genre("Cooking", "Cooking"),
|
|
||||||
Genre("Harem", "Harem"),
|
|
||||||
Genre("Isekai", "Isekai"),
|
|
||||||
Genre("Magic", "Magic"),
|
|
||||||
Genre("Music", "Music"),
|
|
||||||
Genre("Martial Arts", "Martial Arts"),
|
|
||||||
Genre("Project", "Project"),
|
|
||||||
Genre("sci fi", "sci fi"),
|
|
||||||
Genre("Shounen", "Shounen"),
|
|
||||||
Genre("Military", "Military"),
|
|
||||||
Genre("Martial Art", "Martial Art"),
|
|
||||||
Genre("Over Power", "Over Power"),
|
|
||||||
Genre("School Life", "School Life"),
|
|
||||||
Genre("Shoujo Ai", "Shoujo Ai"),
|
|
||||||
Genre("sport", "sport"),
|
|
||||||
Genre("Supranatural", "Supranatural"),
|
|
||||||
Genre("Webtoon", "Webtoon"),
|
|
||||||
Genre("Webtoons", "Webtoons"),
|
|
||||||
Genre("Suspense", "Suspense"),
|
|
||||||
Genre("Sports", "Sports"),
|
|
||||||
Genre("Yuri", "Yuri"),
|
|
||||||
Genre("Thriller", "Thriller"),
|
|
||||||
Genre("Super Power", "Super Power"),
|
|
||||||
Genre("ShounenS", "ShounenS"),
|
|
||||||
Genre("Sci-fi", "Sci-fi"),
|
|
||||||
Genre("Psychological", "Psychological"),
|
|
||||||
Genre("Mystery", "Mystery"),
|
|
||||||
Genre("Mature", "Mature"),
|
|
||||||
Genre("Manga", "Manga"),
|
|
||||||
Genre("Josei", "Josei"),
|
|
||||||
Genre("Historical", "Historical"),
|
|
||||||
Genre("Fantasy", "Fantasy"),
|
|
||||||
Genre("Dachima", "Dachima"),
|
|
||||||
Genre("Advanture", "Advanture"),
|
|
||||||
Genre("Echi", "Echi"),
|
|
||||||
Genre("4-Koma", "4-Koma")
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
|
@ -1,17 +0,0 @@
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
|
|
||||||
ext {
|
|
||||||
extName = 'Mundo Hentai'
|
|
||||||
pkgNameSuffix = 'pt.mundohentai'
|
|
||||||
extClass = '.MundoHentai'
|
|
||||||
extVersionCode = 2
|
|
||||||
libVersion = '1.2'
|
|
||||||
containsNsfw = true
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation project(':lib-ratelimit')
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
|
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 40 KiB |
|
@ -1,193 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.pt.mundohentai
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.annotations.Nsfw
|
|
||||||
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
@Nsfw
|
|
||||||
class MundoHentai : ParsedHttpSource() {
|
|
||||||
|
|
||||||
override val name = "Mundo Hentai"
|
|
||||||
|
|
||||||
override val baseUrl = "https://mundohentaioficial.com"
|
|
||||||
|
|
||||||
override val lang = "pt-BR"
|
|
||||||
|
|
||||||
override val supportsLatest = false
|
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.addInterceptor(RateLimitInterceptor(1, 1, TimeUnit.SECONDS))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
override fun headersBuilder(): Headers.Builder = Headers.Builder()
|
|
||||||
.add("User-Agent", USER_AGENT)
|
|
||||||
.add("Referer", baseUrl)
|
|
||||||
|
|
||||||
private fun genericMangaFromElement(element: Element): SManga =
|
|
||||||
SManga.create().apply {
|
|
||||||
title = element.select("div.menu a.title").text()
|
|
||||||
thumbnail_url = element.attr("style")
|
|
||||||
.substringAfter("url(\"")
|
|
||||||
.substringBefore("\")")
|
|
||||||
url = element.select("a.absolute").attr("href")
|
|
||||||
}
|
|
||||||
|
|
||||||
// The source does not have a popular list page, so we use the Doujin list instead.
|
|
||||||
override fun popularMangaRequest(page: Int): Request {
|
|
||||||
val newHeaders = headersBuilder()
|
|
||||||
.set("Referer", if (page == 1) baseUrl else "$baseUrl/tipo/doujin/${page - 1}")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val pageStr = if (page != 1) "/$page" else ""
|
|
||||||
return GET("$baseUrl/tipo/doujin$pageStr", newHeaders)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun popularMangaSelector(): String = "ul.post-list li div.card:has(a.absolute[href^=/])"
|
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga = genericMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun popularMangaNextPageSelector() = "div.buttons:not(:has(a.selected + a.material-icons))"
|
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
|
||||||
if (query.isNotEmpty()) {
|
|
||||||
val url = "$baseUrl/search".toHttpUrlOrNull()!!.newBuilder()
|
|
||||||
.addQueryParameter("q", query)
|
|
||||||
.toString()
|
|
||||||
|
|
||||||
return GET(url, headers)
|
|
||||||
}
|
|
||||||
|
|
||||||
val tagFilter = filters[1] as TagFilter
|
|
||||||
val tagSlug = tagFilter.values[tagFilter.state].slug
|
|
||||||
|
|
||||||
val newHeaders = headersBuilder()
|
|
||||||
.set("Referer", if (page == 1) "$baseUrl/categories" else "$baseUrl/tags/$tagSlug/${page - 1}")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val pageStr = if (page != 1) "/$page" else ""
|
|
||||||
return GET("$baseUrl/tags/$tagSlug$pageStr", newHeaders)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchMangaSelector() = popularMangaSelector() + ":not(:has(div.right-tape))"
|
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga = genericMangaFromElement(element)
|
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
|
||||||
val post = document.select("div.post")
|
|
||||||
|
|
||||||
return SManga.create().apply {
|
|
||||||
author = post.select("div.tags div.tag:contains(Artista:) a.value").text()
|
|
||||||
genre = post.select("div.tags div.tag:contains(Tags:) a.value").joinToString { it.text() }
|
|
||||||
description = post.select("div.tags div.tag:contains(Tipo:)").text()
|
|
||||||
.plus("\n" + post.select("div.tags div.tag:contains(Cor:)").text())
|
|
||||||
status = SManga.COMPLETED
|
|
||||||
thumbnail_url = post.select("div.cover img").attr("src")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun chapterListSelector(): String = "div.post header.data div.float-buttons a.read"
|
|
||||||
|
|
||||||
override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
|
|
||||||
name = "Capítulo"
|
|
||||||
scanlator = element.parent().parent()
|
|
||||||
.select("div.tags div.tag:contains(Tradutor:) a.value")
|
|
||||||
.text()
|
|
||||||
chapter_number = 1f
|
|
||||||
url = element.attr("href")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListRequest(chapter: SChapter): Request {
|
|
||||||
val newHeader = headersBuilder()
|
|
||||||
.set("Referer", "$baseUrl${chapter.url}".substringBeforeLast("/"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return GET(baseUrl + chapter.url, newHeader)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
|
||||||
return document.select("div.gallery > img")
|
|
||||||
.mapIndexed { i, el ->
|
|
||||||
Page(i, document.location(), el.attr("src"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document) = ""
|
|
||||||
|
|
||||||
override fun imageRequest(page: Page): Request {
|
|
||||||
val newHeaders = headersBuilder()
|
|
||||||
.set("Referer", page.url)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return GET(page.imageUrl!!, newHeaders)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getFilterList(): FilterList = FilterList(
|
|
||||||
Filter.Header("Os filtros são ignorados na busca!"),
|
|
||||||
TagFilter(getTags())
|
|
||||||
)
|
|
||||||
|
|
||||||
data class Tag(val name: String, val slug: String) {
|
|
||||||
override fun toString(): String = name
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TagFilter(tags: Array<Tag>) : Filter.Select<Tag>("Tag", tags)
|
|
||||||
|
|
||||||
private fun getTags(): Array<Tag> = arrayOf(
|
|
||||||
Tag("-- Selecione --", ""),
|
|
||||||
Tag("Ahegao", "ahegao"),
|
|
||||||
Tag("Anal", "anal"),
|
|
||||||
Tag("Biquíni", "biquini"),
|
|
||||||
Tag("Chubby", "chubby"),
|
|
||||||
Tag("Colegial", "colegial"),
|
|
||||||
Tag("Creampie", "creampie"),
|
|
||||||
Tag("Dark Skin", "dark-skin"),
|
|
||||||
Tag("Dupla Penetração", "dupla-penetracao"),
|
|
||||||
Tag("Espanhola", "espanhola"),
|
|
||||||
Tag("Exibicionismo", "exibicionismo"),
|
|
||||||
Tag("Footjob", "footjob"),
|
|
||||||
Tag("Furry", "furry"),
|
|
||||||
Tag("Futanari", "futanari"),
|
|
||||||
Tag("Grupal", "grupal"),
|
|
||||||
Tag("Incesto", "incesto"),
|
|
||||||
Tag("Lingerie", "lingerie"),
|
|
||||||
Tag("MILF", "milf"),
|
|
||||||
Tag("Maiô", "maio"),
|
|
||||||
Tag("Masturbação", "masturbacao"),
|
|
||||||
Tag("Netorare", "netorare"),
|
|
||||||
Tag("Oral", "oral"),
|
|
||||||
Tag("Peitinhos", "peitinhos"),
|
|
||||||
Tag("Preservativo", "preservativo"),
|
|
||||||
Tag("Professora", "professora"),
|
|
||||||
Tag("Sex Toys", "sex-toys"),
|
|
||||||
Tag("Tentáculos", "tentaculos"),
|
|
||||||
Tag("Yaoi", "yaoi")
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun latestUpdatesSelector(): String = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element): SManga = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector(): String = throw UnsupportedOperationException("Not used")
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
|
|
||||||
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"
|
|
||||||
}
|
|
||||||
}
|
|