From afb3941626be7f92eea824f0722d86fc7f3825f5 Mon Sep 17 00:00:00 2001 From: Sittikorn Hirunpongthawat Date: Sat, 18 Apr 2020 05:36:11 +0700 Subject: [PATCH] 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 --- src/th/nekopost/build.gradle | 2 +- .../extension/th/nekopost/NPUtils.kt | 12 +++ .../extension/th/nekopost/Nekopost.kt | 91 ++++++++++++++----- 3 files changed, 80 insertions(+), 25 deletions(-) diff --git a/src/th/nekopost/build.gradle b/src/th/nekopost/build.gradle index 03f7793d7..54c5e25f9 100644 --- a/src/th/nekopost/build.gradle +++ b/src/th/nekopost/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Nekopost' pkgNameSuffix = 'th.nekopost' extClass = '.Nekopost' - extVersionCode = 1 + extVersionCode = 2 libVersion = '1.2' } diff --git a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt index 30f0ab3af..dd599fbfe 100644 --- a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt +++ b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt @@ -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(c: Collection, val mangaList: List) : ArrayList(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/(.*)$") diff --git a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt index b912f37c1..afd66da06 100644 --- a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt +++ b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt @@ -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 { + if (page == 1) { + latestMangaList = HashSet() + latestUpdatePageOffset = 0 + } + + return client.newCall(latestUpdatesRequest(page + latestUpdatePageOffset)) + .asObservableSuccess() + .concatMap { response -> + latestUpdatesParse(response).let { + if ((it.mangas as NPArrayList).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 -> - if (!latestMangaList.contains(manga.url)) { - latestMangaList.add(manga.url) - true - } else false } - val hasNextPage = mangas.isNotEmpty() + 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 = 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 { + if (page == 1) { + popularMangaList = HashSet() + popularMangaPageOffset = 0 + } + + return client.newCall(popularMangaRequest(page + popularMangaPageOffset)) + .asObservableSuccess() + .concatMap { response -> + popularMangaParse(response).let { + if ((it.mangas as NPArrayList).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 -> - if (!popularMangaList.contains(manga.url)) { - popularMangaList.add(manga.url) - true - } else false - } + val mangaList = document.select(popularMangaSelector()) - val hasNextPage = mangas.isNotEmpty() + 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 = 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() @@ -228,7 +271,7 @@ class Nekopost() : ParsedHttpSource() { when { it.isNotEmpty() -> it NPUtils.getValueOf(NPUtils.Genre, query) == null -> it - else ->{ + else -> { queryString = "" arrayOf(query) }