Remove dead sources (#9811)
* Remove CAT-translator * Remove Jellyring * Remove ManWe * Remove Yetiskin Ruya Manga * Remove Mugi Manga * Remove Deccal Scans * Remove FactManga * Remove Komikuzan * Remove MangaKazani * Remove Manga One Love * Remove Free Manhwa * Remove Minda Fansub * Remove SeriManga * Remove ScamberTraslator * Remove Arabs Doujin * Remove DragonManga * Remove KomikRealm * Remove Magerin * Remove YonaBar * Remove Manga Raw.org * Remove MangaKomi * Remove DMC Scans * Remove Disaster Scans
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Arabs Doujin'
|
||||
extClass = '.ArabsDoujin'
|
||||
themePkg = 'zeistmanga'
|
||||
baseUrl = 'https://www.arabsdoujin.online'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 21 KiB |
@ -1,12 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.ar.arabsdoujin
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
|
||||
class ArabsDoujin : ZeistManga("Arabs Doujin", "https://www.arabsdoujin.online", "ar") {
|
||||
override val client = super.client.newBuilder()
|
||||
.rateLimit(3)
|
||||
.build()
|
||||
|
||||
override val pageListSelector = "div.check-box"
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'YonaBar'
|
||||
extClass = '.YonaBar'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://yonabar.xyz'
|
||||
overrideVersionCode = 3
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 23 KiB |
@ -1,19 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.ar.yonabar
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class YonaBar : Madara(
|
||||
"YonaBar",
|
||||
"https://yonabar.xyz",
|
||||
"ar",
|
||||
SimpleDateFormat("MMM dd, yyyy", Locale("ar")),
|
||||
) {
|
||||
override val client = super.client.newBuilder()
|
||||
.rateLimit(3)
|
||||
.build()
|
||||
|
||||
override val mangaSubString = "yaoi"
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
ext {
|
||||
extName = 'Disaster Scans'
|
||||
extClass = '.DisasterScans'
|
||||
extVersionCode = 34
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 39 KiB |
@ -1,129 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.en.disasterscans
|
||||
|
||||
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 eu.kanade.tachiyomi.util.asJsoup
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
import rx.Observable
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class DisasterScans : ParsedHttpSource() {
|
||||
|
||||
override val name = "Disaster Scans"
|
||||
override val lang = "en"
|
||||
override val versionId = 3
|
||||
override val baseUrl = "https://disasterscans.com"
|
||||
override val supportsLatest = true
|
||||
|
||||
private val dateFormat: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US)
|
||||
private val json by injectLazy<Json>()
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request =
|
||||
GET("$baseUrl/home", headers)
|
||||
|
||||
override fun latestUpdatesRequest(page: Int) =
|
||||
popularMangaRequest(page)
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request =
|
||||
GET("$baseUrl/comics", headers)
|
||||
|
||||
override fun popularMangaSelector(): String = "div:has(span:contains(POPULAR)) + section a:has(img)"
|
||||
|
||||
override fun latestUpdatesSelector(): String = "div:has(span:contains(LATEST)) + section a:has(img)"
|
||||
|
||||
override fun searchMangaSelector(): String = ".grid a"
|
||||
|
||||
private fun mangaFromElement(element: Element): SManga = SManga.create().apply {
|
||||
setUrlWithoutDomain(element.absUrl("href"))
|
||||
thumbnail_url = element.selectFirst("img")?.absUrl("src")
|
||||
}
|
||||
|
||||
override fun popularMangaFromElement(element: Element): SManga = mangaFromElement(element).apply {
|
||||
title = element.selectFirst("h5")!!.text()
|
||||
}
|
||||
|
||||
override fun latestUpdatesFromElement(element: Element): SManga = mangaFromElement(element).apply {
|
||||
title = element.parent()?.selectFirst("div a")!!.text()
|
||||
}
|
||||
|
||||
override fun searchMangaFromElement(element: Element): SManga = mangaFromElement(element).apply {
|
||||
title = element.selectFirst("h1")!!.text()
|
||||
}
|
||||
|
||||
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
|
||||
val response = client.newCall(searchMangaRequest(page, query, filters)).execute()
|
||||
val mangaList = response.asJsoup().select(searchMangaSelector())
|
||||
.map { searchMangaFromElement(it) }
|
||||
.filter { it.title.lowercase().contains(query.lowercase()) }
|
||||
return Observable.just(MangasPage(mangaList, false))
|
||||
}
|
||||
|
||||
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
|
||||
author = document.selectFirst("span:contains(Author) + span")!!.text()
|
||||
|
||||
document.selectFirst("section div div")?.children()?.also { infoRows ->
|
||||
infoRows[0].selectFirst("h1")?.text()?.let { title = it }
|
||||
description = infoRows[2].text()
|
||||
|
||||
with(infoRows[1].select("span")) {
|
||||
status = when (this.removeAt(0)?.text()?.lowercase()) {
|
||||
"ongoing" -> SManga.ONGOING
|
||||
else -> SManga.UNKNOWN
|
||||
}
|
||||
genre = this.joinToString { it.text() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
class ChapterDTO(val chapterID: Int, val ChapterNumber: String, val ChapterName: String, val chapterDate: String)
|
||||
private val chapterDataRegex = Regex("""\\"chapters\\":(\[.*]),\\"param\\":\\"(\S+)\\"\}""")
|
||||
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
chapterDataRegex.find(response.body.string())?.destructured?.also { (chapterData, mangaId) ->
|
||||
return json.decodeFromString<List<ChapterDTO>>(chapterData.replace("\\", "")).map { chapter ->
|
||||
SChapter.create().apply {
|
||||
name = "Chapter ${chapter.ChapterNumber} - ${chapter.ChapterName}"
|
||||
setUrlWithoutDomain(
|
||||
baseUrl.toHttpUrl().newBuilder().apply {
|
||||
addPathSegment("comics")
|
||||
addPathSegment(mangaId)
|
||||
addPathSegment("${chapter.chapterID}-chapter-${chapter.ChapterNumber}")
|
||||
}.build().toString(),
|
||||
)
|
||||
|
||||
date_upload = try {
|
||||
dateFormat.parse(chapter.chapterDate)?.time ?: 0
|
||||
} catch (_: Exception) {
|
||||
0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return listOf()
|
||||
}
|
||||
|
||||
override fun pageListParse(document: Document): List<Page> =
|
||||
document.select("section img").mapIndexed { index, img -> Page(index, imageUrl = img.absUrl("src")) }
|
||||
|
||||
override fun popularMangaNextPageSelector(): String? = null
|
||||
override fun latestUpdatesNextPageSelector(): String? = null
|
||||
override fun searchMangaNextPageSelector(): String? = null
|
||||
override fun imageUrlParse(document: Document): String = ""
|
||||
override fun chapterListSelector(): String = ""
|
||||
override fun chapterFromElement(element: Element): SChapter = throw UnsupportedOperationException()
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
ext {
|
||||
extName = 'DMC Scans'
|
||||
extClass = '.DMCScans'
|
||||
themePkg = 'zeistmanga'
|
||||
baseUrl = 'https://didascans.blogspot.com'
|
||||
overrideVersionCode = 1
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 26 KiB |
@ -1,92 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.en.dmcscans
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import eu.kanade.tachiyomi.source.model.Page
|
||||
import eu.kanade.tachiyomi.util.asJsoup
|
||||
import okhttp3.Response
|
||||
import org.jsoup.Jsoup
|
||||
import org.jsoup.nodes.Document
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class DMCScans : ZeistManga("DMC Scans", "https://didascans.blogspot.com", "en") {
|
||||
override val client = super.client.newBuilder()
|
||||
.rateLimit(1, 3, TimeUnit.SECONDS)
|
||||
.build()
|
||||
|
||||
// ============================== Popular ===============================
|
||||
|
||||
override val popularMangaSelector = ".PopularPosts > article"
|
||||
override val popularMangaSelectorTitle = ".post-title a"
|
||||
override val popularMangaSelectorUrl = ".post-title a"
|
||||
|
||||
// ============================== Search ================================
|
||||
|
||||
override val excludedCategories = listOf("Web Novel")
|
||||
|
||||
// =========================== Manga Details ============================
|
||||
|
||||
override val mangaDetailsSelectorGenres = "#labels > a[rel=tag]"
|
||||
override val mangaDetailsSelectorInfo = ".imptdts"
|
||||
override val mangaDetailsSelectorDescription = "p"
|
||||
override val mangaDetailsSelectorInfoDescription = "div:containsOwn(Status) > span"
|
||||
|
||||
// =========================== Chapter Feed =============================
|
||||
|
||||
override val chapterFeedRegex = """.run\(["'](.*?)["']\)""".toRegex()
|
||||
|
||||
override fun getChapterFeedUrl(doc: Document): String {
|
||||
val feed = chapterFeedRegex
|
||||
.find(doc.html())
|
||||
?.groupValues?.get(1)
|
||||
?: throw Exception("Failed to find chapter feed")
|
||||
|
||||
return apiUrl(chapterCategory)
|
||||
.addPathSegments(feed)
|
||||
.addQueryParameter("max-results", maxChapterResults.toString())
|
||||
.build().toString()
|
||||
}
|
||||
|
||||
// =============================== Filters ==============================
|
||||
|
||||
override val hasFilters = true
|
||||
override val hasTypeFilter = false
|
||||
override val hasLanguageFilter = false
|
||||
|
||||
override fun getGenreList(): List<Genre> = listOf(
|
||||
Genre("Adaptation", "Adaptation"),
|
||||
Genre("Drama", "Drama"),
|
||||
Genre("Historical", "Historical"),
|
||||
Genre("Josei(W)", "Josei(W)"),
|
||||
Genre("Regression", "Regression"),
|
||||
Genre("Romance", "Romance"),
|
||||
Genre("Shojo(G)", "Shojo(G)"),
|
||||
Genre("Slice of Life", "Slice of Life"),
|
||||
Genre("Transmigration", "Transmigration"),
|
||||
)
|
||||
|
||||
// =============================== Pages ================================
|
||||
|
||||
override fun pageListParse(response: Response): List<Page> {
|
||||
val document = response.asJsoup()
|
||||
|
||||
val imgData = document.selectFirst("script:containsData(imgTag)")
|
||||
?.data()
|
||||
?.substringAfter("imgTag")
|
||||
?.substringAfter("`")
|
||||
?.substringBefore("`")
|
||||
?.replace("\\\"", "\"")
|
||||
?.replace("\\\\", "\\")
|
||||
?.replace("\\/", "/")
|
||||
?.replace("\\:", ":")
|
||||
?.let(Jsoup::parseBodyFragment)
|
||||
?: return document.select(pageListSelector).select("img[src]").mapIndexed { i, img ->
|
||||
Page(i, "", img.attr("abs:src"))
|
||||
}
|
||||
|
||||
return imgData.select("img[src]").mapIndexed { i, img ->
|
||||
Page(i, imageUrl = img.attr("abs:src"))
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'FactManga'
|
||||
extClass = '.FactManga'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://factmanga.com'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = false
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
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: 19 KiB |
@ -1,7 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.en.factmanga
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
|
||||
class FactManga : Madara("FactManga", "https://factmanga.com", "en") {
|
||||
override val useNewChapterEndpoint = true
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
ext {
|
||||
extName = 'Free Manhwa'
|
||||
extClass = '.FreeManhwa'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://manhwas.com'
|
||||
overrideVersionCode = 0
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 27 KiB |
@ -1,7 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.en.freemanhwa
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
|
||||
class FreeManhwa : Madara("Free Manhwa", "https://manhwas.com", "en") {
|
||||
override val useNewChapterEndpoint = false
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'MangaKomi'
|
||||
extClass = '.MangaKomi'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://mangakomi.io'
|
||||
overrideVersionCode = 5
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 15 KiB |
@ -1,17 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.en.mangakomi
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
import okhttp3.OkHttpClient
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class MangaKomi : Madara(
|
||||
"MangaKomi",
|
||||
"https://mangakomi.io",
|
||||
"en",
|
||||
) {
|
||||
|
||||
override val client: OkHttpClient = super.client.newBuilder()
|
||||
.rateLimit(1, 1, TimeUnit.SECONDS)
|
||||
.build()
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'ScamberTraslator'
|
||||
extClass = '.ScamberTraslator'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://visorscamber-scans.com'
|
||||
overrideVersionCode = 4
|
||||
isNsfw = false
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 22 KiB |
@ -1,14 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.es.scambertraslator
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class ScamberTraslator : Madara(
|
||||
"ScamberTraslator",
|
||||
"https://visorscamber-scans.com",
|
||||
"es",
|
||||
dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale("es")),
|
||||
) {
|
||||
override val useNewChapterEndpoint = true
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'KomikRealm'
|
||||
extClass = '.KomikRealm'
|
||||
themePkg = 'zeistmanga'
|
||||
baseUrl = 'https://www.komikrealm.my.id'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = false
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 15 KiB |
@ -1,142 +0,0 @@
|
||||
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 okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
|
||||
class KomikRealm : ZeistManga(
|
||||
"KomikRealm",
|
||||
"https://www.komikrealm.my.id",
|
||||
"id",
|
||||
) {
|
||||
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"),
|
||||
)
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Komikuzan'
|
||||
extClass = '.Komikuzan'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://komikuzan.com'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = false
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 47 KiB |
@ -1,15 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.id.komikuzan
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class Komikuzan : Madara(
|
||||
"Komikuzan",
|
||||
"https://komikuzan.com",
|
||||
"id",
|
||||
dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("id")),
|
||||
) {
|
||||
override val useLoadMoreRequest = LoadMoreStrategy.Never
|
||||
override val useNewChapterEndpoint = true
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Magerin'
|
||||
extClass = '.Magerin'
|
||||
themePkg = 'zeistmanga'
|
||||
baseUrl = 'https://www.magerin.com'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = false
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 20 KiB |
@ -1,10 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.id.magerin
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
|
||||
class Magerin : ZeistManga("Magerin", "https://www.magerin.com", "id") {
|
||||
override val client = super.client.newBuilder()
|
||||
.rateLimit(3)
|
||||
.build()
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Manga Raw.org'
|
||||
extClass = '.MangaRawOrg'
|
||||
themePkg = 'mangathemesia'
|
||||
baseUrl = 'https://mangaraw.org'
|
||||
overrideVersionCode = 1
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
@ -1,66 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.ja.mangaraworg
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||
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.util.asJsoup
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
import rx.Observable
|
||||
|
||||
class MangaRawOrg : MangaThemesia("Manga Raw.org", "https://mangaraw.org", "ja") {
|
||||
override val id = 6223520752496636410
|
||||
|
||||
override val client: OkHttpClient = super.client.newBuilder()
|
||||
.rateLimit(4)
|
||||
.build()
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/search?order=popular&page=$page", headers)
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/search?order=update&page=$page", headers)
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request =
|
||||
GET("$baseUrl/search?s=$query&page=$page")
|
||||
|
||||
override fun searchMangaSelector() = "div.bsx"
|
||||
|
||||
override fun searchMangaFromElement(element: Element): SManga {
|
||||
return SManga.create().apply {
|
||||
element.select("div.bigor > a").let {
|
||||
setUrlWithoutDomain(it.attr("href"))
|
||||
title = it.text()
|
||||
}
|
||||
thumbnail_url = element.select("img").attr("abs:src")
|
||||
}
|
||||
}
|
||||
|
||||
override fun searchMangaNextPageSelector() = "a[rel=next]"
|
||||
|
||||
override fun mangaDetailsParse(document: Document): SManga = super.mangaDetailsParse(document)
|
||||
.apply { description = document.select("div.bottom").firstOrNull()?.ownText() }
|
||||
|
||||
override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
|
||||
return client.newCall(pageListRequest(chapter))
|
||||
.asObservableSuccess()
|
||||
.map { response ->
|
||||
pageListParse(response, baseUrl + chapter.url.removeSuffix("/"))
|
||||
}
|
||||
}
|
||||
|
||||
private fun pageListParse(response: Response, chapterUrl: String): List<Page> {
|
||||
return response.asJsoup().select("span.page-link").first()!!.ownText().substringAfterLast(" ").toInt()
|
||||
.let { lastNum -> IntRange(1, lastNum) }
|
||||
.map { num -> Page(num, "$chapterUrl/$num") }
|
||||
}
|
||||
|
||||
override fun imageUrlParse(document: Document): String = document.select("a.img-block img").attr("abs:src")
|
||||
override fun getFilterList(): FilterList = FilterList()
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Manga One Love'
|
||||
extClass = '.MangaOneLove'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://mangaonelove.ru'
|
||||
overrideVersionCode = 2
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 7.1 KiB |
@ -1,7 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.ru.mangaonelove
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class MangaOneLove : Madara("Manga One Love", "https://mangaonelove.ru", "ru", SimpleDateFormat("dd.MM.yyyy", Locale.US))
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'CAT-translator'
|
||||
extClass = '.CatTranslator'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://cats-translator.com/manga'
|
||||
overrideVersionCode = 2
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 41 KiB |
@ -1,33 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.th.cattranslator
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import org.jsoup.nodes.Element
|
||||
|
||||
class CatTranslator : Madara(
|
||||
"CAT-translator",
|
||||
"https://cats-translator.com/manga",
|
||||
"th",
|
||||
) {
|
||||
private fun parseMangaFromElement(element: Element, isSearch: Boolean): SManga {
|
||||
val manga = SManga.create()
|
||||
|
||||
with(element) {
|
||||
selectFirst(if (isSearch) "div.post-title a" else popularMangaUrlSelector)!!.let {
|
||||
manga.setUrlWithoutDomain(it.attr("abs:href"))
|
||||
manga.url = manga.url.removePrefix("/manga")
|
||||
manga.title = it.ownText()
|
||||
}
|
||||
|
||||
selectFirst("img")?.let {
|
||||
manga.thumbnail_url = imageFromElement(it)
|
||||
}
|
||||
}
|
||||
|
||||
return manga
|
||||
}
|
||||
|
||||
override fun popularMangaFromElement(element: Element) = parseMangaFromElement(element, false)
|
||||
|
||||
override fun searchMangaFromElement(element: Element) = parseMangaFromElement(element, true)
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Dragon-Manga'
|
||||
extClass = '.DragonManga'
|
||||
themePkg = 'mangathemesia'
|
||||
baseUrl = 'https://www.dragon-manga.com'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
@ -1,12 +0,0 @@
|
||||
package eu.kanade.tachiyomi.extension.th.dragonmanga
|
||||
|
||||
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class DragonManga : MangaThemesia(
|
||||
"DragonManga",
|
||||
"https://www.dragon-manga.com",
|
||||
"th",
|
||||
dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("th")),
|
||||
)
|
@ -1,10 +0,0 @@
|
||||
ext {
|
||||
extName = 'Deccal Scans'
|
||||
extClass = '.DeccalScans'
|
||||
themePkg = 'madara'
|
||||
baseUrl = 'https://deccalscans.net'
|
||||
overrideVersionCode = 0
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 12 KiB |