added sort by popularity/updated

Naga 2 years ago
parent f733b85878
commit b60b2d8355

@ -23,7 +23,7 @@ internal abstract class NepnepParser(
override val configKeyDomain = ConfigKey.Domain(domain) override val configKeyDomain = ConfigKey.Domain(domain)
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL) override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.POPULARITY, SortOrder.UPDATED)
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java) override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java)
override val isTagsExclusionSupported = true override val isTagsExclusionSupported = true
@ -31,15 +31,16 @@ internal abstract class NepnepParser(
.add("User-Agent", UserAgents.CHROME_DESKTOP) .add("User-Agent", UserAgents.CHROME_DESKTOP)
.build() .build()
data class MangaWithLastUpdate(
val manga: Manga,
val lastUpdate: Long,
val views: String
)
override suspend fun getList(offset: Int, filter: MangaListFilter?): List<Manga> { override suspend fun getList(offset: Int, filter: MangaListFilter?): List<Manga> {
if (offset > 0) { if (offset > 0) {
return emptyList() return emptyList()
} }
var foundTag = true
var foundTagExclude = true
var foundState = true
val doc = webClient.httpGet("https://$domain/search/").parseHtml() val doc = webClient.httpGet("https://$domain/search/").parseHtml()
val json = JSONArray( val json = JSONArray(
doc.selectFirstOrThrow("script:containsData(MainFunction)").data() doc.selectFirstOrThrow("script:containsData(MainFunction)").data()
@ -48,53 +49,38 @@ internal abstract class NepnepParser(
.trim() .trim()
.replace(';', ' '), .replace(';', ' '),
) )
val manga = ArrayList<Manga>(json.length()) val mangaWithLastUpdateList = ArrayList<MangaWithLastUpdate>(json.length())
var sort = false
for (i in 0 until json.length()) { for (i in 0 until json.length()) {
val m = json.getJSONObject(i) val m = json.getJSONObject(i)
val href = "/manga/" + m.getString("i") val href = "/manga/" + m.getString("i")
val imgUrl = "https://temp.compsci88.com/cover/" + m.getString("i") + ".jpg" val imgUrl = "https://temp.compsci88.com/cover/" + m.getString("i") + ".jpg"
val lastUpdate = m.getLong("lt")
val views = m.getString("v")
val viewMonth = m.getString("vm")
when (filter) { when (filter) {
is MangaListFilter.Search -> { is MangaListFilter.Search -> {
if (m.getString("s").contains(filter.query, ignoreCase = true) || m.getString("al") if (m.getString("s").contains(filter.query, ignoreCase = true) || (m.getJSONArray("al").length() > 0 && m.getJSONArray("al").getString(0).contains(filter.query, ignoreCase = true))
.contains(filter.query, ignoreCase = true)
) { ) {
manga.add( mangaWithLastUpdateList.add(
addManga(href, imgUrl, m), MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views)
) )
} }
} }
is MangaListFilter.Advanced -> { is MangaListFilter.Advanced -> {
val tags = filter.tags
if (filter.tags.isNotEmpty()) { val tagsExcluded = filter.tagsExclude
val tagsJon = m.getJSONArray("g").toString() val tagsJson = m.getJSONArray("g").toString()
filter.tags.forEach {
foundTag = false val tagsMatched = tags.isEmpty() || tags.all { tag -> tagsJson.contains(tag.key, ignoreCase = true) }
if (tagsJon.contains(it.key, ignoreCase = true)) { val tagsExcludeMatched = tagsExcluded.isEmpty() || tagsExcluded.none { tag -> tagsJson.contains(tag.key, ignoreCase = true) }
foundTag = true val statesMatched = filter.states.isEmpty() || filter.states.any { state ->
} m.getString("ps").contains(
} when (state) {
}
if (filter.tagsExclude.isNotEmpty()) {
val tagsJon = m.getJSONArray("g").toString()
filter.tagsExclude.forEach {
foundTagExclude = false
if (!tagsJon.contains(it.key, ignoreCase = true)) {
foundTagExclude = true
}
}
}
if (filter.states.isNotEmpty()) {
val stateJson = m.getString("ps")
filter.states.oneOrThrowIfMany().let {
foundState = false
if (stateJson.contains(
when (it) {
MangaState.ONGOING -> "Ongoing" MangaState.ONGOING -> "Ongoing"
MangaState.FINISHED -> "Complete" MangaState.FINISHED -> "Complete"
MangaState.ABANDONED -> "Cancelled" MangaState.ABANDONED -> "Cancelled"
@ -103,25 +89,34 @@ internal abstract class NepnepParser(
}, },
ignoreCase = true, ignoreCase = true,
) )
) {
foundState = true
}
}
} }
if (tagsMatched && tagsExcludeMatched && statesMatched) {
mangaWithLastUpdateList.add(
MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views)
)
if (foundTag && foundState && foundTagExclude) {
manga.add(addManga(href, imgUrl, m))
} }
sort = true
} }
null -> { null -> {
manga.add( mangaWithLastUpdateList.add(
addManga(href, imgUrl, m), MangaWithLastUpdate(addManga(href, imgUrl, m), lastUpdate, views)
) )
} }
} }
} }
return manga if(sort){
when(filter?.sortOrder){
SortOrder.POPULARITY -> mangaWithLastUpdateList.sortByDescending { it.views }
SortOrder.UPDATED -> mangaWithLastUpdateList.sortByDescending { it.lastUpdate }
SortOrder.ALPHABETICAL -> {}
else -> if (filter != null) {
throw IllegalArgumentException("Unsupported sort order: ${filter.sortOrder}")
}
}
}
return mangaWithLastUpdateList.map { it.manga }
} }
private fun addManga(href: String, imgUrl: String, m: JSONObject): Manga { private fun addManga(href: String, imgUrl: String, m: JSONObject): Manga {

Loading…
Cancel
Save