From 516e860b4cede0f47aba676f33d1c42ccbdc31ae Mon Sep 17 00:00:00 2001 From: yemen Date: Wed, 12 Aug 2026 21:02:58 +0300 Subject: [PATCH 1/2] fix(hizomanga): increase per_page and clean chapter text --- src/ar/hizomanga/build.gradle | 2 +- .../extension/ar/hizomanga/HizoManga.kt | 95 +++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/ar/hizomanga/build.gradle b/src/ar/hizomanga/build.gradle index f57b1ee4d..94be22109 100644 --- a/src/ar/hizomanga/build.gradle +++ b/src/ar/hizomanga/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.HizoManga' themePkg = 'madaranovel' baseUrl = 'https://hizomanga.net' - overrideVersionCode = 2 + overrideVersionCode = 4 isNsfw = false isNovel = true } diff --git a/src/ar/hizomanga/src/eu/kanade/tachiyomi/extension/ar/hizomanga/HizoManga.kt b/src/ar/hizomanga/src/eu/kanade/tachiyomi/extension/ar/hizomanga/HizoManga.kt index d99ed036d..59ab2ddbc 100644 --- a/src/ar/hizomanga/src/eu/kanade/tachiyomi/extension/ar/hizomanga/HizoManga.kt +++ b/src/ar/hizomanga/src/eu/kanade/tachiyomi/extension/ar/hizomanga/HizoManga.kt @@ -1,6 +1,12 @@ package eu.kanade.tachiyomi.novelextension.ar.hizomanga import eu.kanade.tachiyomi.multisrc.madaranovel.MadaraNovel +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import okhttp3.Response +import org.jsoup.nodes.Element class HizoManga : MadaraNovel( @@ -9,4 +15,93 @@ class HizoManga : lang = "ar", ) { override val useNewChapterEndpointDefault = true + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/page/$page/?per_page=100&s=&post_type=wp-manga", headers) + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/$page/?per_page=100&s=&post_type=wp-manga&m_orderby=latest", headers) + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/page/$page/?per_page=100&s=${query.replace(" ", "+")}&post_type=wp-manga", headers) + + override fun popularMangaParse(response: Response): MangasPage { + val doc = response.asJsoup() + val mangas = parseNovels(doc) + val hasNextPage = doc.selectFirst(".pagination a:contains(next)") != null || + doc.selectFirst("a.next.page-numbers") != null || + doc.selectFirst(".nav-previous a") != null || + doc.selectFirst(".wp-pagenavi a.nextpostslink") != null || + doc.selectFirst(".page-item.next:not(.disabled) a") != null || + doc.selectFirst(".navigation-ajax .load-ajax") != null + return MangasPage(mangas, hasNextPage) + } + + override suspend fun fetchPageText(page: Page): String { + val response = client.newCall(GET(baseUrl + page.url, headers)).execute() + val doc = response.asJsoup() + + checkCaptcha(doc, baseUrl + page.url) + + doc.select( + "div.ads, div.unlock-buttons, sub, script, ins, .adsbygoogle, .code-block, noscript, " + + "div[id*=google], div[id*=bidgear], div[class*=bidgear], div[class*=google-tag], " + + "iframe, .foxaholic-google-tag-manager-body, .foxaholic-bidgear-before-content-1x1, " + + ".foxaholic-bidgear-banner-before-content, div[id^=bg-ssp], " + + ".adx-zone, .adx-head, [id*='-ad-'], [class*='-ad-'], .ad-container, " + + ".comments, .comment-list, #comments, .comment-respond, " + + ".social-sharing, .share-buttons, .post-share, " + + ".wpdiscuz, .discussion, .comment-form", + ).remove() + + val candidates = listOf( + doc.selectFirst(".text-left"), + doc.selectFirst(".text-right"), + doc.selectFirst(".reading-content .text-left"), + doc.selectFirst(".reading-content .text-right"), + doc.selectFirst(".entry-content"), + doc.selectFirst(".c-blog-post > div > div:nth-child(2)"), + doc.selectFirst(".reading-content"), + doc.selectFirst(".chapter-content"), + ).filterNotNull() + + var contentElement: Element? = null + var maxParagraphText = -1 + for (element in candidates) { + val paragraphTextLength = element.select("p").sumOf { it.text().length } + if (paragraphTextLength > maxParagraphText) { + maxParagraphText = paragraphTextLength + contentElement = element + } + } + + var content = contentElement?.html() ?: "" + + content = content.replace(Regex("]*>.*?", RegexOption.DOT_MATCHES_ALL), "") + content = content.replace(Regex("""\(adsbygoogle[^)]*\)[^;]*;?"""), "") + content = content.replace(Regex("""]*>\s*"""), "") + + content = removeTrailingNonChapterContent(content) + + return content.trim() + } + + private fun removeTrailingNonChapterContent(html: String): String { + val markers = listOf( + "*******", + "المترجمة", + "سبحان الله", + "تطور سلاح", + "الفصل يضحك", + ) + var cutoff = html.length + for (marker in markers) { + val idx = html.lastIndexOf(marker) + if (idx != -1 && idx < cutoff) { + cutoff = idx + } + } + return if (cutoff < html.length) { + html.substring(0, cutoff).trim() + } else { + html + } + } } From 654255247516585113913c5317a0021c34e56c10 Mon Sep 17 00:00:00 2001 From: hamedhani1998 Date: Wed, 12 Aug 2026 22:58:52 +0300 Subject: [PATCH 2/2] Update build.gradle --- src/ar/hizomanga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ar/hizomanga/build.gradle b/src/ar/hizomanga/build.gradle index 94be22109..251b4e60a 100644 --- a/src/ar/hizomanga/build.gradle +++ b/src/ar/hizomanga/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.HizoManga' themePkg = 'madaranovel' baseUrl = 'https://hizomanga.net' - overrideVersionCode = 4 + overrideVersionCode = 3 isNsfw = false isNovel = true }