Add missing filter and fix duplicates in Latest on TaoSect. (#9151)

This commit is contained in:
Alessandro Jean 2021-09-22 08:54:41 -03:00 committed by GitHub
parent 09cb97b648
commit f940ff9499
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 28 deletions

View File

@ -6,7 +6,7 @@ ext {
extName = 'Tao Sect'
pkgNameSuffix = 'pt.taosect'
extClass = '.TaoSect'
extVersionCode = 8
extVersionCode = 9
}
dependencies {

View File

@ -45,6 +45,8 @@ class TaoSect : HttpSource() {
private val apiHeaders: Headers by lazy { apiHeadersBuilder().build() }
private var latestIds: List<String> = emptyList()
override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("User-Agent", USER_AGENT)
.add("Origin", baseUrl)
@ -66,7 +68,7 @@ class TaoSect : HttpSource() {
}
override fun popularMangaParse(response: Response): MangasPage {
val result = json.decodeFromString<List<TaoSectProjectDto>>(response.body!!.string())
val result = response.parseAs<List<TaoSectProjectDto>>()
val projectList = result.map(::popularMangaFromObject)
@ -88,38 +90,50 @@ class TaoSect : HttpSource() {
.addQueryParameter("order", "desc")
.addQueryParameter("orderby", "date")
.addQueryParameter("page", page.toString())
.addQueryParameter("per_page", PROJECTS_PER_PAGE.toString())
.addQueryParameter("per_page", (PROJECTS_PER_PAGE * 2).toString())
.toString()
return GET(apiUrl, apiHeaders)
}
override fun latestUpdatesParse(response: Response): MangasPage {
val result = json.decodeFromString<List<TaoSectChapterDto>>(response.body!!.string())
val result = response.parseAs<List<TaoSectChapterDto>>()
if (result.isNullOrEmpty()) {
return MangasPage(emptyList(), hasNextPage = false)
}
val currentPage = response.request.url.queryParameter("page")!!.toInt()
val lastPage = response.headers["X-Wp-TotalPages"]!!.toInt()
val hasNextPage = currentPage < lastPage
if (currentPage == 1) {
latestIds = emptyList()
}
val projectIds = result
.distinctBy { it.projectId!! }
.joinToString(",") { it.projectId!! }
.map { it.projectId!! }
.distinct()
.filterNot { latestIds.contains(it) }
latestIds = latestIds + projectIds
if (projectIds.isEmpty()) {
return MangasPage(emptyList(), hasNextPage)
}
val projectsApiUrl = "$baseUrl/$API_BASE_PATH/projetos".toHttpUrl().newBuilder()
.addQueryParameter("include", projectIds)
.addQueryParameter("include", projectIds.joinToString(","))
.addQueryParameter("per_page", projectIds.size.toString())
.addQueryParameter("orderby", "include")
.addQueryParameter("_fields", DEFAULT_FIELDS)
.toString()
val projectsRequest = GET(projectsApiUrl, apiHeaders)
val projectsResponse = client.newCall(projectsRequest).execute()
val projectsResult = json.decodeFromString<List<TaoSectProjectDto>>(projectsResponse.body!!.string())
val projectsResult = projectsResponse.parseAs<List<TaoSectProjectDto>>()
val projectList = projectsResult.map(::popularMangaFromObject)
val currentPage = response.request.url.queryParameter("page")!!.toInt()
val lastPage = response.headers["X-Wp-TotalPages"]!!.toInt()
val hasNextPage = currentPage < lastPage
projectsResponse.close()
return MangasPage(projectList, hasNextPage)
@ -129,9 +143,12 @@ class TaoSect : HttpSource() {
val apiUrl = "$baseUrl/$API_BASE_PATH/projetos".toHttpUrl().newBuilder()
.addQueryParameter("page", page.toString())
.addQueryParameter("per_page", PROJECTS_PER_PAGE.toString())
.addQueryParameter("search", query)
.addQueryParameter("_fields", DEFAULT_FIELDS)
if (query.isNotEmpty()) {
apiUrl.addQueryParameter("search", query)
}
filters.forEach { filter ->
when (filter) {
is CountryFilter -> {
@ -184,6 +201,15 @@ class TaoSect : HttpSource() {
apiUrl.addQueryParameter("order", order)
apiUrl.addQueryParameter("orderby", orderBy)
}
is FeaturedFilter -> {
if (query.isEmpty()) {
if (filter.state == Filter.TriState.STATE_INCLUDE) {
apiUrl.addQueryParameter("destaque", "1")
} else if (filter.state == Filter.TriState.STATE_EXCLUDE) {
apiUrl.addQueryParameter("destaque", "0")
}
}
}
}
}
@ -216,7 +242,7 @@ class TaoSect : HttpSource() {
}
override fun mangaDetailsParse(response: Response): SManga {
val result = json.decodeFromString<List<TaoSectProjectDto>>(response.body!!.string())
val result = response.parseAs<List<TaoSectProjectDto>>()
if (result.isNullOrEmpty()) {
throw Exception(PROJECT_NOT_FOUND)
@ -252,7 +278,7 @@ class TaoSect : HttpSource() {
}
override fun chapterListParse(response: Response): List<SChapter> {
val result = json.decodeFromString<List<TaoSectProjectDto>>(response.body!!.string())
val result = response.parseAs<List<TaoSectProjectDto>>()
if (result.isNullOrEmpty()) {
throw Exception(PROJECT_NOT_FOUND)
@ -264,19 +290,16 @@ class TaoSect : HttpSource() {
val countViewRequest = countViewRequest(project.id.toString())
runCatching { client.newCall(countViewRequest).execute().close() }
val timeNow = System.currentTimeMillis()
return project.volumes!!
.flatMap { it.chapters }
.reversed()
.map { chapterFromObject(it, project) }
.filter { it.date_upload <= timeNow }
}
private fun chapterFromObject(obj: TaoSectChapterDto, project: TaoSectProjectDto): SChapter = SChapter.create().apply {
name = obj.name
scanlator = this@TaoSect.name
date_upload = if (obj.releaseDate.isNullOrEmpty().not()) obj.releaseDate!!.toDate() else obj.date.toDate()
date_upload = obj.date.toDate()
url = "/leitor-online/projeto/${project.slug!!}/${obj.slug}/"
}
@ -299,7 +322,7 @@ class TaoSect : HttpSource() {
}
override fun pageListParse(response: Response): List<Page> {
val result = json.decodeFromString<List<TaoSectProjectDto>>(response.body!!.string())
val result = response.parseAs<List<TaoSectProjectDto>>()
if (result.isNullOrEmpty()) {
throw Exception(PROJECT_NOT_FOUND)
@ -319,9 +342,30 @@ class TaoSect : HttpSource() {
val countViewRequest = countViewRequest(project.id!!.toString(), chapter.id)
runCatching { client.newCall(countViewRequest).execute().close() }
return chapter.pages.mapIndexed { i, pageUrl ->
val pages = chapter.pages.mapIndexed { i, pageUrl ->
Page(i, chapterUrl, pageUrl)
}
// Check if the pages have exceeded the view limit of Google Drive.
val firstPage = pages[0]
val hasExceededViewLimit = runCatching {
val firstPageRequest = imageRequest(firstPage)
val firstPageResponse = client.newCall(firstPageRequest).execute()
val hasExceeded = firstPageResponse.headers["Content-Type"]!!
.contains("text/html")
firstPageResponse.close()
hasExceeded
}
if (hasExceededViewLimit.getOrDefault(false)) {
throw Exception(EXCEEDED_GOOGLE_DRIVE_VIEW_LIMIT)
}
return pages
}
override fun fetchImageUrl(page: Page): Observable<String> = Observable.just(page.imageUrl!!)
@ -358,11 +402,10 @@ class TaoSect : HttpSource() {
override fun getFilterList(): FilterList = FilterList(
CountryFilter(getCountryList()),
// Status filter is broken on the API at the moment.
// It will be fixed by the scanlator team.
// StatusFilter(getStatusList()),
StatusFilter(getStatusList()),
GenreFilter(getGenreList()),
SortFilter()
SortFilter(),
FeaturedFilter()
)
private class Tag(val id: String, name: String) : Filter.TriState(name)
@ -379,6 +422,12 @@ class TaoSect : HttpSource() {
Selection(DEFAULT_ORDERBY, false)
)
private class FeaturedFilter : Filter.TriState("Mostrar destaques")
private inline fun <reified T> Response.parseAs(): T = use {
json.decodeFromString(it.body?.string().orEmpty())
}
private fun String.toDate(): Long {
return runCatching { DATE_FORMATTER.parse(this)?.time }
.getOrNull() ?: 0L
@ -442,10 +491,12 @@ class TaoSect : HttpSource() {
private const val API_BASE_PATH = "wp-json/wp/v2"
private const val PROJECTS_PER_PAGE = 18
private const val DEFAULT_ORDERBY = 4
private const val DEFAULT_ORDERBY = 3
private const val DEFAULT_FIELDS = "title,thumbnail,link"
private const val PROJECT_NOT_FOUND = "Projeto não encontrado."
private const val CHAPTER_NOT_FOUND = "Capítulo não encontrado."
private const val EXCEEDED_GOOGLE_DRIVE_VIEW_LIMIT = "Limite de visualizações atingido " +
"no Google Drive. Aguarde com que o limite seja reestabelecido."
private val DATE_FORMATTER by lazy {
SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
@ -454,7 +505,6 @@ class TaoSect : HttpSource() {
private val SORT_LIST = listOf(
Tag("date", "Data de criação"),
Tag("modified", "Data de modificação"),
Tag("destaque", "Destaque"),
Tag("title", "Título"),
Tag("views", "Visualizações")
)

View File

@ -47,6 +47,5 @@ data class TaoSectChapterDto(
@SerialName("nome_capitulo") val name: String = "",
@SerialName("paginas") val pages: List<String> = emptyList(),
@SerialName("post_id") val projectId: String? = "",
@SerialName("data_hora_agendamento") val releaseDate: String? = "",
val slug: String = ""
)