From d1d999aa86433f203972441e452c6a84ce8fbac4 Mon Sep 17 00:00:00 2001 From: happywillow0 <45346080+happywillow0@users.noreply.github.com> Date: Wed, 18 Mar 2020 18:45:46 -0400 Subject: [PATCH 1/2] Add TMO --- src/es/tumangaonline/build.gradle | 18 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4218 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2320 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5492 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9579 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 15283 bytes .../es/tumangaonline/TuMangaOnline.kt | 526 ++++++++++++++++++ 7 files changed, 544 insertions(+) create mode 100644 src/es/tumangaonline/build.gradle create mode 100644 src/es/tumangaonline/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/es/tumangaonline/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/es/tumangaonline/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/es/tumangaonline/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/es/tumangaonline/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt diff --git a/src/es/tumangaonline/build.gradle b/src/es/tumangaonline/build.gradle new file mode 100644 index 000000000..aa6186eaf --- /dev/null +++ b/src/es/tumangaonline/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: TuMangaOnline' + pkgNameSuffix = 'es.tumangaonline' + extClass = '.TuMangaOnline' + extVersionCode = 1 + libVersion = '1.2' +} + +dependencies { + implementation project(':lib-ratelimit') + compileOnly project(':preference-stub') + compileOnly 'com.github.inorichi.injekt:injekt-core:65b0440' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/es/tumangaonline/res/mipmap-hdpi/ic_launcher.png b/src/es/tumangaonline/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9b90ad753aa6cdb17b952f1725bc17a231591aa7 GIT binary patch literal 4218 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 QZ~y=R07*qoM6N<$g2U|(AOHXW literal 0 HcmV?d00001 diff --git a/src/es/tumangaonline/res/mipmap-mdpi/ic_launcher.png b/src/es/tumangaonline/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..46b23e86c87c517a8bbb65075e5e134a12eebe4f GIT binary patch literal 2320 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 VAib5qS0Vra002ovPDHLkV1g{KJSqSH literal 0 HcmV?d00001 diff --git a/src/es/tumangaonline/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/tumangaonline/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d77b493d7b0cf4927746427627fd9f02a7f35504 GIT binary patch literal 15283 zcmcIr^K)Ncw7s8CY@@N!IBjgJv8^U;Z0i#>cB96PZ8S!M#hkyqWjI#hjTl zXWyB9_E~$ab;Fbtq)-qE5CH%{k&zZxd4G2PcfrHH-&K~a;Q)XPkP#PAb2m8AhjYf6 znO)_|5EeZn)5lJXo{WG$tc4WqV^xE~!}Z0LpmAEBKT3$BkAKrdZ=pc zaPg|I-=!ev{#&+M<@<2H=hMr-C+PJof0Z_{An51e$sO$(7Q_!$_6G4DTB)RQEvxl? z@`wNHi!anAS~^DRbZMUPZ_px@AI6qbO#DgCX)jnKL~%z$y> zThhzY1=7l@)^bQRk^9M+)oF&RV7^L}VD*KAPayhtf>4C%AhJAYFbEztQ26zSFhGVM zG`>b)v)&y0Mk^G*x4#sK4gvn?da=9+KJw+9DW9Q%JyxG}3*}#)9?!&bjeiuQrM+aj z2D17(`8I4#%mxoDX0iDE%PgF$MbAQuN{h^TN&Aq+sTfUqH8f_2=F{@^@#}N|@`8gv)=#rUk9HnA+cYt$oThA2}S66ee?3 zGS?89yeQ)z7(o*C6(PsAoKhunHC=tgnBT2w}=|12YPRXf=$uq+|_lYiznNR3PYOti7&)B_?_eUCZ z$o)J(MfF!$){#Gtrr#Vc@ZpSTzT+mJ`qSCG?sAZl9&|RbHxNpEejmVKGL$#U>&(b? zGyji2&;5l}mB_H~p?+;DUG5{f)}k>_t=uTfhZt679WdR8wpXNu`xB}-nQiueeempJ zm`dr(2c93P%G*i%JRLC=_Ld8RcBvb|5)_kiG-@!8z2@{AQyrEtsTlmkye zJRKfF-=J8%igEkFdx+54RpaZ{;&;goDzcFgoIt)Ux`GThu`Kw~cdP9e^tLsL!DLu` zz}C;mQKoi9cLQ=62ck!JEkZG7nJ@&J2ND}fo_O(}i&8#WiJzPQmg)$CR5qPXUoAz? z+(4a96zB0k=qTx&+k8J>e^Tk&%&ORe1Mk-OOlmANS%i2KV&OCrZ%2{Zr!u`RNbeZ} zqi)3v-V7{ye{KUPkM~bMCtx$5R>>LtCn$Mwf&1{`pd)Sxz(f≤z)*h~g-v+UYer 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 ZwI1vk>2OXgdH)#~kdaUjuMjl~_#fnIS+M{B literal 0 HcmV?d00001 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 new file mode 100644 index 000000000..4d404230a --- /dev/null +++ b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt @@ -0,0 +1,526 @@ +package eu.kanade.tachiyomi.extension.es.tumangaonline + +import android.app.Application +import android.content.SharedPreferences +import android.support.v7.preference.ListPreference +import android.support.v7.preference.PreferenceScreen +import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.ConfigurableSource +import eu.kanade.tachiyomi.source.model.Filter +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 okhttp3.FormBody +import okhttp3.Headers +import okhttp3.HttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.* +import java.util.concurrent.TimeUnit + +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 rateLimitInterceptor = RateLimitInterceptor(1, 1) + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addNetworkInterceptor(rateLimitInterceptor) + .connectTimeout(1, TimeUnit.MINUTES) + .readTimeout(1, TimeUnit.MINUTES) + .retryOnConnectionFailure(true) + .followRedirects(true) + .build()!! + 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/") + .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) + //.post(formBody) + .build() + + return client.newCall(req) + .execute() + .request() + .url() + .toString() + /*.execute() + .body()!! + .string()*/ + } + + //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(" ")) + title = it.select("h4.text-truncate").text() + thumbnail_url = it.select("style").toString().substringAfter("('").substringBeforeLast("')") + } + } + + //Latest + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/latest_uploads?page=$page&uploads_mode=thumbnail", headers) + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + override fun latestUpdatesSelector() = "div.upload-file-row" + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + val mangas = document.select(latestUpdatesSelector()) + .distinctBy { it.select("div.thumbnail-title > h4.text-truncate").text().trim() } + .map { latestUpdatesFromElement(it) } + val hasNextPage = latestUpdatesNextPageSelector().let { selector -> + document.select(selector).first() + } != null + return MangasPage(mangas, hasNextPage) + } + + override fun latestUpdatesFromElement(element: Element) = SManga.create().apply { + element.select("div.upload-file-row > a").let { + setUrlWithoutDomain(it.attr("href")) + title = it.select("div.thumbnail-title > h4.text-truncate").text() + thumbnail_url = it.select("div.thumbnail > style").toString().substringAfter("url('").substringBefore("');") + } + } + + //Search + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = HttpUrl.parse("$baseUrl/library")!!.newBuilder() + + url.addQueryParameter("title", query) + url.addQueryParameter("page", page.toString()) + url.addQueryParameter("_page", "1") //Extra Query to Prevent Scrapping aka without it = 403 + + filters.forEach { filter -> + when (filter) { + is Types -> { + url.addQueryParameter("type", filter.toUriPart()) + } + is Demography -> { + url.addQueryParameter("demography", filter.toUriPart()) + } + is FilterBy -> { + url.addQueryParameter("filter_by", filter.toUriPart()) + } + is OrderBy -> { + url.addQueryParameter("order_item", filter.toUriPart()) + } + is OrderDir -> { + url.addQueryParameter("order_dir", filter.toUriPart()) + } + is WebcomicFilter -> { + url.addQueryParameter("webcomic", when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + }) + } + is FourKomaFilter -> { + url.addQueryParameter("yonkoma", when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + }) + } + is AmateurFilter -> { + url.addQueryParameter("amateur", when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + }) + } + is EroticFilter -> { + url.addQueryParameter("erotic", when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + }) + } + is GenreList -> { + filter.state + .filter { genre -> genre.state } + .forEach { genre -> url.addQueryParameter("genders[]", genre.id) } + } + } + } + + return GET(url.build().toString(), headers) + } + + override fun searchMangaSelector() = popularMangaSelector() + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) + + //Details + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + document.select("h5.card-title").let { + author = it?.first()?.attr("title")?.substringAfter(", ") + artist = it?.last()?.attr("title")?.substringAfter(", ") + } + + genre = document.select("a.py-2").joinToString(", ") { + it.text() + } + + description = document.select("p.element-description")?.text() + status = parseStatus(document.select("span.book-status")?.text().orEmpty()) + thumbnail_url = document.select(".book-thumbnail").attr("src") + } + + private fun parseStatus(status: String) = when { + status.contains("Publicándose") -> SManga.ONGOING + status.contains("Finalizado") -> SManga.COMPLETED + 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) } + } + + // Regular list of chapters + val chapters = mutableListOf() + document.select(regularChapterListSelector()).forEach { chapelement -> + val chapternumber = chapelement.select("a.btn-collapse").text().substringBefore(":").substringAfter("Capítulo").trim().toFloat() + val chaptername = chapelement.select("div.col-10.text-truncate").text() + val scanelement = chapelement.select("ul.chapter-list > li") + val dupselect = getduppref()!! + if (dupselect == "one") { + scanelement.first { chapters.add(regularChapterFromElement(it, chaptername, chapternumber, chapterUrl)) } + } else { + scanelement.forEach { chapters.add(regularChapterFromElement(it, chaptername, chapternumber, chapterUrl)) } + } + } + return chapters + } + + 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")}" + 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 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")}" + name = chName + chapter_number = number + 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 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 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("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) + } + + override fun pageListParse(document: Document): List = mutableListOf().apply { + if (getPageMethod() == "cascade") { + document.select("img.viewer-img").forEach { + add(Page(size, "", it.let { + if (it.hasAttr("data-src")) + it.attr("abs:data-src") else it.attr("abs:src") + })) + } + } else { + val pageList = document.select("#viewer-pages-select").first().select("option").map { it.attr("value").toInt() } + val url = document.baseUri() + pageList.forEach { + add(Page(it, "$url/$it")) + } + } + } + + 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("Tipo", arrayOf( + Pair("Ver todo", ""), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + Pair("Manhwa", "manhwa"), + Pair("Novela", "novel"), + Pair("One shot", "one_shot"), + Pair("Doujinshi", "doujinshi"), + Pair("Oel", "oel") + )) + + private class Demography : UriPartFilter("Demografía", arrayOf( + Pair("Ver todo", ""), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen", "shounen"), + Pair("Josei", "josei"), + Pair("Kodomo", "kodomo") + )) + + private class FilterBy : UriPartFilter("Ordenar por", arrayOf( + Pair("Título", "title"), + Pair("Autor", "author"), + Pair("Compañia", "company") + )) + + private class OrderBy : UriPartFilter("Ordenar por", arrayOf( + Pair("Me gusta", "likes_count"), + Pair("Alfabético", "alphabetically"), + Pair("Puntuación", "score"), + Pair("Creación", "creation"), + Pair("Fecha estreno", "release_date") + )) + + private class OrderDir : UriPartFilter("Ordenar por", arrayOf( + Pair("ASC", "asc"), + Pair("DESC", "desc") + )) + + 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("Géneros", genres) + + override fun getFilterList() = FilterList( + Types(), + Demography(), + Filter.Separator(), + FilterBy(), + OrderBy(), + OrderDir(), + Filter.Separator(), + WebcomicFilter(), + FourKomaFilter(), + AmateurFilter(), + EroticFilter(), + GenreList(getGenreList()) + ) + + // 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 + private fun getGenreList() = listOf( + Genre("Acción", "1"), + Genre("Aventura", "2"), + Genre("Comedia", "3"), + Genre("Drama", "4"), + Genre("Recuentos de la vida", "5"), + Genre("Ecchi", "6"), + Genre("Fantasia", "7"), + Genre("Magia", "8"), + Genre("Sobrenatural", "9"), + Genre("Horror", "10"), + Genre("Misterio", "11"), + Genre("Psicológico", "12"), + Genre("Romance", "13"), + Genre("Ciencia Ficción", "14"), + Genre("Thriller", "15"), + Genre("Deporte", "16"), + Genre("Girls Love", "17"), + Genre("Boys Love", "18"), + Genre("Harem", "19"), + Genre("Mecha", "20"), + Genre("Supervivencia", "21"), + Genre("Reencarnación", "22"), + Genre("Gore", "23"), + Genre("Apocalíptico", "24"), + Genre("Tragedia", "25"), + Genre("Vida Escolar", "26"), + Genre("Historia", "27"), + Genre("Militar", "28"), + Genre("Policiaco", "29"), + Genre("Crimen", "30"), + Genre("Superpoderes", "31"), + Genre("Vampiros", "32"), + Genre("Artes Marciales", "33"), + Genre("Samurái", "34"), + Genre("Género Bender", "35"), + Genre("Realidad Virtual", "36"), + Genre("Ciberpunk", "37"), + Genre("Musica", "38"), + Genre("Parodia", "39"), + Genre("Animación", "40"), + Genre("Demonios", "41"), + Genre("Familia", "42"), + Genre("Extranjero", "43"), + Genre("Niños", "44"), + Genre("Realidad", "45"), + Genre("Telenovela", "46"), + Genre("Guerra", "47"), + Genre("Oeste", "48") + ) + + private open class UriPartFilter(displayName: String, val vals: Array>) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + fun toUriPart() = vals[state].second + } + + // Preferences Code + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + val deduppref = androidx.preference.ListPreference(screen.context).apply { + key = DEDUP_PREF_Title + title = DEDUP_PREF_Title + entries = arrayOf("All scanlators", "One scanlator per chapter") + entryValues = arrayOf("all", "one") + summary = "%s" + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as String + val index = this.findIndexOfValue(selected) + val entry = entryValues[index] as String + preferences.edit().putString(DEDUP_PREF, entry).commit() + } + } + + val pageMethod = androidx.preference.ListPreference(screen.context).apply { + key = PAGEGET_PREF_Title + title = PAGEGET_PREF_Title + entries = arrayOf("Cascada", "Paginada") + entryValues = arrayOf("cascade", "paginated") + summary = "%s" + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as String + val index = this.findIndexOfValue(selected) + val entry = entryValues[index] as String + preferences.edit().putString(PAGEGET_PREF, entry).commit() + } + } + screen.addPreference(deduppref) + screen.addPreference(pageMethod) + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val deduppref = ListPreference(screen.context).apply { + key = DEDUP_PREF_Title + title = DEDUP_PREF_Title + entries = arrayOf("All scanlators", "One scanlator per chapter") + entryValues = arrayOf("all", "one") + summary = "%s" + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as String + val index = this.findIndexOfValue(selected) + val entry = entryValues[index] as String + preferences.edit().putString(DEDUP_PREF, entry).commit() + } + } + + val pageMethod = ListPreference(screen.context).apply { + key = PAGEGET_PREF_Title + title = PAGEGET_PREF_Title + entries = arrayOf("Cascada", "Paginada") + entryValues = arrayOf("cascade", "paginated") + summary = "%s" + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as String + val index = this.findIndexOfValue(selected) + val entry = entryValues[index] as String + preferences.edit().putString(PAGEGET_PREF, entry).commit() + } + } + screen.addPreference(deduppref) + screen.addPreference(pageMethod) + + } + + 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 = "deduppref" + private const val PAGEGET_PREF_Title = "Método para obtener imágenes" + private const val PAGEGET_PREF = "pagemethodpref" + } +} From 1059277db61afff1e4fc1077b25e3eccd70f32a7 Mon Sep 17 00:00:00 2001 From: happywillow0 <45346080+happywillow0@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:05:37 -0400 Subject: [PATCH 2/2] Update build.gradle --- src/es/tumangaonline/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/es/tumangaonline/build.gradle b/src/es/tumangaonline/build.gradle index aa6186eaf..133af0b5b 100644 --- a/src/es/tumangaonline/build.gradle +++ b/src/es/tumangaonline/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: TuMangaOnline' pkgNameSuffix = 'es.tumangaonline' extClass = '.TuMangaOnline' - extVersionCode = 1 + extVersionCode = 25 libVersion = '1.2' }