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