From 3404731442d7e2f473b8f10e26df269d5ed51282 Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 20 Oct 2025 17:37:03 +0200 Subject: [PATCH] Fix Scanmanga (#11149) Partial revert of "Remove some dead sources (#11133)" This revert only the source Scan-Manga, who still exists but is blocked outside of France. This reverts commit 7c8903e84c3a080f77b1401f531e65f70eb6c1f7. --- src/fr/scanmanga/.gitignore | 1 + src/fr/scanmanga/build.gradle | 8 + .../scanmanga/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4040 bytes .../scanmanga/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2162 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5586 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10669 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 15377 bytes .../extension/fr/scanmanga/ScanManga.kt | 248 ++++++++++++++++++ .../extension/fr/scanmanga/ScanMangaDto.kt | 41 +++ 9 files changed, 298 insertions(+) create mode 100644 src/fr/scanmanga/.gitignore create mode 100644 src/fr/scanmanga/build.gradle create mode 100644 src/fr/scanmanga/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/fr/scanmanga/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/fr/scanmanga/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/fr/scanmanga/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/fr/scanmanga/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanManga.kt create mode 100644 src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanMangaDto.kt diff --git a/src/fr/scanmanga/.gitignore b/src/fr/scanmanga/.gitignore new file mode 100644 index 000000000..639cdd514 --- /dev/null +++ b/src/fr/scanmanga/.gitignore @@ -0,0 +1 @@ +local.properties diff --git a/src/fr/scanmanga/build.gradle b/src/fr/scanmanga/build.gradle new file mode 100644 index 000000000..23aee9935 --- /dev/null +++ b/src/fr/scanmanga/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Scan-Manga' + extClass = '.ScanManga' + extVersionCode = 12 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/fr/scanmanga/res/mipmap-hdpi/ic_launcher.png b/src/fr/scanmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0983fdf43ddbe94e81f55afdfe1457551282efbc GIT binary patch literal 4040 zcmV;(4>$0MP)&FbTII$uN`DOtP7+N>ZEInPiyC1d=Qm zu(2Tl%w>EtVYv(#gYkuLA^DJvElcu!#KQQLd`p&O9oEs3x^;Aa_YWOdST@*LIPCJP z`jo3&U6S6Xe(&{rzxTQcc@j_JNj!-s@g)Ag#8ZTj6^}Vj`B*wB+1c68noOqmX_}6u zY5EvV)5q*~`|-yK|L>-0`heAH{da*t@FSnFhl-VaKL4McPG<$jaRvZxJpSS4IL_el zcq({2-aipSRxUbo;^X6g%rH#Va4XDwQ8|95=n(4GC9p9A_OF z8To(^^0y1l9zw{|dc8gl|2Mi-$ly56qtR#%5kj6O3mmvt5JG-9H8qvI1V3WgnJ+XN zO$s68@5utY*$P6)vud?Ebul7XmIceQ@USdA9u^*tXIWucc1~GpwK|m$@(*NzgZ0XV z2;w*nZVw9!?SazjM!&&@@1~q+(=cfDqn@9Z1=4&UTGR~2%?ung1EWYa?7hq*WZxXj zDPa!w&XBTa22oN9#dmZV9v#Ev*>RxBmnlmi zXQ>5UZ<|1;>^24l2B1=@U^1EDa=F4Q$mwBGJHg;^%UvGKRf;f)Dz_c3)9rn;-f&@{BZKM!0gMIT5-4L3ndDttxODI8SZr#Dn z@=8b~67==;L9JGUrs?nra(Ou94$$+6WPUlWETsNT_QkEiT7_Xd@sd(T)!Vhd}I~f#N``h z_)9_tUf+Hat3Nw|)t{Zft3F=aeiHjmWrD{SKq{4@udfdpjV8Q;TGceZZlXfSvEhp{ zId*=Viwl=CaV;wgxw*M0C@4TlNeOs79{7Ad1OmZ=;Pd%&l2=rUok^Fl`m^Ks*H7c{ z!Y6Tf;giF7;g4Qk-gXoR&g7s@RF9614h#~YPA|>vpKwXv3iwr)}1P*fx^y871nHz$4ejY!`jb| zAmLITZqNAb((Gq}X7L;s*0 zDwPUTQ&Z6E^)MQZi^gCyVp6L^w)hTyn|u>%4;Ns~p}V|(=th9o4&A`|xI$#qb;DpZ zfubnTG#&n#^jv~IFCM_^ZE<+{lY@BW^OJZz@(eyqE<#nu0L*4H>~=dG4hLwOUNkm` z0~K9k_>XUEu>R;xtUJoXx}!X-^>d^QYi6+V1RvRrgRnWgVjjs_Y^I>V#IJ$Ej?zJ_ z+kOK7_NO?!x+4XzN2O!K!Cd^|d<|}o>%q8OfmQWlaCMZ6XjTUq8w{|L?l!quXO}YmwVo_$C3-0y|APZBOF8YsVjJ6XCi*_)nBn@ zUj{ZDEqyQwK1947*~i*@qE0IREa(L zZBS?}xKHhBR&X4L+Y{6H>{^poj*krqm3aSb9r&^d=&UsUJEs-v{TXyzfVIc@*mSZS zxy=eV7;mY=;|VP)Y=Q!7s0IqLH50g+UxLz`0>ovMVavhm*cexYP4RqePOQY1q$)%g zc0gsagMC0t9LHhIKw)QI8#X206|*6s62CfCgPfKT&@MO3v;5!ve7H_G8VHmjG?(hqmwaD~k(AE4B2m}I%B#lTb7UP{n9wK~#HYZl$ zt(0m+7j|GoZ@q6Bl;t=K>nZFl=)jgFVNmA$`cw@vqzYJQ7dVcCiS{6^lfrJP?Jg4U zTC6~(!GuZ;y`Qg6`fv3=a=O ztJT6{v4nr37)ns=J%WaYhM-VtaHOmgZzfk^b7B=Dl7xsz65`F&YNS^8!s2kw$|R2C zV5Arv7j$Dwa&YFnkt{^Aum@&`Gx&PD6DfW{l9_@mxKP^zNkb!KG8slkM`17+;B-2J zzVnd^Dlab&2r?Lqn9!SXvb-BxQ)>c(B9esInpT4pVJ~!6Iv|PTIOwc2(yIIL%hZ~H zoQ(-p*pgg@6Xo5|SR6suvn&gvZ4N>87Mv>YfS{rh4Gj(G@9z))VpXJc-czr!B3f!i zZ1p&<-Y5+cWHcH<(=^m3I}Vn0;mwq4L?j8ZDX|Kh605K^tp@4hL0D;TCQaKIqzHTQ zR%&&SoHvq%IKr1fJ3~&eAO<#P8GN z_c?d)pVvC^(dA}*m@dT!=S29^`D$bplt3sHqP@Kx!^6Xvo}LE7Fz|RhkZUd2mD`30 zpBz8G`L-7MZKIgBIgue%;MZxvnG=y%g?)t`P)^%Ic1MGFy7fP$DvK@N!nlh9e#VdHb~CKgevUHYr~+{5^`!Vm!Qad1m))6 zfKVtzS63I5O64OEbgUF>zsbdGQJ3)Q&eM2hM+$zk{~QF>-qriy;2<;_4Je8VS{$-0 zhasI6U*@#V$|V0hXC^zcn<3X)z_J`dO$ufTO7;ngyjM_>6ghd1RL~GM9xucCxI(Ns za2>BjXW$om(((SW>u7B6f?O_#QmKT|XoSPzm^CqDISxH46L#jc1>M4DvN=hJU3qQj z*I4GAFD*n+RaMoa5tQ39jE(UEY&ceib#aAQb1)BUzRAIdX=Uh9jA3eODzN_)svHDtwwD#iy6W z_~fDpf4oqOKb)^YOnxJjIwNd0TVMy%zj~jmaTM)>cuqZpF8^`q4FR1m&9{ z-*2|<7o?{cB(}{Kw0k)O(Jl{+HU(4&HJxzRP{#E};J?D0op!`^x`P8U`qFE8)W38GvqG&UA$8w)k%!6fCu zq}3e~Rk*OYAvZF(Ipo0M5M3)$V#6+p4Net944} z105uo?@+;f?7kPtY(hy1k|VJprdEyr$tlCttJhFcQUbA9jK01;Xtmn#ZXEgr%_Uo^`sHv$zQ&SUqdwVf4F@fpn zY0xws{#^~X+YPhXjERW}+_`fHQmGVGRaM~ecqlC`MM+7?yc8D~FPfsFq5w1h?>}Bs zQBi@Kni@!@Qgn892F@i;PfrIb3t``ScDvo6C<(CKu`hF-6S!C-*NWP-(Ff!%Hg!!UuYnNQA=3-V`?+wF$S2QVJRXnR?Z#scOVhM%U|^v0op;_@O9=T1S;RxVgm}BzGlYtE)>F3WeXEJ9qBORjXF5B82>-uZ@d-!N5x22mF{2@-srnzYs!x z?&JB#ke~b7@H67goWCOv@nQjgtRUVLe1>=jv*!pQKYC1gj(G1_&-mK((66SL8U7cW utR#f|&11?+a`y!%PvS{Di6`;BkN*XgeA2`@I8LV?+``l)Z=xD6j|%dlr@zL}ZYxTom>K>;ik1J$sftXV2x^hg}wSU1Vi(=!3tR z&(qGF{d~{=fBwJoKYv1A)QfsibJa3J$V-HfSC*KULN4*w`Sa(Oa~xM7%QB56E?Jgo zj^oZ9J9cb&y#6oye7*}yEgoH7ulGD5K}_LUOpEUcak#~Uj&3s^ zKYk3FrXh-AVgam-i0n3YPWh(=cvks61{Mb>8r2OHIyyQqJUk3R5EdRll4TS=n2HoP zvdC!h;&8JYM-4QN7+hfvM{#HxD#*bo4p1)a(~aS?I!BnjS}RnQ)o5vHfz@h7AP`u1 zfQcy)nWjkjw8k-fRo;k8rAic+sZgpc$F=JklwGfYqPzlS(OlQyS}fEWT)e8rd#U;O z`6pRnl6K|ddc{q&wY9-+wx^aJqOBo2Yr2gn3$MI>=}4S3lZ}@ zrEU~!wjafs?MIP&Nr}519q8@t#o*u|hK7bP7OYS|sJxVqg;Ob0k|6Ca+dhsWm+-~EI~VD|c+u5;q5svIR6Ew&w3U{g*dHlM1&pZ?o~ zKF8eef08Vtr1cS!Pie#QdzJ0*ashOW`mm$Yh8>kw?5MC}ceNEG<1|>71<&(|2bkTM zGC~0i1_P>$U3mZVY9!~@U~`@pfBBk%WrBS|UY2E)-?Ly#-i-XNQWM<1pj?;3k5mI2 zgbFsY```7#X0yTL@g%+qrNtNlgTVlc#e%x7A#6QehvYmhlJm6KUep4IXDULz?!hpA z^?6-be#f^ha5Dbz@13K*uzV`TBCT;8wK_ezy1L+SI1=l`4`~7Wo4sMubq-ur-3SNp z`Fyz9Wy7ye-$rtt7Mo7hVrNM!Tr3A!mO=G7vGvStB;^L@{a-Iqu+zSosU=D19AzT{ z?5lU8th@rv&CRe_EQvL;4l9k{6*S>D`Biu?y9^&>mq1yrfyrco&1S>Y)D%Qfg0g)G zTk?YeHl3&^9!pySp1srxP3(ywjp2q1gBcoAYYJAvTBRd{S;L zJ~*etcOz~@FI2Mwq|6HN?N#Ms1sFrp2@TdCxrViA-(cIZ5_I*LVYl1CFbo7i2;Wgr z3Xa6Pq4_?|pTDN?VAvgVU7tIE0y>>8@c{QMF8r~e0e|>Xix1CKFGg3LjyD#4b*BiR4UaID3!{%P$(2( zlu9L3Dit&u4YXPcbdMd50t#M;A znb6kOhR)7Tn9XKbt--yp-|v4yenA0bSq9JZU>FADJ@&+N~XM~WIgpk!s#Hx_P8zHB-k6V|K;2G@?N$_Cp o$4kWWki#p_BLAXZ)HBro09!2c$G5WQ`Tzg`07*qoM6N<$g6dlet^fc4 literal 0 HcmV?d00001 diff --git a/src/fr/scanmanga/res/mipmap-xhdpi/ic_launcher.png b/src/fr/scanmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5d716298d7d21ef79638c78ca929601ca1d2a7f9 GIT binary patch literal 5586 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 WpE3m6NDB07K@YU_HEUsri2noHa+sR{ literal 0 HcmV?d00001 diff --git a/src/fr/scanmanga/res/mipmap-xxhdpi/ic_launcher.png b/src/fr/scanmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9f545740ace4f4a7a6540279a36fa55221dd09ce GIT binary patch literal 10669 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 literal 0 HcmV?d00001 diff --git a/src/fr/scanmanga/res/mipmap-xxxhdpi/ic_launcher.png b/src/fr/scanmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9f26c3dd393994f3c68a3b85356381702e1379fc GIT binary patch literal 15377 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 literal 0 HcmV?d00001 diff --git a/src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanManga.kt b/src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanManga.kt new file mode 100644 index 000000000..a63c7a78f --- /dev/null +++ b/src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanManga.kt @@ -0,0 +1,248 @@ +package eu.kanade.tachiyomi.extension.fr.scanmanga + +import android.util.Base64 +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +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 keiyoushi.utils.parseAs +import okhttp3.CookieJar +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import java.util.zip.Inflater + +class ScanManga : HttpSource() { + override val name = "Scan-Manga" + + override val baseUrl = "https://m.scan-manga.com" + private val baseImageUrl = "https://static.scan-manga.com/img/manga" + + override val lang = "fr" + + override val supportsLatest = true + + override fun headersBuilder(): Headers.Builder = super.headersBuilder() + .add("Accept-Language", "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7") + .set("User-Agent", "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36") + + // Popular + override fun popularMangaRequest(page: Int): Request { + return GET("$baseUrl/TOP-Manga-Webtoon-36.html", headers) + } + + override fun popularMangaParse(response: Response): MangasPage { + val mangas = response.asJsoup().select("#carouselTOPContainer > div.top").map { element -> + SManga.create().apply { + val titleElement = element.selectFirst("a.atop")!! + + title = titleElement.text() + setUrlWithoutDomain(titleElement.attr("href")) + thumbnail_url = element.selectFirst("img")?.attr("data-original") + } + } + + return MangasPage(mangas, false) + } + + // Latest + override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl, headers) + + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + + val mangas = document.select("#content_news .publi").map { element -> + SManga.create().apply { + val mangaElement = element.selectFirst("a.l_manga")!! + + title = mangaElement.text() + setUrlWithoutDomain(mangaElement.attr("href")) + + thumbnail_url = element.selectFirst("img")?.attr("src") + } + } + + return MangasPage(mangas, false) + } + + // Search + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/api/search/quick.json" + .toHttpUrl().newBuilder() + .addQueryParameter("term", query) + .build() + .toString() + + val newHeaders = headers.newBuilder() + .add("Content-type", "application/json; charset=UTF-8") + .build() + + return GET(url, newHeaders) + } + + override fun searchMangaParse(response: Response): MangasPage { + val json = response.body.string() + if (json == "[]") { return MangasPage(emptyList(), false) } + + return MangasPage( + json.parseAs().title?.map { + SManga.create().apply { + title = it.nom_match + setUrlWithoutDomain(it.url) + thumbnail_url = "$baseImageUrl/${it.image}" + } + } ?: emptyList(), + false, + ) + } + + // Details + override fun mangaDetailsParse(response: Response): SManga { + val document = response.asJsoup() + + return SManga.create().apply { + title = document.select("h1.main_title[itemprop=name]").text() + author = document.select("div[itemprop=author]").text() + description = document.selectFirst("div.titres_desc[itemprop=description]")?.text() + genre = document.selectFirst("div.titres_souspart span[itemprop=genre]")?.text() + + val statutText = document.selectFirst("div.titres_souspart")?.ownText() + status = when { + statutText?.contains("En cours", ignoreCase = true) == true -> SManga.ONGOING + statutText?.contains("Terminé", ignoreCase = true) == true -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + thumbnail_url = document.select("div.full_img_serie img[itemprop=image]").attr("src") + } + } + + // Chapters + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + return document.select("div.chapt_m").map { element -> + val linkEl = element.selectFirst("td.publimg span.i a")!! + val titleEl = element.selectFirst("td.publititle") + + val chapterName = linkEl.text() + val extraTitle = titleEl?.text() + + SChapter.create().apply { + name = if (!extraTitle.isNullOrEmpty()) "$chapterName - $extraTitle" else chapterName + setUrlWithoutDomain(linkEl.absUrl("href")) + } + } + } + + // Pages + private fun decodeHunter(obfuscatedJs: String): String { + val regex = Regex("""eval\(function\(h,u,n,t,e,r\)\{.*?\}\("([^"]+)",\d+,"([^"]+)",(\d+),(\d+),\d+\)\)""") + val (encoded, mask, intervalStr, optionStr) = regex.find(obfuscatedJs)?.destructured + ?: error("Failed to match obfuscation pattern: $obfuscatedJs") + + val interval = intervalStr.toInt() + val option = optionStr.toInt() + val delimiter = mask[option] + val tokens = encoded.split(delimiter).filter { it.isNotEmpty() } + val reversedMap = mask.withIndex().associate { it.value to it.index } + + return buildString { + for (token in tokens) { + // Reverse the hashIt() operation: convert masked characters back to digits + val digitString = token.map { c -> + reversedMap[c]?.toString() ?: error("Invalid masked character: $c") + }.joinToString("") + + // Convert from base `option` to decimal + val number = digitString.toIntOrNull(option) + ?: error("Failed to parse token: $digitString as base $option") + + // Reverse the shift done during encodeIt() + val originalCharCode = number - interval + + append(originalCharCode.toChar()) + } + } + } + + private fun dataAPI(data: String, idc: Int): UrlPayload { + // Step 1: Base64 decode the input + val compressedBytes = Base64.decode(data, Base64.NO_WRAP or Base64.NO_PADDING) + + // Step 2: Inflate (zlib decompress) + val inflater = Inflater() + inflater.setInput(compressedBytes) + val outputBuffer = ByteArray(512 * 1024) // 512 KB buffer, should be more than enough + val decompressedLength = inflater.inflate(outputBuffer) + inflater.end() + + val inflated = String(outputBuffer, 0, decompressedLength) + + // Step 3: Remove trailing hex string and reverse + val hexIdc = idc.toString(16) + val cleaned = inflated.removeSuffix(hexIdc) + val reversed = cleaned.reversed() + + // Step 4: Base64 decode and parse JSON + val finalJsonStr = String(Base64.decode(reversed, Base64.DEFAULT)) + + return finalJsonStr.parseAs() + } + + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + val packedScript = document.selectFirst("script:containsData(h,u,n,t,e,r)")!!.data() + + val unpackedScript = decodeHunter(packedScript) + val parametersRegex = Regex("""sml = '([^']+)';\n?.*var sme = '([^']+)'""") + + val (sml, sme) = parametersRegex.find(unpackedScript)?.destructured + ?: error("Failed to extract parameters from script.") + + val chapterInfoRegex = Regex("""const idc = (\d+)""") + val (chapterId) = chapterInfoRegex.find(packedScript)?.destructured + ?: error("Failed to extract chapter ID.") + + val mediaType = "application/json; charset=UTF-8".toMediaType() + val requestBody = """{"a":"$sme","b":"$sml"}""" + + val documentUrl = document.baseUri().toHttpUrl() + + val pageListRequest = POST( + "$baseUrl/api/lel/$chapterId.json", + headers.newBuilder() + .add("Origin", "${documentUrl.scheme}://${documentUrl.host}") + .add("Referer", documentUrl.toString()) + .add("Token", "yf") + .build(), + requestBody.toRequestBody(mediaType), + ) + + val lelResponse = client.newBuilder().cookieJar(CookieJar.NO_COOKIES).build() + .newCall(pageListRequest).execute().use { response -> + if (!response.isSuccessful) { error("Unexpected error while fetching lel.") } + dataAPI(response.body.string(), chapterId.toInt()) + } + + return lelResponse.generateImageUrls().map { Page(it.first, imageUrl = it.second) } + } + + // Page + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() + + override fun imageRequest(page: Page): Request { + val imgHeaders = headers.newBuilder() + .add("Origin", baseUrl) + .build() + + return GET(page.imageUrl!!, imgHeaders) + } +} diff --git a/src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanMangaDto.kt b/src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanMangaDto.kt new file mode 100644 index 000000000..234af3a8c --- /dev/null +++ b/src/fr/scanmanga/src/eu/kanade/tachiyomi/extension/fr/scanmanga/ScanMangaDto.kt @@ -0,0 +1,41 @@ +package eu.kanade.tachiyomi.extension.fr.scanmanga + +import kotlinx.serialization.Serializable + +@Serializable +class Page( + val f: String, // filename + val e: String, // extension +) + +@Serializable +class UrlPayload( + private val dN: String, + private val s: String, + private val v: String, + private val c: String, + private val p: Map, +) { + fun generateImageUrls(): List> { + val baseUrl = "https://$dN/$s/$v/$c" + return p.entries + .mapNotNull { (key, page) -> + key.toIntOrNull()?.let { pageIndex -> + pageIndex to "$baseUrl/${page.f}.${page.e}" + } + } + .sortedBy { it.first } // sort by page index + } +} + +@Serializable +class MangaSearchDto( + val title: List?, +) + +@Serializable +class MangaItemDto( + val nom_match: String, + val url: String, + val image: String, +)