From 36eb58e89394acb3ffd15a40b4c2b25a4551f1f6 Mon Sep 17 00:00:00 2001 From: Romain Date: Sun, 17 Aug 2025 15:20:52 +0200 Subject: [PATCH] Add Invincible ComicsVf (#10153) * Add Invincible ComicsVf Closes #9956 * Added Icon * Final details * Apply recomandations * Delete src/fr/invinciblecomics/.gitignore * Set the version to 1 in build.gradle * Name with some caps --- src/fr/invinciblecomics/build.gradle | 7 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4045 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2238 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5370 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9621 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 13738 bytes .../fr/invinciblecomics/InvincibleComics.kt | 132 ++++++++++++++++++ 7 files changed, 139 insertions(+) create mode 100644 src/fr/invinciblecomics/build.gradle create mode 100644 src/fr/invinciblecomics/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/fr/invinciblecomics/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/fr/invinciblecomics/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/fr/invinciblecomics/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/fr/invinciblecomics/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/fr/invinciblecomics/src/eu/kanade/tachiyomi/extension/fr/invinciblecomics/InvincibleComics.kt diff --git a/src/fr/invinciblecomics/build.gradle b/src/fr/invinciblecomics/build.gradle new file mode 100644 index 000000000..7c4f57c64 --- /dev/null +++ b/src/fr/invinciblecomics/build.gradle @@ -0,0 +1,7 @@ +ext { + extName = 'Invincible ComicsVF' + extClass = '.InvincibleComics' + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/fr/invinciblecomics/res/mipmap-hdpi/ic_launcher.png b/src/fr/invinciblecomics/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..20c73ff84507dd121e17022f7ebb8259204ac37b GIT binary patch literal 4045 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 literal 0 HcmV?d00001 diff --git a/src/fr/invinciblecomics/res/mipmap-mdpi/ic_launcher.png b/src/fr/invinciblecomics/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ab246c8ae6e50a05f14f5479b316a25cad3007 GIT binary patch literal 2238 zcmV;v2toIWP)-32a*iI)%&lE6p|pYkECFm#X(rGHR|2^1P@NC~ts7OPGfsU+Y`fl6z~ z>cA8~sckT=Kw|-IaTo@r3fOVL2o{_{Vp1gu;gSn6#&pt|`gL)EX1hV|IW_>P)LaxDqqS{Yl71e(9 zUKKb50t2$#opIqpF@4Qe7<30C0e-$UICG}Q61*UQ5P>|_-;c|o5bV*({z=bw*lZ|N z6fDckM1~XFo}pI$cV}$3w#9v2GB8WvX&qB zcyN}kti|hwir08DLZiv0u7<fR$cIOb z%tv;X6QNKTon75 z|FdWRi30AIU0vv-_p@iu!t&+I(Ri^D#d!)A%>5<`@^6K#`f&t4e*n#2wBqkaj-#&r zEwr?`k?+dI{bk=pdD#L4flPFi7O7zUtsl}wi-)M%;(WQ++lO~foW{MgXCOC+{ag!lKasre`)jekF9?@K z0CVO`pMb>*{7E2ySH_LQQ}y*2K79C~YxrAF>j)TXr}(f;Ah@mOY1DjhPFo8G`A6r7 zWg%e~nl>$|1zIWBH&j$$$)-(l!hCIHfq~GVW=%0$Sm)i^{g_|(rltGvXW|x!5wNfT z6ZojI5{ox(j3;pUBOt7;zNwqRLKm80duWTL_Ei^ZY7z|MsZ�z(^oMS;pVa1Oh6E z#^y`d_2+|F^}r%bC>d+uV=T?-_2mxOsy2`Xqg8@Q$&x++qXig7wB9*WRfWaX)tdhg zgc0z3iiodUeZE3z^O+awuzTMjb#*RZv;Z3(sX}q#$T;_EYwy60m-pglKmGxVGo4T> z*F*A=0xaq+aRPVUl~@bu$h6sQxU_y9zE!b81suB8hEVtCaa!iQ-r>25Hx9pteFu-A z-R;4l*S2E}k$C6$DI7lbFYG^b3}cIK$9Lx5gU26y0FKIEKJa|13y8p@q*e&YqG8WbEggqm+ zO^NdyiwBc6fx8q3k)#!y6d>(*70R1$TWX(Q44pvKoE(t50)8yryB)a&c_PT!7ZS&r zbV+;u0p$<%)*G6%37Ggl%l(k5&@*$Uqv}`dNO^|3Jr1hHN^IIqd*!3=L;3Yf*Jm)1 zFK&U!lP%YQFirdys)b56t;IbH=ZU+F>d$7wwN7d8At*2ZH8BQspQJ~?Yz>G8)t9u` zydXvJqg~rjKxr`E66t9^hELwS6Y_hf63?H8L}1dSq$@Gc*-T~dampa0*DlAr^6#0d zm+SoZPkoG!&tF6JM=R;E@6g2pK;HbA2EnyiUiVB$pUnRJ%n zBa^r1&%zI%c*s=lOS|`D{gxf-yVy1}c0cjXu{cosG>S&u2DoVr;8i%tg`jmCIsuE4 z!b|8B#gVH4hfJ7;icVS#H_xt=fvhVkpGGQE~lMPUw z*q#(TzZ54hVS`q$)J^K0@3AdICw(X$)q7#=K6) ziAwoGEO~S#WJTN1i!}N9*C5v)78#m`1xibkA1#`Qvgjl-&n}!1Ews7YdY=xH(e@ zHyueX_}-->$F`Z1Q2y9zHRG5zI!aL)d@{|79O*IC{z=ZcHBkI%?hnIKyrpw(~Ea61w0 z^O#Qqfx5{pEsxM`PgFVpe6)E4dH?_b M07*qoM6N<$f(O-CYXATM literal 0 HcmV?d00001 diff --git a/src/fr/invinciblecomics/res/mipmap-xhdpi/ic_launcher.png b/src/fr/invinciblecomics/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3460ab9e3a652467cf4e34113c966ec35307f4 GIT binary patch literal 5370 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 literal 0 HcmV?d00001 diff --git a/src/fr/invinciblecomics/src/eu/kanade/tachiyomi/extension/fr/invinciblecomics/InvincibleComics.kt b/src/fr/invinciblecomics/src/eu/kanade/tachiyomi/extension/fr/invinciblecomics/InvincibleComics.kt new file mode 100644 index 000000000..3c3b6d468 --- /dev/null +++ b/src/fr/invinciblecomics/src/eu/kanade/tachiyomi/extension/fr/invinciblecomics/InvincibleComics.kt @@ -0,0 +1,132 @@ +package eu.kanade.tachiyomi.extension.fr.invinciblecomics + +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 eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Element + +class InvincibleComics : HttpSource() { + override val name = "Invincible ComicsVF" + + override val baseUrl = "https://invinciblecomicsvf.fr" + + override val lang = "fr" + + override val supportsLatest = true + + // Popular + override fun popularMangaRequest(page: Int): Request { + return GET(baseUrl, headers) + } + + override fun popularMangaParse(response: Response): MangasPage { + val mangas = response.asJsoup().select(".top-comics-grid .comic-card, .top-bd .comic-card").map { element -> + parseMangaFromElement(element) + } + + return MangasPage(mangas, false) + } + + // Latest + override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl, headers) + + override fun latestUpdatesParse(response: Response): MangasPage { + val mangas = response.asJsoup().select(".nouveaux-ajouts .comic-card").map { element -> + parseMangaFromElement(element) + } + + return MangasPage(mangas, false) + } + + private fun parseMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h3")!!.text() + setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) + thumbnail_url = element.selectFirst("img")?.parseSrcset() + } + + // Search + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/page/$page/?s=$query&ct_post_type=comic:bande_dessine".toHttpUrl() + + return GET(url, headers) + } + + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + + val mangas = document.select(".entry-card").map { element -> + SManga.create().apply { + title = element.selectFirst("a")?.attr("aria-label")!! + setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) + thumbnail_url = element.selectFirst("img")?.attr("data-src") + } + } + + return MangasPage(mangas, document.selectFirst(".next") != null) + } + + // Details + override fun mangaDetailsParse(response: Response): SManga { + val document = response.asJsoup() + return SManga.create().apply { + thumbnail_url = document.selectFirst("#main img")?.parseSrcset() + description = document.selectFirst("strong:contains(Résumé)")?.parent()?.ownText() + author = document.selectFirst("strong:contains(Auteur)")?.parent()?.ownText() + genre = document.selectFirst("strong:contains(Genres)")?.parent()?.ownText() + status = when (document.selectFirst("strong:contains(Statut)")?.parent()?.ownText()) { + "En cours" -> SManga.ONGOING // OK + "Terminé" -> SManga.COMPLETED // TODO: Check if this is correct + else -> SManga.UNKNOWN + } + } + } + + // Chapters + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + return document.select("a.tome-link").map { element -> + SChapter.create().apply { + name = element.text() + setUrlWithoutDomain(element.attr("href")) + date_upload = 0L + chapter_number = element.attr("data-tome").toFloatOrNull() ?: 0f + } + }.reversed() + } + + // Pages + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + + val script = document.selectFirst("script:containsData(imageBase)")?.data() + ?: error("No script with imageBase found") + val imageBaseUrl = Regex("""imageBase = "(.*)";""").find(script)?.groupValues?.get(1) + ?: error("Failed to extract imageBase URL from script") + val totalPages = Regex("""const totalPages = (\d+);""").find(script)?.groupValues?.get(1) + ?: error("Failed to extract total pages from script") + + return (1..totalPages.toInt()).map { pageNumber -> + Page(pageNumber, imageUrl = "$imageBaseUrl${"%03d".format(pageNumber)}.png") + } + } + + // Page + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() + + // Utils + private fun Element.parseSrcset(): String { + if (!this.hasAttr("data-srcset")) { + return this.attr("data-src") + } + val parts = this.attr("data-srcset").split(",").map { it.trim() } + return parts.last { it.contains(" ") }.substringBefore(" ") + } +}