From ee937137c305ae800778c0bb44b07370a11c65ef Mon Sep 17 00:00:00 2001 From: bapeey <90949336+bapeey@users.noreply.github.com> Date: Tue, 27 Feb 2024 09:38:22 -0500 Subject: [PATCH] Add ManhwaWeb (#1542) * Add manhwaweb * Lint * Remove data class * Oops * Oppsi Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> * Remove "Not used" Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> * Requested changes * Fix chapter url * Create SChapter in main class * make extension function --------- Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> --- src/es/manhwaweb/build.gradle | 8 + .../manhwaweb/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4944 bytes .../manhwaweb/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2783 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6446 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11619 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 16381 bytes .../extension/es/manhwaweb/ManhwaWeb.kt | 199 ++++++++++++++++++ .../extension/es/manhwaweb/ManhwaWebDto.kt | 135 ++++++++++++ .../es/manhwaweb/ManhwaWebFilters.kt | 100 +++++++++ 9 files changed, 442 insertions(+) create mode 100644 src/es/manhwaweb/build.gradle create mode 100644 src/es/manhwaweb/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/es/manhwaweb/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/es/manhwaweb/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/es/manhwaweb/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/es/manhwaweb/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWeb.kt create mode 100644 src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebDto.kt create mode 100644 src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebFilters.kt diff --git a/src/es/manhwaweb/build.gradle b/src/es/manhwaweb/build.gradle new file mode 100644 index 000000000..a72c783f2 --- /dev/null +++ b/src/es/manhwaweb/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'ManhwaWeb' + extClass = '.ManhwaWeb' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/es/manhwaweb/res/mipmap-hdpi/ic_launcher.png b/src/es/manhwaweb/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a03457d1534c4f9e46fc8950bc11bef842d822f5 GIT binary patch literal 4944 zcmV-W6R+%vP)Px|3Q0skRCr$PTzhm?)tUdD`^x)85(ovdBDsMOh~Xt-P-IFS%W7Sns)MD@)ah7U z76c&yq5%n5L8^cvRRQaWb*i0VT(!016D(?}T5Toam4rtCA%rAA-jDk_Gv7Y1ea=1S zx{A%&j(n)vwQ3}m`iF=?(a!wWRX%#Cga}`u zVzyvLQcomh!k`<}O9M^-`O%1c=|Bu(z|5Wd{fwjx&o}+O{z6dwkRzm8q|LW}Qx=9*_TRaRp#%LHx@AC{Y z0ng41V`7jFEU8m8Hv+J+?#P!L0rZ=($jXZmKuJ@sE3I<7J>}foNdr_ghy#bp2%6k* zU@C7Lz|nza0~}QWdTsY@7sE+{s;loWerfc z@ezZPOQz4P@_6FP^iE1g6P;%=4$AhkrC6)ITrcl!*RbI6C%iy_G2hW8FR-TO?q)xM#&?maZuV-M7rMEJQx}9zryi_EnM|~dxfIMX?#ll2b zM;H_KXkh{GfmAkeNQSd1JjT(vdJ~VRX|f=PBx*op87oBv5U16ui7^Hl-LanKvd(KZ zZ|SOyE?*Z`*?Bo*ykqc6yf{mWEJ4r2+**sMfZy-m+AyF@><42V*VD zdQ($fVu-DFTAHSn%hob}89l}xZrV-Q6dOQOW>mSEiE%o@_1kRVQG=nEFvGHjUC?L_ zt|fR39F=yesRe@mtqpa2B&`=@Y2+3nU91A6O(thm`b9aD$T$+PjAeAXWX!+~sRYqX zQy6>UHj1+{&#^Pe?J48DIw$9mdNd9KT^KK$rxqaTGkrPn)K>Ij2m_2kBp03!0YFkD zZKgw>tSmT_5*cW{U!8{-45%^^R$gHkc|n&031dbx2@7;}!PnZ#z=<244M!r?C&Jg( z2LF|I-GnI1QG(L}Pj(g@adGHtYDTE9Hw;{=oB9@)l?6Bi1bX}6Yi@xU4C*{tOaM)s zLS9Vo<{475DSKBe#ju&zu|d>tdk&XBI>6kk?8HsLlGrrz_U|G0?)mKb#eMs6YWq$= z5HR`&cVhHiw=G~1G4qNr#P|gIfS}|ze{^u!yabS2&F1y`0~C}m!LS=9$Rqj~?wIKFusdtaFmmJd4|7`5O|jGlixyM6kV*U-4<4IR>?OF%nrZYFM4Uc0yM0m@WBJ+kBY(@gz-8k{g4zz#qH%sQwgUlOCan1er!kG}y-n&Qu zJ+qSyh)ieNOV7iZLVE)uzF4>zftJgL6$lZd@4ibNc+dGp9I9B0V0(wmG>K}iqaDb^Vu!ZsoG7O(RH*=7d3mbhGD|`)kw@8gT70badiDg^qxG;^-D@ER$>~R5Yb%bf+X&x`IXg0|@oQGWot~z4)Cf@aEq{mn z#rLu2jemF>r+2+1n~$XOuJkla{pBwpcs#63$md7HFL$H)?e}y#m5@6I#hV|4Ga&)( zwe>i(ay0~HJyxDEnvigS%;F#&@z@8Jtf~NU0?B)76(9vMi1=#H8#wpc9(B_B1+Uy6 zEx^cs_^z%s37{RSh9u_YqIk%uPoF_ec_k2_Z7WH9hu``w{%tCEA1im^t#@#0`z~h2sx8Q>9~FbRo@)TPJzT1xnHv4(Eq{<{5M6%n^D<7}6%s(yRLh?ZAbVCR^FU``-GlRcek*rK>WIRgkl)W- z?(jJ`$pC$ziZrcII^s#EeuAu7ssj!_36==46{{NC3GlRuoC3 zA5`6Z?UrrGTQDE--x!JBbLVkn-3A0Mw=vU*%Nc>fwGSaaX9U`64&%~ipToQG$81xo z>3s{UI31R!}r@iZpVx(tB>nAf11)$5RT{S1t} zZ64EthFveA^^YI1dPjWsR^v* za^EgDyk(1#KKWYox3uEO`p1znHV^q_OW2e&?Ii~7fIxmh_U6QZ3F|81$;w1q%^}qP z{Aq;x`jPjOdobeLx4?JlGLEd@fZm2P$h+@f*`$#6eg30`5Pg1lmo38ZTfWKCit36- z&~vQbls$CQ-it*95NBdCFv@=g27vm`oI~N7RY)zKh+uCo4zJw+r^|_=b(JjKr?lea z_8rKcJquo*LECn49!6vyY|_?ENXpBFzr6$1D;|c}(~p8x%aB$w3Eij9qNeO21_s4p zg_SFqFdr;`7=2$g;@T}6KyJS8Vl!%1twEsma+vlgQ$Cm^D3q%la=ATu)~fRt3D zX60)196yD$Dc54c+J~6^UwC&f;STR{qSQH zJ^BdZvNF;7=g)BbsqGNEdkxXJHfkL}(QX`)i8&RK<`&GA>b)zMscybn28i;b36HKu z>V)x3i%4|oUh5~Hp>D&IEELF`%>nfOKAe|aYOw+kcjslKgqKFOqoH%%BJ`CNgAXko6y+YQ0( zLTB9xbT>30=hj<5VZxv9yc-S{6;uA=MD9I5#5cZw8~QI_LC3LLWY4+*!G0f3Ji8OE z`}W(O9vn142` zX|~irR~9j-d@aNnIq|ta`l{RMD_9tbyBX5iJ1bV$+ZFy-KmxVQo?ykEmDe$5DJCR zey|3?wobK=nX^k#P`;FXCI+bh8Fn4i^&uAINvn)CD^|nb)T}1MZ2!yUMDdo#k(_^x z9BfLY}qw@+E^hcF{uQeCJk`X|yK0GmjRS5?5x?PEYf8QW`=BDwlnsOBI*3)i;yvGDr3<3 z-~Ttx?tT>rYFko$ZOKHkz)3>gaJ&fq{`(o0;CO7zfEieQ8qwxR1^$MkT)N&aiPnoLH3hq z{nU&>Jnshv$f=36HAB?BL`joOv_$Hn4QR~!L}+SOtQ!PM5QGeJaDy;g58{tR*aGA&l0-VZadY==-bp)+ zFgcK*y72JeEZoc@gC)Es?LB*uHd`>0YGZMb1Q4CHmoH1xG0`8}veux{iFmVF8!R{j zK^T)4^A;6Xxts%eF+&#y)Q4Ezy_Jy<1cmwY*Z?XlwsrHot!m%xGV2J-%;Zz@W{%5T zoQKL&*+Dl%0EI`=b{%gURq!{o63Ls9*Bn=`4aUvZVD6%^b(;)rm>@-DP z1<)Vzi^7H?K{BRPLlWt+<0d}rc6(NZt%sUgk-3>L(AEA%uRknqFsQbkpZVT(Y(J|rKwjlq@>#m>I| z?(%aDCtm|V>%n2)Th+~tyqT!D`MBid%)H^Fa(27j9_fTa#BN^daU`x;{T}RK2N}bA zfq?HXtrwdArK{@_EnJ&_CDWpQ!pcqC;Rz`z<8nrf-sW<93Lyw|!qR>Xb3ivA8E`R- zd!Se8YtlXbfUmZtx$(i?&Q98PrQ>PzrQWbFT3AKW)Cd7VD^;n9iHW0=GcsqpU2*yU z`z2V9nJy?vhWQ^IF!VWcwI67((LWbOUm)N=+0}mOqn@6ga}qd0AKRfcx$FR<;!gVZ zGXP=^{m`*4y7%>5b~%HtN45oNy_U|xkmk@2nbx5Guz=DeF^RSn=*KBYM~?;qHZlN> z>k3z&SyIF*0YZnm>BpAz(f)Chn1HdJ*NE96V;^mKZOW8sP{6XCOliP_Z!9vV#9Zp@ z>tIZbhPxX7Xqz(VDcAwzi#2T3`6$A)*N?SaC&HP+=GLcFsBXaqeSx zFPY@d0DJeId+z`J|M&g>f6qaH)k6Rv0@5F=cYWvMh&|Sh@7nTjIKOoOAz=o4dRMKo zHl8098UP(BK!8Zt6aKLF{P6Rbj0okTU=xyiY+$qxb9BM-t_O?wF2EFMJj{#}#*G{2 zi0YQG-Ph4EO$>Ihn6yr;CVpcMDa2YgfO1orj0~xWkoLl_rn2j=8Y=y5bkp9mN=}XhZ(O!^4Z{RBW+}`d<0}5 zwUrf#0Gh)CC>ZPEq)I&=kduH3&rN|a=_uaUQ$n6!D`<}QCe$(l5FqHX8aZ|578H3D zwaW%e8HjP2MS@1!AYv(QRx*r12S(bc5dkbmAa^7Kz`P_Al1rur4QM?bo<_W&wPIEB zj*kC?MpvuO>nKEutoEQ0$e{qFsbpiR9>Zy%i$J6~6|IvLt3+Dy;#6@VybPjvb_(BbvM79EWUhXVn>4}LFcV^|A9$J!%d zkB^7{ffr&&htjDLW9>b<0}+w%d%Y0-KBee|rI6H0IJ5Fe1T^l4YxA3Mq$HubbTb}S zT$HZLT3}4u+E2vsof`m*L(l@Ne!|E%zymB4Q*>ZdH)P(1dvS>ak*OtOt zaZ%IzQ=Jcy#r;LZRFv`w`irJB!Zp)rtj)q{-%jG%_T6ed6-CtX0D@{jfOB|mp-0pA1IQo%l9OrSxbu&H;`;7=l4ls%(v}sY zS78DDjsjSfM4OFzTYFTQ}U-#&`lAAC#!bW2V`=FUxuXHQL^g^pIzWCF>*nu|V@ zCZKl5Zg@UFsiBrN0DyB?E}@WoFp{`7mm)4D8J%ryloIC_EJ4QuFTEDkI}us?cEbO# z1@?q^Mj^_10r9ROaFwmY-7o%wtDAPv@qMODMDqOEXuWnFajD6u+)xhh=?V%ibJu3X zCMV>9cOGQg(D>ejmM6o-}93xcN>m=K)L(u ztQqM0{3P7`@MHA<@l<%LYf!nO1cD6^Vq%bg^bq_ltvLPjIS_0DhOAkE9ywXKw0Z;F zrEAe}{8QBLI|N&|805Ws7`_J&aQdaW5Xc0|OAWLX(g4tjI5Ve!ivSrZB4bM#%|hpY zy&M@EOCWXzaCYt@D%9))yQ%kUx9x&^b14N-wUSYY9O)a^A;C2iXXY+~|6Vh4|8M}l z`wvjDUt}rFAWUy3i4zC};#209_j0$|!Vp!4mYH zJQ01TPQkT32M`e*jilK#@YSKW(OOkQfwBlN3ds@b_recRyZv`)YiNXfYdIP|Iga|b z4kPu|V)Xug5l+pRhkjEg;+g3`LEZ27qv^z7SrU=ni3l2v20~FNGkc`eN~lht6iQ9T zx%rEMfJjr_lg36w#B@VMoP*|UNB?Kw-cpK()it3i@*r(`hX+{6( zFXHmrH}UZNCG;9Q8iSTC!IiB$kvOIR&Jp=IGp`u!4Y!RE2%SdN2)MK52&hqTZ7rjM zJ3D_d{C7P_Te=vDV@6R2HU9ZC)bBrpxIt-flL%DRpmOC}g+dXrvB-VrARgbi1z&SB zdJN0Nmp`2WwEJLp_C)sKy=eOUBoYfpBGBQ-f2Ylau~F^l-vD(F&&*gA8!5eJqWf4 z#0^ZPKve*05*aXi28a$w#E4#QfB1>Q?*a3EiGEYrwYoiTq3PIXQuCTM~Jqvxm*7`$p3J*`->98a!) zt>k!TK|ThrevO`=TeK8yU)9skI@_#^*fl(#ikQcrIDRZG{dZ3M1%bzHs_oor9N}}~ z_#(95y$8?V|Ha!+h5po}2@nIFXn6l4*aVxhY+{RvL7yK@qUR0o{RuYd$p!#c3z=(p zp6;bywwHs&FC!{1`npA6%^2yOK$=2bb>rUwB(LkeC*{&GX;jTZ>BA%dW)mqdEiE#ZFM1w`(95MesMMoZ8$-NT+I(20bMVo1)vr)(>e zF`=3|Clq}oL%SkYS@>*oOFhCAGCG{R1v-bgvuPpI_)edcH5(tnJJp{pFe1McL%_6NB$>kARuGMnL`#@T;v9tpxMdVRk^~Gn&{s6bQVY)UN zpEAg`*B%u$okc-TA;ttj0&LVH*>=+P89_v;P08H+Cgc6S_M`RJYRDE-i@M5Y*0Tc9 z(b3TZ`aGRfW{--VEI^3Wk%-fg$g;HnCswI@wx!%EYU`9D^Nh>qAIEN=h+002ovPDHLkV1h}9JcIxM literal 0 HcmV?d00001 diff --git a/src/es/manhwaweb/res/mipmap-xhdpi/ic_launcher.png b/src/es/manhwaweb/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a78640f3a437cd74fa1e38120f74bba914431e GIT binary patch literal 6446 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 IM6N<$f&~&SbpQYW literal 0 HcmV?d00001 diff --git a/src/es/manhwaweb/res/mipmap-xxhdpi/ic_launcher.png b/src/es/manhwaweb/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ed9f5738902dc596d8f143d017156ec7305375 GIT binary patch literal 11619 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 LNkvXXu0mjfTmo6` literal 0 HcmV?d00001 diff --git a/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWeb.kt b/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWeb.kt new file mode 100644 index 000000000..73a8f1f99 --- /dev/null +++ b/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWeb.kt @@ -0,0 +1,199 @@ +package eu.kanade.tachiyomi.extension.es.manhwaweb + +import android.app.Application +import android.content.SharedPreferences +import androidx.preference.PreferenceScreen +import androidx.preference.SwitchPreferenceCompat +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost +import eu.kanade.tachiyomi.source.ConfigurableSource +import eu.kanade.tachiyomi.source.model.Filter +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 kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy + +class ManhwaWeb : HttpSource(), ConfigurableSource { + + private val preferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override val name = "ManhwaWeb" + + override val baseUrl = "https://manhwaweb.com" + + private val apiUrl = "https://manhwawebbackend-production.up.railway.app" + + override val lang = "es" + + override val supportsLatest = true + + private val json: Json by injectLazy() + + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .rateLimitHost(baseUrl.toHttpUrl(), 2) + .build() + + override fun headersBuilder(): Headers.Builder = super.headersBuilder() + .add("Referer", "$baseUrl/") + + override fun popularMangaRequest(page: Int): Request = GET("$apiUrl/manhwa/nuevos", headers) + + override fun popularMangaParse(response: Response): MangasPage { + val result = json.decodeFromString(response.body.string()) + val mangas = (result.data.weekly + result.data.total) + .distinctBy { it.slug } + .sortedByDescending { it.views } + .map { it.toSManga() } + + return MangasPage(mangas, false) + } + + override fun latestUpdatesRequest(page: Int): Request = GET("$apiUrl/latest/new-manhwa", headers) + + override fun latestUpdatesParse(response: Response): MangasPage { + val result = json.decodeFromString(response.body.string()) + val mangas = (result.data.esp + result.data.raw18 + result.data.esp18) + .distinctBy { it.type + it.slug } + .sortedByDescending { it.latestChapterDate } + .map { it.toSManga() } + + return MangasPage(mangas, false) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$apiUrl/manhwa/library".toHttpUrl().newBuilder() + .addQueryParameter("buscar", query) + + filters.forEach { filter -> + when (filter) { + is TypeFilter -> url.addQueryParameter("tipo", filter.toUriPart()) + is DemographyFilter -> url.addQueryParameter("demografia", filter.toUriPart()) + is StatusFilter -> url.addQueryParameter("estado", filter.toUriPart()) + is EroticFilter -> url.addQueryParameter("erotico", filter.toUriPart()) + is GenreFilter -> { + val genres = filter.state + .filter { it.state } + .joinToString("a") { it.id.toString() } + url.addQueryParameter("generes", genres) + } + + is SortByFilter -> { + url.addQueryParameter( + "order_dir", + if (filter.state!!.ascending) "asc" else "desc", + ) + url.addQueryParameter("order_item", filter.selected) + } + + else -> {} + } + } + + url.addQueryParameter("page", (page - 1).toString()) + + return GET(url.build(), headers) + } + + override fun getFilterList(): FilterList { + return FilterList( + TypeFilter(), + DemographyFilter(), + StatusFilter(), + EroticFilter(), + Filter.Separator(), + GenreFilter("Géneros", getGenres()), + Filter.Separator(), + SortByFilter("Ordenar por", getSortProperties()), + ) + } + + override fun searchMangaParse(response: Response): MangasPage { + val result = json.decodeFromString(response.body.string()) + val mangas = result.data.map { it.toSManga() } + return MangasPage(mangas, result.hasNextPage) + } + + override fun getMangaUrl(manga: SManga): String = "$baseUrl/${manga.url}" + + override fun mangaDetailsRequest(manga: SManga): Request { + val slug = manga.url.removeSuffix("/").substringAfterLast("/") + return GET("$apiUrl/manhwa/see/$slug", headers) + } + + override fun mangaDetailsParse(response: Response): SManga = + json.decodeFromString(response.body.string()).toSManga() + + override fun getChapterUrl(chapter: SChapter): String = baseUrl + chapter.url + + override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) + + override fun chapterListParse(response: Response): List { + val result = json.decodeFromString(response.body.string()) + val chaptersEsp = result.esp.map { it.toSChapter("Esp") } + val chaptersRaw = result.raw.map { it.toSChapter("Raw") } + + val filteredRaws = if (preferences.showAllRawsPref()) { + chaptersRaw + } else { + val chapterNumbers = chaptersEsp.map { it.chapter_number }.toSet() + chaptersRaw.filter { it.chapter_number !in chapterNumbers } + } + + return (chaptersEsp + filteredRaws).sortedByDescending { it.chapter_number } + } + + private fun ChapterDto.toSChapter(type: String) = SChapter.create().apply { + name = "Capítulo ${number.toString().removeSuffix(".0")}" + chapter_number = number + date_upload = createdAt ?: 0 + setUrlWithoutDomain(url) + scanlator = type + } + + override fun pageListRequest(chapter: SChapter): Request { + val slug = chapter.url.removeSuffix("/").substringAfterLast("/") + return GET("$apiUrl/chapters/see/$slug", headers) + } + + override fun pageListParse(response: Response): List { + val result = json.decodeFromString(response.body.string()) + return result.data.images.filter { it.isNotBlank() } + .mapIndexed { i, img -> Page(i, imageUrl = img) } + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val showAllRawsPref = SwitchPreferenceCompat(screen.context).apply { + key = SHOW_ALL_RAWS_PREF + title = SHOW_ALL_RAWS_TITLE + summary = SHOW_ALL_RAWS_SUMMARY + setDefaultValue(SHOW_ALL_RAWS_DEFAULT) + } + + screen.addPreference(showAllRawsPref) + } + + private fun SharedPreferences.showAllRawsPref() = getBoolean(SHOW_ALL_RAWS_PREF, SHOW_ALL_RAWS_DEFAULT) + + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException() + + companion object { + private const val SHOW_ALL_RAWS_PREF = "pref_show_all_raws_" + private const val SHOW_ALL_RAWS_TITLE = "Mostrar todos los capítulos \"Raw\"" + private const val SHOW_ALL_RAWS_SUMMARY = "Mostrar todos los capítulos \"Raw\" en la lista de capítulos, a pesar de que ya exista una versión en español." + private const val SHOW_ALL_RAWS_DEFAULT = false + } +} diff --git a/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebDto.kt b/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebDto.kt new file mode 100644 index 000000000..e078dfa1b --- /dev/null +++ b/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebDto.kt @@ -0,0 +1,135 @@ +package eu.kanade.tachiyomi.extension.es.manhwaweb + +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class PayloadPopularDto( + @SerialName("top") val data: PopularDto, +) + +@Serializable +class PopularDto( + @SerialName("manhwas_esp") val weekly: List, + @SerialName("manhwas_raw") val total: List, +) + +@Serializable +class PopularComicDto( + @SerialName("link") val slug: String, + @SerialName("numero") val views: Int, + private val name: String, + @SerialName("imagen") private val thumbnail: String, +) { + fun toSManga() = SManga.create().apply { + title = name + thumbnail_url = thumbnail + url = slug + } +} + +@Serializable +class PayloadLatestDto( + @SerialName("manhwas") val data: LatestDto, +) + +@Serializable +class LatestDto( + @SerialName("manhwas_esp") val esp: List, + @SerialName("manhwas_raw") val raw18: List, + @SerialName("_manhwas") val esp18: List, +) + +@Serializable +class LatestComicDto( + @SerialName("create") val latestChapterDate: Long, + @SerialName("id_manhwa") val slug: String, + @SerialName("_tipo") val type: String, + @SerialName("name_manhwa") private val name: String, + @SerialName("img") private val thumbnail: String, +) { + fun toSManga() = SManga.create().apply { + title = name + thumbnail_url = thumbnail + url = "$type/$slug" + } +} + +@Serializable +class PayloadSearchDto( + val data: List, + @SerialName("next") val hasNextPage: Boolean, +) + +@Serializable +class SearchComicDto( + @SerialName("_id") val slug: String, + @SerialName("_tipo") val type: String, + @SerialName("the_real_name") private val name: String, + @SerialName("_imagen") private val thumbnail: String, +) { + fun toSManga() = SManga.create().apply { + title = name + thumbnail_url = thumbnail + url = "$type/$slug" + } +} + +@Serializable +class ComicDetailsDto( + @SerialName("name_esp") private val title: String, + @SerialName("_sinopsis") private val description: String? = null, + @SerialName("_status") private val status: String, + @SerialName("_name") private val alternativeName: String? = null, + @SerialName("_imagen") private val thumbnail: String, + @SerialName("_categoris") private val genres: List>, + @SerialName("_extras") private val extras: ComicDetailsExtrasDto, +) { + fun toSManga() = SManga.create().apply { + title = this@ComicDetailsDto.title + thumbnail_url = thumbnail + description = this@ComicDetailsDto.description + if (!alternativeName.isNullOrBlank()) { + if (!description.isNullOrBlank()) description += "\n\n" + description += "Nombres alternativos: $alternativeName" + } + status = parseStatus(this@ComicDetailsDto.status) + genre = genres.joinToString { it.values.first() } + author = extras.authors.joinToString() + } + + private fun parseStatus(status: String) = when (status) { + "publicandose" -> SManga.ONGOING + "finalizado" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } +} + +@Serializable +class ComicDetailsExtrasDto( + @SerialName("autores") val authors: List, +) + +@Serializable +class PayloadChapterDto( + @SerialName("chapters_esp") val esp: List, + @SerialName("chapters_raw") val raw: List, +) + +@Serializable +class ChapterDto( + @SerialName("chapter") val number: Float, + @SerialName("link") val url: String, + @SerialName("create") val createdAt: Long?, +) + +@Serializable +class PayloadPageDto( + @SerialName("chapter") val data: PageDto, +) + +@Serializable +class PageDto( + @SerialName("img") val images: List, +) diff --git a/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebFilters.kt b/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebFilters.kt new file mode 100644 index 000000000..72fa59302 --- /dev/null +++ b/src/es/manhwaweb/src/eu/kanade/tachiyomi/extension/es/manhwaweb/ManhwaWebFilters.kt @@ -0,0 +1,100 @@ +package eu.kanade.tachiyomi.extension.es.manhwaweb + +import eu.kanade.tachiyomi.source.model.Filter + +class TypeFilter : UriPartFilter( + "Tipo", + arrayOf( + Pair("Ver todo", ""), + Pair("Manhwa", "manhwa"), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + ), +) + +class DemographyFilter : UriPartFilter( + "Demografía", + arrayOf( + Pair("Ver todo", ""), + Pair("Seinen", "seinen"), + Pair("Shonen", "shonen"), + Pair("Josei", "josei"), + Pair("Shojo", "shojo"), + ), +) + +class StatusFilter : UriPartFilter( + "Estado", + arrayOf( + Pair("Ver todo", ""), + Pair("Publicándose", "publicandose"), + Pair("Finalizado", "finalizado"), + ), +) + +class EroticFilter : UriPartFilter( + "Erótico", + arrayOf( + Pair("Ver todo", ""), + Pair("Sí", "si"), + Pair("No", "no"), + ), +) + +class Genre(title: String, val id: Int) : Filter.CheckBox(title) + +class GenreFilter(title: String, genres: List) : Filter.Group(title, genres) + +fun getGenres(): List = listOf( + Genre("Acción", 3), + Genre("Aventura", 29), + Genre("Comedia", 18), + Genre("Drama", 1), + Genre("Recuentos de la vida", 42), + Genre("Romance", 2), + Genre("Venganza", 5), + Genre("Harem", 6), + Genre("Fantasia", 23), + Genre("Sobrenatural", 31), + Genre("Tragedia", 25), + Genre("Psicológico", 43), + Genre("Horror", 32), + Genre("Thriller", 44), + Genre("Historias cortas", 28), + Genre("Ecchi", 30), + Genre("Gore", 34), + Genre("Girls love", 27), + Genre("Boys love", 45), + Genre("Reencarnación", 41), + Genre("Sistema de niveles", 37), + Genre("Ciencia ficción", 33), + Genre("Apocalíptico", 38), + Genre("Artes Marciales", 39), + Genre("Superpoderes", 40), + Genre("Cultivación (cultivo)", 35), + Genre("Milf", 8), +) + +class SortProperty(val name: String, val value: String) { + override fun toString(): String = name +} + +fun getSortProperties(): List = listOf( + SortProperty("Alfabético", "alfabetico"), + SortProperty("Creación", "creacion"), + SortProperty("Num. Capítulos", "num_chapter"), +) + +class SortByFilter(title: String, private val sortProperties: List) : Filter.Sort( + title, + sortProperties.map { it.name }.toTypedArray(), + Selection(0, ascending = false), +) { + val selected: String + get() = sortProperties[state!!.index].value +} + +open class UriPartFilter(displayName: String, val vals: Array>) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + fun toUriPart() = vals[state].second +}