feat(multisrc/DooPlay): Make new filters implementation easier (#1434)

* feat(multisrc/DooPlay): Make new filters implementation easier

* fix(multisrc/DooPlay): Update CineVision URL
This commit is contained in:
Claudemirovsky
2023-03-22 23:00:48 -03:00
committed by GitHub
parent bbae30385d
commit 719c1ebf9c
3 changed files with 42 additions and 20 deletions

View File

@ -13,7 +13,7 @@ import uy.kohesive.injekt.api.get
class CineVision : DooPlay( class CineVision : DooPlay(
"pt-BR", "pt-BR",
"CineVision", "CineVision",
"https://cinevisionv6.net", "https://cinevision.vc",
) { ) {
// ============================== Popular =============================== // ============================== Popular ===============================
override fun popularAnimeSelector(): String = "article.w_item_b > a" override fun popularAnimeSelector(): String = "article.w_item_b > a"

View File

@ -199,10 +199,16 @@ abstract class DooPlay(
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
return when { return when {
query.isBlank() -> { query.isBlank() -> {
val genreUri = filters.asUriPart() filters
var url = "$baseUrl/$genreUri" .firstOrNull { it.state != 0 }
if (page > 1) url += "/page/$page" ?.let {
GET(url, headers) val filter = it as UriPartFilter
val filterUrl = buildString {
append("$baseUrl/${filter.toUriPart()}")
if (page > 1) append("/page/$page")
}
GET(filterUrl, headers)
} ?: popularAnimeRequest(page)
} }
else -> GET("$baseUrl/page/$page/?s=$query", headers) else -> GET("$baseUrl/page/$page/?s=$query", headers)
} }
@ -318,13 +324,13 @@ abstract class DooPlay(
/** /**
* Automatically fetched genres from the source to be used in the filters. * Automatically fetched genres from the source to be used in the filters.
*/ */
protected open lateinit var genresListFilter: AnimeFilter<*> protected open lateinit var genresArray: FilterItems
override fun getFilterList(): AnimeFilterList { override fun getFilterList(): AnimeFilterList {
return if (this::genresListFilter.isInitialized) { return if (this::genresArray.isInitialized) {
AnimeFilterList( AnimeFilterList(
AnimeFilter.Header(genreFilterHeader), AnimeFilter.Header(genreFilterHeader),
genresListFilter, FetchedGenresFilter(genresListMessage, genresArray),
) )
} else if (fetchGenres) { } else if (fetchGenres) {
AnimeFilterList(AnimeFilter.Header(genresMissingWarning)) AnimeFilterList(AnimeFilter.Header(genresMissingWarning))
@ -337,15 +343,17 @@ abstract class DooPlay(
* Fetch the genres from the source to be used in the filters. * Fetch the genres from the source to be used in the filters.
*/ */
protected open fun fetchGenresList() { protected open fun fetchGenresList() {
if (!this::genresListFilter.isInitialized && fetchGenres) { if (!this::genresArray.isInitialized && fetchGenres) {
runCatching { runCatching {
val filter = client.newCall(genresListRequest()) client.newCall(genresListRequest())
.execute() .execute()
.asJsoup() .asJsoup()
.let(::genresListParse) .let(::genresListParse)
if ((filter as AnimeFilter.Select<*>).values.size > 0) { .let { items ->
genresListFilter = filter if (items.isNotEmpty()) {
} genresArray = items
}
}
}.onFailure { it.printStackTrace() } }.onFailure { it.printStackTrace() }
} }
} }
@ -358,13 +366,23 @@ abstract class DooPlay(
/** /**
* Get the genres from the document. * Get the genres from the document.
*/ */
protected open fun genresListParse(document: Document): AnimeFilter<*> { protected open fun genresListParse(document: Document): FilterItems {
val items = document.select(genresListSelector()).map { val items = document.select(genresListSelector()).map {
val name = it.text() val name = it.text()
val value = it.attr("href").substringAfter("$baseUrl/") val value = it.attr("href").substringAfter("$baseUrl/")
Pair(name, value) Pair(name, value)
}.toTypedArray() }.toTypedArray()
return UriPartFilter(genresListMessage, items)
return if (items.isEmpty()) {
items
} else {
arrayOf(Pair(selectFilterText, "")) + items
}
}
protected open val selectFilterText = when (lang) {
"pt-BR" -> "<Selecione>"
else -> "<Select>"
} }
protected open val genreFilterHeader = when (lang) { protected open val genreFilterHeader = when (lang) {
@ -382,11 +400,13 @@ abstract class DooPlay(
else -> "Genre" else -> "Genre"
} }
protected open fun genresListSelector() = "li:contains(${genresListMessage}s) ul.sub-menu li > a" protected open fun genresListSelector() = "li:contains($genresListMessage) ul.sub-menu li > a"
class FetchedGenresFilter(title: String, items: FilterItems) : UriPartFilter(title, items)
open class UriPartFilter( open class UriPartFilter(
displayName: String, displayName: String,
val vals: Array<Pair<String, String>>, val vals: FilterItems,
) : AnimeFilter.Select<String>( ) : AnimeFilter.Select<String>(
displayName, displayName,
vals.map { it.first }.toTypedArray(), vals.map { it.first }.toTypedArray(),
@ -394,8 +414,8 @@ abstract class DooPlay(
fun toUriPart() = vals[state].second fun toUriPart() = vals[state].second
} }
private fun AnimeFilterList.asUriPart(): String { private inline fun <reified R> AnimeFilterList.asUriPart(): String {
return this.filterIsInstance<UriPartFilter>().first().toUriPart() return this.first { it is R }.let { it as UriPartFilter }.toUriPart()
} }
// ============================= Utilities ============================== // ============================= Utilities ==============================
@ -466,3 +486,5 @@ abstract class DooPlay(
.getOrNull() ?: 0L .getOrNull() ?: 0L
} }
} }
typealias FilterItems = Array<Pair<String, String>>

View File

@ -13,7 +13,7 @@ class DooPlayGenerator : ThemeSourceGenerator {
override val sources = listOf( override val sources = listOf(
SingleLang("Animes House", "https://animeshouse.net", "pt-BR", isNsfw = false, overrideVersionCode = 4), SingleLang("Animes House", "https://animeshouse.net", "pt-BR", isNsfw = false, overrideVersionCode = 4),
SingleLang("Cinemathek", "https://cinemathek.net", "de", isNsfw = true, overrideVersionCode = 9), SingleLang("Cinemathek", "https://cinemathek.net", "de", isNsfw = true, overrideVersionCode = 9),
SingleLang("CineVision", "https://cinevisionv6.net", "pt-BR", isNsfw = true, overrideVersionCode = 3), SingleLang("CineVision", "https://cinevision.vc", "pt-BR", isNsfw = true, overrideVersionCode = 4),
SingleLang("pactedanime", "https://pactedanime.com", "en", isNsfw = false, overrideVersionCode = 4), SingleLang("pactedanime", "https://pactedanime.com", "en", isNsfw = false, overrideVersionCode = 4),
SingleLang("Pi Fansubs", "https://pifansubs.org", "pt-BR", isNsfw = true, overrideVersionCode = 12), SingleLang("Pi Fansubs", "https://pifansubs.org", "pt-BR", isNsfw = true, overrideVersionCode = 12),
) )