Initial commit
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 15 KiB |
BIN
multisrc/overrides/zmanga/default/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 30 KiB |
BIN
multisrc/overrides/zmanga/hensekai/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 256 KiB |
9
multisrc/overrides/zmanga/hensekai/src/Hensekai.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package eu.kanade.tachiyomi.extension.id.hensekai
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class Hensekai : ZManga("Hensekai", "https://hensekai.com", "id", SimpleDateFormat("MMM d, yyyy", Locale("id"))) {
|
||||
override val hasProjectPage = true
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 15 KiB |
BIN
multisrc/overrides/zmanga/komikgan/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
10
multisrc/overrides/zmanga/komikgan/src/KomikGan.kt
Normal file
@@ -0,0 +1,10 @@
|
||||
package eu.kanade.tachiyomi.extension.id.komikgan
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class KomikGan : ZManga("KomikGan", "https://komikgan.com", "id", SimpleDateFormat("MMM d, yyyy", Locale("id"))) {
|
||||
|
||||
override val hasProjectPage = true
|
||||
}
|
||||
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 36 KiB |
BIN
multisrc/overrides/zmanga/komikindoinfo/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 239 KiB |
10
multisrc/overrides/zmanga/komikindoinfo/src/KomikIndoInfo.kt
Normal file
@@ -0,0 +1,10 @@
|
||||
package eu.kanade.tachiyomi.extension.id.komikindoinfo
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class KomikIndoInfo : ZManga("KomikIndo.info", "http://komikindo.info", "id", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("id"))) {
|
||||
|
||||
override val hasProjectPage = true
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 23 KiB |
BIN
multisrc/overrides/zmanga/komikita/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
160
multisrc/overrides/zmanga/komikita/src/Komikita.kt
Normal file
@@ -0,0 +1,160 @@
|
||||
package eu.kanade.tachiyomi.extension.id.komikita
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import okhttp3.Request
|
||||
import org.jsoup.nodes.Element
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class Komikita : ZManga(
|
||||
"Komikita",
|
||||
"https://komikita.org",
|
||||
"id",
|
||||
SimpleDateFormat("MMM d, yyyy", Locale("id")),
|
||||
) {
|
||||
override val hasProjectPage = true
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
return GET("$baseUrl/${pagePathSegment(page)}/?s")
|
||||
}
|
||||
|
||||
override fun latestUpdatesSelector() = "h2:contains(Latest) + .flexbox3 .flexbox3-item"
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request {
|
||||
return GET("$baseUrl/${pagePathSegment(page)}")
|
||||
}
|
||||
|
||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
||||
return SManga.create().apply {
|
||||
setUrlWithoutDomain(element.select("div.flexbox3-content a").attr("href"))
|
||||
title = element.select("div.flexbox3-content a").attr("title")
|
||||
thumbnail_url = element.select("img").attr("abs:src")
|
||||
}
|
||||
}
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
|
||||
url.addQueryParameter("s", query)
|
||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
||||
when (filter) {
|
||||
is GenreList -> {
|
||||
filter.state
|
||||
.filter { it.state }
|
||||
.forEach { url.addQueryParameter("genre[]", it.id) }
|
||||
}
|
||||
// if site has project page, default value "hasProjectPage" = false
|
||||
is ProjectFilter -> {
|
||||
if (filter.toUriPart() == "project-filter-on") {
|
||||
url =
|
||||
"$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
|
||||
}
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
return GET(url.toString(), headers)
|
||||
}
|
||||
|
||||
override fun getFilterList(): FilterList {
|
||||
val filters = mutableListOf<Filter<*>>(
|
||||
Filter.Header("NOTE: cant be used with multiple genre!"),
|
||||
GenreList(getGenreList()),
|
||||
)
|
||||
if (hasProjectPage) {
|
||||
filters.addAll(
|
||||
mutableListOf<Filter<*>>(
|
||||
Filter.Separator(),
|
||||
Filter.Header("NOTE: cant be used with other filter!"),
|
||||
Filter.Header("$name Project List page"),
|
||||
ProjectFilter(),
|
||||
),
|
||||
)
|
||||
}
|
||||
return FilterList(filters)
|
||||
}
|
||||
|
||||
private fun getGenreList() = listOf(
|
||||
Tag("4-koma", "4-Koma"),
|
||||
Tag("4-koma-comedy", "4-Koma Comedy"),
|
||||
Tag("action", "Action"),
|
||||
Tag("adult", "Adult"),
|
||||
Tag("adventure", "Adventure"),
|
||||
Tag("another-chance", "Another chance"),
|
||||
Tag("city", "City"),
|
||||
Tag("comedy", "Comedy"),
|
||||
Tag("completed", "Completed"),
|
||||
Tag("cooking", "Cooking"),
|
||||
Tag("demons", "Demons"),
|
||||
Tag("drama", "Drama"),
|
||||
Tag("ecchi", "Ecchi"),
|
||||
Tag("fantasy", "Fantasy"),
|
||||
Tag("full-color", "Full Color"),
|
||||
Tag("game", "Game"),
|
||||
Tag("gender-bender", "Gender bender"),
|
||||
Tag("gore", "Gore"),
|
||||
Tag("harem", "Harem"),
|
||||
Tag("historical", "Historical"),
|
||||
Tag("horror", "Horror"),
|
||||
Tag("isekai", "Isekai"),
|
||||
Tag("josei", "Josei"),
|
||||
Tag("kingdom", "Kingdom"),
|
||||
Tag("leveling", "Leveling"),
|
||||
Tag("loli", "Loli"),
|
||||
Tag("magic", "Magic"),
|
||||
Tag("manga", "Manga"),
|
||||
Tag("manhua", "Manhua"),
|
||||
Tag("manhwa", "Manhwa"),
|
||||
Tag("martial-arts", "Martial Arts"),
|
||||
Tag("mature", "Mature"),
|
||||
Tag("mecha", "Mecha"),
|
||||
Tag("medical", "Medical"),
|
||||
Tag("military", "Military"),
|
||||
Tag("monster", "Monster"),
|
||||
Tag("monsters", "Monsters"),
|
||||
Tag("monster-girls", "Monster Girls"),
|
||||
Tag("music", "Music"),
|
||||
Tag("mystery", "Mystery"),
|
||||
Tag("n-a", "N/A"),
|
||||
Tag("one-shot", "One Shot"),
|
||||
Tag("overpowered", "Overpowered"),
|
||||
Tag("parody", "Parody"),
|
||||
Tag("police", "Police"),
|
||||
Tag("post-apocalyptic", "Post Apocalyptic"),
|
||||
Tag("psychological", "Psychological"),
|
||||
Tag("reincarnation", "Reincarnation"),
|
||||
Tag("returned", "Returned"),
|
||||
Tag("returner", "Returner"),
|
||||
Tag("romance", "Romance"),
|
||||
Tag("school", "School"),
|
||||
Tag("school-life", "School Life"),
|
||||
Tag("sci-fi", "Sci-Fi"),
|
||||
Tag("socks", "Socks"),
|
||||
Tag("seinen", "Seinen"),
|
||||
Tag("shoujo", "Shoujo"),
|
||||
Tag("shoujo-ai", "Shoujo Ai"),
|
||||
Tag("shounen", "Shounen"),
|
||||
Tag("shounen-ai", "Shounen Ai"),
|
||||
Tag("slice-of-life", "Slice of Life"),
|
||||
Tag("smut", "Smut"),
|
||||
Tag("sports", "Sports"),
|
||||
Tag("super-power", "Super Power"),
|
||||
Tag("supernatural", "Supernatural"),
|
||||
Tag("survival", "Survival"),
|
||||
Tag("terror", "Terror"),
|
||||
Tag("thriller", "Thriller"),
|
||||
Tag("tragedy", "Tragedy"),
|
||||
Tag("vampire", "Vampire"),
|
||||
Tag("webtoons", "Webtoons"),
|
||||
Tag("yuri", "Yuri"),
|
||||
Tag("zombies", "Zombies"),
|
||||
)
|
||||
|
||||
private class Tag(val id: String, name: String) : Filter.CheckBox(name)
|
||||
|
||||
private class GenreList(genres: List<Tag>) : Filter.Group<Tag>("Genres", genres)
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
multisrc/overrides/zmanga/komikplay/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
58
multisrc/overrides/zmanga/komikplay/src/KomikPlay.kt
Normal file
@@ -0,0 +1,58 @@
|
||||
package eu.kanade.tachiyomi.extension.id.komikplay
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import okhttp3.Request
|
||||
import org.jsoup.nodes.Element
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class KomikPlay : ZManga("KomikPlay", "https://komikplay.com", "id", SimpleDateFormat("d MMM yyyy", Locale.US)) {
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
return GET("$baseUrl/${pagePathSegment(page)}/?s")
|
||||
}
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request {
|
||||
return GET("$baseUrl/${pagePathSegment(page)}")
|
||||
}
|
||||
|
||||
override fun latestUpdatesSelector() = "h2:contains(New) + .flexbox3 .flexbox3-item"
|
||||
|
||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
||||
return SManga.create().apply {
|
||||
setUrlWithoutDomain(element.select("div.flexbox3-content a").attr("href"))
|
||||
title = element.select("div.flexbox3-content a").attr("title")
|
||||
thumbnail_url = element.select("img").attr("abs:src")
|
||||
}
|
||||
}
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
|
||||
url.addQueryParameter("s", query)
|
||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
||||
when (filter) {
|
||||
// if site has project page, default value "hasProjectPage" = false
|
||||
is ProjectFilter -> {
|
||||
if (filter.toUriPart() == "project-filter-on") {
|
||||
url = "$baseUrl$projectPageString/page/$page".toHttpUrlOrNull()!!.newBuilder()
|
||||
}
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
return GET(url.toString(), headers)
|
||||
}
|
||||
|
||||
override fun getFilterList() = FilterList(
|
||||
Filter.Header("NOTE: cant be used with other filter!"),
|
||||
Filter.Header("$name Project List page"),
|
||||
ProjectFilter(),
|
||||
)
|
||||
|
||||
override val hasProjectPage = true
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
BIN
multisrc/overrides/zmanga/maidmanga/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
9
multisrc/overrides/zmanga/maidmanga/src/MaidManga.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package eu.kanade.tachiyomi.extension.id.maidmanga
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class MaidManga : ZManga("Maid - Manga", "https://www.maid.my.id", "id", SimpleDateFormat("MMM d, yyyy", Locale("id"))) {
|
||||
override val hasProjectPage = true
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 30 KiB |
BIN
multisrc/overrides/zmanga/neumanga/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 188 KiB |
12
multisrc/overrides/zmanga/neumanga/src/Neumanga.kt
Normal file
@@ -0,0 +1,12 @@
|
||||
package eu.kanade.tachiyomi.extension.id.neumanga
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import okhttp3.Headers
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class Neumanga : ZManga("Neumanga", "https://neumanga.net", "id", SimpleDateFormat("MMMM dd, yyyy", Locale("id"))) {
|
||||
|
||||
override fun headersBuilder(): Headers.Builder = Headers.Builder()
|
||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 17 KiB |
BIN
multisrc/overrides/zmanga/sektekomik/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
101
multisrc/overrides/zmanga/sektekomik/src/SekteKomik.kt
Normal file
@@ -0,0 +1,101 @@
|
||||
package eu.kanade.tachiyomi.extension.id.sektekomik
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
import eu.kanade.tachiyomi.source.model.FilterList
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import org.jsoup.nodes.Element
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class SekteKomik : ZManga("Sekte Komik", "https://sektekomik.com", "id") {
|
||||
// Formerly "Sekte Komik (WP Manga Stream)"
|
||||
override val id = 7866629035053218469
|
||||
|
||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||
.connectTimeout(10, TimeUnit.SECONDS)
|
||||
.readTimeout(30, TimeUnit.SECONDS)
|
||||
.rateLimit(3)
|
||||
.build()
|
||||
|
||||
// popular
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
return GET("$baseUrl")
|
||||
}
|
||||
|
||||
override fun popularMangaSelector() = "div.flexbox-item"
|
||||
|
||||
override fun popularMangaFromElement(element: Element): SManga {
|
||||
return SManga.create().apply {
|
||||
setUrlWithoutDomain(element.select("a").attr("href"))
|
||||
title = element.select("a").attr("title")
|
||||
thumbnail_url = element.select("img").attr("abs:src")
|
||||
}
|
||||
}
|
||||
|
||||
override fun popularMangaNextPageSelector() = "Not used"
|
||||
|
||||
// latest
|
||||
override fun latestUpdatesRequest(page: Int): Request {
|
||||
return GET("$baseUrl/page/$page")
|
||||
}
|
||||
|
||||
override fun latestUpdatesSelector() = "div.flexbox4-item"
|
||||
|
||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
||||
return SManga.create().apply {
|
||||
setUrlWithoutDomain(element.select("div.flexbox4-content a").attr("href"))
|
||||
title = element.select("div.flexbox4-side .title").first()!!.text()
|
||||
thumbnail_url = element.select("img").attr("abs:src")
|
||||
}
|
||||
}
|
||||
|
||||
override fun latestUpdatesNextPageSelector() = "div.pagination .next"
|
||||
|
||||
// search
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
var url = "$baseUrl/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
|
||||
url.addQueryParameter("s", query)
|
||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
||||
when (filter) {
|
||||
// if site has project page, default value "hasProjectPage" = false
|
||||
is ProjectFilter -> {
|
||||
if (filter.toUriPart() == "project-filter-on") {
|
||||
url = "$baseUrl$projectPageString/${pagePathSegment(page)}".toHttpUrlOrNull()!!.newBuilder()
|
||||
}
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
return GET(url.toString(), headers)
|
||||
}
|
||||
|
||||
override fun searchMangaSelector() = "div.flexbox2-item"
|
||||
|
||||
override fun searchMangaFromElement(element: Element): SManga {
|
||||
return SManga.create().apply {
|
||||
setUrlWithoutDomain(element.select("div.flexbox2-content a").attr("href"))
|
||||
title = element.select("div.flexbox2-title > span").first()!!.text()
|
||||
thumbnail_url = element.select("img").attr("abs:src")
|
||||
}
|
||||
}
|
||||
|
||||
override fun searchMangaNextPageSelector() = latestUpdatesNextPageSelector()
|
||||
|
||||
// filter
|
||||
override val hasProjectPage = true
|
||||
|
||||
override fun getFilterList(): FilterList {
|
||||
val filters = mutableListOf<Filter<*>>(
|
||||
Filter.Separator(),
|
||||
Filter.Header("NOTE: cant be used with search!"),
|
||||
Filter.Header("$name Project List page"),
|
||||
ProjectFilter(),
|
||||
)
|
||||
return FilterList(filters)
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
BIN
multisrc/overrides/zmanga/shirodoujin/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
9
multisrc/overrides/zmanga/shirodoujin/src/Shirodoujin.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package eu.kanade.tachiyomi.extension.id.shirodoujin
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zmanga.ZManga
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class Shirodoujin : ZManga("Shiro Doujin", "https://shirodoujin.com", "id", SimpleDateFormat("MMM d, yyyy", Locale("id"))) {
|
||||
override val hasProjectPage = true
|
||||
}
|
||||