Base support for multiple tags in repositories

This commit is contained in:
Koitharu
2021-09-05 15:47:44 +03:00
parent 6596dca291
commit 0355b61e69
3 changed files with 48 additions and 29 deletions

View File

@@ -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

View File

@@ -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")

View File

@@ -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")