Holonometria: update URL and other fixes (#9400)

* Holonometria: update URL and other fixes

* Review suggestions
This commit is contained in:
scb261 2025-06-25 15:07:41 +03:00 committed by Draff
parent e84d87a883
commit 63ff937ae4
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 20 additions and 62 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'HOLONOMETRIA' extName = 'HOLONOMETRIA'
extClass = '.HolonometriaFactory' extClass = '.HolonometriaFactory'
extVersionCode = 2 extVersionCode = 3
isNsfw = false isNsfw = false
} }

View File

@ -8,12 +8,12 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import keiyoushi.utils.tryParse
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
class Holonometria( class Holonometria(
override val lang: String, override val lang: String,
@ -22,31 +22,23 @@ class Holonometria(
override val name = "HOLONOMETRIA" override val name = "HOLONOMETRIA"
override val baseUrl = "https://alt.hololive.tv" override val baseUrl = "https://holoearth.com"
override val supportsLatest = false override val supportsLatest = false
override val client = network.cloudflareClient.newBuilder() override fun popularMangaRequest(page: Int) = GET("$baseUrl/${langPath}alt/holonometria/manga/", headers)
.readTimeout(60, TimeUnit.SECONDS)
.build()
override fun headersBuilder() = super.headersBuilder() override fun popularMangaSelector() = ".manga__item"
.add("Referer", "$baseUrl/")
override fun popularMangaRequest(page: Int) =
GET("$baseUrl/holonometria/$langPath", headers)
override fun popularMangaSelector() = "#Story article:has(a[href*=/manga/])"
override fun popularMangaNextPageSelector() = null override fun popularMangaNextPageSelector() = null
override fun popularMangaFromElement(element: Element) = SManga.create().apply { override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) 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") thumbnail_url = element.selectFirst("img")?.attr("abs:src")
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = 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 { override fun searchMangaParse(response: Response): MangasPage {
val document = response.asJsoup() val document = response.asJsoup()
@ -64,10 +56,10 @@ class Holonometria(
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun mangaDetailsParse(document: Document) = SManga.create().apply { override fun mangaDetailsParse(document: Document) = SManga.create().apply {
title = document.select(".md-ttl__pages").text() title = document.select(".alt-nav__met-sub-link.is-current").text()
thumbnail_url = document.select(".mangainfo img").attr("abs:src") thumbnail_url = document.select(".manga-detail__thumb img").attr("abs:src")
description = document.select(".mangainfo aside").text() description = document.select(".manga-detail__caption").text()
val info = document.select(".mangainfo footer").html().split("<br>") val info = document.select(".manga-detail__person").html().split("<br>")
author = info.firstOrNull { desc -> manga.any { desc.contains(it, true) } } author = info.firstOrNull { desc -> manga.any { desc.contains(it, true) } }
?.substringAfter("") ?.substringAfter("")
?.substringAfter(":") ?.substringAfter(":")
@ -80,57 +72,23 @@ class Holonometria(
?.replace("&amp;", "&") ?.replace("&amp;", "&")
} }
override fun chapterListRequest(manga: SManga) = override fun chapterListRequest(manga: SManga) = GET("$baseUrl/${manga.url}", headers)
paginatedChapterListRequest(manga.url, 1)
private fun paginatedChapterListRequest(mangaUrl: String, page: Int) = override fun chapterListSelector() = ".manga-detail__list .manga-detail__list-item"
GET("$baseUrl$mangaUrl".removeSuffix("/") + if (page == 1) "/" else "/page/$page/", headers)
override fun chapterListParse(response: Response): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> =
val document = response.asJsoup() super.chapterListParse(response).reversed()
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 chapterFromElement(element: Element) = SChapter.create().apply { override fun chapterFromElement(element: Element) = SChapter.create().apply {
setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
name = element.select(".ttl").text() name = element.select(".manga-detail__list-title").text()
date_upload = element.selectFirst(".data--date")?.text().parseDate() date_upload = dateFormat.tryParse(element.selectFirst(".manga-detail__list-date")?.text())
scanlator = element.selectFirst(".data--category")?.text()
}
private fun String?.parseDate(): Long {
return runCatching {
dateFormat.parse(this!!)!!.time
}.getOrDefault(0L)
} }
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
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")) Page(idx, "", img.attr("abs:src"))
} }.reversed()
} }
companion object { companion object {
@ -138,7 +96,7 @@ class Holonometria(
private val script = listOf("script", "naskah", "脚本") private val script = listOf("script", "naskah", "脚本")
private val dateFormat by lazy { private val dateFormat by lazy {
SimpleDateFormat("yy.MM.dd", Locale.ENGLISH) SimpleDateFormat("yyyy.MM.dd", Locale.ENGLISH)
} }
} }