From b5c830e10e389ab3040bdb843074e8ce67cc35f9 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Tue, 14 Jun 2022 19:52:18 +0300 Subject: [PATCH] Final touches --- .../parsers/site/NicovideoSeigaParser.kt | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NicovideoSeigaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NicovideoSeigaParser.kt index 8c95e216..603d4f19 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NicovideoSeigaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NicovideoSeigaParser.kt @@ -29,7 +29,7 @@ class NicovideoSeigaParser(override val context: MangaLoaderContext) : MangaPars override suspend fun getUsername(): String { val body = context.httpGet("https://app.nicovideo.jp/my/apps").parseHtml().body() - return body.selectFirst("#userinfo > div > div > strong")?.text() ?: parseFailed("Cannot get username") + return body.selectFirst("#userinfo > div > div > strong")?.text() ?: throw AuthRequiredException(source) } override val sortOrders: Set = EnumSet.of( @@ -46,10 +46,13 @@ class NicovideoSeigaParser(override val context: MangaLoaderContext) : MangaPars sortOrder: SortOrder?, ): List { val page = (offset / 20f).toIntUp().inc() - if (!query.isNullOrEmpty()) { - return if (offset == 0) getSearchList(query, page) else emptyList() + val url = when { + !query.isNullOrEmpty() -> return if (offset == 0) getSearchList(query, page) else emptyList() + tags.isNullOrEmpty() -> "https://${getDomain()}/manga/list?page=$page&sort=${getSortKey(sortOrder)}" + tags.size == 1 -> "https://${getDomain()}${tags.first().key}?page=$page&sort=${getSortKey(sortOrder)}" + tags.size > 1 -> throw IllegalArgumentException("This source supports only 1 category") + else -> "https://${getDomain()}/manga/list?page=$page&sort=${getSortKey(sortOrder)}" } - val url = "/manga/list?page=$page&sort=${getSortKey(sortOrder)}".withDomain() val doc = context.httpGet(url).parseHtml() val comicList = doc.body().select("#comic_list > ul > li") ?: parseFailed("Container not found") val items = comicList.select("div > .description > div > div") @@ -65,7 +68,13 @@ class NicovideoSeigaParser(override val context: MangaLoaderContext) : MangaPars rating = RATING_UNKNOWN, url = href, isNsfw = false, - tags = emptySet(), + tags = item.getElementsByAttributeValueContaining("href", "?category=").mapToSet { a -> + MangaTag( + key = a.attr("href").substringAfterLast('='), + title = a.ownText().trim(), + source = source, + ) + }, state = when (statusText) { STATUS_ONGOING -> MangaState.ONGOING STATUS_FINISHED -> MangaState.FINISHED @@ -89,6 +98,7 @@ class NicovideoSeigaParser(override val context: MangaLoaderContext) : MangaPars STATUS_FINISHED -> MangaState.FINISHED else -> null }, + isNsfw = contents.select(".icon_adult").isNotEmpty(), chapters = contents.select("#episode_list > ul > li").mapIndexedNotNull { i, li -> val href = li.selectFirst("div > div.description > div.title > a")?.attrAsRelativeUrl("href") ?: parseFailed() MangaChapter( @@ -124,7 +134,16 @@ class NicovideoSeigaParser(override val context: MangaLoaderContext) : MangaPars } override suspend fun getTags(): Set { - return emptySet() + val doc = context.httpGet("https://${getDomain()}/manga/list").parseHtml() + val root = doc.body().select("#mg_category_list > ul > li") ?: parseFailed("Cannot find tags") + return root.mapToSet { li -> + val a = li.selectFirst("a") ?: parseFailed("a is null") + MangaTag( + title = a.text(), + key = a.attrAsRelativeUrlOrNull("href").orEmpty(), + source = source, + ) + } } private suspend fun getSearchList(query: String, page: Int): List {