diff --git a/src/fr/mangakawaii/build.gradle b/src/fr/mangakawaii/build.gradle index 7fc282048..cc8d71812 100644 --- a/src/fr/mangakawaii/build.gradle +++ b/src/fr/mangakawaii/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Mangakawaii' pkgNameSuffix = 'fr.mangakawaii' extClass = '.MangaKawaii' - extVersionCode = 25 + extVersionCode = 26 libVersion = '1.2' } diff --git a/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt b/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt index 3ded3b2de..1b3f8a8ff 100644 --- a/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt +++ b/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt @@ -22,6 +22,9 @@ import java.util.concurrent.TimeUnit import kotlin.math.absoluteValue import kotlin.random.Random +/** + * Heavily customized MyMangaReaderCMS source + */ class MangaKawaii : ParsedHttpSource() { override val name = "Mangakawaii" @@ -37,8 +40,8 @@ class MangaKawaii : ParsedHttpSource() { .build() protected open val userAgentRandomizer1 = "${Random.nextInt(9).absoluteValue}" - protected open val userAgentRandomizer2 = "${Random.nextInt(10,99).absoluteValue}" - protected open val userAgentRandomizer3 = "${Random.nextInt(100,999).absoluteValue}" + protected open val userAgentRandomizer2 = "${Random.nextInt(10, 99).absoluteValue}" + protected open val userAgentRandomizer3 = "${Random.nextInt(100, 999).absoluteValue}" override fun headersBuilder(): Headers.Builder = Headers.Builder() .add( @@ -47,84 +50,80 @@ class MangaKawaii : ParsedHttpSource() { "Chrome/8$userAgentRandomizer1.0.4$userAgentRandomizer3.1$userAgentRandomizer2 Safari/537.36" ) - override fun popularMangaSelector() = "a.hot-manga__item" - override fun latestUpdatesSelector() = ".section__list-group li div.section__list-group-left" - override fun searchMangaSelector() = "h1 + ul a[href*=manga]" - override fun chapterListSelector() = "tr[class*=volume-]:has(td)" - - override fun popularMangaNextPageSelector(): String? = null - override fun latestUpdatesNextPageSelector(): String? = null - override fun searchMangaNextPageSelector(): String? = null - + // Popular override fun popularMangaRequest(page: Int) = GET(baseUrl, headers) + override fun popularMangaSelector() = "a.hot-manga__item" + override fun popularMangaNextPageSelector(): String? = null + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.select("div.hot-manga__item-caption").select("div.hot-manga__item-name").text().trim() + setUrlWithoutDomain(element.select("a").attr("href")) + thumbnail_url = "https://cdn.mangakawaii.com/uploads" + element.select("a").attr("href") + "/cover/cover_250x350.jpg" + } + // Latest override fun latestUpdatesRequest(page: Int) = GET(baseUrl, headers) + override fun latestUpdatesSelector() = ".section__list-group li div.section__list-group-left" + override fun latestUpdatesNextPageSelector(): String? = null + override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { + title = element.select("a").attr("title") + setUrlWithoutDomain(element.select("a").attr("href")) + thumbnail_url = "https://cdn.mangakawaii.com/uploads" + element.select("a").attr("href") + "/cover/cover_250x350.jpg" + } + + // Search override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val uri = Uri.parse("$baseUrl/search").buildUpon() .appendQueryParameter("query", query) .appendQueryParameter("search_type", "manga") return GET(uri.toString(), headers) } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.url = element.select("a").attr("href") - manga.title = element.select("div.hot-manga__item-caption").select("div.hot-manga__item-name").text().trim() - manga.thumbnail_url = element.select("a").attr("style").substringAfter("('").substringBeforeLast("'") - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { - title = element.select("a").attr("title") + override fun searchMangaSelector() = "h1 + ul a[href*=manga]" + override fun searchMangaNextPageSelector(): String? = null + override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.select("a").text().trim() setUrlWithoutDomain(element.select("a").attr("href")) - thumbnail_url = element.select("img").attr("data-src") + thumbnail_url = "https://cdn.mangakawaii.com/uploads" + element.select("a").attr("href") + "/cover/cover_250x350.jpg" } - override fun searchMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.url = element.select("a").attr("href") - manga.title = element.select("a").text().trim() - return manga + // Manga details + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + thumbnail_url = document.select("div.manga-view__header-image").select("img").attr("abs:src") + description = document.select("dd.text-justify.text-break").text() + author = document.select("a[href*=author]").text() + artist = document.select("a[href*=artist]").text() + genre = document.select("a[href*=category]").joinToString { it.text() } + status = when (document.select("span.badge.bg-success.text-uppercase").text()) { + "En Cours" -> SManga.ONGOING + "Terminé" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } } - override fun chapterFromElement(element: Element): SChapter { - val chapter = SChapter.create() - chapter.url = element.select("td.table__chapter").select("a").attr("href") - chapter.name = element.select("td.table__chapter").select("span").text().trim() - chapter.chapter_number = element.select("td.table__chapter").select("span").text().substringAfter("Chapitre").replace(Regex("""[,-]"""), ".").trim().toFloatOrNull() + // Chapter list + //override fun chapterListRequest(manga: SManga): Request = GET("$baseUrl${manga.widgetPageUrl}", headers) + override fun chapterListSelector() = "tr[class*=volume-]:has(td)" + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + url = element.select("td.table__chapter").select("a").attr("href") + name = element.select("td.table__chapter").select("span").text().trim() + chapter_number = element.select("td.table__chapter").select("span").text().substringAfter("Chapitre").replace(Regex("""[,-]"""), ".").trim().toFloatOrNull() ?: -1F - chapter.date_upload = element.select("td.table__date").firstOrNull()?.text()?.let { parseDate(it) } ?: 0 - return chapter + date_upload = element.select("td.table__date").firstOrNull()?.text()?.let { parseDate(it) } + ?: 0 } private fun parseDate(date: String): Long { return SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(date)?.time ?: 0L } - override fun mangaDetailsParse(document: Document): SManga { - val manga = SManga.create() - manga.thumbnail_url = document.select("div.manga-view__header-image").select("img").attr("abs:src") - manga.description = document.select("dd.text-justify.text-break").text() - manga.author = document.select("a[href*=author]").text() - manga.artist = document.select("a[href*=artist]").text() - val glist = document.select("a[href*=category]").map { it.text() } - manga.genre = glist.joinToString(", ") - manga.status = when (document.select("span.badge.bg-success.text-uppercase").text()) { - "En Cours" -> SManga.ONGOING - "Terminé" -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - return manga - } - + // Pages override fun pageListParse(response: Response): List { val body = response.asJsoup() - val selectorEncoded1 = "Wkdim" +"gsai" + "mgWQyV2lkMm" + "xrS2img" + "ppZDFoY" + "kd4ZElHaW" + - "RsdimgFp6cHVi" + "M1FvVzNOeVl5" + "bimgzlpZG" + "lkWjJsbVhT" + "a3imgNJQzVq" + "YjI1MFlpZFd" + - "saWR1WlhJdFi"+ "mgpteDFhV1FnTGi" + "mg5KdmlkZHlC" + "a2FYWimgTZiaW" + "imgRtOTBL" + "QzV0ZUMxaim" + - "gGRYUnZpZEtT"+ "QTZibTki" +"mgwS0imgRwdm" + "JteGlkimgNU" + "xXTm9hV3himgr" + "aWRLU0JwYldjNm" + "JtOTBpZEti"+ - "mgGdHpp" + "ZGNtTXFQimg" + "V2RwWml" + "kbDBw" + val selectorEncoded1 = "Wkdim" + "gsai" + "mgWQyV2lkMm" + "xrS2img" + "ppZDFoY" + "kd4ZElHaW" + + "RsdimgFp6cHVi" + "M1FvVzNOeVl5" + "bimgzlpZG" + "lkWjJsbVhT" + "a3imgNJQzVq" + "YjI1MFlpZFd" + + "saWR1WlhJdFi" + "mgpteDFhV1FnTGi" + "mg5KdmlkZHlC" + "a2FYWimgTZiaW" + "imgRtOTBL" + "QzV0ZUMxaim" + + "gGRYUnZpZEtT" + "QTZibTki" + "mgwS0imgRwdm" + "JteGlkimgNU" + "xXTm9hV3himgr" + "aWRLU0JwYldjNm" + "JtOTBpZEti" + + "mgGdHpp" + "ZGNtTXFQimg" + "V2RwWml" + "kbDBw" val selectorEncoded2 = String(Base64.decode(selectorEncoded1.replace("img", ""), Base64.DEFAULT)) val selectorDecoded = String(Base64.decode(selectorEncoded2.replace("id", ""), Base64.DEFAULT)) var elements = body.select(selectorDecoded)