From 63ff937ae4506482e887d9246d9e1bed22d2cb53 Mon Sep 17 00:00:00 2001
From: scb261 <65343233+scb261@users.noreply.github.com>
Date: Wed, 25 Jun 2025 15:07:41 +0300
Subject: [PATCH] Holonometria: update URL and other fixes (#9400)
* Holonometria: update URL and other fixes
* Review suggestions
---
src/all/holonometria/build.gradle | 2 +-
.../all/holonometria/Holonometria.kt | 80 +++++--------------
2 files changed, 20 insertions(+), 62 deletions(-)
diff --git a/src/all/holonometria/build.gradle b/src/all/holonometria/build.gradle
index 7f24782c9..7226ee39f 100644
--- a/src/all/holonometria/build.gradle
+++ b/src/all/holonometria/build.gradle
@@ -1,7 +1,7 @@
ext {
extName = 'HOLONOMETRIA'
extClass = '.HolonometriaFactory'
- extVersionCode = 2
+ extVersionCode = 3
isNsfw = false
}
diff --git a/src/all/holonometria/src/eu/kanade/tachiyomi/extension/all/holonometria/Holonometria.kt b/src/all/holonometria/src/eu/kanade/tachiyomi/extension/all/holonometria/Holonometria.kt
index c9f80d7d1..fc1325fa2 100644
--- a/src/all/holonometria/src/eu/kanade/tachiyomi/extension/all/holonometria/Holonometria.kt
+++ b/src/all/holonometria/src/eu/kanade/tachiyomi/extension/all/holonometria/Holonometria.kt
@@ -8,12 +8,12 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
+import keiyoushi.utils.tryParse
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class Holonometria(
override val lang: String,
@@ -22,31 +22,23 @@ class Holonometria(
override val name = "HOLONOMETRIA"
- override val baseUrl = "https://alt.hololive.tv"
+ override val baseUrl = "https://holoearth.com"
override val supportsLatest = false
- override val client = network.cloudflareClient.newBuilder()
- .readTimeout(60, TimeUnit.SECONDS)
- .build()
+ override fun popularMangaRequest(page: Int) = GET("$baseUrl/${langPath}alt/holonometria/manga/", headers)
- override fun headersBuilder() = super.headersBuilder()
- .add("Referer", "$baseUrl/")
-
- override fun popularMangaRequest(page: Int) =
- GET("$baseUrl/holonometria/$langPath", headers)
-
- override fun popularMangaSelector() = "#Story article:has(a[href*=/manga/])"
+ override fun popularMangaSelector() = ".manga__item"
override fun popularMangaNextPageSelector() = null
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
- title = element.select(".ttl").text()
+ title = element.select(".manga__title").text()
thumbnail_url = element.selectFirst("img")?.attr("abs:src")
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) =
- GET("$baseUrl/holonometria/$langPath#${query.trim()}", headers)
+ GET("$baseUrl/${langPath}alt/holonometria/manga/#${query.trim()}", headers)
override fun searchMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
@@ -64,10 +56,10 @@ class Holonometria(
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
- title = document.select(".md-ttl__pages").text()
- thumbnail_url = document.select(".mangainfo img").attr("abs:src")
- description = document.select(".mangainfo aside").text()
- val info = document.select(".mangainfo footer").html().split("
")
+ title = document.select(".alt-nav__met-sub-link.is-current").text()
+ thumbnail_url = document.select(".manga-detail__thumb img").attr("abs:src")
+ description = document.select(".manga-detail__caption").text()
+ val info = document.select(".manga-detail__person").html().split("
")
author = info.firstOrNull { desc -> manga.any { desc.contains(it, true) } }
?.substringAfter(":")
?.substringAfter(":")
@@ -80,57 +72,23 @@ class Holonometria(
?.replace("&", "&")
}
- override fun chapterListRequest(manga: SManga) =
- paginatedChapterListRequest(manga.url, 1)
+ override fun chapterListRequest(manga: SManga) = GET("$baseUrl/${manga.url}", headers)
- private fun paginatedChapterListRequest(mangaUrl: String, page: Int) =
- GET("$baseUrl$mangaUrl".removeSuffix("/") + if (page == 1) "/" else "/page/$page/", headers)
+ override fun chapterListSelector() = ".manga-detail__list .manga-detail__list-item"
- override fun chapterListParse(response: Response): List {
- val document = response.asJsoup()
- val mangaUrl = response.request.url.toString()
- .substringAfter(baseUrl)
- .substringBefore("page/")
-
- val chapters = document.select(chapterListSelector())
- .map(::chapterFromElement)
- .toMutableList()
-
- val lastPage = document.select(".pagenation-list a").last()
- ?.text()?.toIntOrNull() ?: return chapters
-
- for (page in 2..lastPage) {
- val request = paginatedChapterListRequest(mangaUrl, page)
- val newDocument = client.newCall(request).execute().asJsoup()
-
- val moreChapters = newDocument.select(chapterListSelector())
- .map(::chapterFromElement)
-
- chapters.addAll(moreChapters)
- }
-
- return chapters
- }
-
- override fun chapterListSelector() = "#Archive article"
+ override fun chapterListParse(response: Response): List =
+ super.chapterListParse(response).reversed()
override fun chapterFromElement(element: Element) = SChapter.create().apply {
setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
- name = element.select(".ttl").text()
- date_upload = element.selectFirst(".data--date")?.text().parseDate()
- scanlator = element.selectFirst(".data--category")?.text()
- }
-
- private fun String?.parseDate(): Long {
- return runCatching {
- dateFormat.parse(this!!)!!.time
- }.getOrDefault(0L)
+ name = element.select(".manga-detail__list-title").text()
+ date_upload = dateFormat.tryParse(element.selectFirst(".manga-detail__list-date")?.text())
}
override fun pageListParse(document: Document): List {
- return document.select("#js-mangaviewer img").mapIndexed { idx, img ->
+ return document.select(".manga-detail__swiper-wrapper img").mapIndexed { idx, img ->
Page(idx, "", img.attr("abs:src"))
- }
+ }.reversed()
}
companion object {
@@ -138,7 +96,7 @@ class Holonometria(
private val script = listOf("script", "naskah", "脚本")
private val dateFormat by lazy {
- SimpleDateFormat("yy.MM.dd", Locale.ENGLISH)
+ SimpleDateFormat("yyyy.MM.dd", Locale.ENGLISH)
}
}