From 0a5202d84a76f876659b41cd31e24c90ac6a63af Mon Sep 17 00:00:00 2001 From: abubaca4 <55701175+abubaca4@users.noreply.github.com> Date: Wed, 19 Oct 2022 17:10:10 +0300 Subject: [PATCH] [RU]NudeMoon change domain and other fixes (#13914) * update site url * Parse mobile site version Fix a lot if error --- src/ru/nudemoon/build.gradle | 2 +- .../extension/ru/nudemoon/Nudemoon.kt | 86 +++++++++++-------- 2 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/ru/nudemoon/build.gradle b/src/ru/nudemoon/build.gradle index c993f5a68..f2577f77e 100644 --- a/src/ru/nudemoon/build.gradle +++ b/src/ru/nudemoon/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Nude-Moon' pkgNameSuffix = 'ru.nudemoon' extClass = '.Nudemoon' - extVersionCode = 8 + extVersionCode = 9 isNsfw = true } diff --git a/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt b/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt index 4e558e85d..0bd2e730b 100644 --- a/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt +++ b/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt @@ -20,7 +20,7 @@ class Nudemoon : ParsedHttpSource() { override val name = "Nude-Moon" - override val baseUrl = "https://nude-moon.net" + override val baseUrl = "https://nude-moon.me" override val lang = "ru" @@ -29,6 +29,7 @@ class Nudemoon : ParsedHttpSource() { private val cookiesHeader by lazy { val cookies = mutableMapOf() cookies["NMfYa"] = "1" + cookies["nm_mobile"] = "1" buildCookies(cookies) } @@ -99,7 +100,7 @@ class Nudemoon : ParsedHttpSource() { return GET(url, headers) } - override fun popularMangaSelector() = "tr[valign=top]" + override fun popularMangaSelector() = "table.news_pic2" override fun latestUpdatesSelector() = popularMangaSelector() @@ -108,7 +109,7 @@ class Nudemoon : ParsedHttpSource() { override fun popularMangaFromElement(element: Element): SManga { val manga = SManga.create() - manga.thumbnail_url = element.select("img[class^=news]").attr("abs:src") + manga.thumbnail_url = element.select("img.news_pic2").attr("abs:src") element.select("a:has(h2)").let { manga.title = it.text() manga.setUrlWithoutDomain(it.attr("href")) @@ -123,7 +124,7 @@ class Nudemoon : ParsedHttpSource() { override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - override fun popularMangaNextPageSelector() = "a.small:contains(Следующая)" + override fun popularMangaNextPageSelector() = "a.small:contains(>)" override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() @@ -131,18 +132,28 @@ class Nudemoon : ParsedHttpSource() { override fun mangaDetailsParse(document: Document): SManga { val manga = SManga.create() - manga.author = document.select("div.tbl1 a[href^=mangaka]").text() - manga.genre = document.select("div.tbl2 span.tag-links a").joinToString { it.text() } + manga.author = document.select("table.news_pic2 a[href*=mangaka]").text() + manga.genre = document.select("table.news_pic2 div.tag-links a").joinToString { it.text() } manga.description = document.select(".description").text() - manga.thumbnail_url = document.select("tr[valign=top] img[class^=news]").attr("abs:src") + manga.thumbnail_url = document.selectFirst("div.gallery-item img.textbox").attr("abs:data-src") return manga } override fun chapterListRequest(manga: SManga): Request { + val mangaDocument: Document + client.newCall( + GET(baseUrl + manga.url, headers) + ).execute().run { + if (!isSuccessful) { + close() + throw Exception("HTTP error $code") + } + mangaDocument = this.asJsoup() + } - val chapterUrl = if (manga.title.contains("\\s#\\d+".toRegex())) - "/vse_glavy/" + manga.title.split("\\s#\\d+".toRegex())[0].replace("\\W".toRegex(), "_") + val chapterUrl = if (mangaDocument.select("td.button a:contains(Все главы)").isNotEmpty()) + mangaDocument.select("td.button a:contains(Все главы)").attr("href") else manga.url @@ -151,39 +162,46 @@ class Nudemoon : ParsedHttpSource() { override fun chapterListSelector() = popularMangaSelector() - override fun chapterListParse(response: Response): List { + override fun chapterListParse(response: Response): List = mutableListOf().apply { val responseUrl = response.request.url.toString() val document = response.asJsoup() if (!responseUrl.contains("/vse_glavy/")) { - return listOf(chapterFromElement(document)) + add(chapterFromElement(document)) + } else { + document.select("table.news_pic2").forEach { + val chapter = SChapter.create() + val nameAndUrl = it.select("tr[valign=top] a:has(h2)") + chapter.name = nameAndUrl.select("h2").text() + chapter.setUrlWithoutDomain(nameAndUrl.attr("abs:href")) + chapter.scanlator = it.select("tr[valign=top] td[align=left] a[href*=perevod]").text() + chapter.date_upload = it.selectFirst("tr[valign=top] td[align=left] span.small2").text().let { + textDate -> + try { + SimpleDateFormat("dd MMMM yyyy", Locale("ru")).parse(textDate)?.time ?: 0L + } catch (e: Exception) { + 0 + } + } + val floatRegex = Regex("^([+-]?\\d*\\.?\\d*)\$") + chapter.chapter_number = floatRegex.find(chapter.name).toString().toFloatOrNull() ?: -1f + add(chapter) + } } - - // Order chapters by its number 'cause on the site they are in random order - return document.select(chapterListSelector()).sortedByDescending { - val regex = "#(\\d+)".toRegex() - val chapterName = it.select("img[class^=news]").first().parent().attr("title") - regex.find(chapterName)?.groupValues?.get(1)?.toInt() ?: 0 - }.map { chapterFromElement(it) } } override fun chapterFromElement(element: Element): SChapter { val chapter = SChapter.create() - val infoElem = element.select("tr[valign=top]").first().parent() - val chapterName = infoElem.select("h1, h2").text() - var chapterUrl = infoElem.select("a[title]:has(img)").attr("href") - if (!chapterUrl.contains("-online")) { - chapterUrl = chapterUrl.replace("/\\d+".toRegex(), "$0-online") - } else { - chapter.chapter_number = 1F - } + val chapterName = element.select("table td.bg_style1 h1").text() + var chapterUrl = element.baseUri() - chapter.setUrlWithoutDomain(if (!chapterUrl.startsWith("/")) "/$chapterUrl" else chapterUrl) + chapter.setUrlWithoutDomain(chapterUrl) chapter.name = chapterName - chapter.date_upload = infoElem.text().substringAfter("Дата:").substringBefore("Просмотров").trim().let { + chapter.scanlator = element.select("table.news_pic2 a[href*=perevod]").text() + chapter.date_upload = element.select("table.news_pic2 span.small2:contains(/)").text().let { try { - SimpleDateFormat("dd MMMM yyyy", Locale("ru")).parse(it)?.time ?: 0L + SimpleDateFormat("dd/MM/yyyy", Locale("ru")).parse(it)?.time ?: 0L } catch (e: Exception) { 0 } @@ -192,12 +210,10 @@ class Nudemoon : ParsedHttpSource() { return chapter } - override fun pageListParse(response: Response): List { - val imgScript = response.asJsoup().select("script:containsData(var images)").first().data() - - return Regex("""images\[(\d+)].src\s=\s'(http.*)'""").findAll(imgScript).map { - Page(it.groupValues[1].toInt(), imageUrl = it.groupValues[2]) - }.toList() + override fun pageListParse(response: Response): List = mutableListOf().apply { + response.asJsoup().select("div.gallery-item img.textbox").mapIndexed { index, img -> + add(Page(index, imageUrl = img.attr("abs:data-src"))) + } } override fun imageUrlParse(document: Document) = throw Exception("Not Used")