diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt index 579dd120..bc39794f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt @@ -38,7 +38,7 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex append(page) } } else if (!query.isNullOrEmpty()) { - append("search?keyword=") + append("comic-search?key=") append(query.urlEncoded()) if (page > 1) { append("&page=") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt index 68e74403..f751aba7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt @@ -56,9 +56,9 @@ internal abstract class GalleryAdultsParser( return parseMangaList(webClient.httpGet(url).parseHtml()) } - protected open val selectGallery = ".preview_item" + protected open val selectGallery = ".thumb" protected open val selectGalleryLink = ".inner_thumb a" - protected open val selectGalleryImg = ".inner_thumb img" + protected open val selectGalleryImg = "img" protected open val selectGalleryTitle = "h2" protected open fun parseMangaList(doc: Document): List { @@ -95,7 +95,7 @@ internal abstract class GalleryAdultsParser( }.awaitAll().flattenTo(ArraySet(360)) } - protected open val pathTagUrl = "/tags/popular/pag/" + protected open val pathTagUrl = "/tags/popular/?page=" protected open val selectTags = ".tags_page ul.tags li" protected open val listLanguage = arrayOf( "/english", @@ -143,7 +143,7 @@ internal abstract class GalleryAdultsParser( protected open val selectTag = "div.tags:contains(Tags:) .tag_list" protected open val selectAuthor = "ul.artists a.tag_btn" protected open val selectLanguageChapter = "div.tags:contains(Languages:) .tag_list a span.tag" - protected open val selectUrlChapter = "#cover a, .cover a, .left_cover a, .g_thumb a, .gallery_left a" + protected open val selectUrlChapter = "#cover a, .cover a, .left_cover a, .g_thumb a, .gallery_left a, .gt_left a" override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/AsmHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/AsmHentai.kt index 99b7d1ad..539fac03 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/AsmHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/AsmHentai.kt @@ -11,6 +11,7 @@ import org.koitharu.kotatsu.parsers.util.removeSuffix @MangaSourceParser("ASMHENTAI", "AsmHentai", type = ContentType.HENTAI) internal class AsmHentai(context: MangaLoaderContext) : GalleryAdultsParser(context, MangaSource.ASMHENTAI, "asmhentai.com") { + override val selectGallery = ".preview_item" override val selectGalleryLink = ".image a" override val selectGalleryImg = ".image img" override val pathTagUrl = "/tags/?page=" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEnvy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEnvy.kt new file mode 100644 index 00000000..8e4e9b3c --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEnvy.kt @@ -0,0 +1,79 @@ +package org.koitharu.kotatsu.parsers.site.galleryadults.all + +import org.jsoup.nodes.Element +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.site.galleryadults.GalleryAdultsParser +import org.koitharu.kotatsu.parsers.util.domain +import org.koitharu.kotatsu.parsers.util.mapToSet +import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.removeSuffix +import org.koitharu.kotatsu.parsers.util.urlEncoded + +@MangaSourceParser("HENTAIENVY", "HentaiEnvy", type = ContentType.HENTAI) +internal class HentaiEnvy(context: MangaLoaderContext) : + GalleryAdultsParser(context, MangaSource.HENTAIENVY, "hentaienvy.com") { + override val selectGalleryLink = "a" + override val selectGalleryTitle = "div.title" + override val selectTags = ".tags_items" + override val selectTag = ".gt_right_tags ul:contains(Tags:)" + override val selectAuthor = ".gt_right_tags ul:contains(Artists:) a" + override val selectLanguageChapter = ".gt_right_tags ul:contains(Languages:) a" + override val idImg = "fimg" + override val listLanguage = arrayOf( + "/english", + "/french", + "/japanese", + "/chinese", + "/spanish", + "/russian", + "/korean", + "/german", + "/portuguese", + ) + + override fun Element.parseTags() = select("a").mapToSet { + val key = it.attr("href").removeSuffix('/').substringAfterLast('/') + val name = it.html().substringBefore("<") + MangaTag( + key = key, + title = name, + source = source, + ) + } + + override suspend fun getListPage( + page: Int, + query: String?, + tags: Set?, + sortOrder: SortOrder, + ): List { + val tag = tags.oneOrThrowIfMany() + val url = buildString { + append("https://") + append(domain) + if (!tags.isNullOrEmpty()) { + if (tag?.key == "languageKey") { + append("/language") + append(tag.title) + append("/?") + } else { + append("/tag/") + append(tag?.key.orEmpty()) + append("/?") + } + } else if (!query.isNullOrEmpty()) { + append("/search/?s_key=") + append(query.urlEncoded()) + append("&") + } else { + append("/?") + } + append("page=") + append(page) + } + return parseMangaList(webClient.httpGet(url).parseHtml()) + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt index b32ec9a3..cb811af9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiEra.kt @@ -14,8 +14,6 @@ import org.koitharu.kotatsu.parsers.util.urlEncoded @MangaSourceParser("HENTAIERA", "HentaiEra", type = ContentType.HENTAI) internal class HentaiEra(context: MangaLoaderContext) : GalleryAdultsParser(context, MangaSource.HENTAIERA, "hentaiera.com", 25) { - override val selectGallery = ".thumb" - override val pathTagUrl = "/tags/popular?page=" override val selectTags = ".tags_section" override val selectTag = ".galleries_info li:contains(Tags) div.info_tags" override val selectAuthor = ".galleries_info li:contains(Artists) span.item_name" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiForce.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiForce.kt new file mode 100644 index 00000000..b696e182 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiForce.kt @@ -0,0 +1,84 @@ +package org.koitharu.kotatsu.parsers.site.galleryadults.all + +import org.jsoup.nodes.Element +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.site.galleryadults.GalleryAdultsParser +import org.koitharu.kotatsu.parsers.util.* + +@MangaSourceParser("HENTAIFORCE", "HentaiForce", type = ContentType.HENTAI) +internal class HentaiForce(context: MangaLoaderContext) : + GalleryAdultsParser(context, MangaSource.HENTAIFORCE, "hentaiforce.net") { + override val selectGallery = ".gallery" + override val selectGalleryLink = "a.gallery-thumb" + override val pathTagUrl = "/tags/popular/" + override val selectTags = ".tag-listing" + override val selectUrlChapter = "#gallery-main-cover a" + override val selectTag = "div.tag-container:contains(Tags:)" + override val selectAuthor = "div.tag-container:contains(Artists:) a" + override val selectLanguageChapter = "div.tag-container:contains(Languages:) a" + override val idImg = ".gallery-reader-img-wrapper img" + override val listLanguage = arrayOf( + "/english", + "/french", + "/japanese", + "/chinese", + "/spanish", + "/russian", + "/korean", + "/german", + "/indonesian", + "/italian", + "/portuguese", + "/thai", + "/vietnamese", + ) + + override fun Element.parseTags() = select("a").mapToSet { + val key = it.attr("href").removeSuffix('/').substringAfterLast('/') + val name = it.html().substringBefore("<") + MangaTag( + key = key, + title = name, + source = source, + ) + } + + override suspend fun getPageUrl(page: MangaPage): String { + val doc = webClient.httpGet(page.url.toAbsoluteUrl(domain)).parseHtml() + return doc.selectFirstOrThrow(idImg).src() ?: doc.parseFailed("Image src not found") + } + + override suspend fun getListPage( + page: Int, + query: String?, + tags: Set?, + sortOrder: SortOrder, + ): List { + val tag = tags.oneOrThrowIfMany() + val url = buildString { + append("https://") + append(domain) + if (!tags.isNullOrEmpty()) { + if (tag?.key == "languageKey") { + append("/language") + append(tag.title) + append("/") + } else { + append("/tag/") + append(tag?.key.orEmpty()) + append("/") + } + } else if (!query.isNullOrEmpty()) { + append("search?q=") + append(query.urlEncoded()) + append("&page=") + } else { + append("/page/") + } + append(page) + } + return parseMangaList(webClient.httpGet(url).parseHtml()) + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiFox.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiFox.kt index c217f677..866d60b6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiFox.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiFox.kt @@ -11,6 +11,7 @@ import org.koitharu.kotatsu.parsers.util.* internal class HentaiFox(context: MangaLoaderContext) : GalleryAdultsParser(context, MangaSource.HENTAIFOX, "hentaifox.com") { override val selectGallery = ".lc_galleries .thumb, .related_galleries .thumb" + override val pathTagUrl = "/tags/popular/pag/" override val selectTags = ".list_tags" override val selectTag = "ul.tags" override val selectLanguageChapter = "ul.languages a.tag_btn" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiRox.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiRox.kt index 36ccff7f..717684c7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiRox.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/HentaiRox.kt @@ -8,8 +8,7 @@ import org.koitharu.kotatsu.parsers.site.galleryadults.GalleryAdultsParser @MangaSourceParser("HENTAIROX", "HentaiRox", type = ContentType.HENTAI) internal class HentaiRox(context: MangaLoaderContext) : GalleryAdultsParser(context, MangaSource.HENTAIROX, "hentairox.com") { - override val selectGallery = ".thumb" - override val pathTagUrl = "/tags/popular?page=" + override val selectGalleryImg = ".inner_thumb img" override val selectTags = ".gtags" override val selectTag = "li:contains(Tags:)" override val selectAuthor = "li:contains(Artists:) span.item_name" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt index 5c4d84db..fb3d6896 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt @@ -12,7 +12,6 @@ internal class NHentaiParser(context: MangaLoaderContext) : GalleryAdultsParser(context, MangaSource.NHENTAI, "nhentai.net", 25) { override val selectGallery = "div.index-container:not(.index-popular) .gallery, #related-container .gallery" override val selectGalleryLink = "a" - override val selectGalleryImg = "img" override val selectGalleryTitle = ".caption" override val pathTagUrl = "/tags/popular?page=" override val selectTags = "#tag-container a" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/SuryaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/SuryaScans.kt index d2e4a967..4e44a9ad 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/SuryaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/SuryaScans.kt @@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("SURYASCANS", "SuryaScans", "en") internal class SuryaScans(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.SURYASCANS, "suryareader.com", pageSize = 5, searchPageSize = 5) + MangaReaderParser(context, MangaSource.SURYASCANS, "suryacomics.com", pageSize = 5, searchPageSize = 10)