From 203ae81d5cb7fd85ef5c8dabca73b10a001e28d2 Mon Sep 17 00:00:00 2001 From: Mike <51273546+SnakeDoc83@users.noreply.github.com> Date: Sun, 14 Jul 2019 10:26:07 -0400 Subject: [PATCH] Madara tweaks (#1295) Madara tweaks --- src/all/madara/build.gradle | 2 +- .../tachiyomi/extension/all/madara/Madara.kt | 34 +++++++--- .../extension/all/madara/MadaraFactory.kt | 68 ++++++++++++++++--- 3 files changed, 81 insertions(+), 23 deletions(-) diff --git a/src/all/madara/build.gradle b/src/all/madara/build.gradle index 41e433b51..6cf7a32cf 100644 --- a/src/all/madara/build.gradle +++ b/src/all/madara/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Madara' pkgNameSuffix = "all.madara" extClass = '.MadaraFactory' - extVersionCode = 5 + extVersionCode = 6 libVersion = '1.2' } diff --git a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt index 63d2282ff..1e02e354b 100644 --- a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt +++ b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt @@ -152,9 +152,13 @@ open class Madara( select("div.artist-content").first()?.let { manga.artist = it.text() } - select("div.description-summary div.summary__content p").let { - manga.description = it.joinToString(separator = "\n\n") { p -> - p.text().replace("
", "\n") + select("div.description-summary div.summary__content").let { + if (it.select("p").text().isNotEmpty()) { + manga.description = it.select("p").joinToString(separator = "\n\n") { p -> + p.text().replace("
", "\n") + } + } else { + manga.description = it.text() } } select("div.summary_image img").first()?.let { @@ -181,14 +185,20 @@ open class Madara( with(element) { select("a").first()?.let { urlElement -> - chapter.setUrlWithoutDomain(urlElement.attr("href").let { - it + if(!it.endsWith("?style=list")) "?style=list" else "" + chapter.setUrlWithoutDomain(urlElement.attr("abs:href").let { + it.substringBefore("?style=paged") + if(!it.endsWith("?style=list")) "?style=list" else "" }) chapter.name = urlElement.text() } - select("span.chapter-release-date i").first()?.let { - chapter.date_upload = parseChapterDate(it.text()) ?: 0 + // For when source's chapter date is a graphic representing "new" instead of text + 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 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")) { - "día", "day" -> Calendar.DAY_OF_MONTH - "hora", "hour" -> Calendar.HOUR + "jour", "día", "day" -> Calendar.DAY_OF_MONTH + "heure", "hora", "hour" -> Calendar.HOUR "min", "minute" -> Calendar.MINUTE "segundo", "second" -> Calendar.SECOND else -> return null @@ -247,8 +257,10 @@ open class Madara( } } + open val pageListParseSelector = "div.page-break" + override fun pageListParse(document: Document): List { - return document.select("div.page-break").mapIndexed { index, element -> + return document.select(pageListParseSelector).mapIndexed { index, element -> Page(index, "", element.select("img").first()?.let{ it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src") }) diff --git a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt index c6bad3ff7..60457f373 100644 --- a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt +++ b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt @@ -6,13 +6,10 @@ import eu.kanade.tachiyomi.source.SourceFactory import java.text.SimpleDateFormat import java.util.* 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.SManga -import okhttp3.CacheControl -import okhttp3.FormBody +import eu.kanade.tachiyomi.source.model.* +import eu.kanade.tachiyomi.util.asJsoup import okhttp3.Request -import org.jsoup.nodes.Element +import okhttp3.Response class MadaraFactory : SourceFactory { override fun createSources(): List = listOf( @@ -53,7 +50,38 @@ class ZeroScans : Madara("ZeroScans", "https://zeroscans.com", "en") class IsekaiScanCom : Madara("IsekaiScan.com", "http://isekaiscan.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 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 { + val chapters = mutableListOf() + 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 KomikGo : Madara("KomikGo", "https://komikgo.com/", "id") 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 latestUpdatesNextPageSelector(): 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 YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) class ZManga : Madara("ZManga", "https://zmanga.org/", "es") -class MangazukiMe : Madara("Mangazuki.me", "https://mangazuki.me/", "en") -class MangazukiOnline : Madara("Mangazuki.online", "https://www.mangazuki.online/", "en") +class MangazukiMe : Madara("Mangazuki.me", "https://mangazuki.me/", "en"){ + override fun chapterListParse(response: Response): List { + val chapters = mutableListOf() + 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 { + val chapters = mutableListOf() + 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 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 MangaSY : Madara("Manga SY", "https://www.mangasy.com/", "en") class ManwhaClub : Madara("Manwha Club", "https://manhwa.club/", "en")