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:
@ -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"
|
||||||
|
@ -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>>
|
||||||
|
@ -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),
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user