From 0355b61e697214179cb3268d6abd10b2759cb0f7 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 5 Sep 2021 15:47:44 +0300 Subject: [PATCH] Base support for multiple tags in repositories --- .../kotatsu/core/parser/MangaRepository.kt | 16 ++++++- .../core/parser/site/AnibelRepository.kt | 13 +++-- .../core/parser/site/NineMangaRepository.kt | 48 ++++++++++--------- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt index 86bf848fd..fc960f069 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaRepository.kt @@ -12,9 +12,21 @@ interface MangaRepository { suspend fun getList( offset: Int, query: String? = null, + tags: Set? = null, sortOrder: SortOrder? = null, - tag: MangaTag? = null - ): List + ): List = 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 = throw NotImplementedError("This is fine") suspend fun getDetails(manga: Manga): Manga diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/AnibelRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/AnibelRepository.kt index 82c924435..6142f71d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/AnibelRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/AnibelRepository.kt @@ -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?, + sortOrder: SortOrder? ): List { 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") diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/NineMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/NineMangaRepository.kt index cbbd59ee1..7fea87b3c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/NineMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/NineMangaRepository.kt @@ -26,30 +26,33 @@ abstract class NineMangaRepository( override suspend fun getList( offset: Int, query: String?, - sortOrder: SortOrder?, - tag: MangaTag?, + tags: Set?, + sortOrder: SortOrder? ): List { 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 { - 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")