Initial commit
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
multisrc/overrides/zeistmanga/animexnovel/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
41
multisrc/overrides/zeistmanga/animexnovel/src/AnimeXNovel.kt
Normal file
@@ -0,0 +1,41 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.animexnovel
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||
import eu.kanade.tachiyomi.source.model.SChapter
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
import okhttp3.Response
|
||||
|
||||
class AnimeXNovel : ZeistManga("AnimeXNovel", "https://www.animexnovel.com", "pt-BR") {
|
||||
|
||||
override val mangaCategory: String = "Manga"
|
||||
|
||||
override fun popularMangaParse(response: Response): MangasPage {
|
||||
val document = response.asJsoup()
|
||||
val mangas = document.select("div.PopularPosts div.grid > figure").map { element ->
|
||||
SManga.create().apply {
|
||||
thumbnail_url = element.selectFirst("img")!!.attr("abs:src")
|
||||
title = element.selectFirst("figcaption > a")!!.text()
|
||||
setUrlWithoutDomain(element.selectFirst("figcaption > a")!!.attr("href"))
|
||||
}
|
||||
}.filter { it.title.contains("[Mangá]") }
|
||||
|
||||
return MangasPage(mangas, false)
|
||||
}
|
||||
|
||||
override val mangaDetailsSelectorDescription = "div.bc-fff.s1 > h3:contains(Sinopse) ~ div[style=text-align: justify;]"
|
||||
|
||||
private val chapterListSelector = "div:has(> .list-judul:contains(Lista de Capítulos)) div#latest ul > li, div.tab:has(> label:contains(Lista de Capítulos)) div.tab-content ul > li"
|
||||
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
val document = response.asJsoup()
|
||||
val chapters = document.select(chapterListSelector)
|
||||
return chapters.map {
|
||||
SChapter.create().apply {
|
||||
name = it.select("a").text()
|
||||
setUrlWithoutDomain(it.select("a").attr("href"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 18 KiB |
BIN
multisrc/overrides/zeistmanga/asupankomik/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
@@ -0,0 +1,8 @@
|
||||
package eu.kanade.tachiyomi.extension.id.asupankomik
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
|
||||
class AsupanKomik : ZeistManga("Asupan Komik", "https://www.asupankomik.my.id", "id") {
|
||||
override val hasFilters = true
|
||||
override val pageListSelector = "div.check-box"
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 91 KiB |
@@ -0,0 +1,7 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.guildatierdraw
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
|
||||
class GuildaTierDraw : ZeistManga("Guilda Tier Draw", "https://www.guildatierdraw.com", "pt-BR") {
|
||||
override val mangaDetailsSelectorDescription = "#Sinopse"
|
||||
}
|
||||
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 36 KiB |
BIN
multisrc/overrides/zeistmanga/hijala/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 246 KiB |
57
multisrc/overrides/zeistmanga/hijala/src/Hijala.kt
Normal file
@@ -0,0 +1,57 @@
|
||||
package eu.kanade.tachiyomi.extension.ar.hijala
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
|
||||
class Hijala : ZeistManga("Hijala", "https://hijala.blogspot.com", "ar") {
|
||||
|
||||
override val hasFilters = true
|
||||
override val hasLanguageFilter = false
|
||||
|
||||
override val supportsLatest = false
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request = latestUpdatesRequest(page)
|
||||
override fun popularMangaParse(response: Response): MangasPage = latestUpdatesParse(response)
|
||||
|
||||
override fun getGenreList(): List<Genre> = listOf(
|
||||
Genre("أكشن", "Action"),
|
||||
Genre("أثارة", "Thriller"),
|
||||
Genre("أتشي", "Ecchi"),
|
||||
Genre("حياة مدرسية", "School Life"),
|
||||
Genre("تاريخي", "Historical"),
|
||||
Genre("ألعاب", "Game"),
|
||||
Genre("خيال علمي", "Sci-Fi"),
|
||||
Genre("خيال", "Fantasy"),
|
||||
Genre("خارق للطبيعة", "Supernatural"),
|
||||
Genre("رومانسي", "Romance"),
|
||||
Genre("رعب", "Horror"),
|
||||
Genre("دراما", "Drama"),
|
||||
Genre("سينين", "Seinen"),
|
||||
Genre("سحري", "Magic"),
|
||||
Genre("رياضي", "Sports"),
|
||||
Genre("شونين", "Shounen"),
|
||||
Genre("شوجو", "Shoujo"),
|
||||
Genre("شريحة من الحياة", "Slice of Life"),
|
||||
Genre("علاجي", "Medical"),
|
||||
Genre("عسكري", "Military"),
|
||||
Genre("طبخ", "Cooking"),
|
||||
Genre("فنون قتال", "Martial Arts"),
|
||||
Genre("غموض", "Mystery"),
|
||||
Genre("عوالم متعددة", "Isekai"),
|
||||
Genre("مانها", "مانها"),
|
||||
Genre("مأساوي", "Tragedy"),
|
||||
Genre("كوميديا", "Comedy"),
|
||||
Genre("مغامرات", "Adventure"),
|
||||
Genre("مصاص دماء", "مصاص دماء"),
|
||||
Genre("مانهوا", "مانهوا"),
|
||||
Genre("موسيقي", "موسيقي"),
|
||||
Genre("موسيقى", "Music"),
|
||||
Genre("مغامرات", "مغامرات"),
|
||||
Genre("نفسي", "نفسي"),
|
||||
Genre("نفسي", "Psychological"),
|
||||
Genre("ميكا", "ميكا"),
|
||||
)
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 20 KiB |
BIN
multisrc/overrides/zeistmanga/klmanhua/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
9
multisrc/overrides/zeistmanga/klmanhua/src/KLManhua.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package eu.kanade.tachiyomi.extension.id.klmanhua
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
|
||||
class KLManhua : ZeistManga("KLManhua", "https://klmanhua.blogspot.com", "id") {
|
||||
|
||||
override val hasFilters = true
|
||||
override val hasLanguageFilter = false
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 15 KiB |
BIN
multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
146
multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt
Normal file
@@ -0,0 +1,146 @@
|
||||
package eu.kanade.tachiyomi.extension.id.komikrealm
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Status
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Type
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaDto
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaIntl
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
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.util.asJsoup
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
|
||||
class KomikRealm : ZeistManga(
|
||||
"KomikRealm",
|
||||
"https://www.komikrealm.my.id",
|
||||
"id",
|
||||
) {
|
||||
private val json: Json by injectLazy()
|
||||
|
||||
override val hasFilters = true
|
||||
|
||||
override val hasLanguageFilter = false
|
||||
|
||||
override val chapterCategory = ""
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
val url = apiUrl("Project")
|
||||
.addQueryParameter("orderby", "updated")
|
||||
.addQueryParameter("max-results", "12")
|
||||
.build()
|
||||
|
||||
return GET(url, headers)
|
||||
}
|
||||
|
||||
override fun popularMangaParse(response: Response): MangasPage {
|
||||
val jsonString = response.body.string()
|
||||
val result = json.decodeFromString<ZeistMangaDto>(jsonString)
|
||||
|
||||
val mangas = result.feed?.entry.orEmpty()
|
||||
.filter { it.category.orEmpty().any { category -> category.term == "Series" } }
|
||||
.filter { !it.category.orEmpty().any { category -> category.term == "Anime" } }
|
||||
.map { it.toSManga(baseUrl) }
|
||||
|
||||
return MangasPage(mangas, false)
|
||||
}
|
||||
|
||||
override fun mangaDetailsParse(response: Response): SManga {
|
||||
val document = response.asJsoup()
|
||||
val profileManga = document.select(".bigcontent")
|
||||
val infoManga = profileManga.select("ul.infonime li")
|
||||
|
||||
return SManga.create().apply {
|
||||
thumbnail_url = profileManga.select("img").first()!!.attr("data-src")
|
||||
description = profileManga.select(".sinoposis").text()
|
||||
genre = profileManga.select("div.info-genre > a[rel=tag]")
|
||||
.joinToString { it.text() }
|
||||
|
||||
infoManga.forEach {
|
||||
val title = it.select("b").text()
|
||||
val desc = it.select("span").text()
|
||||
|
||||
when (title) {
|
||||
"Status" -> status = parseStatus(desc)
|
||||
"Author" -> author = desc
|
||||
"Artist" -> artist = desc
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
val document = response.asJsoup()
|
||||
|
||||
val url = getChapterFeedUrl(document)
|
||||
|
||||
val req = GET(url, headers)
|
||||
val res = client.newCall(req).execute()
|
||||
|
||||
val jsonString = res.body.string()
|
||||
val result = json.decodeFromString<ZeistMangaDto>(jsonString)
|
||||
|
||||
return result.feed?.entry
|
||||
?.filter {
|
||||
!it.category.orEmpty().any { category ->
|
||||
category.term == "Series"
|
||||
}
|
||||
}
|
||||
?.map { it.toSChapter(baseUrl) }
|
||||
?: throw Exception("Failed to parse from chapter API")
|
||||
}
|
||||
|
||||
private val imagePageRegex = """(http|https)://[^"]+""".toRegex()
|
||||
|
||||
override fun pageListParse(response: Response): List<Page> {
|
||||
val document = response.asJsoup()
|
||||
val script = document.select(".post-body > script").html()
|
||||
val matches = imagePageRegex.findAll(script)
|
||||
return matches.mapIndexed { i, match ->
|
||||
Page(i, "", match.value)
|
||||
}.toList()
|
||||
}
|
||||
|
||||
private val labelChapterRegex = """var label_chapter = "([^"]+)";""".toRegex()
|
||||
|
||||
override fun getChapterFeedUrl(doc: Document): String {
|
||||
val script = doc.select(".post-body > script")
|
||||
val feed = labelChapterRegex.find(script.html())
|
||||
?.groupValues?.get(1)
|
||||
?: throw Exception("Failed to find chapter feed")
|
||||
|
||||
return apiUrl(chapterCategory)
|
||||
.addPathSegments(feed)
|
||||
.addQueryParameter("max-results", "999999")
|
||||
.build().toString()
|
||||
}
|
||||
|
||||
private val intl by lazy { ZeistMangaIntl(lang) }
|
||||
|
||||
override fun getStatusList(): List<Status> = listOf(
|
||||
Status(intl.all, ""),
|
||||
Status(intl.statusOngoing, "Ongoing"),
|
||||
Status(intl.statusCompleted, "Completed"),
|
||||
)
|
||||
|
||||
override fun getTypeList(): List<Type> = listOf(
|
||||
Type(intl.all, ""),
|
||||
Type(intl.typeManga, "Manga"),
|
||||
Type(intl.typeManhua, "Manhua"),
|
||||
Type(intl.typeManhwa, "Manhwa"),
|
||||
)
|
||||
|
||||
override fun getGenreList(): List<Genre> = listOf(
|
||||
Genre("Drama", "Drama"),
|
||||
Genre("Mature", "Mature"),
|
||||
Genre("Supernatural", "Supernatural"),
|
||||
)
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 18 KiB |
11
multisrc/overrides/zeistmanga/ler999/src/Ler999.kt
Normal file
@@ -0,0 +1,11 @@
|
||||
package eu.kanade.tachiyomi.extension.pt.ler999
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class Ler999 : ZeistManga("Ler 999", "https://ler999.blogspot.com", "pt-BR") {
|
||||
override val client = super.client.newBuilder()
|
||||
.rateLimit(1, 2, TimeUnit.SECONDS)
|
||||
.build()
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 16 KiB |
BIN
multisrc/overrides/zeistmanga/mangaailand/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
33
multisrc/overrides/zeistmanga/mangaailand/src/MangaAiLand.kt
Normal file
@@ -0,0 +1,33 @@
|
||||
package eu.kanade.tachiyomi.extension.ar.mangaailand
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
|
||||
class MangaAiLand : ZeistManga("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar") {
|
||||
|
||||
override val hasFilters = true
|
||||
override val hasLanguageFilter = false
|
||||
|
||||
override val chapterCategory = "فصل"
|
||||
|
||||
override fun getGenreList(): List<Genre> = listOf(
|
||||
Genre("تراجيدي", "تراجيدي"),
|
||||
Genre("تاريخي", "تاريخي"),
|
||||
Genre("أكشن", "أكشن"),
|
||||
Genre("خيالي", "خيالي"),
|
||||
Genre("جيشي", "جيشي"),
|
||||
Genre("تشويق", "تشويق"),
|
||||
Genre("سينين", "سينين"),
|
||||
Genre("سحري", "سحري"),
|
||||
Genre("دراما", "دراما"),
|
||||
Genre("عصابات", "عصابات"),
|
||||
Genre("عسكري", "عسكري"),
|
||||
Genre("شونين", "شونين"),
|
||||
Genre("مغامرة", "مغامرة"),
|
||||
Genre("فنون قتالية", "فنون قتالية"),
|
||||
Genre("غموض", "غموض"),
|
||||
Genre("وحوش", "وحوش"),
|
||||
Genre("نجاة", "نجاة"),
|
||||
Genre("نفسي", "نفسي"),
|
||||
)
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 19 KiB |
BIN
multisrc/overrides/zeistmanga/mangasoul/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
7
multisrc/overrides/zeistmanga/mangasoul/src/MangaSoul.kt
Normal file
@@ -0,0 +1,7 @@
|
||||
package eu.kanade.tachiyomi.extension.ar.mangasoul
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
|
||||
class MangaSoul : ZeistManga("Manga Soul", "https://www.manga-soul.com", "ar") {
|
||||
override val mangaDetailsSelectorInfo = ".y6x11p, .y6x11p > b > span"
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
multisrc/overrides/zeistmanga/mikoroku/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
86
multisrc/overrides/zeistmanga/mikoroku/src/MikoRoku.kt
Normal file
@@ -0,0 +1,86 @@
|
||||
package eu.kanade.tachiyomi.extension.id.mikoroku
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Status
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Element
|
||||
|
||||
class MikoRoku : ZeistManga("MikoRoku", "https://www.mikoroku.web.id", "id") {
|
||||
|
||||
// ============================== Popular ===============================
|
||||
override val popularMangaSelector = "div.PopularPosts article"
|
||||
override val popularMangaSelectorTitle = ".post-title a"
|
||||
override val popularMangaSelectorUrl = ".post-title a"
|
||||
|
||||
// ============================== Filters ===============================
|
||||
override val hasFilters = true
|
||||
|
||||
// The source actually has both, but they return no result, so its useless.
|
||||
override val hasLanguageFilter = false
|
||||
override val hasTypeFilter = false
|
||||
|
||||
override fun getStatusList() = listOf(
|
||||
Status("Semua", ""),
|
||||
Status("Ongoing", "Ongoing"),
|
||||
Status("Completed", "Completed"),
|
||||
)
|
||||
|
||||
override fun getGenreList() = listOf(
|
||||
Genre("Action", "Action"),
|
||||
Genre("Adventure", "Adventure"),
|
||||
Genre("Comedy", "Comedy"),
|
||||
Genre("Dark Fantasy", "Dark Fantasy"),
|
||||
Genre("Drama", "Drama"),
|
||||
Genre("Fantasy", "Fantasy"),
|
||||
Genre("Harem", "H4rem"),
|
||||
Genre("Historical", "Historical"),
|
||||
Genre("Horror", "Horror"),
|
||||
Genre("Isekai", "Isekai"),
|
||||
Genre("Magic", "Magic"),
|
||||
Genre("Mecha", "Mecha"),
|
||||
Genre("Military", "Military"),
|
||||
Genre("Monsters", "Monsters"),
|
||||
Genre("Mystery", "Mystery"),
|
||||
Genre("Psychological", "Psychological"),
|
||||
Genre("Romance", "Romance"),
|
||||
Genre("School Life", "School Life"),
|
||||
Genre("Sci-Fi", "Sci-Fi"),
|
||||
Genre("Seinen", "Seinen"),
|
||||
Genre("Shounen", "Shounen"),
|
||||
Genre("Slice of Life", "Slice of Life"),
|
||||
Genre("Supernatural", "Supernatural"),
|
||||
Genre("Survival", "Survival"),
|
||||
Genre("Tragedy", "Tragedy"),
|
||||
)
|
||||
|
||||
// =========================== Manga Details ============================
|
||||
override val mangaDetailsSelector = "div.section#main div.widget:has(main)"
|
||||
override val mangaDetailsSelectorGenres = "dl > dd > a[rel=tag]"
|
||||
|
||||
override fun mangaDetailsParse(response: Response): SManga {
|
||||
val document = response.use { it.asJsoup() }
|
||||
val profileManga = document.selectFirst(mangaDetailsSelector)!!
|
||||
return SManga.create().apply {
|
||||
with(profileManga) {
|
||||
thumbnail_url = selectFirst("img")?.absUrl("src")
|
||||
description = document.select(mangaDetailsSelectorDescription).text()
|
||||
genre = select(mangaDetailsSelectorGenres).eachText().joinToString()
|
||||
status = parseStatus(selectFirst("span[data-status]")?.text().orEmpty())
|
||||
author = getInfo("Author")
|
||||
artist = getInfo("Artist")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Element.getInfo(text: String): String? =
|
||||
selectFirst("$mangaDetailsSelectorInfo:containsOwn($text) > $mangaDetailsSelectorInfoDescription")
|
||||
?.text()
|
||||
?.trim()
|
||||
|
||||
// =============================== Pages ================================
|
||||
// Specific/faster selection first, generic/slower last
|
||||
override val pageListSelector = "article#reader div.separator a, article#reader"
|
||||
}
|
||||
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 216 KiB |
@@ -0,0 +1,22 @@
|
||||
package eu.kanade.tachiyomi.extension.tr.mikrokosmosfansub
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
import okhttp3.Response
|
||||
import org.jsoup.Jsoup
|
||||
|
||||
class MikrokosmosFansub : ZeistManga("Mikrokosmos Fansub", "https://mikrokosmosfb.blogspot.com", "tr") {
|
||||
|
||||
override val pageListSelector = "div.check-box > script"
|
||||
|
||||
override fun pageListParse(response: Response): List<Page> {
|
||||
val document = response.asJsoup()
|
||||
val script = document.select(pageListSelector)
|
||||
val content = script.html().substringAfter("const content = `").substringBefore("`;")
|
||||
val images = Jsoup.parse(content).select("a")
|
||||
return images.select("img[src]").mapIndexed { i, img ->
|
||||
Page(i, "", img.attr("abs:src"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,28 @@
|
||||
package eu.kanade.tachiyomi.extension.tr.shadowceviri
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
import okhttp3.Response
|
||||
|
||||
class ShadowCeviri : ZeistManga("Shadow Çeviri", "https://shadowceviri.blogspot.com", "tr") {
|
||||
|
||||
// ============================== Popular ===============================
|
||||
override fun popularMangaParse(response: Response): MangasPage {
|
||||
val document = response.use { it.asJsoup() }
|
||||
val mangas = document.select("ul.gallery > li.bg").map { element ->
|
||||
SManga.create().apply {
|
||||
thumbnail_url = element.attr("style").substringAfter('(').substringBefore(')')
|
||||
title = element.selectFirst("h3")?.text() ?: "Manga"
|
||||
// NPE my beloved
|
||||
setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
|
||||
}
|
||||
}
|
||||
return MangasPage(mangas, false)
|
||||
}
|
||||
|
||||
// ============================== Chapters ==============================
|
||||
override val useOldChapterFeed = true
|
||||
override val chapterCategory = "Bölüm"
|
||||
}
|
||||
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 27 KiB |
BIN
multisrc/overrides/zeistmanga/shiyurasub/res/web_hi_res_512.png
Normal file
|
After Width: | Height: | Size: 172 KiB |