MangaGun: Fix page list parse and update domain (#10593)

* MangaGun: Fix page list parse and update domain

* MangaGun: add comments.

* MangaGun: Update icon and source name.

* Update src/ja/mangagun/src/eu/kanade/tachiyomi/extension/ja/mangagun/MangaGun.kt

Co-authored-by: Luqman <16263232+Riztard@users.noreply.github.com>

* Update extension name

---------

Co-authored-by: Luqman <16263232+Riztard@users.noreply.github.com>
This commit is contained in:
AlphaBoom 2025-09-20 17:43:54 +09:00 committed by Draff
parent f1f374f773
commit c47e2c1024
Signed by: Draff
GPG Key ID: E8A89F3211677653
7 changed files with 30 additions and 55 deletions

View File

@ -1,9 +1,9 @@
ext { ext {
extName = 'MangaGun' extName = 'NihonKuni'
extClass = '.MangaGun' extClass = '.MangaGun'
themePkg = 'fmreader' themePkg = 'fmreader'
baseUrl = 'https://mangagun.net' baseUrl = 'https://nihonkuni.com'
overrideVersionCode = 4 overrideVersionCode = 5
isNsfw = true isNsfw = true
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.extension.ja.mangagun package eu.kanade.tachiyomi.extension.ja.mangagun
import android.util.Base64
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.asObservableSuccess
@ -8,17 +7,23 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter 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.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Cookie
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import org.jsoup.Jsoup
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable import rx.Observable
import java.util.Calendar import java.util.Calendar
private const val DOMAIN = "mangagun.net" private const val DOMAIN = "nihonkuni.com"
/**
* This plugin is for the website originally named MangaGun(漫画軍), which was later renamed to NihonKuni(日本国). Please do not be confused by the names.
*/
class MangaGun : FMReader("NihonKuni", "https://$DOMAIN", "ja") {
// Formerly "MangaGun(漫画軍)"
override val id = 3811800324362294701
class MangaGun : FMReader("MangaGun", "https://$DOMAIN", "ja") {
override val infoElementSelector = "div.row div.row" override val infoElementSelector = "div.row div.row"
// source is picky about URL format // source is picky about URL format
@ -31,17 +36,6 @@ class MangaGun : FMReader("MangaGun", "https://$DOMAIN", "ja") {
override fun popularMangaRequest(page: Int): Request = mangaRequest("views", page) override fun popularMangaRequest(page: Int): Request = mangaRequest("views", page)
override fun popularMangaFromElement(element: Element): SManga {
return SManga.create().apply {
element.select(headerSelector).let {
setUrlWithoutDomain(it.attr("abs:href"))
title = it.text()
}
thumbnail_url = element.select("img, .thumb-wrapper .img-in-ratio").attr("style")
.substringAfter("background-image:url(").substringBefore(")")
}
}
override fun latestUpdatesRequest(page: Int): Request = mangaRequest("last_update", page) override fun latestUpdatesRequest(page: Int): Request = mangaRequest("last_update", page)
override fun getImgAttr(element: Element?): String? { override fun getImgAttr(element: Element?): String? {
@ -51,15 +45,21 @@ class MangaGun : FMReader("MangaGun", "https://$DOMAIN", "ja") {
element.hasAttr("data-src") -> element.attr("abs:data-src") element.hasAttr("data-src") -> element.attr("abs:data-src")
element.hasAttr("data-bg") -> element.attr("abs:data-bg") element.hasAttr("data-bg") -> element.attr("abs:data-bg")
element.hasAttr("data-srcset") -> element.attr("abs:data-srcset") element.hasAttr("data-srcset") -> element.attr("abs:data-srcset")
element.hasAttr("style") -> element.attr("style").substringAfter("('") element.hasAttr("style") -> element.attr("style").substringAfter("url(")
.substringBefore("')") .substringBefore(")").trim('\'', '"')
else -> element.attr("abs:src") else -> element.attr("abs:src")
} }
} }
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> { override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
val slug = manga.url.substringAfter("raw-").substringBefore(".html") val index = manga.url.indexOf("manga-")
// Handling version compatibility, previous version used the 'raw-' prefix.
val slug = if (index >= 0) {
manga.url.substring(index + 6)
} else {
manga.url.substringAfter("raw-")
}.substringBefore(".html")
return client.newCall( return client.newCall(
GET( GET(
@ -99,39 +99,14 @@ class MangaGun : FMReader("MangaGun", "https://$DOMAIN", "ja") {
return chapterDate.timeInMillis return chapterDate.timeInMillis
} }
private fun handleDdosProtect(document: Document): Document {
val key = document.select("script:containsData(document.cookie)").first()?.html()
?.substringAfter("escape('")?.substringBefore("'")
if (key != null) {
// save cookie ct_anti_ddos_key
client.cookieJar.saveFromResponse(
baseUrl.toHttpUrl(),
listOf(
Cookie.Builder()
.name("ct_anti_ddos_key")
.value(key)
.domain(DOMAIN)
.path("/")
.build(),
),
)
}
return document.select("noscript div a").attr("abs:href").let { url ->
client.newCall(GET(url, headers)).execute().asJsoup()
}
}
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
val ddosProtect = document.select("title").first()?.text() val html = document.select("script:containsData(window.chapterImages)").first()!!.data()
?.contains("Manga Gun - DDoS protection") ?: false .substringAfter("window.chapterImages=\"").substringBefore("\"")
return if (ddosProtect) { .replace("\\/", "/")
handleDdosProtect(document) .replace("\\n", "")
} else { .replace("\\r", "")
document return Jsoup.parse(html).select("img.chapter-img").mapIndexed { index, element ->
}.select(".chapter-content img.chapter-img") Page(index, imageUrl = element.attr("abs:data-srcset").trim())
.eachAttr("data-img") }
.mapIndexed { index, img ->
Page(index, "", Base64.decode(img, Base64.DEFAULT).decodeToString())
}
} }
} }