From bf539439848b1849f8f8842c18c982f62a8e7882 Mon Sep 17 00:00:00 2001 From: beerpsi <92439990+beerpiss@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:55:11 +0700 Subject: [PATCH] Add Manga Planet (#1319) --- src/en/mangaplanet/build.gradle | 12 ++ .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2618 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1338 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3423 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6629 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9380 bytes .../en/mangaplanet/CookieInterceptor.kt | 46 +++++ .../extension/en/mangaplanet/Filters.kt | 133 ++++++++++++ .../extension/en/mangaplanet/MangaPlanet.kt | 194 ++++++++++++++++++ 9 files changed, 385 insertions(+) create mode 100644 src/en/mangaplanet/build.gradle create mode 100644 src/en/mangaplanet/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/mangaplanet/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/mangaplanet/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/mangaplanet/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/mangaplanet/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/CookieInterceptor.kt create mode 100644 src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/Filters.kt create mode 100644 src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/MangaPlanet.kt diff --git a/src/en/mangaplanet/build.gradle b/src/en/mangaplanet/build.gradle new file mode 100644 index 000000000..6a8362cfe --- /dev/null +++ b/src/en/mangaplanet/build.gradle @@ -0,0 +1,12 @@ +ext { + extName = "Manga Planet" + extClass = ".MangaPlanet" + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(":lib:speedbinb")) +} diff --git a/src/en/mangaplanet/res/mipmap-hdpi/ic_launcher.png b/src/en/mangaplanet/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..815193d287930214beca629d8324bafbf7d0d619 GIT binary patch literal 2618 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 literal 0 HcmV?d00001 diff --git a/src/en/mangaplanet/res/mipmap-mdpi/ic_launcher.png b/src/en/mangaplanet/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..dacc282b2cc1931de296527586b21a1097a85e6a GIT binary patch literal 1338 zcmV-A1;zS_P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000F6Nkl<Zc-rlk z1CT697=-U(q_b_?wn8U_a1Q%~(6epZ=GwN=v$izqvGV?^-g%Y=7uOk)E6jZPS9W*R zRkCEsI;+N#$B`9L_V`hj3)iw`%k*xydqFT596^*t3?^b(I%m!t-G%ax7e#RqVoVN) zV+CK4^JolN@Avynh%ph9m9a6#^Y#9E#Hbh>V?1Ag8)G=YjdFl1EIEK2!0HXaX!HDc z15B<R#`8(-5Uf%Ne=vwv(SsvhHmqqhaUbrmqJ@4>zl*H^0RlSME#jZ5K{)+Er1aVG zMRphNIMfWoo(9~!uMyf^MrgOz<F@tH`0Pj{k~=K?|3YH_S8j5lc*KPgaw$1`&=J{d zz~u4ckBR}@xW5UyJ&m}Yz#05wN1CDCVT5K|Jv8fUpk7*zYv*U+*NkRV5p>>=6J_+- z8#sAoat58@4Zz-SYr7Q#E<a5$fM1IGa6Q2r2wu0l0k;smZl{sp1rC4XP60P=7oc8V z0o9@+Xr{*FyQB4R`T{srY()x&!yLdz71-Y;QUD+32qU<9F9B0!7`%>E<^*`nR`M3| z=31y%S3$M345}F^P*aGRg`GHY_G~56`t9smiA;r>MKA6<+=3g}#6$2qBzQedoWQx& zn`*gLYo!3nx!F)oiNhTW)6ryhfyqsiPwjWG;e_`hX4C0)`oJ{3ZkS)J@29pyAA;X5 z!Cz0-Y_5~wH`YM4fgB33AfE?NOg@Uqd2M_p>B0?7KKucO+<rc(w^KX#)D2Q)2%fx+ zPyHl#HG`+SkZMg8lsrHIgXjKcZzZbCZn*qGR-wq<Mh7Xx1BaS<-*p6k%Wfm}{T%S? zs-aw2AqAM92Q{t0hnw>8(&`)x(2DlcD%gC1$OY(f_;APmMm}{N`NkcrG7`L&;ICyD ztpv`iqg+j1Ud{tNw7M7{Y+^M!iW_GoqSNMy_=Ail=EuDUnqVOK(9|`X>OxaL9e!0M z3@gg<;r<5Pzc>TqsXolN&q+eR!wZWy0H;5K6{@#-@N#@B?x5;uPpi!7@GsNfy}nz3 zit3}_@RFZfnZ@^0e^(8n+UyR0fFQsh`|Wlw{;3!^sqfd&XWa${Uo{F}iAQ(T<HLiE zxQ_a-SX=_d)P!U3<0c-)A1MNuhTZ<iR49AU3A5J^5}(*D)cw%Zub~jyb<*ADq3!i} z_h1w5rk^R6lo5O>6w{NB!%sSj>!%+@)u25xo4Fu|cfjrooV2C*v$UTA9IwnHI|aOR zs0j~ktAlb`xdgwk5Q=F@C&7=Oa0tI93#hfYvAWre2Ae0m0cgj_FSJv|R^zk8X1ub8 zCVrq1chSTpaGE%~-_J}V=(v;MS#>_$S_CuIW<#q5hP{p0-fj(VfZQP`PF1VuMbU^8 z)ilMQ66&C(+oEz>BJa6^phqv(li*bZ|Lxv#3^=?9DY?%c{tB@-DK$xZ_JU!)73L4K zASAh|PaEq8@cim*=q4YAV&Wl;pL9erL2D)*#<MFkv7x4q?R%ngpt+C(mFNo~w@<{9 zvM&6UCU7q<?L=;m4Wc*jKRDFO0ptL306D-7ZnxWv7?a225gFV00*oPFBM8Dq#F&gm z<2J^|8P6m20}nj#U{O)gc9Y2@+H5vN(~P0KynOdF&ph)mV<VqeETN8k2l-L*Q&IL~ w<U1Kts6H1OLP6G$bx}5BP;e$$vaY=T1vXmIcQ%_uBme*a07*qoM6N<$g0AF?YybcN literal 0 HcmV?d00001 diff --git a/src/en/mangaplanet/res/mipmap-xhdpi/ic_launcher.png b/src/en/mangaplanet/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..325c328028a84c1032b3baab661e24a6b534a6f9 GIT binary patch literal 3423 zcmV-l4WROgP)<h;3K|Lk000e1NJLTq003YB003YJ1^@s6;+S_h000dpNkl<Zc-rlq z19&4{AH`Qm{o1x|+qP}nTHCgTc3n&FZo5LADz$AP=R0>YJDcXscGGY3q3J!(b7~~N z^S}Rl@66<xeo|6WQc_Y<Qc_Y<Qg*7pg$ML$TeA2s=m79Rw2pRB?b=7}qFOJQSOnsD z9RUC4n{Rs5)YN?1-rgQ#GMQ@7$0Zn$#je`g+Aqh98FREn5Dtg0i;9Z6Q2aAU*;Hp| zXR@!a?|FiiBSYv<>#o24`lH+0+IB;#Td_bB-g@h;;~f=(fIpCS%gf9A98z|vq@?6m z!A!7oNcGc4H#Rozgp^$(tG$95trrZBwD-HxCv<dl)I!SMxu8Wbqg{`*4GpB-=~E!p zBMD|IyMagA|2^o_A=T3WPE*+pI+6ee(Vp}fkm`{HGuqR60+0bn$pB;kQZfJ;fRqeC z1|TH^aJ*yyO&y*1FG>brq7AjJsBP;+W_>Frr&Zy<EI9%KiW+c3a1O2w%E2%3<*-Ms zohH<@cA%`eU2!!(7GLYRWB^L_Um1`MFQ0UruptBA?Jq+mfm)7|#`aDmR<~evRt<jL zSBlr7^YK)8E*=Wa!Gj?=crr8>uSVqImt93zl~IL+%4X$vOfrD()y}G&kXnT&q6={P z=1lyaP>%e@b`5+{Q#;n>)Z)V(MYtt68|Q4vRD$yGPQy{O`&!{tv)35lu`mH=El$Ku z-l=$>fvnA}LQ!Lz-9ea4Ko!H^Q`L-+k_LF^)nPG1UzS}9|Dt--v~@aH039Y1Dq1?g z956StT4_f@%^fCe$gRa2+Y52wRwIsDPv{DGGyLQE@r{8TH3tG%L$6MS+sYKU&5eWG z%zf~jwIAos-;G!NQsHB)MsvGucqZCd--cxjdJZ4MO1|I85tLrns*J=oKDZ`6o-}?w zCZ*DOS3!KDN-xiCXu}_IWw_EmOR08GT7$nX4PFdDz<(#E5EpFDI0%1LiaCH~$#5fl z5rXUVy>J^Ff=lLX$8WI($gOYHpfh--y2o(@ZYZczs+*j<lk)^%5;pzwYjGU<Z^stl zluelmcv`FaqkPgh8u;~f=Bhu5pPS*+s|*T!#VcsGBG(!F%$~Xft|R?%{P+;O?w^J& z99gq6s+G1<+}z%yb~)D2%L5Qqp2^`JUDouEe!7qFU)olP<2PpD7`7ZQ3;3e)kLBk# zD{V(<IVyaE2H%}Np7X$ov={}hv-WEtxQvg0%Wyv&H6{>`Z%D%K(nj=DTMFy3zq+}1 z2SEOq#XkEwt30T<QJDjTGT2{VV@o-1LxxiIr*Q-v<D<bho8W1i@Ra~q`Il`<$0Zxm z%>m4dKN!HYT_OO*o}&Wrl5Z-~t6N~NMA0nCt`U#FcLz|<iEtGA=*PQD5L(iJ27X@6 zk?_O*Qk<~S4Bu0&dRhffcLA@$w{APjQ{X{+t|0tnNpM}9Xof#yui0b6v=ELO6NGOf zb5PBB;BXRi#gw#4G^)GwUOxgTWtqozq>O-NtgMUtj9uZcvlIRb4ZbkJtMHea?J~<E zfXOime7)*(rbl5(O1U};ZL6H{#~Ugw_a)9V2@4q;+VCXz0A31w+K!f^c%|Vm@aZLq zaGA6JU;xwiKtIA?3&4dRKjNK$%o^LRsJK~yFXk%e-H6Rhug001GnJ*~$?X4U^J7m9 zzE#!J9`teink9I}0{&7f_>1Xzaa{u#9U|asK51eorp1-OTHFjOD;~B;=h+E!sMF9? z#^L?U-vvt5AIDYC3(@&_hCWt|0vj!dR^VUGiPl{MZv~&=HTYHm=!M6IcL_i@%omUO zB%-vb9S5|lvRNz?w4U!20f@;rxTFz<7Ejc-umP9(8MT&k4L4rb)1Efr(`wH@2tT=d z_=^&>0Q3huKGG7t;`3)jVY9KC^OH$A^sqj^PMa5;Du9TxCguGBjYzJ<(cbA=zxSe# z<;N;`8}MmM_)D$eFQzTwFQn(jLEj~SC`<T?UHSQ++$B#<uflFtzZH7tYC)DqKwpa~ zIyl*`p>0;Z6@0bj&>HwI@CjanPjeEs3LsK}Zs|*=M_@%#v2s}ZfbtsK#R|x|0<hlL z+#i;wz_;%Ap7bHBUU;dU@E62GKWm=~Uz-Co@NOgg@Z8$ncz07A?p?YQ88t21Zr!h_ z0f{xOFga@g`>I-SLtwTAe1qbn`SJC>MozYdBZohawuH|EbGp%?3jAZo1Y&SRDsG$? z4c%~GTro2ed&(NSj8F#QydxmCq8V5C8415@zdwef;L=U$IDwzrfKMmEW2psv8{jqg zR{dYcWvJ_@K-{||MuG1+${&LmhVX?`Lb1K5zVDoni79Ww<-SIn{ocbyzbAYJx)(QE z7pyZJ9zJc^esrw<GZ)0+Gv7o!xGWZW0p7wFOb+Q=0qm)4!L@!_7VzzFId1mA7u7%W zVD-NeV8q7(sW^Fj5Oe~%l`owdid`iQeJ6m_x>np7oTE*)C$HsuJNte2@Z-$zXPc}4 zJpSI`9fi1#Cu?*g0&Kvihit)3bE9CWY=+SO>K4?scZ!9A^9GRL)Q;z(3(OlU`mvB4 zc=mX*jkgVdP8?3**WL-v#(N>z@MJ5}P248n+YDgfUmNknn!PAjH;Ljb*~{At;a}9? zoB@d4@bvU5e7mny>-Wcq<M}<VdV0P^%b{KAXZ?-%G&~pQ@%KdU*G=0E-N-<j@D=~= zjqf6}l_Ry;4Q-gl$M$MWp$Njcjs;Q5+Im`gwX!2#nOlo<eA4ai_qO3H;1%EKorYn% zij;QaqD;K1$44F#{=gwyaq1{vtVpe}yfQ+mev>oJ0b&;%T-<;~S+(GY2RCCOIoht) z8omeLpCe8&E>F^0jxG2XuTH^Nf9K=50HX$8^Q2hlhWpuuKa~D+Bkounqiw=0Lx8gc zAT~6sbL$XU*7%PnIXIyl$FpJueCw9u!T0AgfD@J_*=#u%ux))3m50|D;t32#XAOVK zPENf3hk{RUh1ZY`_<dUrOg4x+O#pK;Yp}nn#paOSTiJr!{Id=@(Yo5`_b2jazKbcq z8=*Nkg&%XpL*Ul%cZgNbq2a65f5Y5p>?v(<&MV`@WgIgys*zOF+U+%-W0NazGDm?m zeCvLH#`0u*5Sfb~V+(K`zo!=m+Gg2+KWRJLPIr}W?)}FO-H1^;3((qOLU?JTGU4*- zY;iuI_Xp6<A-z1i7Rl_bhf_A^f>)#S;l3o%Cj2YbrV@M}-iye^=}VIcUaa#8f2I}q zsk@+454Lp+pRGsFmCuVC5|CBf0-<@v8r&I{i+jTJI8W8|{s00v;chE$g1w63{BUm| zTakdS`u0uf_;!0Cp5@n1U7DzXXT@8ASC^UNqqLUOJ$(9iA5Ofnh%BtvisiTXatvV5 z{nw;oO>SN94nSN`yO336>fuTHjrn!Bdu<$^-jIyHV)F3F=5%<>5x^~vXzqbdc<OHR z=4wnBbm|Efd*BcHV?Az|_cu0VR>1@)UYl2kH+K}_<V_hkV{<0%49yjXqkC@v(=*KL ze0wG4fh4x7<vF#=wL%{R8Q?K|i}}>y$ROy)gg`$wjPFCC8x^b_Qc!IleD-{oKiA{- zMKM@U_|~T!P4v%kW#W`%@1KOn*?Ik>fWDH@=V#R@;Cbzh(hj0IA-)`7z)7Qhp&z`- z`V?Z%;qy?#@xwRc`HhKeJ9X$_;I@=e-zv_6_5J_`Csx2@b7F?F+L(}9shoce<Hzcy z>6$EG7cere1h*`Wh1(xK(EYjL-vaOQhc|9qunog^6{4`A4W_>E0u5eAuN+U|_5NaY zp}e0>b3dS55yzHe_wG5C6ZxNeig3rW9XNT^7Pt>)5Nsub25(l5Vp@A3gK{0b5hsq^ zg4-5t$M3QEh%IeUTTUN)g-oZ(4AJC(E2>l2u2vbV@gsMwkNd>oX7=(+riJ3%iGjk( z$2Tq9j>p#R#}83iSeaglWcBh#2T8t8*hIH<n3T3<<S5%;*@PHYH?4fkukm~B{28mz zojw358GsBxN(LYUkdgt&0HkC9G5{$Vfa4_tkO7EGH>Cdi0Sr74KvPpw9i;41TU%R; zBLbkb`v;s>R8+JVQg*4VtjwU@KfnP2xY4Hs1_lm;)L|uBb!24ZSV!DJLudf)LLYy^ z2`5}^G#XPO)va=Jax$;I_S&ljGwmKS4!DcbQS=!vzWCyO27@7uJq}V`)zQ&`^z`)1 z_uhN&QNc=OrV|Vuavw1@(R0o`^UNETELk!>F)`7QmzURCSXhX@?A+YkrsU-0bZ>9( z*_U2==`Cb*uFA?yWv2yjq{~rv`ULuH`V#sY`Ud(Y`sP0Bn*;-u#ifFc%E-gI`W+R5 z8+{CYGJU3+_WAS$ebncx49-%S980@9`d*UO?MScw6EFH``q(~h!N5ypqPN|49DhII zffn}^*7tGiR2BnOHvRt>ch#1bl9G~=l9K9O`WFmyFLaBzvM>Mu002ovPDHLkV1m(u BzE%JL literal 0 HcmV?d00001 diff --git a/src/en/mangaplanet/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangaplanet/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee8a6a3fab44e4688b6b21f15b27e4522ab5002 GIT binary patch literal 6629 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 literal 0 HcmV?d00001 diff --git a/src/en/mangaplanet/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangaplanet/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4e51aab2d2b7038950f2d33ee263db817dac8ac8 GIT binary patch literal 9380 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 Cv^pOE literal 0 HcmV?d00001 diff --git a/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/CookieInterceptor.kt b/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/CookieInterceptor.kt new file mode 100644 index 000000000..9511aff1a --- /dev/null +++ b/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/CookieInterceptor.kt @@ -0,0 +1,46 @@ +package eu.kanade.tachiyomi.extension.en.mangaplanet + +import android.util.Log +import android.webkit.CookieManager +import okhttp3.Interceptor +import okhttp3.Response + +class CookieInterceptor( + private val domain: String, + private val key: String, + private val value: String, +) : Interceptor { + + init { + val url = "https://$domain/" + val cookie = "$key=$value; Domain=$domain; Path=/" + setCookie(url, cookie) + } + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + if (!request.url.host.endsWith(domain)) return chain.proceed(request) + + val cookie = "$key=$value" + val cookieList = request.header("Cookie")?.split("; ") ?: emptyList() + if (cookie in cookieList) return chain.proceed(request) + + setCookie("https://$domain/", "$cookie; Domain=$domain; Path=/") + val prefix = "$key=" + val newCookie = buildList(cookieList.size + 1) { + cookieList.filterNotTo(this) { it.startsWith(prefix) } + add(cookie) + }.joinToString("; ") + val newRequest = request.newBuilder().header("Cookie", newCookie).build() + return chain.proceed(newRequest) + } + + private fun setCookie(url: String, value: String) { + try { + CookieManager.getInstance().setCookie(url, value) + } catch (e: Exception) { + // Probably running on Tachidesk + Log.e("MangaPlanet", "failed to set cookie", e) + } + } +} diff --git a/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/Filters.kt b/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/Filters.kt new file mode 100644 index 000000000..5ddcd19a6 --- /dev/null +++ b/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/Filters.kt @@ -0,0 +1,133 @@ +package eu.kanade.tachiyomi.extension.en.mangaplanet + +import eu.kanade.tachiyomi.source.model.Filter +import okhttp3.HttpUrl + +interface UrlFilter { + fun addToUrl(builder: HttpUrl.Builder) +} + +class SortFilter : SelectFilter( + "Sort order", + "sort", + arrayOf( + Pair("Released last", ""), + Pair("Released first", "1"), + Pair("By A to Z", "2"), + ), +) + +class CategoryFilter : MultiSelectFilter( + "Category", + "cat", + listOf( + MultiSelectOption("Shojo/Josei", "3"), + MultiSelectOption("Shonen/Seinen", "1"), + MultiSelectOption("BL(futekiya)", "2"), + MultiSelectOption("GL/Yuri", "4"), + ), +) + +class SpicyLevelFilter : MultiSelectFilter( + "Spicy Level - BL(futekiya) only", + "hp", + listOf( + MultiSelectOption("🌶️🌶️🌶️🌶️🌶️", "5"), + MultiSelectOption("🌶️🌶️🌶️🌶️️", "4"), + MultiSelectOption("🌶️🌶️🌶️", "3"), + MultiSelectOption("🌶️🌶️", "2"), + MultiSelectOption("🌶️", "1"), + ), +) + +class AccessTypeFilter : SelectFilter( + "Access Type", + "bt", + arrayOf( + Pair("All", ""), + Pair("Access for free", "1"), + Pair("Access via Points", "2"), + Pair("Access via Manga Planet Pass", "3"), + ), +) + +class FormatFilter : MultiSelectFilter( + "Format", + "fmt", + listOf( + MultiSelectOption("Manga", "1"), + MultiSelectOption("TatéManga", "2"), + MultiSelectOption("Novel", "3"), // Novels are images with text + ), +) + +class RatingFilter : MultiSelectFilter( + "Rating", + "rtg", + listOf( + MultiSelectOption("All Ages", "0"), + MultiSelectOption("R16+", "16"), + MultiSelectOption("R18+", "18"), + ), +) + +class ReleaseStatusFilter : SelectFilter( + "Release status", + "comp", + arrayOf( + Pair("All", ""), + Pair("Ongoing", "progress"), + Pair("Completed", "comp"), + ), +) + +class LetterFilter : SelectFilter( + "Display by First Letter", + "fl", + buildList { + add(Pair("All", "")) + + for (letter in 'A'..'Z') { + add(Pair(letter.toString(), letter.toString())) + } + + add(Pair("Other", "other")) + } + .toTypedArray(), +) + +open class MultiSelectFilter( + name: String, + val queryParameter: String, + options: List<MultiSelectOption>, +) : Filter.Group<MultiSelectOption>(name, options), UrlFilter { + override fun addToUrl(builder: HttpUrl.Builder) { + val enabled = state.filter { it.state } + + if (enabled.isEmpty() || enabled.size == state.size) { + return + } + + builder.addQueryParameter( + queryParameter, + enabled.joinToString(",") { it.value }, + ) + } +} + +class MultiSelectOption(name: String, val value: String, state: Boolean = false) : Filter.CheckBox(name, state) + +open class SelectFilter( + name: String, + val queryParameter: String, + val vals: Array<Pair<String, String>>, + state: Int = 0, +) : Filter.Select<String>(name, vals.map { it.first }.toTypedArray(), state), UrlFilter { + override fun addToUrl(builder: HttpUrl.Builder) { + if (state == 0) { + return + } + + builder.addQueryParameter(queryParameter, vals[state].second) + } +} diff --git a/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/MangaPlanet.kt b/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/MangaPlanet.kt new file mode 100644 index 000000000..27be22be6 --- /dev/null +++ b/src/en/mangaplanet/src/eu/kanade/tachiyomi/extension/en/mangaplanet/MangaPlanet.kt @@ -0,0 +1,194 @@ +package eu.kanade.tachiyomi.extension.en.mangaplanet + +import eu.kanade.tachiyomi.lib.speedbinb.SpeedBinbInterceptor +import eu.kanade.tachiyomi.lib.speedbinb.SpeedBinbReader +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.FilterList +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.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale + +class MangaPlanet : ParsedHttpSource() { + + override val name = "Manga Planet" + + override val baseUrl = "https://mangaplanet.com" + + override val lang = "en" + + override val supportsLatest = false + + // No need to be lazy if you're going to use it immediately below. + private val json = Injekt.get<Json>() + + override val client = network.client.newBuilder() + .addInterceptor(SpeedBinbInterceptor(json)) + .addInterceptor(CookieInterceptor(baseUrl.toHttpUrl().host, "mpaconf", "18")) + .build() + + override fun headersBuilder() = super.headersBuilder() + .add("Referer", "$baseUrl/") + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/browse/title?ttlpage=$page", headers) + + override fun popularMangaSelector() = ".book-list" + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) + title = element.selectFirst("h3")!!.text() + author = element.selectFirst("p:has(.fa-pen-nib)")?.text() + description = element.selectFirst("h3 + p")?.text() + thumbnail_url = element.selectFirst("img")?.absUrl("data-src") + status = when { + element.selectFirst(".fa-flag-alt") != null -> SManga.COMPLETED + element.selectFirst(".fa-arrow-right") != null -> SManga.ONGOING + else -> SManga.UNKNOWN + } + } + + override fun popularMangaNextPageSelector() = "ul.pagination a.page-link[rel=next]" + + override fun latestUpdatesRequest(page: Int) = throw UnsupportedOperationException() + + override fun latestUpdatesSelector() = throw UnsupportedOperationException() + + override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException() + + override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + if (query.isNotEmpty()) { + addPathSegment("search") + addQueryParameter("keyword", query) + } else { + addPathSegments("browse/title") + } + + filters.ifEmpty { getFilterList() } + .filterIsInstance<UrlFilter>() + .forEach { it.addToUrl(this) } + + if (page > 1) { + addQueryParameter("ttlpage", page.toString()) + } + }.build() + + return GET(url, headers) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + override fun mangaDetailsParse(document: Document): SManga { + val alternativeTitles = document.selectFirst("h3#manga_title + p")!! + .textNodes() + .filterNot { it.text().isBlank() } + .joinToString { it.text() } + + return SManga.create().apply { + title = document.selectFirst("h3#manga_title")!!.text() + author = document.select("h3:has(.fa-pen-nib) a").joinToString { it.text() } + description = buildString { + append("Alternative Titles: ") + appendLine(alternativeTitles) + appendLine() + appendLine(document.selectFirst("h3#manga_title ~ p:eq(2)")!!.text()) + } + genre = buildList { + document.select("h3:has(.fa-layer-group) a") + .map { it.text() } + .let { addAll(it) } + document.select(".fa-pepper-hot").size + .takeIf { it > 0 } + ?.let { add("🌶️".repeat(it)) } + document.select(".tags-btn button") + .map { it.text() } + .let { addAll(it) } + document.selectFirst("span:has(.fa-book-spells, .fa-book)")?.let { add(it.text()) } + document.selectFirst("span:has(.fa-user-friends)")?.let { add(it.text()) } + } + .joinToString() + status = when { + document.selectFirst(".fa-flag-alt") != null -> SManga.COMPLETED + document.selectFirst(".fa-arrow-right") != null -> SManga.ONGOING + else -> SManga.UNKNOWN + } + thumbnail_url = document.selectFirst("img.img-thumbnail")?.absUrl("data-src") + } + } + + override fun chapterListSelector() = "ul.ep_ul li.list-group-item" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + element.selectFirst("h3 p")!!.let { + val id = it.id().substringAfter("epi_title_") + + url = "/reader?cid=$id" + name = it.text() + } + + date_upload = try { + val date = element.selectFirst("p")!!.ownText() + + dateFormat.parse(date)!!.time + } catch (_: Exception) { + 0L + } + } + + override fun chapterListParse(response: Response): List<SChapter> { + val document = response.asJsoup() + + return document.select(chapterListSelector()) + .filter { e -> + e.selectFirst("p")?.ownText()?.contains("Arrives on") != true + } + .map { chapterFromElement(it) } + .reversed() + } + + private val reader by lazy { SpeedBinbReader(client, headers, json) } + + override fun pageListParse(document: Document): List<Page> { + if (document.selectFirst("a[href\$=account/sign-up]") != null) { + throw Exception("Sign up in WebView to read this chapter") + } + + if (document.selectFirst("a:contains(UNLOCK NOW)") != null) { + throw Exception("Purchase this chapter in WebView") + } + + return reader.pageListParse(document) + } + + override fun imageUrlParse(document: Document) = throw UnsupportedOperationException() + + override fun getFilterList() = FilterList( + SortFilter(), + AccessTypeFilter(), + ReleaseStatusFilter(), + LetterFilter(), + CategoryFilter(), + SpicyLevelFilter(), + FormatFilter(), + RatingFilter(), + ) +} + +private val dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)