diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt index c24ff7abb..7748d3307 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt @@ -9,6 +9,8 @@ import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* +private const val DEF_BRANCH_NAME = "Основний переклад" + @MangaSourceParser("MANGAINUA", "MANGA/in/UA", "uk") class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(MangaSource.MANGAINUA) { @@ -21,41 +23,41 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder? + sortOrder: SortOrder?, ): List { val page = (offset / 24f).toIntUp().inc() val searchPage = (offset / 10f).toIntUp().inc() val url = when { - !query.isNullOrEmpty() -> ("/index.php?do=search" + + !query.isNullOrEmpty() -> ( + "/index.php?do=search" + "&subaction=search" + - "&search_start=${searchPage}" + + "&search_start=$searchPage" + "&full_search=1" + - "&story=${query}" + - "&titleonly=3").withDomain() + "&story=$query" + + "&titleonly=3" + ).withDomain() tags.isNullOrEmpty() -> "/mangas/page/$page".withDomain() tags.size == 1 -> "${tags.first().key}/page/$page" tags.size > 1 -> throw IllegalArgumentException("This source supports only 1 genre") - else -> "/mangas/page/${page}".withDomain() + else -> "/mangas/page/$page".withDomain() } val doc = context.httpGet(url).parseHtml() val container = doc.body().getElementById("dle-content") ?: parseFailed("Container not found") val items = container.select("div.col-6") return items.mapNotNull { item -> val href = item.selectFirst("a")?.attrAsRelativeUrl("href") ?: return@mapNotNull null - val listCover = item.selectFirst("header.card__cover")?.selectFirst("img")?.attrAsAbsoluteUrlOrNull("data-src") - val searchCover = item.selectFirst("header.card__cover")?.selectFirst("img")?.attrAsAbsoluteUrlOrNull("src").orEmpty() Manga( id = generateUid(href), title = item.selectFirst("h3.card__title")?.text() ?: return@mapNotNull null, - coverUrl = listCover ?: searchCover, + coverUrl = item.selectFirst("header.card__cover")?.selectFirst("img")?.run { + attrAsAbsoluteUrlOrNull("data-src") ?: attrAsAbsoluteUrlOrNull("src") + }.orEmpty(), altTitle = null, author = null, - rating = runCatching { - item.selectFirst("div.card__short-rate--num") - ?.text() - ?.toFloatOrNull() - ?.div(10F) - }.getOrNull() ?: RATING_UNKNOWN, + rating = item.selectFirst("div.card__short-rate--num") + ?.text() + ?.toFloatOrNull() + ?.div(10F) ?: RATING_UNKNOWN, url = href, isNsfw = item.selectFirst("ul.card__list")?.select("li")?.lastOrNull()?.text() == "18+", tags = runCatching { @@ -79,31 +81,48 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma val root = doc.body().getElementById("dle-content") ?: parseFailed("Cannot find root") val dateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.US) + val chaptersRoot = root.selectFirst(".linkstocomics") + var prevChapterName: String? = null + var i = 0 return manga.copy( description = root.selectFirst("div.item__full-description")?.text(), - largeCoverUrl = root.selectFirst("div.item__full-sidebar--poster")?.selectFirst("img")?.attrAsAbsoluteUrl("src").orEmpty(), - chapters = root.select("div.linkstocomics").mapIndexedNotNull { i, item -> - val href = item?.selectFirst("a")?.attr("href") - ?: return@mapIndexedNotNull null + largeCoverUrl = root.selectFirst("div.item__full-sidebar--poster")?.selectFirst("img") + ?.attrAsAbsoluteUrlOrNull("src"), + chapters = chaptersRoot?.select("div.ltcitems")?.mapNotNull { item -> + val href = item?.selectFirst("a")?.attrAsRelativeUrlOrNull("href") + ?: return@mapNotNull null + val isAlternative = item.styleValueOrNull("background") != null + val name = item.selectFirst("a")?.text().orEmpty() + if (!isAlternative) i++ MangaChapter( id = generateUid(href), - name = item.selectFirst("a")?.text().orEmpty(), - number = i + 1, + name = if (isAlternative) { + prevChapterName ?: return@mapNotNull null + } else { + prevChapterName = name + name + }, + number = i, url = href, scanlator = null, - branch = null, + branch = if (isAlternative) { + name.substringAfterLast(':').trim() + } else { + DEF_BRANCH_NAME + }, uploadDate = dateFormat.tryParse(item.selectFirst("div.ltcright")?.text()), source = source, ) - }, + }.orEmpty(), ) } override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.withDomain() val doc = context.httpGet(fullUrl).parseHtml() - val root = doc.body().getElementById("comics") ?: parseFailed("Root not found") - return root.select("ul.xfieldimagegallery").map { ul -> + val root = + doc.body().getElementById("comics")?.selectFirst("ul.xfieldimagegallery") ?: parseFailed("Root not found") + return root.select("li").map { ul -> val img = ul.selectFirst("img") ?: parseFailed("Page image not found") val url = img.attrAsAbsoluteUrl("data-src") MangaPage( @@ -119,9 +138,10 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma override suspend fun getTags(): Set { val domain = getDomain() val doc = context.httpGet("https://$domain/mangas").parseHtml() - val root = doc.body().getElementById("menu_1")?.selectFirst("div.menu__wrapper") ?: parseFailed("Cannot find root") - return root.select("li").mapToSet { li -> - val a = li.selectFirst("a") ?: parseFailed("a is null") + val root = + doc.body().getElementById("menu_1")?.selectFirst("div.menu__wrapper") ?: parseFailed("Cannot find root") + return root.select("li").mapNotNullToSet { li -> + val a = li.selectFirst("a") ?: return@mapNotNullToSet null MangaTag( title = a.ownText(), key = a.attr("href").removeSuffix("/"),