From 69e7bc75efd2cc14d23c03b63d79c2d3177f83e3 Mon Sep 17 00:00:00 2001 From: Chopper <156493704+choppeh@users.noreply.github.com> Date: Thu, 7 Nov 2024 08:26:26 -0300 Subject: [PATCH] CrystalComics: Theme changed (#5906) * Theme changed * Fix lint and update icon * Use imageFromElement --- .../etoshore}/AndroidManifest.xml | 8 +- lib-multisrc/etoshore/build.gradle.kts | 5 + .../eu/kanade/tachiyomi/multisrc/Etoshore.kt | 242 ++++++++++++++++++ .../tachiyomi/multisrc/EtoshoreUrlActivity.kt | 6 +- src/pt/crystalcomics/build.gradle | 4 +- .../res/mipmap-hdpi/ic_launcher.png | Bin 4562 -> 3340 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 2613 -> 1882 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 6442 -> 4467 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 11200 -> 7841 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 15916 -> 11150 bytes .../pt/crystalcomics/CrystalComics.kt | 12 +- src/pt/mangalivre/build.gradle | 4 +- .../extension/pt/mangalivre/MangaLivre.kt | 201 +-------------- 13 files changed, 274 insertions(+), 208 deletions(-) rename {src/pt/mangalivre => lib-multisrc/etoshore}/AndroidManifest.xml (72%) create mode 100644 lib-multisrc/etoshore/build.gradle.kts create mode 100644 lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/Etoshore.kt rename src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivreUrlActivity.kt => lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/EtoshoreUrlActivity.kt (85%) diff --git a/src/pt/mangalivre/AndroidManifest.xml b/lib-multisrc/etoshore/AndroidManifest.xml similarity index 72% rename from src/pt/mangalivre/AndroidManifest.xml rename to lib-multisrc/etoshore/AndroidManifest.xml index ea54504a3..24530a9e1 100644 --- a/src/pt/mangalivre/AndroidManifest.xml +++ b/lib-multisrc/etoshore/AndroidManifest.xml @@ -2,7 +2,7 @@ @@ -13,9 +13,9 @@ + android:host="${SOURCEHOST}" + android:pathPattern="/.*/..*" + android:scheme="${SOURCESCHEME}" /> diff --git a/lib-multisrc/etoshore/build.gradle.kts b/lib-multisrc/etoshore/build.gradle.kts new file mode 100644 index 000000000..dc076cc37 --- /dev/null +++ b/lib-multisrc/etoshore/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + id("lib-multisrc") +} + +baseVersionCode = 1 diff --git a/lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/Etoshore.kt b/lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/Etoshore.kt new file mode 100644 index 000000000..441b12ce5 --- /dev/null +++ b/lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/Etoshore.kt @@ -0,0 +1,242 @@ +package eu.kanade.tachiyomi.multisrc.etoshore + +import eu.kanade.tachiyomi.network.GET +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 okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +abstract class Etoshore( + override val name: String, + override val baseUrl: String, + final override val lang: String, +) : ParsedHttpSource() { + + override val supportsLatest = true + + override val client = network.cloudflareClient + + // ============================== Popular ============================== + + open val popularFilter = FilterList( + SelectionList("", listOf(Tag(value = "views", query = "sort"))), + ) + + override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", popularFilter) + override fun popularMangaParse(response: Response) = searchMangaParse(response) + + override fun popularMangaSelector() = throw UnsupportedOperationException() + override fun popularMangaNextPageSelector() = throw UnsupportedOperationException() + override fun popularMangaFromElement(element: Element) = throw UnsupportedOperationException() + + // ============================== Latest =============================== + + open val latestFilter = FilterList( + SelectionList("", listOf(Tag(value = "date", query = "sort"))), + ) + + override fun latestUpdatesRequest(page: Int) = searchMangaRequest(page, "", latestFilter) + override fun latestUpdatesParse(response: Response) = searchMangaParse(response) + + override fun latestUpdatesSelector() = throw UnsupportedOperationException() + override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException() + override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException() + + // ============================== Search =============================== + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/page/$page".toHttpUrl().newBuilder() + .addQueryParameter("s", query) + + filters.forEach { filter -> + when (filter) { + is SelectionList -> { + val selected = filter.selected() + url.addQueryParameter(selected.query, selected.value) + } + else -> {} + } + } + + return GET(url.build(), headers) + } + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (query.startsWith(PREFIX_SEARCH)) { + val slug = query.substringAfter(PREFIX_SEARCH) + return fetchMangaDetails(SManga.create().apply { url = "/manga/$slug/" }) + .map { manga -> MangasPage(listOf(manga), false) } + } + return super.fetchSearchManga(page, query, filters) + } + + override fun searchMangaSelector() = ".search-posts .chapter-box .poster a" + + override fun searchMangaNextPageSelector() = ".navigation .naviright:has(a)" + + override fun searchMangaFromElement(element: Element) = SManga.create().apply { + title = element.attr("title") + thumbnail_url = element.selectFirst("img")?.let(::imageFromElement) + setUrlWithoutDomain(element.absUrl("href")) + } + + override fun searchMangaParse(response: Response): MangasPage { + if (filterList.isEmpty()) { + filterParse(response) + } + return super.searchMangaParse(response) + } + + // ============================== Details =============================== + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst("h1")!!.text() + description = document.selectFirst(".excerpt p")?.text() + document.selectFirst(".details-right-con img")?.let { thumbnail_url = imageFromElement(it) } + genre = document.select("div.meta-item span.meta-title:contains(Genres) + span a") + .joinToString { it.text() } + author = document.selectFirst("div.meta-item span.meta-title:contains(Author) + span a") + ?.text() + document.selectFirst(".status")?.text()?.let { + status = it.toMangaStatus() + } + + setUrlWithoutDomain(document.location()) + } + + protected open fun imageFromElement(element: Element): String? { + return when { + element.hasAttr("data-src") -> element.attr("abs:data-src") + element.hasAttr("data-lazy-src") -> element.attr("abs:data-lazy-src") + element.hasAttr("srcset") -> element.attr("abs:srcset").getSrcSetImage() + element.hasAttr("data-cfsrc") -> element.attr("abs:data-cfsrc") + else -> element.attr("abs:src") + } + } + + protected open fun String.getSrcSetImage(): String? { + return this.split(" ") + .filter(URL_REGEX::matches) + .maxOfOrNull(String::toString) + } + + protected val completedStatusList: Array = arrayOf( + "Finished", + "Completo", + ) + + protected open val ongoingStatusList: Array = arrayOf( + "Publishing", + "Ativo", + ) + + protected val hiatusStatusList: Array = arrayOf( + "on hiatus", + ) + + protected val canceledStatusList: Array = arrayOf( + "Canceled", + "Discontinued", + ) + + open fun String.toMangaStatus(): Int { + return when { + containsIn(completedStatusList) -> SManga.COMPLETED + containsIn(ongoingStatusList) -> SManga.ONGOING + containsIn(hiatusStatusList) -> SManga.ON_HIATUS + containsIn(canceledStatusList) -> SManga.CANCELLED + else -> SManga.UNKNOWN + } + } + + // ============================== Chapters ============================ + + override fun chapterListSelector() = ".chapter-list li a" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + name = element.selectFirst(".title")!!.text() + setUrlWithoutDomain(element.absUrl("href")) + } + + // ============================== Pages =============================== + + override fun pageListParse(document: Document): List { + return document.select(".chapter-images .chapter-item > img").mapIndexed { index, element -> + Page(index, imageUrl = imageFromElement(element)) + } + } + + override fun imageUrlParse(document: Document) = "" + + // ============================= Filters ============================== + + private var filterList = emptyList>>() + + override fun getFilterList(): FilterList { + val filters = mutableListOf>() + + filters += if (filterList.isNotEmpty()) { + filterList.map { SelectionList(it.first, it.second) } + } else { + listOf(Filter.Header("Aperte 'Redefinir' para tentar mostrar os filtros")) + } + + return FilterList(filters) + } + + protected open fun parseSelection(document: Document, selector: String): Pair>? { + val selectorFilter = "#filter-form $selector .select-item-head .text" + return document.selectFirst(selectorFilter)?.text()?.let { displayName -> + displayName to document.select("#filter-form $selector li").map { element -> + element.selectFirst("input")!!.let { input -> + Tag( + name = element.selectFirst(".text")!!.text(), + value = input.attr("value"), + query = input.attr("name"), + ) + } + } + } + } + + open val filterListSelector: List = listOf( + ".filter-genre", + ".filter-status", + ".filter-type", + ".filter-year", + ".filter-sort", + ) + + open fun filterParse(response: Response) { + val document = Jsoup.parseBodyFragment(response.peekBody(Long.MAX_VALUE).string()) + filterList = filterListSelector.mapNotNull { selector -> parseSelection(document, selector) } + } + + protected data class Tag(val name: String = "", val value: String = "", val query: String = "") + + private open class SelectionList(displayName: String, private val vals: List, state: Int = 0) : + Filter.Select(displayName, vals.map { it.name }.toTypedArray(), state) { + fun selected() = vals[state] + } + + // ============================= Utils ============================== + + private fun String.containsIn(array: Array): Boolean { + return this.lowercase() in array.map { it.lowercase() } + } + + companion object { + const val PREFIX_SEARCH = "id:" + val URL_REGEX = """^(https?://[^\s/$.?#].[^\s]*)${'$'}""".toRegex() + } +} diff --git a/src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivreUrlActivity.kt b/lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/EtoshoreUrlActivity.kt similarity index 85% rename from src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivreUrlActivity.kt rename to lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/EtoshoreUrlActivity.kt index 136e120de..89c5dd58e 100644 --- a/src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivreUrlActivity.kt +++ b/lib-multisrc/etoshore/src/eu/kanade/tachiyomi/multisrc/EtoshoreUrlActivity.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.extension.pt.mangalivre +package eu.kanade.tachiyomi.multisrc.etoshore import android.app.Activity import android.content.ActivityNotFoundException @@ -7,7 +7,7 @@ import android.os.Bundle import android.util.Log import kotlin.system.exitProcess -class MangaLivreUrlActivity : Activity() { +class EtoshoreUrlActivity : Activity() { private val tag = javaClass.simpleName @@ -18,7 +18,7 @@ class MangaLivreUrlActivity : Activity() { val item = pathSegments[1] val mainIntent = Intent().apply { action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", "${MangaLivre.PREFIX_SEARCH}$item") + putExtra("query", "${Etoshore.PREFIX_SEARCH}$item") putExtra("filter", packageName) } diff --git a/src/pt/crystalcomics/build.gradle b/src/pt/crystalcomics/build.gradle index fa7400592..455352919 100644 --- a/src/pt/crystalcomics/build.gradle +++ b/src/pt/crystalcomics/build.gradle @@ -1,9 +1,9 @@ ext { extName = 'CrystalComics' extClass = '.CrystalComics' - themePkg = 'madara' + themePkg = 'etoshore' baseUrl = 'https://crystalcomics.com' - overrideVersionCode = 0 + overrideVersionCode = 37 } apply from: "$rootDir/common.gradle" diff --git a/src/pt/crystalcomics/res/mipmap-hdpi/ic_launcher.png b/src/pt/crystalcomics/res/mipmap-hdpi/ic_launcher.png index 3a490e3147732e6560779a9169e0532106bd7ac6..7cbdc492900f04e7fb28261374a9ebdf6b02daca 100644 GIT binary patch delta 3338 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 ^<*DU9T0xo3=D5{rohAsv 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 P00000NkvXXu0mjfJ#OgE diff --git a/src/pt/crystalcomics/res/mipmap-xhdpi/ic_launcher.png b/src/pt/crystalcomics/res/mipmap-xhdpi/ic_launcher.png index 90220134b22dd61c00052c71ce1d0771c5ed2e55..1a7c8b499e150f291c411c4c0aee65bdc92fc441 100644 GIT binary patch literal 4467 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 FV1k`Wqb>jd literal 6442 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 EftK$^|J?}jG5c-RwI%>yw}mS! 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 Yfn)cYoCXq&89f7V6)ojTCG$`J1A&BnS^xk5 literal 11200 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 !7xR^wU^%{!B3}i9o!BvdiVLAgn-!^mF@f+^RN{ zHy&wzcD4heq0sI5My#eguZu`ifQowb-}7WgLBMCvvad74)_WjRFLN76Lkv&5GX z5>%oAm&Z@pfX&Arx6j&O=n6`mEO$Sm+r=J%yRc|3d=iL_8KD`QSjWYY`Fb5UC7tkO zKN_QnY3&Z~_B?W|h6&2WgLIY4$OJ5ng0(7uro^@*8%uPSTQv zZ^9?t!ym*b3luV|8pa3!eqLD}5*R&aQ@?4w1u>~hA-Um@hlov`!ffukR=*KXSzv*m zM=o^8G)Oc*%sC*1Q2IO5*Bghx{fRo6ElwKD_Qz8Rby3^j#NFWHeW8DRG;!y z2qc#$vZ>sma7Em$n)h_hxpFSwrhAR zB*^j8sqe{u_j!o^8$>0lxe01QMGl=dm@^_gvHx3PqaHuz+6N#u wB&-ZzQ-qQR@A7j7)sd?%^{(~*|GEdf=ZN@D%{AWtCT{_6Tgr2L(SB%>V!Z literal 15916 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 diff --git a/src/pt/crystalcomics/src/eu/kanade/tachiyomi/extension/pt/crystalcomics/CrystalComics.kt b/src/pt/crystalcomics/src/eu/kanade/tachiyomi/extension/pt/crystalcomics/CrystalComics.kt index 7752cd46b..0d8972e56 100644 --- a/src/pt/crystalcomics/src/eu/kanade/tachiyomi/extension/pt/crystalcomics/CrystalComics.kt +++ b/src/pt/crystalcomics/src/eu/kanade/tachiyomi/extension/pt/crystalcomics/CrystalComics.kt @@ -1,14 +1,14 @@ package eu.kanade.tachiyomi.extension.pt.crystalcomics -import eu.kanade.tachiyomi.multisrc.madara.Madara -import java.text.SimpleDateFormat -import java.util.Locale +import eu.kanade.tachiyomi.multisrc.etoshore.Etoshore +import eu.kanade.tachiyomi.network.interceptor.rateLimit -class CrystalComics : Madara( +class CrystalComics : Etoshore( "Crystal Comics", "https://crystalcomics.com", "pt-BR", - SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR")), ) { - override val useNewChapterEndpoint = true + override val client = super.client.newBuilder() + .rateLimit(2) + .build() } diff --git a/src/pt/mangalivre/build.gradle b/src/pt/mangalivre/build.gradle index 653384aa6..943b0b342 100644 --- a/src/pt/mangalivre/build.gradle +++ b/src/pt/mangalivre/build.gradle @@ -1,7 +1,9 @@ ext { extName = 'Manga Livre' extClass = '.MangaLivre' - extVersionCode = 2 + themePkg = 'etoshore' + baseUrl = 'https://mangalivre.one' + overrideVersionCode = 1 isNsfw = true } diff --git a/src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivre.kt b/src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivre.kt index 82e3f466b..181c2be84 100644 --- a/src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivre.kt +++ b/src/pt/mangalivre/src/eu/kanade/tachiyomi/extension/pt/mangalivre/MangaLivre.kt @@ -1,206 +1,23 @@ package eu.kanade.tachiyomi.extension.pt.mangalivre -import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.multisrc.etoshore.Etoshore import eu.kanade.tachiyomi.network.interceptor.rateLimit -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 okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Request import okhttp3.Response -import org.jsoup.Jsoup -import org.jsoup.nodes.Document import org.jsoup.nodes.Element -import rx.Observable - -/** - * Etoshore - Manga Theme - */ -class MangaLivre : ParsedHttpSource() { - - override val name = "Manga Livre" - - override val baseUrl = "https://mangalivre.one" - - override val lang = "pt-BR" - - override val supportsLatest = true +class MangaLivre : Etoshore( + name = "Manga Livre", + baseUrl = "https://mangalivre.one", + lang = "pt-BR", +) { override val versionId = 2 override val client = network.cloudflareClient.newBuilder() .rateLimit(2) .build() - // ============================== Popular ============================== + override fun chapterListParse(response: Response) = + super.chapterListParse(response).reversed() - private val popularFilter = FilterList( - SelectionList("", listOf(Tag(value = "views", query = "sort"))), - ) - - override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", popularFilter) - override fun popularMangaParse(response: Response) = searchMangaParse(response) - - override fun popularMangaSelector() = throw UnsupportedOperationException() - override fun popularMangaNextPageSelector() = throw UnsupportedOperationException() - override fun popularMangaFromElement(element: Element) = throw UnsupportedOperationException() - - // ============================== Latest =============================== - - private val latestFilter = FilterList( - SelectionList("", listOf(Tag(value = "date", query = "sort"))), - ) - - override fun latestUpdatesRequest(page: Int) = searchMangaRequest(page, "", latestFilter) - override fun latestUpdatesParse(response: Response) = searchMangaParse(response) - - override fun latestUpdatesSelector() = throw UnsupportedOperationException() - override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException() - override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException() - - // ============================== Search =============================== - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = "$baseUrl/page/$page".toHttpUrl().newBuilder() - .addQueryParameter("s", query) - - filters.forEach { filter -> - when (filter) { - is SelectionList -> { - val selected = filter.selected() - url.addQueryParameter(selected.query, selected.value) - } - else -> {} - } - } - - return GET(url.build(), headers) - } - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - if (query.startsWith(PREFIX_SEARCH)) { - val slug = query.substringAfter(PREFIX_SEARCH) - return fetchMangaDetails(SManga.create().apply { url = "/manga/$slug/" }) - .map { manga -> MangasPage(listOf(manga), false) } - } - return super.fetchSearchManga(page, query, filters) - } - - override fun searchMangaSelector() = ".search-posts .chapter-box .poster a" - - override fun searchMangaNextPageSelector() = ".navigation .naviright:has(a)" - - override fun searchMangaFromElement(element: Element) = SManga.create().apply { - title = element.attr("title") - thumbnail_url = element.selectFirst("img")?.absUrl("src") - setUrlWithoutDomain(element.absUrl("href")) - } - - override fun searchMangaParse(response: Response): MangasPage { - if (filterList.isEmpty()) { - filterParse(response) - } - return super.searchMangaParse(response) - } - - // ============================== Details =============================== - - override fun mangaDetailsParse(document: Document) = SManga.create().apply { - title = document.selectFirst("h1")!!.text() - description = document.selectFirst(".excerpt p")?.text() - thumbnail_url = document.selectFirst(".details-right-con img")?.absUrl("src") - genre = document.select("div.meta-item span.meta-title:contains(Genres) + span a") - .joinToString { it.text() } - author = document.selectFirst("div.meta-item span.meta-title:contains(Author) + span a") - ?.text() - document.selectFirst(".status")?.text()?.let { - status = it.toMangaStatus() - } - - setUrlWithoutDomain(document.location()) - } - - private fun String.toMangaStatus(): Int { - return when (this.lowercase().trim()) { - "publishing" -> SManga.ONGOING - "finished" -> SManga.COMPLETED - "discontinued" -> SManga.CANCELLED - "on hiatus" -> SManga.ON_HIATUS - else -> SManga.UNKNOWN - } - } - - // ============================== Chapters ============================ - - override fun chapterListSelector() = ".chapter-list li a" - - override fun chapterFromElement(element: Element) = SChapter.create().apply { - name = element.selectFirst(".title")!!.text() - setUrlWithoutDomain(element.absUrl("href")) - } - - override fun chapterListParse(response: Response) = super.chapterListParse(response).reversed() - - // ============================== Pages =============================== - - override fun pageListParse(document: Document): List { - return document.select(".chapter-images .chapter-item img").mapIndexed { index, element -> - Page(index, imageUrl = element.absUrl("src")) - } - } - - override fun imageUrlParse(document: Document) = "" - - // ============================= Filters ============================== - - private var filterList = emptyList() - - override fun getFilterList(): FilterList { - val filters = filterList.takeIf(List<*>::isNotEmpty) - ?: listOf(Filter.Header("Aperte 'Redefinir' para tentar mostrar os filtros")) - return FilterList(filters) - } - - private fun parseSelection(document: Document, selector: String): SelectionList? { - val selectorFilter = "#filter-form $selector .select-item-head .text" - return document.selectFirst(selectorFilter)?.text()?.let { displayName -> - val values = document.select("#filter-form $selector li").map { element -> - element.selectFirst("input")!!.let { input -> - Tag( - name = element.selectFirst(".text")!!.text(), - value = input.attr("value"), - query = input.attr("name"), - ) - } - } - SelectionList(displayName, values) - } - } - - private val filterListSelector: List = listOf( - ".filter-genre", - ".filter-status", - ".filter-type", - ".filter-sort", - ) - - private fun filterParse(response: Response) { - val document = Jsoup.parseBodyFragment(response.peekBody(Long.MAX_VALUE).string()) - filterList = filterListSelector.mapNotNull { selector -> parseSelection(document, selector) } - } - - private data class Tag(val name: String = "", val value: String = "", val query: String = "") - - private open class SelectionList(displayName: String, private val vals: List, state: Int = 0) : - Filter.Select(displayName, vals.map { it.name }.toTypedArray(), state) { - fun selected() = vals[state] - } - - companion object { - const val PREFIX_SEARCH = "id:" - } + override fun imageFromElement(element: Element): String? = element.attr("abs:src") }