Nekopost - fix next page not loaded (#2685)

* Add Nekopost V.1.2.1

* Fix genre not shown

* Change Icons

* Rename monthMap -> monthList

* Change from getter to normal declaration

* Rename getUrlWithoutDomainFromFullUrl to getMangaOrChapterAlias

* Fix duplicate title

* Fix unable to search by Genre tag

* Change Genre and Status from Enum to Pairs

* Minor changes

* Fix next page not loaded when previous page has no new title

* Fix offset not reset
This commit is contained in:
Sittikorn Hirunpongthawat 2020-04-18 05:36:11 +07:00 committed by GitHub
parent 7ef7fe679d
commit afb3941626
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 25 deletions

View File

@ -5,7 +5,7 @@ ext {
appName = 'Tachiyomi: Nekopost'
pkgNameSuffix = 'th.nekopost'
extClass = '.Nekopost'
extVersionCode = 1
extVersionCode = 2
libVersion = '1.2'
}

View File

@ -1,8 +1,20 @@
package eu.kanade.tachiyomi.extension.th.nekopost
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.*
class NPArrayList<E>(c: Collection<E>, val mangaList: List<Element>) : ArrayList<E>(c) {
override fun isEmpty(): Boolean = mangaList.isEmpty()
fun isNotEmpty(): Boolean = mangaList.isNotEmpty()
fun isListEmpty(): Boolean = super.isEmpty()
fun isListNotEmpty(): Boolean = !isListEmpty()
}
object NPUtils {
private val urlWithoutDomainFromFullUrlRegex: Regex = Regex("^https://www\\.nekopost\\.net/manga/(.*)$")

View File

@ -1,7 +1,7 @@
package eu.kanade.tachiyomi.extension.th.nekopost
import android.util.Log
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.model.*
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
@ -12,6 +12,7 @@ import org.json.JSONException
import org.json.JSONObject
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import rx.Observable
import java.net.URL
import java.util.*
import kotlin.collections.ArrayList
@ -48,22 +49,46 @@ class Nekopost() : ParsedHttpSource() {
override fun imageUrlParse(document: Document): String = ".bg-card.card .p-3.text-white img"
private var latestUpdatePageOffset: Int = 0
override fun fetchLatestUpdates(page: Int): Observable<MangasPage> {
if (page == 1) {
latestMangaList = HashSet()
latestUpdatePageOffset = 0
}
return client.newCall(latestUpdatesRequest(page + latestUpdatePageOffset))
.asObservableSuccess()
.concatMap { response ->
latestUpdatesParse(response).let {
if ((it.mangas as NPArrayList<SManga>).isListEmpty() && it.mangas.isNotEmpty()) {
latestUpdatePageOffset++
fetchLatestUpdates(page)
} else Observable.just(it)
}
}
}
override fun latestUpdatesParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select(latestUpdatesSelector()).filter { element ->
val mangaList = document.select(latestUpdatesSelector()).filter { element ->
val dateText = element.select(".date").text().trim()
val currentDate = Calendar.getInstance(Locale("th"))
dateText.contains(currentDate.get(Calendar.DATE).toString()) && dateText.contains(NPUtils.monthList[currentDate.get(Calendar.MONTH)])
}.map { element -> latestUpdatesFromElement(element) }.filter { manga ->
}
val mangas = NPArrayList(
mangaList.map { element -> latestUpdatesFromElement(element) }.filter { manga ->
if (!latestMangaList.contains(manga.url)) {
latestMangaList.add(manga.url)
true
} else false
}
},
mangaList)
val hasNextPage = mangas.isNotEmpty()
val hasNextPage = mangaList.isNotEmpty()
return MangasPage(mangas, hasNextPage)
}
@ -79,10 +104,7 @@ class Nekopost() : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector(): String? = throw Exception("Unused")
override fun latestUpdatesRequest(page: Int): Request {
if (page == 1) latestMangaList = HashSet()
return GET("$mangaListUrl/${page - 1}")
}
override fun latestUpdatesRequest(page: Int): Request = GET("$mangaListUrl/${page - 1}")
override fun latestUpdatesSelector(): String = "a[href]"
@ -156,17 +178,41 @@ class Nekopost() : ParsedHttpSource() {
}
}
private var popularMangaPageOffset: Int = 0
override fun fetchPopularManga(page: Int): Observable<MangasPage> {
if (page == 1) {
popularMangaList = HashSet()
popularMangaPageOffset = 0
}
return client.newCall(popularMangaRequest(page + popularMangaPageOffset))
.asObservableSuccess()
.concatMap { response ->
popularMangaParse(response).let {
if ((it.mangas as NPArrayList<SManga>).isListEmpty() && it.mangas.isNotEmpty()) {
popularMangaPageOffset++
fetchPopularManga(page)
} else Observable.just(it)
}
}
}
override fun popularMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select(popularMangaSelector()).map { element -> popularMangaFromElement(element) }.filter { manga ->
val mangaList = document.select(popularMangaSelector())
val mangas = NPArrayList(
mangaList.map { element -> popularMangaFromElement(element) }.filter { manga ->
if (!popularMangaList.contains(manga.url)) {
popularMangaList.add(manga.url)
true
} else false
}
},
mangaList)
val hasNextPage = mangas.isNotEmpty()
val hasNextPage = mangaList.isNotEmpty()
return MangasPage(mangas, hasNextPage)
}
@ -175,10 +221,7 @@ class Nekopost() : ParsedHttpSource() {
override fun popularMangaNextPageSelector(): String? = latestUpdatesNextPageSelector()
override fun popularMangaRequest(page: Int): Request {
if (page == 1) popularMangaList = HashSet()
return GET("$mangaListUrl/${page - 1}")
}
override fun popularMangaRequest(page: Int): Request = GET("$mangaListUrl/${page - 1}")
override fun popularMangaSelector(): String = latestUpdatesSelector()