From e788cff04a41d4d0f496e2ff64a397e621ea73fc Mon Sep 17 00:00:00 2001 From: devi Date: Thu, 2 Nov 2023 19:36:26 +0100 Subject: [PATCH] Minor daily update --- .../site/galleryadults/GalleryAdultsParser.kt | 55 ++++++++++++++----- .../site/galleryadults/all/AsmHentai.kt | 7 ++- .../site/galleryadults/all/HentaiEra.kt | 30 +++++++--- .../site/galleryadults/all/HentaiFox.kt | 29 ++++++++-- .../site/galleryadults/all/HentaiRox.kt | 11 +++- .../site/galleryadults/all/NHentaiParser.kt | 22 +++++--- .../site/mangareader/fr/PhenixscansParser.kt | 1 - .../parsers/site/mangareader/id/MangakKita.kt | 3 +- 8 files changed, 116 insertions(+), 42 deletions(-) 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 b88db34a..68e74403 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 @@ -34,10 +34,15 @@ internal abstract class GalleryAdultsParser( append("https://") append(domain) if (!tags.isNullOrEmpty()) { - append("/tag/") - append(tag?.key.orEmpty()) - append("/?") - + 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()) @@ -92,11 +97,37 @@ internal abstract class GalleryAdultsParser( protected open val pathTagUrl = "/tags/popular/pag/" protected open val selectTags = ".tags_page ul.tags li" + protected open val listLanguage = arrayOf( + "/english", + "/french", + "/japanese", + "/chinese", + "/spanish", + "/russian", + "/korean", + "/german", + "/indonesian", + "/italian", + "/portuguese", + "/turkish", + "/thai", + "/vietnamese", + ) // The "/" is used to move them up in the tag list and therefore also in the url. private suspend fun getTags(page: Int): Set { val url = "https://$domain$pathTagUrl$page" val root = webClient.httpGet(url).parseHtml().selectFirstOrThrow(selectTags) - return root.parseTags() + val tagLanguage = ArrayList(listLanguage.size) + for (language in listLanguage) { + tagLanguage.add( + MangaTag( + key = "languageKey", + title = language, + source = source, + ), + ) + } + return root.parseTags() + tagLanguage } protected open fun Element.parseTags() = select("a.tag, .gallery_title a").mapToSet { @@ -111,16 +142,15 @@ 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 urlReplaceBefore = "/g/" - protected open val urlReplaceAfter = "/gallery/" 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" override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val urlChapters = manga.url.replace(urlReplaceBefore, urlReplaceAfter) + "1/" - val tag = doc.selectFirstOrThrow(selectTag) + val urlChapters = doc.selectFirstOrThrow(selectUrlChapter).attr("href") + val tag = doc.selectFirst(selectTag)?.parseTags() return manga.copy( - tags = tag.parseTags(), + tags = tag.orEmpty(), author = doc.selectFirst(selectAuthor)?.html()?.substringBefore(" { val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() @@ -162,7 +192,6 @@ internal abstract class GalleryAdultsParser( override suspend fun getPageUrl(page: MangaPage): String { val doc = webClient.httpGet(page.url.toAbsoluteUrl(domain)).parseHtml() - val root = doc.body() - return root.requireElementById(idImg).src() ?: root.parseFailed("Image src not found") + return doc.requireElementById(idImg).src() ?: doc.parseFailed("Image src not found") } } 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 2713dcc2..99b7d1ad 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 @@ -15,8 +15,13 @@ internal class AsmHentai(context: MangaLoaderContext) : override val selectGalleryImg = ".image img" override val pathTagUrl = "/tags/?page=" override val selectAuthor = "div.tags:contains(Artists:) .tag_list a span.tag" - override val selectTotalPage = ".tp" override val idImg = "fimg" + override val listLanguage = arrayOf( + "/english", + "/japanese", + "/chinese", + "/turkish", + ) override fun Element.parseTags() = select("a").mapToSet { val key = it.attr("href").removeSuffix('/').substringAfterLast('/') 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 2c58efa2..b32ec9a3 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 @@ -19,9 +19,16 @@ internal class HentaiEra(context: MangaLoaderContext) : 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" - override val urlReplaceBefore = "/gallery/" - override val urlReplaceAfter = "/view/" override val selectLanguageChapter = ".galleries_info li:contains(Languages) div.info_tags .item_name" + override val listLanguage = arrayOf( + "/english", + "/japanese", + "/spanish", + "/french", + "/korean", + "/german", + "/russian", + ) override suspend fun getListPage( page: Int, @@ -34,10 +41,15 @@ internal class HentaiEra(context: MangaLoaderContext) : append("https://") append(domain) if (!tags.isNullOrEmpty()) { - append("/tag/") - append(tag?.key.orEmpty()) - append("/?") - + if (tag?.key == "languageKey") { + append("/language") + append(tag.title) + append("/?") + } else { + append("/tag/") + append(tag?.key.orEmpty()) + append("/?") + } } else if (!query.isNullOrEmpty()) { append("/search/?key=") append(query.urlEncoded()) @@ -53,10 +65,10 @@ internal class HentaiEra(context: MangaLoaderContext) : override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val urlChapters = manga.url.replace(urlReplaceBefore, urlReplaceAfter) + "1/" - val tag = doc.selectFirstOrThrow(selectTag) + val urlChapters = doc.selectFirstOrThrow("#cover a, .cover a, .left_cover a").attr("href") + val tag = doc.selectFirst(selectTag)?.parseTags() return manga.copy( - tags = tag.parseTags(), + tags = tag.orEmpty(), author = doc.selectFirst(selectAuthor)?.text(), chapters = listOf( MangaChapter( 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 3b72dd07..c217f677 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 @@ -13,11 +13,22 @@ internal class HentaiFox(context: MangaLoaderContext) : override val selectGallery = ".lc_galleries .thumb, .related_galleries .thumb" override val selectTags = ".list_tags" override val selectTag = "ul.tags" - override val urlReplaceBefore = "/gallery/" - override val urlReplaceAfter = "/g/" override val selectLanguageChapter = "ul.languages a.tag_btn" - - override val selectTotalPage = ".total_pages" + override val listLanguage = arrayOf( + "/english", + "/french", + "/japanese", + "/chinese", + "/spanish", + "/russian", + "/korean", + "/indonesian", + "/italian", + "/portuguese", + "/turkish", + "/thai", + "/vietnamese", + ) override suspend fun getListPage( page: Int, @@ -30,13 +41,19 @@ internal class HentaiFox(context: MangaLoaderContext) : append("https://") append(domain) if (!tags.isNullOrEmpty()) { - append("/tag/") - append(tag?.key.orEmpty()) + if (tag?.key == "languageKey") { + append("/language") + append(tag.title) + } else { + append("/tag/") + append(tag?.key.orEmpty()) + } if (page > 1) { append("/pag/") append(page) append("/") } + } else if (!query.isNullOrEmpty()) { append("/search/?q=") append(query.urlEncoded()) 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 85dea867..36ccff7f 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 @@ -13,7 +13,14 @@ internal class HentaiRox(context: MangaLoaderContext) : override val selectTags = ".gtags" override val selectTag = "li:contains(Tags:)" override val selectAuthor = "li:contains(Artists:) span.item_name" - override val urlReplaceBefore = "/gallery/" - override val urlReplaceAfter = "/view/" override val selectLanguageChapter = "li:contains(Languages:) .item_name" + override val listLanguage = arrayOf( + "/english", + "/french", + "/japanese", + "/spanish", + "/russian", + "/korean", + "/german", + ) } 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 c3254d0f..5c4d84db 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 @@ -18,13 +18,14 @@ internal class NHentaiParser(context: MangaLoaderContext) : override val selectTags = "#tag-container a" override val selectTag = ".tag-container:contains(Tags:) span.tags" override val selectAuthor = "#tags div.tag-container:contains(Artists:) span.name" - override val urlReplaceBefore = "/g/" - override val urlReplaceAfter = "/g/" override val selectLanguageChapter = ".tag-container:contains(Languages:) span.tags a:not(.tag-17249) span.name" // tag-17249 = translated - - override val selectTotalPage = ".num-pages" override val idImg = "image-container" + override val listLanguage = arrayOf( + "/english", + "/japanese", + "/chinese", + ) override suspend fun getListPage( page: Int, @@ -40,10 +41,15 @@ internal class NHentaiParser(context: MangaLoaderContext) : append(domain) if (!tags.isNullOrEmpty()) { val tag = tags.single() - append("/tag/") - append(tag.key) - append("/?") - + if (tag.key == "languageKey") { + append("/language") + append(tag.title) + append("/?") + } else { + append("/tag/") + append(tag.key) + append("/?") + } } else if (!query.isNullOrEmpty()) { append("/search/?q=") append(query.urlEncoded()) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/PhenixscansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/PhenixscansParser.kt index a1288eb9..b1412dbb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/PhenixscansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/PhenixscansParser.kt @@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser @MangaSourceParser("PHENIXSCANS", "PhenixScans", "fr") internal class PhenixscansParser(context: MangaLoaderContext) : MangaReaderParser(context, MangaSource.PHENIXSCANS, "phenixscans.fr", pageSize = 20, searchPageSize = 10) { - override val datePattern = "MMM d, yyyy" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MangakKita.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MangakKita.kt index 6a4f0873..acefedcd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MangakKita.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/MangakKita.kt @@ -8,7 +8,6 @@ import java.util.* @MangaSourceParser("MANGAKITA", "MangaKita", "id") internal class MangakKita(context: MangaLoaderContext) : - MangaReaderParser(context, MangaSource.MANGAKITA, "mangakita.net", pageSize = 20, searchPageSize = 20) { - override val datePattern = "MMM d, yyyy" + MangaReaderParser(context, MangaSource.MANGAKITA, "mangakita.id", pageSize = 20, searchPageSize = 10) { override val sourceLocale: Locale = Locale.ENGLISH }