Add more filters to Tsuki. (#7061)
This commit is contained in:
		
							parent
							
								
									c06c47caac
								
							
						
					
					
						commit
						b03d930599
					
				| @ -5,8 +5,9 @@ ext { | ||||
|     extName = 'Tsuki Mangás' | ||||
|     pkgNameSuffix = 'pt.tsukimangas' | ||||
|     extClass = '.TsukiMangas' | ||||
|     extVersionCode = 14 | ||||
|     extVersionCode = 15 | ||||
|     libVersion = '1.2' | ||||
|     containsNsfw = true | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|  | ||||
| @ -9,6 +9,7 @@ import com.github.salomonbrys.kotson.string | ||||
| import com.google.gson.JsonElement | ||||
| import com.google.gson.JsonObject | ||||
| import com.google.gson.JsonParser | ||||
| import eu.kanade.tachiyomi.annotations.Nsfw | ||||
| import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor | ||||
| import eu.kanade.tachiyomi.network.GET | ||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | ||||
| @ -30,6 +31,7 @@ import java.text.SimpleDateFormat | ||||
| import java.util.Locale | ||||
| import java.util.concurrent.TimeUnit | ||||
| 
 | ||||
| @Nsfw | ||||
| class TsukiMangas : HttpSource() { | ||||
| 
 | ||||
|     override val name = "Tsuki Mangás" | ||||
| @ -51,16 +53,17 @@ class TsukiMangas : HttpSource() { | ||||
|         .add("Referer", baseUrl) | ||||
| 
 | ||||
|     override fun popularMangaRequest(page: Int): Request { | ||||
|         return GET("$baseUrl/api/v2/home", headers) | ||||
|         return GET("$baseUrl/api/v2/mangas?page=$page&title=&filter=0", headers) | ||||
|     } | ||||
| 
 | ||||
|     override fun popularMangaParse(response: Response): MangasPage { | ||||
|         val result = response.asJson().obj | ||||
| 
 | ||||
|         val popularMangas = result["topviewsmonth"].array | ||||
|         val popularMangas = result["data"].array | ||||
|             .map { popularMangaItemParse(it.obj) } | ||||
| 
 | ||||
|         return MangasPage(popularMangas, false) | ||||
|         val hasNextPage = result["page"].int < result["lastPage"].int | ||||
|         return MangasPage(popularMangas, hasNextPage) | ||||
|     } | ||||
| 
 | ||||
|     private fun popularMangaItemParse(obj: JsonObject) = SManga.create().apply { | ||||
| @ -97,20 +100,41 @@ class TsukiMangas : HttpSource() { | ||||
|         val url = "$baseUrl/api/v2/mangas?page=$page".toHttpUrlOrNull()!!.newBuilder() | ||||
|         url.addQueryParameter("title", query) | ||||
| 
 | ||||
|         // Genre filter must be the first. | ||||
|         filters.filterIsInstance<GenreFilter>().firstOrNull()?.state | ||||
|             ?.filter { it.state } | ||||
|             ?.forEach { url.addQueryParameter("genres[]", it.name) } | ||||
| 
 | ||||
|         // Sort by filter must also be the first. | ||||
|         filters.filterIsInstance<SortByFilter>().firstOrNull() | ||||
|             ?.let { filter -> | ||||
|                 if (filter.state!!.index == 0) { | ||||
|                     url.addQueryParameter("filter", if (filter.state!!.ascending) "1" else "0") | ||||
|                 } else { | ||||
|                     url.addQueryParameter("filter", if (filter.state!!.ascending) "3" else "2") | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         filters.forEach { filter -> | ||||
|             when (filter) { | ||||
|                 is GenreFilter -> { | ||||
|                     filter.state | ||||
|                         .filter { it.state } | ||||
|                         .forEach { url.addQueryParameter("genres", it.name) } | ||||
|                 is DemographyFilter -> { | ||||
|                     if (filter.state > 0) { | ||||
|                         url.addQueryParameter("demography", filter.state.toString()) | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 is TypeFilter -> { | ||||
|                 is FormatFilter -> { | ||||
|                     if (filter.state > 0) { | ||||
|                         url.addQueryParameter("format", filter.state.toString()) | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 is StatusFilter -> { | ||||
|                     if (filter.state > 0) { | ||||
|                         url.addQueryParameter("status", (filter.state - 1).toString()) | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 is AdultFilter -> { | ||||
|                     if (filter.state == Filter.TriState.STATE_INCLUDE) { | ||||
|                         url.addQueryParameter("adult_content", "1") | ||||
| @ -259,73 +283,36 @@ class TsukiMangas : HttpSource() { | ||||
| 
 | ||||
|     private class Genre(name: String) : Filter.CheckBox(name) | ||||
| 
 | ||||
|     private class GenreFilter(genres: List<Genre>) : Filter.Group<Genre>("Gêneros", genres) | ||||
|     private class DemographyFilter(demographies: List<String>) : Filter.Select<String>("Demografia", demographies.toTypedArray()) | ||||
| 
 | ||||
|     private class TypeFilter(types: List<String>) : Filter.Select<String>("Formato", types.toTypedArray()) | ||||
|     private class FormatFilter(types: List<String>) : Filter.Select<String>("Formato", types.toTypedArray()) | ||||
| 
 | ||||
|     private class StatusFilter(statusList: List<String>) : Filter.Select<String>("Status", statusList.toTypedArray()) | ||||
| 
 | ||||
|     private class AdultFilter : Filter.TriState("Conteúdo adulto") | ||||
| 
 | ||||
|     private class SortByFilter : Filter.Sort("Ordenar por", arrayOf("Visualizações", "Nota"), Selection(0, false)) | ||||
| 
 | ||||
|     private class GenreFilter(genres: List<Genre>) : Filter.Group<Genre>("Gêneros", genres) | ||||
| 
 | ||||
|     override fun getFilterList(): FilterList = FilterList( | ||||
|         DemographyFilter(getDemographiesList()), | ||||
|         FormatFilter(getSerieFormats()), | ||||
|         StatusFilter(getStatusList()), | ||||
|         AdultFilter(), | ||||
|         SortByFilter(), | ||||
|         GenreFilter(getGenreList()), | ||||
|         TypeFilter(getSerieTypes()), | ||||
|         AdultFilter() | ||||
|     ) | ||||
| 
 | ||||
|     // [...document.querySelectorAll(".multiselect:first-of-type .multiselect__element span span")] | ||||
|     //     .map(i => `Genre("${i.innerHTML}")`).join(",\n") | ||||
|     private fun getGenreList(): List<Genre> = listOf( | ||||
|         Genre("4-koma"), | ||||
|         Genre("Adulto"), | ||||
|         Genre("Artes Marciais"), | ||||
|         Genre("Aventura"), | ||||
|         Genre("Ação"), | ||||
|         Genre("Bender"), | ||||
|         Genre("Comédia"), | ||||
|         Genre("Drama"), | ||||
|         Genre("Ecchi"), | ||||
|         Genre("Esporte"), | ||||
|         Genre("Fantasia"), | ||||
|         Genre("Ficção"), | ||||
|         Genre("Gastronomia"), | ||||
|         Genre("Gender"), | ||||
|         Genre("Guerra"), | ||||
|         Genre("Harém"), | ||||
|         Genre("Histórico"), | ||||
|         Genre("Horror"), | ||||
|         Genre("Isekai"), | ||||
|         Genre("Josei"), | ||||
|         Genre("Magia"), | ||||
|         Genre("Manhua"), | ||||
|         Genre("Manhwa"), | ||||
|         Genre("Mecha"), | ||||
|         Genre("Medicina"), | ||||
|         Genre("Militar"), | ||||
|         Genre("Mistério"), | ||||
|         Genre("Musical"), | ||||
|         Genre("One-Shot"), | ||||
|         Genre("Psicológico"), | ||||
|         Genre("Romance"), | ||||
|         Genre("Sci-fi"), | ||||
|         Genre("Seinen"), | ||||
|         Genre("Shoujo"), | ||||
|         Genre("Shoujo Ai"), | ||||
|         Genre("Shounen"), | ||||
|         Genre("Shounen Ai"), | ||||
|         Genre("Slice of Life"), | ||||
|         Genre("Sobrenatural"), | ||||
|         Genre("Super Poderes"), | ||||
|         Genre("Suspense"), | ||||
|         Genre("Terror"), | ||||
|         Genre("Thriller"), | ||||
|         Genre("Tragédia"), | ||||
|         Genre("Vida Escolar"), | ||||
|         Genre("Webtoon"), | ||||
|         Genre("Yaoi"), | ||||
|         Genre("Yuri"), | ||||
|         Genre("Zumbi") | ||||
|     private fun getDemographiesList(): List<String> = listOf( | ||||
|         "Todas", | ||||
|         "Shounen", | ||||
|         "Shoujo", | ||||
|         "Seinen", | ||||
|         "Josei" | ||||
|     ) | ||||
| 
 | ||||
|     private fun getSerieTypes(): List<String> = listOf( | ||||
|     private fun getSerieFormats(): List<String> = listOf( | ||||
|         "Todos", | ||||
|         "Mangá", | ||||
|         "Manhwa", | ||||
| @ -333,6 +320,98 @@ class TsukiMangas : HttpSource() { | ||||
|         "Novel" | ||||
|     ) | ||||
| 
 | ||||
|     private fun getStatusList(): List<String> = listOf( | ||||
|         "Todos", | ||||
|         "Ativo", | ||||
|         "Completo", | ||||
|         "Cancelado", | ||||
|         "Hiato" | ||||
|     ) | ||||
| 
 | ||||
|     // [...document.querySelectorAll(".multiselect:first-of-type .multiselect__element span span")] | ||||
|     //     .map(i => `Genre("${i.innerHTML}")`).join(",\n") | ||||
|     private fun getGenreList(): List<Genre> = listOf( | ||||
|         Genre("4-Koma"), | ||||
|         Genre("Adaptação"), | ||||
|         Genre("Aliens"), | ||||
|         Genre("Animais"), | ||||
|         Genre("Antologia"), | ||||
|         Genre("Artes Marciais"), | ||||
|         Genre("Aventura"), | ||||
|         Genre("Ação"), | ||||
|         Genre("Colorido por fã"), | ||||
|         Genre("Comédia"), | ||||
|         Genre("Crime"), | ||||
|         Genre("Cross-dressing"), | ||||
|         Genre("Deliquentes"), | ||||
|         Genre("Demônios"), | ||||
|         Genre("Doujinshi"), | ||||
|         Genre("Drama"), | ||||
|         Genre("Ecchi"), | ||||
|         Genre("Esportes"), | ||||
|         Genre("Fantasia"), | ||||
|         Genre("Fantasmas"), | ||||
|         Genre("Filosófico"), | ||||
|         Genre("Gals"), | ||||
|         Genre("Ganhador de Prêmio"), | ||||
|         Genre("Garotas Monstro"), | ||||
|         Genre("Garotas Mágicas"), | ||||
|         Genre("Gastronomia"), | ||||
|         Genre("Gore"), | ||||
|         Genre("Harém"), | ||||
|         Genre("Harém Reverso"), | ||||
|         Genre("Hentai"), | ||||
|         Genre("Histórico"), | ||||
|         Genre("Horror"), | ||||
|         Genre("Incesto"), | ||||
|         Genre("Isekai"), | ||||
|         Genre("Jogos Tradicionais"), | ||||
|         Genre("Lolis"), | ||||
|         Genre("Long Strip"), | ||||
|         Genre("Mafia"), | ||||
|         Genre("Magia"), | ||||
|         Genre("Mecha"), | ||||
|         Genre("Medicina"), | ||||
|         Genre("Militar"), | ||||
|         Genre("Mistério"), | ||||
|         Genre("Monstros"), | ||||
|         Genre("Música"), | ||||
|         Genre("Ninjas"), | ||||
|         Genre("Obscenidade"), | ||||
|         Genre("Oficialmente Colorido"), | ||||
|         Genre("One-shot"), | ||||
|         Genre("Policial"), | ||||
|         Genre("Psicológico"), | ||||
|         Genre("Pós-apocalíptico"), | ||||
|         Genre("Realidade Virtual"), | ||||
|         Genre("Reencarnação"), | ||||
|         Genre("Romance"), | ||||
|         Genre("Samurais"), | ||||
|         Genre("Sci-Fi"), | ||||
|         Genre("Shotas"), | ||||
|         Genre("Shoujo Ai"), | ||||
|         Genre("Shounen Ai"), | ||||
|         Genre("Slice of Life"), | ||||
|         Genre("Sobrenatural"), | ||||
|         Genre("Sobrevivência"), | ||||
|         Genre("Super Herói"), | ||||
|         Genre("Thriller"), | ||||
|         Genre("Todo Colorido"), | ||||
|         Genre("Trabalho de Escritório"), | ||||
|         Genre("Tragédia"), | ||||
|         Genre("Troca de Gênero"), | ||||
|         Genre("Vampiros"), | ||||
|         Genre("Viagem no Tempo"), | ||||
|         Genre("Vida Escolar"), | ||||
|         Genre("Violência Sexual"), | ||||
|         Genre("Vídeo Games"), | ||||
|         Genre("Webcomic"), | ||||
|         Genre("Wuxia"), | ||||
|         Genre("Yaoi"), | ||||
|         Genre("Yuri"), | ||||
|         Genre("Zumbis") | ||||
|     ) | ||||
| 
 | ||||
|     private fun String.toDate(): Long { | ||||
|         return try { | ||||
|             DATE_FORMATTER.parse(this)?.time ?: 0L | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alessandro Jean
						Alessandro Jean