parent
ac7e98b6f8
commit
203ae81d5c
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: Madara'
|
appName = 'Tachiyomi: Madara'
|
||||||
pkgNameSuffix = "all.madara"
|
pkgNameSuffix = "all.madara"
|
||||||
extClass = '.MadaraFactory'
|
extClass = '.MadaraFactory'
|
||||||
extVersionCode = 5
|
extVersionCode = 6
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,9 +152,13 @@ open class Madara(
|
||||||
select("div.artist-content").first()?.let {
|
select("div.artist-content").first()?.let {
|
||||||
manga.artist = it.text()
|
manga.artist = it.text()
|
||||||
}
|
}
|
||||||
select("div.description-summary div.summary__content p").let {
|
select("div.description-summary div.summary__content").let {
|
||||||
manga.description = it.joinToString(separator = "\n\n") { p ->
|
if (it.select("p").text().isNotEmpty()) {
|
||||||
p.text().replace("<br>", "\n")
|
manga.description = it.select("p").joinToString(separator = "\n\n") { p ->
|
||||||
|
p.text().replace("<br>", "\n")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
manga.description = it.text()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
select("div.summary_image img").first()?.let {
|
select("div.summary_image img").first()?.let {
|
||||||
|
@ -181,14 +185,20 @@ open class Madara(
|
||||||
|
|
||||||
with(element) {
|
with(element) {
|
||||||
select("a").first()?.let { urlElement ->
|
select("a").first()?.let { urlElement ->
|
||||||
chapter.setUrlWithoutDomain(urlElement.attr("href").let {
|
chapter.setUrlWithoutDomain(urlElement.attr("abs:href").let {
|
||||||
it + if(!it.endsWith("?style=list")) "?style=list" else ""
|
it.substringBefore("?style=paged") + if(!it.endsWith("?style=list")) "?style=list" else ""
|
||||||
})
|
})
|
||||||
chapter.name = urlElement.text()
|
chapter.name = urlElement.text()
|
||||||
}
|
}
|
||||||
|
|
||||||
select("span.chapter-release-date i").first()?.let {
|
// For when source's chapter date is a graphic representing "new" instead of text
|
||||||
chapter.date_upload = parseChapterDate(it.text()) ?: 0
|
if (select("img").attr("alt").isNotBlank()) {
|
||||||
|
chapter.date_upload = parseRelativeDate(select("img").attr("alt")) ?: 0
|
||||||
|
} else {
|
||||||
|
// For a chapter date that's text
|
||||||
|
select("span.chapter-release-date i").first()?.let {
|
||||||
|
chapter.date_upload = parseChapterDate(it.text()) ?: 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,10 +237,10 @@ open class Madara(
|
||||||
if (trimmedDate[2] != "ago") return null
|
if (trimmedDate[2] != "ago") return null
|
||||||
val number = trimmedDate[0].toIntOrNull() ?: return null
|
val number = trimmedDate[0].toIntOrNull() ?: return null
|
||||||
|
|
||||||
// Map English/Spanish unit to Java unit
|
// Map English and other language units to Java units
|
||||||
val javaUnit = when (trimmedDate[1].removeSuffix("s")) {
|
val javaUnit = when (trimmedDate[1].removeSuffix("s")) {
|
||||||
"día", "day" -> Calendar.DAY_OF_MONTH
|
"jour", "día", "day" -> Calendar.DAY_OF_MONTH
|
||||||
"hora", "hour" -> Calendar.HOUR
|
"heure", "hora", "hour" -> Calendar.HOUR
|
||||||
"min", "minute" -> Calendar.MINUTE
|
"min", "minute" -> Calendar.MINUTE
|
||||||
"segundo", "second" -> Calendar.SECOND
|
"segundo", "second" -> Calendar.SECOND
|
||||||
else -> return null
|
else -> return null
|
||||||
|
@ -247,8 +257,10 @@ open class Madara(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open val pageListParseSelector = "div.page-break"
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
return document.select("div.page-break").mapIndexed { index, element ->
|
return document.select(pageListParseSelector).mapIndexed { index, element ->
|
||||||
Page(index, "", element.select("img").first()?.let{
|
Page(index, "", element.select("img").first()?.let{
|
||||||
it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src")
|
it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src")
|
||||||
})
|
})
|
||||||
|
|
|
@ -6,13 +6,10 @@ import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.source.model.*
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
|
||||||
import okhttp3.CacheControl
|
|
||||||
import okhttp3.FormBody
|
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import org.jsoup.nodes.Element
|
import okhttp3.Response
|
||||||
|
|
||||||
class MadaraFactory : SourceFactory {
|
class MadaraFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = listOf(
|
override fun createSources(): List<Source> = listOf(
|
||||||
|
@ -53,7 +50,38 @@ class ZeroScans : Madara("ZeroScans", "https://zeroscans.com", "en")
|
||||||
class IsekaiScanCom : Madara("IsekaiScan.com", "http://isekaiscan.com/", "en")
|
class IsekaiScanCom : Madara("IsekaiScan.com", "http://isekaiscan.com/", "en")
|
||||||
class HappyTeaScans : Madara("Happy Tea Scans", "https://happyteascans.com/", "en")
|
class HappyTeaScans : Madara("Happy Tea Scans", "https://happyteascans.com/", "en")
|
||||||
class JustForFun : Madara("Just For Fun", "https://just-for-fun.ru/", "ru", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
class JustForFun : Madara("Just For Fun", "https://just-for-fun.ru/", "ru", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
||||||
class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe/", "en")
|
class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe/", "en") {
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val chapters = mutableListOf<SChapter>()
|
||||||
|
val document = response.asJsoup()
|
||||||
|
|
||||||
|
// For when it's a normal chapter list
|
||||||
|
if (document.select(chapterListSelector()).hasText()) {
|
||||||
|
document.select(chapterListSelector())
|
||||||
|
.filter { it.select("a").attr("href").contains(baseUrl)}
|
||||||
|
.map { chapters.add(chapterFromElement(it)) }
|
||||||
|
} else {
|
||||||
|
// For their "fancy" volume/chapter lists
|
||||||
|
document.select("div.wpb_wrapper:contains(volume) a")
|
||||||
|
.filter { it.attr("href").contains(baseUrl) && !it.attr("href").contains("imgur")}
|
||||||
|
.map {
|
||||||
|
val chapter = SChapter.create()
|
||||||
|
if (it.attr("href").contains("volume")) {
|
||||||
|
val volume = it.attr("href").substringAfter("volume-").substringBefore("/")
|
||||||
|
val volChap = it.attr("href").substringAfter("volume-$volume/").substringBefore("/").replace("-", " ").capitalize()
|
||||||
|
chapter.name = "Volume $volume - $volChap"
|
||||||
|
} else {
|
||||||
|
chapter.name = it.attr("href").substringBefore("/p").substringAfterLast("/").replace("-", " ").capitalize()
|
||||||
|
}
|
||||||
|
it.attr("href").let {
|
||||||
|
chapter.setUrlWithoutDomain(it.substringBefore("?") + if (!it.endsWith("?style=list")) "?style=list" else "")
|
||||||
|
chapters.add(chapter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chapters.reversed()
|
||||||
|
}
|
||||||
|
}
|
||||||
class Kanjiku : Madara("Kanjiku", "https://kanjiku.net/", "de", dateFormat = SimpleDateFormat("dd. MMM yyyy", Locale.GERMAN))
|
class Kanjiku : Madara("Kanjiku", "https://kanjiku.net/", "de", dateFormat = SimpleDateFormat("dd. MMM yyyy", Locale.GERMAN))
|
||||||
class KomikGo : Madara("KomikGo", "https://komikgo.com/", "id")
|
class KomikGo : Madara("KomikGo", "https://komikgo.com/", "id")
|
||||||
class LuxyScans : Madara("Luxy Scans", "https://luxyscans.com/", "en")
|
class LuxyScans : Madara("Luxy Scans", "https://luxyscans.com/", "en")
|
||||||
|
@ -63,16 +91,34 @@ class TritiniaScans : Madara("Tritinia Scans", "http://tritiniascans.ml/", "en")
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/index.html?s=$query", headers)
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/index.html?s=$query", headers)
|
||||||
override fun latestUpdatesNextPageSelector(): String? = null
|
override fun latestUpdatesNextPageSelector(): String? = null
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
override fun popularMangaNextPageSelector(): String? = null
|
||||||
|
|
||||||
}
|
}
|
||||||
class TsubakiNoScan : Madara("Tsubaki No Scan", "https://tsubakinoscan.com/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
class TsubakiNoScan : Madara("Tsubaki No Scan", "https://tsubakinoscan.com/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
||||||
class YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
class YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
||||||
class ZManga : Madara("ZManga", "https://zmanga.org/", "es")
|
class ZManga : Madara("ZManga", "https://zmanga.org/", "es")
|
||||||
class MangazukiMe : Madara("Mangazuki.me", "https://mangazuki.me/", "en")
|
class MangazukiMe : Madara("Mangazuki.me", "https://mangazuki.me/", "en"){
|
||||||
class MangazukiOnline : Madara("Mangazuki.online", "https://www.mangazuki.online/", "en")
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val chapters = mutableListOf<SChapter>()
|
||||||
|
response.asJsoup().select(chapterListSelector())
|
||||||
|
.filter { it.select("a").attr("href").contains(baseUrl) }
|
||||||
|
.map { chapters.add(chapterFromElement(it)) }
|
||||||
|
return chapters
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class MangazukiOnline : Madara("Mangazuki.online", "https://www.mangazuki.online/", "en") {
|
||||||
|
override fun chapterListSelector() = "li.wp-manga-chapter:has(a)"
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val chapters = mutableListOf<SChapter>()
|
||||||
|
response.asJsoup().select(chapterListSelector())
|
||||||
|
.filter { it.select("a").attr("href").contains(baseUrl) }
|
||||||
|
.map { chapters.add(chapterFromElement(it)) }
|
||||||
|
return chapters
|
||||||
|
}
|
||||||
|
}
|
||||||
class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club/", "ja")
|
class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club/", "ja")
|
||||||
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club/", "ko")
|
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club/", "ko")
|
||||||
class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com/", "en")
|
class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com/", "en") {
|
||||||
|
override val pageListParseSelector = "div.reading-content img"
|
||||||
|
}
|
||||||
class Mangalike : Madara("Mangalike", "https://mangalike.net/", "en")
|
class Mangalike : Madara("Mangalike", "https://mangalike.net/", "en")
|
||||||
class MangaSY : Madara("Manga SY", "https://www.mangasy.com/", "en")
|
class MangaSY : Madara("Manga SY", "https://www.mangasy.com/", "en")
|
||||||
class ManwhaClub : Madara("Manwha Club", "https://manhwa.club/", "en")
|
class ManwhaClub : Madara("Manwha Club", "https://manhwa.club/", "en")
|
||||||
|
|
Loading…
Reference in New Issue