From fe1ef89d301a5cd445570e36de3662cf20cf8deb Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:56:25 +0100 Subject: [PATCH 1/4] fix OmegaScans site structure changed --- .../parsers/site/heancms/en/OmegaScans.kt | 141 +++++++++++++++++- 1 file changed, 137 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt index c27444f4..d413ada4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt @@ -2,10 +2,143 @@ package org.koitharu.kotatsu.parsers.site.heancms.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.model.ContentType -import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.heancms.HeanCms +import org.koitharu.kotatsu.parsers.util.* +import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault +import org.koitharu.kotatsu.parsers.util.json.mapJSON +import java.text.SimpleDateFormat +import java.util.Locale @MangaSourceParser("OMEGASCANS", "OmegaScans", "en", ContentType.HENTAI) -internal class OmegaScans(context: MangaLoaderContext) : - HeanCms(context, MangaSource.OMEGASCANS, "omegascans.org") +internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaSource.OMEGASCANS, "omegascans.org") { + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + val url = buildString { + append("https://api.") + append(domain) + append("/query?adult=true&query_string=") + when (filter) { + is MangaListFilter.Search -> { + append(filter.query.urlEncoded()) + } + + is MangaListFilter.Advanced -> { + + filter.states.oneOrThrowIfMany()?.let { + append("&series_status=") + append( + when (it) { + MangaState.ONGOING -> "Ongoing" + MangaState.FINISHED -> "Completed" + MangaState.ABANDONED -> "Dropped" + MangaState.PAUSED -> "Hiatus" + else -> "" + }, + ) + + } + append("&orderBy=") + when (filter.sortOrder) { + SortOrder.POPULARITY -> append("total_views&order=desc") + SortOrder.UPDATED -> append("latest&order=desc") + SortOrder.NEWEST -> append("created_at&order=desc") + SortOrder.ALPHABETICAL -> append("title&order=desc") + SortOrder.ALPHABETICAL_DESC -> append("title&order=asc") + else -> append("latest&order=desc") + } + append("&series_type=Comic&perPage=12") + append("&tags_ids=") + append("[".urlEncoded()) + append(filter.tags.joinToString(",") { it.key }) + append("]".urlEncoded()) + + } + + null -> {} + } + append("&page=") + append(page.toString()) + } + val json = webClient.httpGet(url).parseJson() + return json.getJSONArray("data").mapJSON { j -> + val slug = j.getString("series_slug") + val urlManga = "https://$domain/$pathManga/$slug" + val cover = if (j.getString("thumbnail").contains('/')) { + j.getString("thumbnail") + } else { + "https://api.$domain/${j.getString("thumbnail")}" + } + Manga( + id = j.getLong("id"), + title = j.getString("title"), + altTitle = null, + url = urlManga.toRelativeUrl(domain), + publicUrl = urlManga, + rating = j.getFloatOrDefault("rating", RATING_UNKNOWN), + isNsfw = true, + coverUrl = cover, + tags = setOf(), + state = when (j.getString("status")) { + "Ongoing" -> MangaState.ONGOING + "Completed" -> MangaState.FINISHED + "Dropped" -> MangaState.ABANDONED + "Hiatus" -> MangaState.PAUSED + else -> null + }, + author = j.getString("author"), + source = source, + description = j.getString("description"), + ) + } + + } + + override suspend fun getDetails(manga: Manga): Manga { + val url = buildString { + append("https://api.") + append(domain) + append("/chapter/query?perPage=9999&series_id=" + manga.id) + } + val json = webClient.httpGet(url).parseJson() + val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH) + + val chaptersJsonArray = json.getJSONArray("data") + var totalChapters = json.getJSONObject("meta").getInt("total") + val chapters = chaptersJsonArray.mapJSON { j -> + val slug = j.getJSONObject("series").getString("series_slug") + val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}" + val date = j.getString("created_at").substringBeforeLast("T") + MangaChapter( + id = j.getLong("id"), + url = chapterUrl, + name = j.getString("chapter_name"), + number = totalChapters--, + branch = null, + uploadDate = dateFormat.tryParse(date), + scanlator = null, + source = source, + ) + } + + return manga.copy( + chapters = chapters.reversed(), + ) + } + + override suspend fun getAvailableTags(): Set { + val doc = webClient.httpGet("https://$domain/comics").parseHtml() + + val tags = + doc.selectFirstOrThrow("script:containsData(tags)").data().replace("\\", "").substringAfterLast("\"tags\"") + .split("\",{\"") + + return tags.mapNotNullToSet { + MangaTag( + key = it.substringAfter("id\":").substringBefore(",\""), + title = it.substringAfter("name\":\"").substringBefore("\"").toTitleCase(sourceLocale), + source = source, + ) + } + } + +} From a714d0927edad5475da293162ce8bde354206c2f Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Tue, 19 Mar 2024 20:46:15 +0100 Subject: [PATCH 2/4] fix OmegaScans tags --- .../parsers/site/heancms/en/OmegaScans.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt index d413ada4..3844216c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.parsers.site.heancms.en +import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.* @@ -46,7 +47,7 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS SortOrder.ALPHABETICAL_DESC -> append("title&order=asc") else -> append("latest&order=desc") } - append("&series_type=Comic&perPage=12") + append("&series_type=All&perPage=$pageSize") append("&tags_ids=") append("[".urlEncoded()) append(filter.tags.joinToString(",") { it.key }) @@ -128,17 +129,18 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/comics").parseHtml() - val tags = - doc.selectFirstOrThrow("script:containsData(tags)").data().replace("\\", "").substringAfterLast("\"tags\"") - .split("\",{\"") + val tags = doc.selectFirstOrThrow("script:containsData(tags)").data() + .replace("\\", "") + .substringAfterLast("\"tags\":") + .substringBeforeLast("}],") - return tags.mapNotNullToSet { + return JSONArray(tags).mapJSON { MangaTag( - key = it.substringAfter("id\":").substringBefore(",\""), - title = it.substringAfter("name\":\"").substringBefore("\"").toTitleCase(sourceLocale), + key = it.getInt("id").toString(), + title = it.getString("name"), source = source, ) - } + }.toSet() } } From e605b325c73f296945a9c5c4d42994e07485ba37 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:27:28 +0100 Subject: [PATCH 3/4] fixrating --- .../org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt index 3844216c..fad3e1b7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt @@ -75,7 +75,7 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS altTitle = null, url = urlManga.toRelativeUrl(domain), publicUrl = urlManga, - rating = j.getFloatOrDefault("rating", RATING_UNKNOWN), + rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 5f, isNsfw = true, coverUrl = cover, tags = setOf(), From 6fcf3785efce4dd32f4f3e9b769b1ba9aa0c1e75 Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Wed, 20 Mar 2024 10:10:54 +0100 Subject: [PATCH 4/4] fix #591 --- .../koitharu/kotatsu/parsers/site/zh/Baozimh.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt index 66df8782..e4e3981d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt @@ -185,8 +185,8 @@ internal class Baozimh(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() val pagesList = doc.requireElementById("__nuxt") - val chapterLink = doc.select("link[rel=canonical]").attr("href") - val nextChapterLink = doc.select("div.next_chapter a").attr("href") + var chapterLink = doc.select("link[rel=canonical]").attr("href") + var nextChapterLink = doc.select("a#next-chapter").attr("href") var part = 2 val idSet = HashSet() var pages = pagesList.select("button.pure-button").map { btn -> @@ -201,11 +201,11 @@ internal class Baozimh(context: MangaLoaderContext) : ) } - val chapterPart = chapterLink.substringAfterLast("/").substringBefore(".html") - val nexChapterPart = nextChapterLink.substringAfterLast("/").substringBefore(".html") + var chapterPart = chapterLink.substringAfterLast("/").substringBefore(".html") + var nexChapterPart = nextChapterLink.substringAfterLast("/").substringBefore(".html") while (nextChapterLink != "" && (nexChapterPart == chapterPart + "_" + part.toString())){ - val doc2 = webClient.httpGet(nextChapterLink).parseHtml().requireElementById("__nuxt") - val pages2 = doc2.select("button.pure-button").mapNotNull { btn -> + val doc2 = webClient.httpGet(nextChapterLink).parseHtml() + val pages2 = doc2.requireElementById("__nuxt").select("button.pure-button").mapNotNull { btn -> val urlPage = btn.attr("on").substringAfter(": '").substringBefore("?t=") val id = generateUid(urlPage) if(!idSet.add(id)){ @@ -220,6 +220,10 @@ internal class Baozimh(context: MangaLoaderContext) : } pages = pages+pages2 part++ + chapterLink = doc2.select("link[rel=canonical]").attr("href") + nextChapterLink = doc2.select("a#next-chapter").attr("href") + chapterPart = chapterLink.substringAfterLast("/").substringBefore(".html").substringBeforeLast("_") + nexChapterPart = nextChapterLink.substringAfterLast("/").substringBefore(".html") } return pages }