From 39475d8916d6af15fb06bd2230a6fd4783e4abd6 Mon Sep 17 00:00:00 2001 From: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> Date: Sat, 13 Jul 2024 11:08:21 +0500 Subject: [PATCH] Add Taadd (#3943) * Add Taadd * cleanup chapter names * remove unused * webview urls * improve chapter title cleanup --- src/en/taadd/build.gradle | 8 + src/en/taadd/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3057 bytes src/en/taadd/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1909 bytes src/en/taadd/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4506 bytes .../taadd/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7847 bytes .../taadd/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10941 bytes .../tachiyomi/extension/en/taadd/Filters.kt | 114 ++++++ .../tachiyomi/extension/en/taadd/Taadd.kt | 331 ++++++++++++++++++ 8 files changed, 453 insertions(+) create mode 100644 src/en/taadd/build.gradle create mode 100644 src/en/taadd/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/taadd/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/taadd/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/taadd/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/taadd/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Filters.kt create mode 100644 src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Taadd.kt diff --git a/src/en/taadd/build.gradle b/src/en/taadd/build.gradle new file mode 100644 index 000000000..426d5f5d6 --- /dev/null +++ b/src/en/taadd/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Taadd' + extClass = '.Taadd' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/taadd/res/mipmap-hdpi/ic_launcher.png b/src/en/taadd/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd3a65fa86d01e8baf9ec32e28c6272eda58e98 GIT binary patch literal 3057 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 literal 0 HcmV?d00001 diff --git a/src/en/taadd/res/mipmap-mdpi/ic_launcher.png b/src/en/taadd/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..374bfe155882a937d1e85ae3c5fc58d37a04a0c4 GIT binary patch literal 1909 zcmV-*2a5QKP)@k-g{{#51EojLCY|M^s=~fy*vwrI|XdH2BZn@hr6%;NhDaj=(D{F;=gTr*0Oy*%# z6vkd|hKe7vL|~aa$8j|pjb=+uPEJZjMuysyS_pvs-Me@5TwPt~>xr2Xgbkq+jUyGw z_+KMBlSkWN=$NS0>O!SbxsVj(aOrQ&Ur| zLZR@cXJ!S4ioZ+&u;(YqY`3Jb*Ey*_F!8v#&>UsQzX2CgK6 z+U(K@}N3$?M^q^V1*2_QOF96l3q1sSLp@0Y zV3WVtG)WM)kb%7@25xjD20BB*W+ApntQ!|j%{mKYP!MO>7Q}i0x@Cm4)LPhV=|HTR zLYfP8hPuu1u+h^VDFCZU$_5aR6u`qUphN)1I&5fYz}|iP;pF59g`FL|yu9G!;{!)W zM^N7+L0+r2F<*(56vS#NmAJVXyGp*p?jL@|#cQ?r{oV+kIma~t4{ktlzZ?mpJ+NwJ zngjqsq~iQZk_8ycit=(q&e{fTp9JdE94N6+!%U!X`xo?VJc{U01rp~@LttQ_O#sA+ zt!FI>0Gp=OXz+e!E;b#kgZk+=0Zko(HHDZvc`&9-o=EQGgyYALBP=Wo&d$z8AZluA zP+3`t$jHdHR-l{|vSa5C1O@~`E|$^}|FaV*Up*+vp+FHzdHVpkIjKv4}c}9yB z6&2y9qBOjbw~au&z|${FOU3G+i@-I~_D4%bRcR3sI0(Bpe1r74Z=w6Q2hf$1;jCPX ztFk8e$HpLg(|UBVx98`Jv%pi-PG4v3v_9A-%}U1Jh7`D5{upH?^WpAJdmVD6Bc-L- zIA$suXcsYQ-5QLW5X&#rOk;CqPD3Bn5nPb>M*h}=aC38mN~OYxm{F+cse=0hXMCBM zhxp8S$WB;}VNt^{?Zqf$QJviz)C+@?7h%hs1z5aqC!(UFBmfZD4@{YzjPL7H;G@dI zxgS@z3HfgPYz*3Q1PXd{%)QC(e)m2r`X?dJeDCpmW6k3vpCA)l>Aj(ZuU z^0Vl1zbneNpT@B1uOKEo8Y#&shzShFl1pmr8R&=f{kt*!nf{2&Uxm21IB@_dsN|%~ zb{m@1v=8yox#<}1UWCnGW%JCKKc__uM-Nve?ECrRc3A}!y}Xcna1YjeQh*1CKgE5e z5AMlb;Cky%^m=s>-cDYI1xbrgcx5|!)GCoV^*zjAy#!mb*C8e*2Gd>|j)fgq7s*B{I36ezK4z%{NBBbP71;&gqAW-&lYzC}tF6U6$Y!UTS2NjhT3Mw34d zr8>YNZ)G;F9X$bfxFdJ-2GBtO>g(%yK?+u+QmVa#h)IbUA3K4aDDWAJxlr-f#i*=0 z54Wyvh>Un1;o;$Y@HaL#V&nStxPIj-x_Npaa>x*bgoLobHOfNtU};OqQO=S{+!GsR zPw@{{3v&A^AubCExRBMg#EY$?w2`6B0CdMN%#>1Vr&MH?={o?xl(9r0V#s+KAws>m zIuU@4nr)MhG7x`mEbS5xpqVPMnKS85-!e+TAd@LQ!KrVx>}GYf!DPM-Cvy@cFheRf zrmfcjj*d5F0!NG1eAwE!Vd4=XtuQ+}LiUn-;)duAjR>hau6zp|+9MSo1CkDR^)iT1 zu2BhKdn1E(->N!91E6+TWmv+ka+W|~2vQ8-R@SV2p_W6`>9jlbH0Qf?=|b(8xy#Jb zEna6;ur}|sO4%j=9V*n(0YYDT!M+ceZRS{3dZMhXEI%M1AYQQY3WSDuF-#O<$jbr~ zHdIwvxyj$(e*yhlM>m@(m`2%4M?XKmUd6@5ne_V_?N41Kc!&{cYx802d^V4|-1}8k zRl5=r5;D%5Idg?x)f@5?Dp#x)IMK~q$dzukA(j5AwIfoy&?+zhkN^TC+F4D-$K4KwJxzu)^Cj`#fk-{*MWdEW1n!ITV& zfXtx1n>vSy00S=q69Fay42*z*yEjRIi2ws5VBqde63|KsP!eY%u$DkY9goUS(X?s{ zAeZNCR+p8(Yuirk06S356+KpCEXaW0pXK-cE^55m04IQ+l9J*Y9v&Xy=;%1r+}ymU zOeSk1s;8z3@f1{!q^6GNX7_O40@Y^9n)_8K6nS#FJgd04_>*0`c6~N`_UrC#b4OUu5RW~p{TYpST@|697hriNKnRrTM=lP3?`xpQZ+7!ouQ zpw#!)xw*M>y}iBTo5aYNkkFA#DXQJPc{8Sc`}QADTNQOupw>8xA;6LvvAuiu?jd`7 z`vFo6u=TbfZiSVWmR=yNhS5ArDOXX}nE+Nl)|Bl@zx_Z)*X15~O8Y2oOsyAl9Y#(@ zxsdE+52|{XawTQ| zjsRyOpw)To4Z)QRY!M9+0ldp$0?H_}N2HSkFafrdnSh^Fwa{WNyx1kJRXGtzYSrFv zg^2(k`mIO`0_^Gt$kA~u5?0d#V0yA)L_o(n0@x7iDgm)10kJJYfF7Wgkod+;Y2r;H z0>COrLIN}mTd$Z&(0Ki2($u0cQUWBvK-(q^#JPz8ZHbb&yomsb0oArSJrbZiW#vt> zDXBw1j|7-N7lVL_05K@(v5biTJ%THyX%hirP*PV$0@qa<0)l8Gc0~O~OoDMX2c~A% z)#vV88UpBhVCisROD-m7R(05uV8x0R=-IQU5y7YBP*mvO79pUbq5>4I zj^vcB__@diRpuTPgC~RBt{dPxi$c0Ma-Eb&4Fv_rETB-(XAK33@nNVED76Ry`}Xa_+*ekhxbtGb#h(r?9N7V*SZb@<&$`4>=|YlIj8btH0sn7U z-r5g$yE250`8}5XaVcC~T^}I$_2h;&L}rw}d*w~&^WhHcxnA@j%EkOxp$ynEdRnje$lZ$kd zU4=Y+_;5HolfzJ#*pZkub0&^we1m?E4MeYAy@WcPoSdA{sZ%Ee1_ol#pg}@A>Qajl zzyn}V&YwSz;iJPKAMr1e0$Obfat+SDj1^IVSg>G$%GGx5+BHlI84K5|*KlWmAJWs) zHQIvm@^a8MDY)M}h5uG~B5CWVf+}m6E?>TkfI)$fN04gFrF#;;R6^lMtCztnk;9C% zqGg#3z1_PaE;deBAiTmiZQ6v?xeJh}@IX9;cCv%xu8>iPvx4puR-?*HhRfDw@P7O; ztXaDjk38~-N)B3-03N}iLx(VN<}zT|S0v+f>R(j^+w(7AOTq$#goLOZWL8!dri>kj zuxod4!mJ8`(R1+DTW>YFvPw!yFly8&jJCUi+hq#m`wYkWk2lm?#oQU)Qo)cX9!G9x z3enFc_{_;E2%_r^a*}|3MZ$t8cP28N%xM8wVDFAS7&vgCAX#rspNV-DHb|u4=BE^P zco~j3Ktay$*_Okhq8fwc7AU6Xa)$NCc9MQKH@8OfYjFZLr));_%3Z*~O#%Umk{q~Q zehGV0-$%cG{Ztb0`RAWwdDMJFRa%2IGS*pF;Ju_ogoT9(t5H=tbLI@fLq{Vz&>9^H zyp89}@nqzySh{p+Jt<=w!C)pNB;d^1Zz1na*BttieX^3l`-nN-elrex_wB{*a|a=} zmtng9cqFb*6l}}7b?XF4D7>1D$QpahhZDXaTe@esKO!R|@!?*v0G7s z2{L=^>*|TrojX960vpw#3vgJncrlKory%BWC%kvO2-E!RvGoT_{B=_*h71|f2#6P7 zd=bgtqyk=~ul)Q_k-=kq^Zx~OwIq`Ti}kPhmU~nb|F7MA5RP&iXoS- z;W4@(6b5^&K_QA>n1T;J_y8wPoWLs)Q}Dan#W4RvIPHZtH!{u!Az*) zm*`*p5sn=@rgA0o(M0gT!H6uB;~H(uG8L7WCUd|6MJdcD1S2sq5e^On*nNp^X(Dv= z2u$u$4PRGF?7mcjG2LwiwZ7r1J2Emd(56lOYs;~*u~@l&HQ+%63?mg(P>sGndEvkp z`{Ci?fj8fL6Yn1Q5N&^Tz(0?jgpZF8=sq0AjT?vJW2X>A*CSqsGZ9dP(s|PbiDH7n zpBx3B|6DU(i|B0&9_CwoFO7p(_|q}38|bu-3wJ_Wj4ta2qsM@J*; zlQb-Y3p$gx%YFt=;TMG*uUHpj`k$6#-n@DB>atq+IF1ba2p0_PWP=*2WI3`eoM=zywd7J`G>w9)VB33yvT82k0g! z*v?D{4~JLAX$++sT9ZfuRwxQkHvd^9yq|#VpRzGMI0Rj@uA_9qD17$WXN}xwJrSVR z>%zHn=P)dI66C{A)Dm!R5thy9CFtgciCx!Wg9c;#FJ%}=>L-^Z;AiqMexj(*p*p|68GMM`|0lPj+~qv6r9s~eSgf9YzlyxuFDV-F@8q9fl0bZvS$F3nC%6b0%049<_UTjs2WvN?*)jTiq z84PeO#Ry*;yz*5(f`Z49I#`FcZQFv|{MY8Uu`bjNiw_o{&y=NDOvaiwQ2hDvmL!xr zk@_6v4ir|y?wb-+n^mL2*AgF;ZcRci@Wm$p-w* z*$kdVB?u={_E}Y7Ow6l@i;GjK7Nj8{mJo^+e?x{hQZu4gK{4o4SbjSjY00tmcB-sK zo|*VG#{T0X#u31!v{^f%C_`c=M;tzRLI9dq>`O01p@8&kz^EsYoSZBGT%55U@nhUj zNq#)5pOIT`BJIng!f`em=jWe)9@&{^(XodgHl}P6cHQ&<4fuBNf+9~^{XXP|`p}uv z?JBYZv@xrY!}@v+!bUtL7}ooZ_vzE8@$}%w5klaHkP+?zOJvYi>?+;4&Lees#K8>n zUtfYHOO~kJvq(dLmVsFeaA@dQoW3GM|1L75{%tclbl}^XwTZtgh?+YWC%31e2TiJ* z%o4>!Le`)@IP~?`g81{Q|&4_h;A%XY%PuMP`e z?r@F&#w$Z08jYh#f!o!=H03)U!Dyx zm*JxVHiEoLSzj{{>Job;eAK~pc(wB(AiIg2H67yd-hmI+m>}gj5FgGlNlhKB@g9K} z0)KK+9_X>>B<9;YgAmXdK<$r&ACxcmjf4R8ZfooRPt!}qL_l*GmOu=d0QzFKh`#@8 z&P8o0qobRHNb9TH3M4>#`*4p230A1SDQyJ=h=-sVREh6I;*t*(0TN@QdvjVyo{{D1Dn)9X}k+rXYTbzfE0>D=UKI)igt7qL7~X} z&_2^qggV}oLEHMc8lpD|&}k7GvDoNK`xzGjIK_!{$EICPj=rE!7Ba%p>;r_Sr&DOiMY?D8+g%>*#`I8?rcjn53S;S0M?kY5 zU(YXaaHiPLy%Ywh`liK01+V7GQruD|McR$3BYEcT58#Em0V%*#@W5&ek zR}HC}oG7KP8I=|+arp4zm2`QKU*f}WQfk&4H29tnUj=lakUtL!_1@*{>nq(e1zI1r z8fm2P$gJ_>$4|I$;lfQStbB(I8#t9olfS_K=SQ6gQZRMu)SkIcWb zssoZk7_VNvdTGs?H47=A_+s7aXZ_!-w8|Y46wcj= ztiAfnvKrS*>n}jwVbz^GcYZ#5_H5ef)vI^V%BQE32&#vVAewxG63YD4ro?297@fZf97|Gsnz|;>4+sjNrI9H2A&Dw ztYP(QM$VgxTx(Q}pS;47Y}APf;LKnvv+^aL8o}q8X+waryz>2$O5n9^!>ADzJvhGn ze?Ta$Bta<+%HKsb)g18duiKnn+a07*qoM6N<$f=6kF{Qv*} literal 0 HcmV?d00001 diff --git a/src/en/taadd/res/mipmap-xxhdpi/ic_launcher.png b/src/en/taadd/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f38afffab47124f437de1e6abef20a8117662a GIT binary patch literal 7847 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 FV1fp!&%gix literal 0 HcmV?d00001 diff --git a/src/en/taadd/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/taadd/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..11a095fef2d5b5beb3c5fb42f8a4bde806885da9 GIT binary patch literal 10941 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 literal 0 HcmV?d00001 diff --git a/src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Filters.kt b/src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Filters.kt new file mode 100644 index 000000000..e1f84b17d --- /dev/null +++ b/src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Filters.kt @@ -0,0 +1,114 @@ +package eu.kanade.tachiyomi.extension.en.taadd + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +class TriStateFilter( + name: String, + val value: String, +) : Filter.TriState(name) + +open class TriStateFilterGroup( + name: String, + genres: List>, +) : Filter.Group( + name, + genres.map { TriStateFilter(it.first, it.second) }, +) { + val included get() = state.filter { it.isIncluded() }.map { it.value } + val excluded get() = state.filter { it.isExcluded() }.map { it.value } +} + +open class SelectFilter( + name: String, + private val options: List>, +) : Filter.Select( + name, + options.map { it.first }.toTypedArray(), +) { + val selected get() = options[state].second +} + +open class TextFilter(name: String) : Filter.Text(name) + +open class TextGroupFilter(name: String) : Filter.Group>( + name, + listOf( + TextFilter("$name Name"), + Selection("Match"), + ), +) { + val text get() = (state[0] as TextFilter).state.trim() + val select get() = (state[1] as Selection).selected +} + +open class Selection(name: String) : SelectFilter( + name, + listOf( + "Contains" to "contain", + "Beginning" to "begin", + "End" to "end", + ), +) + +class NameMatchFilter : Selection("Query Match") + +class AuthorFilter : TextGroupFilter("Author") +class ArtistFilter : TextGroupFilter("Artist") + +class GenreFilter : TriStateFilterGroup( + "Genres", + listOf( + "Romance" to "24", + "Comedy" to "4", + "Drama" to "6", + "Fantasy" to "8", + "Action" to "1", + "Slice Of Life" to "32", + "School Life" to "25", + "Shoujo" to "28", + "Adventure" to "2", + "Yaoi" to "40", + "Shounen" to "30", + "Supernatural" to "34", + "Seinen" to "27", + "Historical" to "11", + "One Shot" to "22", + "Doujinshi" to "45", + "Mystery" to "21", + "Shounen Ai" to "42", + "Ecchi" to "7", + ), +) + +class CompletedSeriesFilter : SelectFilter( + "Completed Series?", + listOf( + "Either" to "either", + "Yes" to "yes", + "No" to "no", + ), +) + +class ReleaseYearFilter : SelectFilter( + "Release", + buildList { + add("All" to "0") + val currentYear = year.format(Date()).toInt() + (currentYear downTo 1995).forEach { add(it.toString() to it.toString()) } + }, +) + +private val year = SimpleDateFormat("yyyy", Locale.ENGLISH) + +fun getFilters() = FilterList( + NameMatchFilter(), + AuthorFilter(), + ArtistFilter(), + GenreFilter(), + CompletedSeriesFilter(), + ReleaseYearFilter(), +) diff --git a/src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Taadd.kt b/src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Taadd.kt new file mode 100644 index 000000000..5baad0d03 --- /dev/null +++ b/src/en/taadd/src/eu/kanade/tachiyomi/extension/en/taadd/Taadd.kt @@ -0,0 +1,331 @@ +package eu.kanade.tachiyomi.extension.en.taadd + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +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 eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import okhttp3.FormBody +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.parser.Parser +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Locale + +class Taadd : HttpSource() { + + override val name = "Taadd" + + override val baseUrl = "https://www.taadd.com" + + override val lang = "en" + + override val supportsLatest = true + + override val client = network.cloudflareClient.newBuilder() + .addNetworkInterceptor { chain -> + val request = chain.request() + val url = request.url.toString() + + if (!url.startsWith(baseUrl) || request.url.fragment.isNullOrBlank()) { + return@addNetworkInterceptor chain.proceed(request) + } + + val version = request.url.fragment!! + + val cookieList = request.header("Cookie") + ?.split("; ") ?: emptyList() + + val newCookie = buildList(cookieList.size + 1) { + cookieList.filterNotTo(this) { existing -> + existing.startsWith("dm72_desktop=") + } + add("dm72_desktop=$version") + }.joinToString("; ") + + val newRequest = request.newBuilder() + .header("Cookie", newCookie) + .build() + + chain.proceed(newRequest) + }.build() + + private val json by injectLazy() + + override fun headersBuilder() = super.headersBuilder() + .set("referer", "$baseUrl/") + + private val ajaxHeaders = headersBuilder() + .set("X-Requested-With", "XMLHttpRequest") + .build() + + override fun popularMangaRequest(page: Int): Request { + val body = FormBody.Builder() + .add("page", page.toString()) + .build() + + return POST("$baseUrl/ajax/hot#mobile", ajaxHeaders, body) + } + + @Serializable + class BrowseManga( + @SerialName("manga_url") val url: String, + val name: String, + val cover: String, + ) + + override fun popularMangaParse(response: Response): MangasPage { + val data = response.parseAs>() + + return MangasPage( + mangas = data.map { + SManga.create().apply { + setUrlWithoutDomain(it.url) + title = Parser.unescapeEntities(it.name, false) + thumbnail_url = it.cover + } + }, + hasNextPage = data.size == 20, + ) + } + + override fun latestUpdatesRequest(page: Int): Request { + val body = FormBody.Builder() + .add("page", page.toString()) + .build() + + return POST("$baseUrl/ajax/more#mobile", ajaxHeaders, body) + } + + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/search/".toHttpUrl().newBuilder().apply { + addQueryParameter("name_sel", filters.get().selected) + addQueryParameter("wd", query.trim()) + filters.get().let { + addQueryParameter("author_sel", it.select) + addQueryParameter("author", it.text) + } + filters.get().let { + addQueryParameter("artist_sel", it.select) + addQueryParameter("artist", it.text) + } + filters.get().let { + addQueryParameter("category_id", it.included.joinToString(",")) + addQueryParameter("out_category_id", it.excluded.joinToString(",")) + } + addQueryParameter("completed_series", filters.get().selected) + addQueryParameter("released", filters.get().selected) + addQueryParameter("page", page.toString()) + fragment("desktop") + }.build() + + return GET(url, headers) + } + + override fun getFilterList() = getFilters() + + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + + return MangasPage( + mangas = document.select(".clistChr li:not(.dot-line1):not(.dot-line0)").map { + SManga.create().apply { + with(it.selectFirst("h2 > a")!!) { + setUrlWithoutDomain(absUrl("href")) + title = text() + } + thumbnail_url = it.selectFirst(".cover img")?.absUrl("src") + } + }, + hasNextPage = document.selectFirst(".pagetor a:contains(>>)") != null, + ) + } + + override fun mangaDetailsRequest(manga: SManga): Request { + return GET("$baseUrl${manga.url}#mobile", headers) + } + + override fun getMangaUrl(manga: SManga): String { + return "$baseUrl${manga.url}" + } + + override fun mangaDetailsParse(response: Response) = SManga.create().apply { + val document = response.asJsoup() + + thumbnail_url = document.selectFirst("img.detail-cover")?.absUrl("src") + description = buildString { + document.selectFirst(".manga-summary")?.text()?.let { + if (it.trim() != "N/A") { + append(it) + } + } + + document.selectFirst(".detail-info > p:contains(Alternative)")?.text()?.let { + if (isNotBlank()) { + append("\n\n") + } + append(it) + } + } + genre = document.select(".manga-genres a").eachText().joinToString() + status = when (document.selectFirst(".detail-info > p:contains(status) > a")?.text()) { + "Ongoing" -> SManga.ONGOING + "Completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + author = document.select(".detail-info > p:contains(author) > a").text() + artist = author + } + + override fun chapterListRequest(manga: SManga): Request { + return GET("$baseUrl${manga.url}?waring=1#desktop", headers) + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + + val mangaTitle = document.selectFirst("meta[property=og:title]")!! + .attr("content") + .simplify() + + return document.select(".chapter_list tr").drop(1).map { + SChapter.create().apply { + with(it.selectFirst("td > a")!!) { + setUrlWithoutDomain(absUrl("href")) + name = run { + val rawTitle = text() + val simplified = rawTitle.simplify() + + if (simplified.startsWith(mangaTitle)) { + var idx = mangaTitle.length + while (idx < rawTitle.length) { + // vol.x ch.y || season x chap y + if ( + rawTitle[idx].equals('v', true) || + rawTitle[idx].equals('s', true) + ) { + val _idx = rawTitle.indexOf('c', idx, true) + if (_idx != -1) { + idx = _idx + } else { + idx++ + } + // actual chapter number + } else if (!rawTitle[idx].isDigit()) { + idx++ + } else { + // remove leading zeros -> 005 + while ( + rawTitle[idx] == '0' && + rawTitle.getOrNull(idx + 1)?.isDigit() == true + ) { + idx++ + } + break + } + } + + if (idx != rawTitle.length) { + val cleanedTitle = rawTitle.substring(idx, rawTitle.length) + + "Chapter $cleanedTitle" + } else { + rawTitle.substring(mangaTitle.length, rawTitle.length).trim() + } + } else { + rawTitle + } + } + } + date_upload = try { + dateFormat.parse( + it.select("td > a").last()!!.text(), + )!!.time + } catch (_: Exception) { + 0L + } + } + } + } + + private fun String.simplify(): String { + return lowercase() + .replace(specialChar) { + " ".repeat(it.value.length) + } + } + + private val specialChar = Regex("""[^a-z0-9]+""") + private val dateFormat = SimpleDateFormat("EEEE, MMMM dd, yyyy", Locale.ENGLISH) + + override fun pageListRequest(chapter: SChapter): Request { + return GET("$baseUrl${chapter.url}#desktop", headers) + } + + override fun getChapterUrl(chapter: SChapter): String { + return "$baseUrl${chapter.url}" + } + + override fun pageListParse(response: Response): List { + var document = response.asJsoup() + val serverUrl = document.selectFirst("section.section div.post-content-body > a") + ?.attr("href") + + if (serverUrl != null) { + val headers = headersBuilder() + .set("referer", document.baseUri()) + .build() + document = client.newCall(GET(serverUrl, headers)).execute().asJsoup() + } + + val finalUrl = document.selectFirst("script:containsData(window.location.href)")?.data() + ?.substringAfter("\"") + ?.substringBefore("\"")?.let { + "https://" + document.baseUri().toHttpUrl().host + it + } + + if (finalUrl != null) { + val headers = headersBuilder() + .set("referer", document.baseUri()) + .build() + document = client.newCall(GET(finalUrl, headers)).execute().asJsoup() + } + + val script = document.select("script:containsData(all_imgs_url)").html() + + val images = imgRegex.find(script)?.groupValues?.get(1) + ?.let { json.decodeFromString>("[$it]") } + ?: throw Exception("Unable to find images") + + return images.mapIndexed { idx, img -> + Page(idx, imageUrl = img) + } + } + + private val imgRegex = Regex("""all_imgs_url\s*:\s*\[\s*([^]]*)\s*,\s*]""") + + override fun imageUrlParse(response: Response): String { + throw UnsupportedOperationException() + } + + private inline fun Response.parseAs(): T = + json.decodeFromStream(body.byteStream()) + + private inline fun > FilterList.get(): T { + return filterIsInstance().first() + } +}