From 8ef76242330eb6245411ebdd992ba1b456680fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Mej=C3=ADa?= Date: Mon, 13 Jul 2020 18:47:50 -0600 Subject: [PATCH] Fix TuMangaOnline & LetorManga (#3779) * Fix inorichi/tachiyomi-extensions#3715 * Fix inorichi/tachiyomi-extensions#3715 for main source TMO * Update TMO gradle version --- src/es/lectormanga/build.gradle | 2 +- .../extension/es/lectormanga/LectorManga.kt | 146 ++++++------------ src/es/tumangaonline/build.gradle | 2 +- .../es/tumangaonline/TuMangaOnline.kt | 129 ++++++---------- 4 files changed, 94 insertions(+), 185 deletions(-) diff --git a/src/es/lectormanga/build.gradle b/src/es/lectormanga/build.gradle index c2d741333..e346eca87 100755 --- a/src/es/lectormanga/build.gradle +++ b/src/es/lectormanga/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'LectorManga' pkgNameSuffix = 'es.lectormanga' extClass = '.LectorManga' - extVersionCode = 11 + extVersionCode = 12 libVersion = '1.2' } diff --git a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt index 8fab3e612..46066709c 100755 --- a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt +++ b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt @@ -14,10 +14,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import java.text.SimpleDateFormat -import java.util.Date import java.util.Locale -import java.util.TimeZone -import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request @@ -32,53 +29,41 @@ import uy.kohesive.injekt.api.get */ class LectorManga : ConfigurableSource, ParsedHttpSource() { - // Info - override val name = "LectorManga" + override val baseUrl = "https://lectormanga.com" + override val lang = "es" + override val supportsLatest = true private val userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" + override fun headersBuilder(): Headers.Builder { return Headers.Builder() .add("User-Agent", userAgent) .add("Referer", "$baseUrl/") } - private fun getBuilder(url: String, headers: Headers, formBody: FormBody?, method: String): String { - val req = Request.Builder() - .headers(headers) - .url(url) - .method(method, formBody) - .build() - - return client.newCall(req) - .execute() - .request() - .url() - .toString() - } - - // Popular - override fun popularMangaRequest(page: Int) = GET("$baseUrl/library?order_item=likes_count&order_dir=desc&type=&filter_by=title&page=$page", headers) + override fun popularMangaNextPageSelector() = ".pagination .page-item:not(.disabled) a[rel='next']" + override fun popularMangaSelector() = ".col-6 .card" + override fun popularMangaFromElement(element: Element) = SManga.create().apply { setUrlWithoutDomain(element.select("a").attr("href")) title = element.select("a").text() thumbnail_url = element.select("img").attr("src") } - // Latest - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/library?order_item=creation&order_dir=desc&page=$page", headers) - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - override fun latestUpdatesSelector() = popularMangaSelector() - override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) - // Search + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + + override fun latestUpdatesSelector() = popularMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val url = HttpUrl.parse("$baseUrl/library")!!.newBuilder() @@ -146,10 +131,10 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { } override fun searchMangaSelector() = popularMangaSelector() - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - // Details + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) override fun mangaDetailsParse(document: Document) = SManga.create().apply { genre = document.select("a.py-2").joinToString(", ") { @@ -166,17 +151,12 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { else -> SManga.UNKNOWN } - // Chapters - override fun chapterListParse(response: Response): List = mutableListOf().apply { - time = serverTime() // Get time when the chapter page is opened - val document = response.asJsoup() - val chapterUrl = response.request().url().toString() // One-shot if (document.select("#chapters").isEmpty()) { - return document.select(oneShotChapterListSelector()).map { oneShotChapterFromElement(it, chapterUrl) } + return document.select(oneShotChapterListSelector()).map { oneShotChapterFromElement(it) } } // Regular list of chapters @@ -188,28 +168,29 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { chapterNames.forEachIndexed { index, _ -> val scanlator = chapterInfos[index].select("li") if (dupselect == "one") { - scanlator.last { add(regularChapterFromElement(chapterNames[index].text(), it, chapterNumbers[index], chapterUrl)) } + scanlator.last { add(regularChapterFromElement(chapterNames[index].text(), it, chapterNumbers[index])) } } else { - scanlator.forEach { add(regularChapterFromElement(chapterNames[index].text(), it, chapterNumbers[index], chapterUrl)) } + scanlator.forEach { add(regularChapterFromElement(chapterNames[index].text(), it, chapterNumbers[index])) } } } } override fun chapterListSelector() = throw UnsupportedOperationException("Not used") + override fun chapterFromElement(element: Element) = throw UnsupportedOperationException("Not used") private fun oneShotChapterListSelector() = "div.chapter-list-element > ul.list-group li.list-group-item" - private fun oneShotChapterFromElement(element: Element, chapterUrl: String) = SChapter.create().apply { - url = "$chapterUrl#${element.select("div.row > .text-right > form").attr("id")}" + private fun oneShotChapterFromElement(element: Element) = SChapter.create().apply { + url = element.select("div.row > .text-right > a").attr("href") name = "One Shot" scanlator = element.select("div.col-md-6.text-truncate")?.text() date_upload = element.select("span.badge.badge-primary.p-2").first()?.text()?.let { parseChapterDate(it) } ?: 0 } - private fun regularChapterFromElement(chapterName: String, info: Element, number: Float, chapterUrl: String) = SChapter.create().apply { - url = "$chapterUrl#${info.select("div.row > .text-right > form").attr("id")}" + private fun regularChapterFromElement(chapterName: String, info: Element, number: Float) = SChapter.create().apply { + url = info.select("div.row > .text-right > a").attr("href") name = chapterName scanlator = info.select("div.col-md-6.text-truncate")?.text() date_upload = info.select("span.badge.badge-primary.p-2").first()?.text()?.let { @@ -223,56 +204,17 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { .parse(date)?.time ?: 0 } - // Utilities - - private var time = serverTime() // Grab time at app launch, can be updated - private fun serverTime(): String { - val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US) - formatter.timeZone = TimeZone.getTimeZone("GMT+1") // Convert time to match server - return formatter.format(Date()) - } - - // Pages - override fun pageListRequest(chapter: SChapter): Request { - val (chapterURL, chapterID) = chapter.url.split("#") - val response = client.newCall(GET(chapterURL, headers)).execute() // Get chapter page for current token - if (!response.isSuccessful) throw Exception("Lector Manga HTTP Error ${response.code()}") - val document = response.asJsoup() - val getUrl = document.select("form#$chapterID").attr("action") + "/$time" // Get redirect URL - val token = document.select("form#$chapterID input").attr("value") // Get token - val method = document.select("form#$chapterID").attr("method") // Check POST or GET - time = serverTime() // Update time for next chapter - - val getHeaders = headersBuilder() - .add("User-Agent", userAgent) - .add("Referer", chapterURL) - .add("Content-Type", "application/x-www-form-urlencoded") - .build() - - val formBody = when (method) { - "GET" -> null - "POST" -> FormBody.Builder() - .add("_token", token) - .build() - else -> throw UnsupportedOperationException("Lector Manga something else broke.") - } - - val newUrl = getBuilder(getUrl, getHeaders, formBody, method) + val currentUrl = client.newCall(GET(chapter.url, headers)).execute().asJsoup().body().baseUri() // Get /cascade instead of /paginate to get all pages at once - val url = if (getPageMethod() == "cascade" && newUrl.contains("paginated")) { - newUrl.substringBefore("paginated") + "cascade" - } else if (getPageMethod() == "paginated" && newUrl.contains("cascade")) { - newUrl.substringBefore("cascade") + "paginated" - } else newUrl + val newUrl = if (getPageMethod() == "cascade" && currentUrl.contains("paginated")) { + currentUrl.substringBefore("paginated") + "cascade" + } else if (getPageMethod() == "paginated" && currentUrl.contains("cascade")) { + currentUrl.substringBefore("cascade") + "paginated" + } else currentUrl - val headers = headersBuilder() - .add("User-Agent", userAgent) - .add("Referer", newUrl) - .build() - - return GET(url, headers) + return GET(newUrl, headers) } override fun pageListParse(document: Document): List = mutableListOf().apply { @@ -292,12 +234,13 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { } } + // Note: At this moment (13/07/2020) it's necessary to make the image request without headers to prevent 403. + override fun imageRequest(page: Page) = GET(page.imageUrl!!) + override fun imageUrlParse(document: Document): String = document.select("img.viewer-image").attr("src") - // Filters - private class Types : UriPartFilter("Filtrar por tipo", arrayOf( - Pair("Ver todo", ""), + Pair("Ver todos", ""), Pair("Manga", "manga"), Pair("Manhua", "manhua"), Pair("Manhwa", "manhwa"), @@ -308,7 +251,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { )) private class Demography : UriPartFilter("Filtrar por demografía", arrayOf( - Pair("Ver todo", ""), + Pair("Ver todas", ""), Pair("Seinen", "seinen"), Pair("Shoujo", "shoujo"), Pair("Shounen", "shounen"), @@ -329,11 +272,15 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { ) private class WebcomicFilter : Filter.TriState("Webcomic") + private class FourKomaFilter : Filter.TriState("Yonkoma") + private class AmateurFilter : Filter.TriState("Amateur") + private class EroticFilter : Filter.TriState("Erótico") private class Genre(name: String, val id: String) : Filter.CheckBox(name) + private class GenreList(genres: List) : Filter.Group("Filtrar por géneros", genres) override fun getFilterList() = FilterList( @@ -353,7 +300,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { // Array.from(document.querySelectorAll('#advancedSearch .custom-checkbox')) // .map(a => `Genre("${a.querySelector('label').innerText}", "${a.querySelector('input').value}")`).join(',\n') // on https://lectormanga.com/library - // Last revision 13/04/2020 + // Last revision 13/07/2020 private fun getGenreList() = listOf( Genre("Acción", "1"), Genre("Aventura", "2"), @@ -420,7 +367,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { val deduppref = androidx.preference.ListPreference(screen.context).apply { key = DEDUP_PREF_Title title = DEDUP_PREF_Title - entries = arrayOf("All scanlators", "One scanlator per chapter") + entries = arrayOf("Mostrar todos los scanlators", "Mostrar solo un scanlator") entryValues = arrayOf("all", "one") summary = "%s" @@ -435,7 +382,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { val pageMethod = androidx.preference.ListPreference(screen.context).apply { key = PAGEGET_PREF_Title title = PAGEGET_PREF_Title - entries = arrayOf("Cascada", "Paginada") + entries = arrayOf("Cascada (recomendado)", "Paginado") entryValues = arrayOf("cascade", "paginated") summary = "%s" @@ -455,7 +402,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { val deduppref = ListPreference(screen.context).apply { key = DEDUP_PREF_Title title = DEDUP_PREF_Title - entries = arrayOf("All scanlators", "One scanlator per chapter") + entries = arrayOf("Mostrar todos los scanlators", "Mostrar solo un scanlator") entryValues = arrayOf("all", "one") summary = "%s" @@ -470,7 +417,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { val pageMethod = ListPreference(screen.context).apply { key = PAGEGET_PREF_Title title = PAGEGET_PREF_Title - entries = arrayOf("Cascada", "Paginada") + entries = arrayOf("Cascada (recomendado)", "Paginado") entryValues = arrayOf("cascade", "paginated") summary = "%s" @@ -487,12 +434,13 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { } private fun getduppref() = preferences.getString(DEDUP_PREF, "all") + private fun getPageMethod() = preferences.getString(PAGEGET_PREF, "cascade") companion object { - private const val DEDUP_PREF_Title = "Chapter List Scanlator Preference" + private const val DEDUP_PREF_Title = "Preferencias de scanlator" private const val DEDUP_PREF = "deduppref" - private const val PAGEGET_PREF_Title = "Método para obtener imágenes" + private const val PAGEGET_PREF_Title = "Método para la descarga de imágenes" private const val PAGEGET_PREF = "pagemethodpref" private val SORTABLES = listOf( diff --git a/src/es/tumangaonline/build.gradle b/src/es/tumangaonline/build.gradle index 6e44b7517..2e17f3a3e 100644 --- a/src/es/tumangaonline/build.gradle +++ b/src/es/tumangaonline/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'TuMangaOnline' pkgNameSuffix = 'es.tumangaonline' extClass = '.TuMangaOnline' - extVersionCode = 26 + extVersionCode = 27 libVersion = '1.2' } diff --git a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt index ffefd6f1e..b8b0b1828 100644 --- a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt +++ b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt @@ -15,7 +15,6 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import java.text.SimpleDateFormat import java.util.Locale -import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request @@ -27,16 +26,16 @@ import uy.kohesive.injekt.api.get class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { - // Info - override val name = "TuMangaOnline" + override val baseUrl = "https://lectortmo.com" + override val lang = "es" + override val supportsLatest = true - // Client - private val userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" + override fun headersBuilder(): Headers.Builder { return Headers.Builder() .add("User-Agent", userAgent) @@ -44,25 +43,12 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { .add("Cache-mode", "no-cache") } - private fun getBuilder(url: String, headers: Headers, formBody: FormBody?, method: String): String { - val req = Request.Builder() - .headers(headers) - .url(url) - .method(method, formBody) - .build() - - return client.newCall(req) - .execute() - .request() - .url() - .toString() - } - - // Popular - override fun popularMangaRequest(page: Int) = GET("$baseUrl/library?order_item=likes_count&order_dir=desc&filter_by=title&_page=1&page=$page", headers) + override fun popularMangaNextPageSelector() = "a.page-link" + override fun popularMangaSelector() = "div.element" + override fun popularMangaFromElement(element: Element) = SManga.create().apply { element.select("div.element > a").let { setUrlWithoutDomain(it.attr("href").substringAfter(" ")) @@ -71,14 +57,13 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { } } - // Latest - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/library?order_item=creation&order_dir=desc&filter_by=title&_page=1&page=$page", headers) - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - override fun latestUpdatesSelector() = popularMangaSelector() - override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) - // Search + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + + override fun latestUpdatesSelector() = popularMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val url = HttpUrl.parse("$baseUrl/library")!!.newBuilder() @@ -147,10 +132,10 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { } override fun searchMangaSelector() = popularMangaSelector() - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - // Details + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) override fun mangaDetailsParse(document: Document) = SManga.create().apply { document.select("h5.card-title").let { @@ -173,15 +158,12 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { else -> SManga.UNKNOWN } - // Chapters - override fun chapterListParse(response: Response): List { val document = response.asJsoup() - val chapterUrl = response.request().url().toString() // One-shot if (document.select("div.chapters").isEmpty()) { - return document.select(oneShotChapterListSelector()).map { oneShotChapterFromElement(it, chapterUrl) } + return document.select(oneShotChapterListSelector()).map { oneShotChapterFromElement(it) } } // Regular list of chapters @@ -196,9 +178,9 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { val scanelement = chapelement.select("ul.chapter-list > li") val dupselect = getduppref()!! if (dupselect == "one") { - scanelement.first { chapters.add(regularChapterFromElement(it, chaptername, chapternumber, chapterUrl)) } + scanelement.first { chapters.add(regularChapterFromElement(it, chaptername, chapternumber)) } } else { - scanelement.forEach { chapters.add(regularChapterFromElement(it, chaptername, chapternumber, chapterUrl)) } + scanelement.forEach { chapters.add(regularChapterFromElement(it, chaptername, chapternumber)) } } } return chapters @@ -210,8 +192,8 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { private fun oneShotChapterListSelector() = "div.chapter-list-element > ul.list-group li.list-group-item" - private fun oneShotChapterFromElement(element: Element, chapterUrl: String) = SChapter.create().apply { - url = "$chapterUrl#${element.select("div.row > .text-right > form").attr("id")}" + private fun oneShotChapterFromElement(element: Element) = SChapter.create().apply { + url = element.select("div.row > .text-right > a").attr("href") name = "One Shot" scanlator = element.select("div.col-md-6.text-truncate")?.text() date_upload = element.select("span.badge.badge-primary.p-2").first()?.text()?.let { parseChapterDate(it) } @@ -220,8 +202,8 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { private fun regularChapterListSelector() = "div.chapters > ul.list-group li.p-0.list-group-item" - private fun regularChapterFromElement(element: Element, chName: String, number: Float, chapterUrl: String) = SChapter.create().apply { - url = "$chapterUrl#${element.select("div.row > .text-right > form").attr("id")}" + private fun regularChapterFromElement(element: Element, chName: String, number: Float) = SChapter.create().apply { + url = element.select("div.row > .text-right > a").attr("href") name = chName chapter_number = number scanlator = element.select("div.col-md-6.text-truncate")?.text() @@ -232,42 +214,17 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { private fun parseChapterDate(date: String): Long = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).parse(date)?.time ?: 0 - // Pages - override fun pageListRequest(chapter: SChapter): Request { - val (chapterURL, chapterID) = chapter.url.split("#") - val response = client.newCall(GET(chapterURL, headers)).execute() // Get chapter page for current token - if (!response.isSuccessful) throw Exception("TMO HTTP Error ${response.code()}") - val document = response.asJsoup() - val script = document.select("script:containsData(submitChapterForm)").html() - val tmotk = script.substringAfter("action+\"").substringBefore("\"}") - val geturl = document.select("form#$chapterID").attr("action") + tmotk // Get redirect URL - val token = document.select("form#$chapterID input").attr("value") // Get token - val method = document.select("form#$chapterID").attr("method") // Check POST or GET + val currentUrl = client.newCall(GET(chapter.url, headers)).execute().asJsoup().body().baseUri() - val getHeaders = headersBuilder() - .add("User-Agent", userAgent) - .add("Referer", chapterURL) - .add("Content-Type", "application/x-www-form-urlencoded") - .build() + // Get /cascade instead of /paginate to get all pages at once + val newUrl = if (getPageMethod() == "cascade" && currentUrl.contains("paginated")) { + currentUrl.substringBefore("paginated") + "cascade" + } else if (getPageMethod() == "paginated" && currentUrl.contains("cascade")) { + currentUrl.substringBefore("cascade") + "paginated" + } else currentUrl - val formBody = when (method) { - "GET" -> null - "POST" -> FormBody.Builder() - .add("_token", token) - .build() - else -> throw UnsupportedOperationException("TMO Unknown method. Open GitHub issue") - } - - val url = getBuilder(geturl, getHeaders, formBody, method).substringBeforeLast("/") + "/${getPageMethod()}" - // Get /cascade instead of /paginated to get all pages at once - - val headers = headersBuilder() - .add("User-Agent", userAgent) - .add("Referer", "$baseUrl/library/manga/") - .build() - - return GET(url, headers) + return GET(newUrl, headers) } override fun pageListParse(document: Document): List = mutableListOf().apply { @@ -287,12 +244,13 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { } } + // Note: At this moment (13/07/2020) it's necessary to make the image request without headers to prevent 403. + override fun imageRequest(page: Page) = GET(page.imageUrl!!) + override fun imageUrlParse(document: Document): String { return document.select("div.viewer-container > div.img-container > img.viewer-image").attr("src") } - // Filters - private class Types : UriPartFilter("Filtrar por tipo", arrayOf( Pair("Ver todo", ""), Pair("Manga", "manga"), @@ -326,11 +284,15 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { ) private class WebcomicFilter : Filter.TriState("Webcomic") + private class FourKomaFilter : Filter.TriState("Yonkoma") + private class AmateurFilter : Filter.TriState("Amateur") + private class EroticFilter : Filter.TriState("Erótico") private class Genre(name: String, val id: String) : Filter.CheckBox(name) + private class GenreList(genres: List) : Filter.Group("Filtrar por géneros", genres) override fun getFilterList() = FilterList( @@ -350,7 +312,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { // Array.from(document.querySelectorAll('#books-genders .col-auto .custom-control')) // .map(a => `Genre("${a.querySelector('label').innerText}", "${a.querySelector('input').value}")`).join(',\n') // on https://tumangaonline.me/library - // Last revision 13/04/2020 + // Last revision 13/07/2020 private fun getGenreList() = listOf( Genre("Acción", "1"), Genre("Aventura", "2"), @@ -407,8 +369,6 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { fun toUriPart() = vals[state].second } - // Preferences Code - private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } @@ -417,7 +377,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { val deduppref = androidx.preference.ListPreference(screen.context).apply { key = DEDUP_PREF_Title title = DEDUP_PREF_Title - entries = arrayOf("All scanlators", "One scanlator per chapter") + entries = arrayOf("Mostrar todos los scanlators", "Mostrar solo un scanlator") entryValues = arrayOf("all", "one") summary = "%s" @@ -432,7 +392,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { val pageMethod = androidx.preference.ListPreference(screen.context).apply { key = PAGEGET_PREF_Title title = PAGEGET_PREF_Title - entries = arrayOf("Cascada", "Paginada") + entries = arrayOf("Cascada (recomendado)", "Paginado") entryValues = arrayOf("cascade", "paginated") summary = "%s" @@ -452,7 +412,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { val deduppref = ListPreference(screen.context).apply { key = DEDUP_PREF_Title title = DEDUP_PREF_Title - entries = arrayOf("All scanlators", "One scanlator per chapter") + entries = arrayOf("Mostrar todos los scanlators", "Mostrar solo un scanlator") entryValues = arrayOf("all", "one") summary = "%s" @@ -467,7 +427,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { val pageMethod = ListPreference(screen.context).apply { key = PAGEGET_PREF_Title title = PAGEGET_PREF_Title - entries = arrayOf("Cascada", "Paginada") + entries = arrayOf("Cascada (recomendado)", "Paginado") entryValues = arrayOf("cascade", "paginated") summary = "%s" @@ -484,12 +444,13 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { } private fun getduppref() = preferences.getString(DEDUP_PREF, "all") + private fun getPageMethod() = preferences.getString(PAGEGET_PREF, "cascade") companion object { - private const val DEDUP_PREF_Title = "Chapter List Scanlator Preference" + private const val DEDUP_PREF_Title = "Preferencias de scanlator" private const val DEDUP_PREF = "deduppref" - private const val PAGEGET_PREF_Title = "Método para obtener imágenes" + private const val PAGEGET_PREF_Title = "Método para la descarga de imágenes" private const val PAGEGET_PREF = "pagemethodpref" private val SORTABLES = listOf(