Base support for multiple tags in repositories
This commit is contained in:
@@ -12,9 +12,21 @@ interface MangaRepository {
|
||||
suspend fun getList(
|
||||
offset: Int,
|
||||
query: String? = null,
|
||||
tags: Set<MangaTag>? = null,
|
||||
sortOrder: SortOrder? = null,
|
||||
tag: MangaTag? = null
|
||||
): List<Manga>
|
||||
): List<Manga> = if (tags == null || tags.size <= 1) {
|
||||
getList(offset, query, sortOrder, tags?.singleOrNull())
|
||||
} else {
|
||||
throw NotImplementedError("Multiple filter are not supported by this source yet")
|
||||
}
|
||||
|
||||
@Deprecated("Use multiple tag variant")
|
||||
suspend fun getList(
|
||||
offset: Int,
|
||||
query: String? = null,
|
||||
sortOrder: SortOrder? = null,
|
||||
tag: MangaTag? = null,
|
||||
): List<Manga> = throw NotImplementedError("This is fine")
|
||||
|
||||
suspend fun getDetails(manga: Manga): Manga
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.koitharu.kotatsu.core.parser.site
|
||||
|
||||
import org.koitharu.kotatsu.base.domain.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.core.exceptions.ParseException
|
||||
import org.koitharu.kotatsu.core.model.*
|
||||
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
|
||||
import org.koitharu.kotatsu.utils.ext.*
|
||||
@@ -20,16 +19,20 @@ class AnibelRepository(loaderContext: MangaLoaderContext) : RemoteMangaRepositor
|
||||
override suspend fun getList(
|
||||
offset: Int,
|
||||
query: String?,
|
||||
sortOrder: SortOrder?,
|
||||
tag: MangaTag?
|
||||
tags: Set<MangaTag>?,
|
||||
sortOrder: SortOrder?
|
||||
): List<Manga> {
|
||||
if (!query.isNullOrEmpty()) {
|
||||
return if (offset == 0) search(query) else emptyList()
|
||||
}
|
||||
val page = (offset / 12f).toIntUp().inc()
|
||||
val link = when {
|
||||
tag != null -> "/manga?genre[]=${tag.key}&page=$page".withDomain()
|
||||
else -> "/manga?page=$page".withDomain()
|
||||
tags.isNullOrEmpty() -> "/manga?page=$page".withDomain()
|
||||
else -> tags.joinToString(
|
||||
prefix = "/manga?",
|
||||
postfix = "&page=$page",
|
||||
separator = "&",
|
||||
) { tag -> "genre[]=${tag.key}" }.withDomain()
|
||||
}
|
||||
val doc = loaderContext.httpGet(link).parseHtml()
|
||||
val root = doc.body().select("div.manga-block") ?: parseFailed("Cannot find root")
|
||||
|
||||
@@ -26,30 +26,33 @@ abstract class NineMangaRepository(
|
||||
override suspend fun getList(
|
||||
offset: Int,
|
||||
query: String?,
|
||||
sortOrder: SortOrder?,
|
||||
tag: MangaTag?,
|
||||
tags: Set<MangaTag>?,
|
||||
sortOrder: SortOrder?
|
||||
): List<Manga> {
|
||||
val page = (offset / PAGE_SIZE.toFloat()).toIntUp() + 1
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(getDomain())
|
||||
if (query.isNullOrEmpty()) {
|
||||
append("/category/")
|
||||
if (tag != null) {
|
||||
append(tag.key)
|
||||
} else {
|
||||
append("index")
|
||||
when {
|
||||
!query.isNullOrEmpty() -> {
|
||||
append("/search/?name_sel=&wd=")
|
||||
append(query.urlEncoded())
|
||||
append("&page=")
|
||||
}
|
||||
!tags.isNullOrEmpty() -> {
|
||||
append("/search/&category_id=")
|
||||
for (tag in tags) {
|
||||
append(tag.key)
|
||||
append(',')
|
||||
}
|
||||
append("&page=")
|
||||
}
|
||||
else -> {
|
||||
append("/category/index_")
|
||||
}
|
||||
append("_")
|
||||
append(page)
|
||||
append(".html")
|
||||
} else {
|
||||
append("/search/?name_sel=&wd=")
|
||||
append(query.urlEncoded())
|
||||
append("&page=")
|
||||
append(page)
|
||||
append(".html")
|
||||
}
|
||||
append(page)
|
||||
append(".html")
|
||||
}
|
||||
val doc = loaderContext.httpGet(url, PREDEFINED_HEADERS).parseHtml()
|
||||
val root = doc.body().selectFirst("ul.direlist")
|
||||
@@ -136,14 +139,15 @@ abstract class NineMangaRepository(
|
||||
}
|
||||
|
||||
override suspend fun getTags(): Set<MangaTag> {
|
||||
val doc = loaderContext.httpGet("https://${getDomain()}/category/", PREDEFINED_HEADERS)
|
||||
val doc = loaderContext.httpGet("https://${getDomain()}/search/?type=high", PREDEFINED_HEADERS)
|
||||
.parseHtml()
|
||||
val root = doc.body().selectFirst("ul.genreidex")
|
||||
return root?.select("li")?.mapToSet { li ->
|
||||
val a = li.selectFirst("a") ?: parseFailed("Link not found")
|
||||
val root = doc.body().getElementById("search_form")
|
||||
return root?.select("li.cate_list")?.mapNotNullToSet { li ->
|
||||
val cateId = li.attr("cate_id") ?: return@mapNotNullToSet null
|
||||
val a = li.selectFirst("a") ?: return@mapNotNullToSet null
|
||||
MangaTag(
|
||||
title = a.text(),
|
||||
key = a.attr("href").substringBetweenLast("/", "."),
|
||||
key = cateId,
|
||||
source = source
|
||||
)
|
||||
} ?: parseFailed("Root not found")
|
||||
|
||||
Reference in New Issue
Block a user