From 6683290bdd17e7a2c1542bd6057c749ce24cbaff Mon Sep 17 00:00:00 2001 From: stevenyomi <95685115+stevenyomi@users.noreply.github.com> Date: Mon, 11 Jul 2022 06:16:16 +0800 Subject: [PATCH] MCCMS: rewrite and add new sources (#12531) --- .../overrides/mccms/haoman6/src/Haoman6.kt | 5 +- .../mccms/haoman6_glens/src/Haoman6_glens.kt | 11 +- .../overrides/mccms/haoman8/src/Haoman8.kt | 11 +- .../overrides/mccms/haomanwu/src/Haomanwu.kt | 25 +-- .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2168 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1265 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2622 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4812 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5755 bytes .../mccms/haomanwu_www/res/web_hi_res_512.png | Bin 0 -> 14970 bytes .../mccms/haomanwu_www/src/Haomanwu_www.kt | 7 + .../manhuaorg/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1836 bytes .../manhuaorg/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1151 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2064 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3983 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5217 bytes .../mccms/manhuaorg/res/web_hi_res_512.png | Bin 0 -> 13536 bytes .../kanade/tachiyomi/multisrc/mccms/MCCMS.kt | 208 ++++++++---------- .../tachiyomi/multisrc/mccms/MCCMSDto.kt | 65 ++++++ .../tachiyomi/multisrc/mccms/MCCMSFilters.kt | 75 +++++++ .../multisrc/mccms/MCCMSGenerator.kt | 16 +- 21 files changed, 269 insertions(+), 154 deletions(-) create mode 100644 multisrc/overrides/mccms/haomanwu_www/res/mipmap-hdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/haomanwu_www/res/mipmap-mdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/haomanwu_www/res/mipmap-xhdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/haomanwu_www/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/haomanwu_www/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/haomanwu_www/res/web_hi_res_512.png create mode 100644 multisrc/overrides/mccms/haomanwu_www/src/Haomanwu_www.kt create mode 100644 multisrc/overrides/mccms/manhuaorg/res/mipmap-hdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/manhuaorg/res/mipmap-mdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/manhuaorg/res/mipmap-xhdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/manhuaorg/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/manhuaorg/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/mccms/manhuaorg/res/web_hi_res_512.png create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSDto.kt create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSFilters.kt diff --git a/multisrc/overrides/mccms/haoman6/src/Haoman6.kt b/multisrc/overrides/mccms/haoman6/src/Haoman6.kt index e022d3851..ad9096e6b 100644 --- a/multisrc/overrides/mccms/haoman6/src/Haoman6.kt +++ b/multisrc/overrides/mccms/haoman6/src/Haoman6.kt @@ -1,7 +1,10 @@ package eu.kanade.tachiyomi.extension.zh.haoman6 import eu.kanade.tachiyomi.multisrc.mccms.MCCMS +import eu.kanade.tachiyomi.source.model.SManga class Haoman6 : MCCMS("好漫6", "https://www.haoman6.com") { - override fun transformTitle(title: String) = title.removeSuffix("(最新在线)").removeSuffix("-") + override fun SManga.cleanup() = apply { + title = title.removeSuffix("(最新在线)").removeSuffix("-") + } } diff --git a/multisrc/overrides/mccms/haoman6_glens/src/Haoman6_glens.kt b/multisrc/overrides/mccms/haoman6_glens/src/Haoman6_glens.kt index 92bf423ec..923e9c6e7 100644 --- a/multisrc/overrides/mccms/haoman6_glens/src/Haoman6_glens.kt +++ b/multisrc/overrides/mccms/haoman6_glens/src/Haoman6_glens.kt @@ -1,13 +1,12 @@ package eu.kanade.tachiyomi.extension.zh.haoman6_glens import eu.kanade.tachiyomi.multisrc.mccms.MCCMS -import eu.kanade.tachiyomi.network.GET -import okhttp3.Response +import eu.kanade.tachiyomi.source.model.SManga class Haoman6_glens : MCCMS("好漫6 (g-lens)", "https://www.g-lens.com") { - override fun transformTitle(title: String) = title.removeSuffix("_").removeSuffix("-") - override val lazyLoadImageAttr = "pc-ec" + override fun SManga.cleanup() = apply { + title = title.removeSuffix("_").removeSuffix("-") + } - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/category/order/addtime", headers) - override fun latestUpdatesParse(response: Response) = searchMangaParse(response) + override val lazyLoadImageAttr = "pc-ec" } diff --git a/multisrc/overrides/mccms/haoman8/src/Haoman8.kt b/multisrc/overrides/mccms/haoman8/src/Haoman8.kt index f9611270c..d40d2e81d 100644 --- a/multisrc/overrides/mccms/haoman8/src/Haoman8.kt +++ b/multisrc/overrides/mccms/haoman8/src/Haoman8.kt @@ -1,14 +1,7 @@ package eu.kanade.tachiyomi.extension.zh.haoman8 import eu.kanade.tachiyomi.multisrc.mccms.MCCMS -import eu.kanade.tachiyomi.network.GET -class Haoman8 : MCCMS("好漫8", "https://caiji.haoman8.com") { - - // Search: 此站点nginx配置有问题,只能用以下格式搜索第一页 - - override fun textSearchRequest(page: Int, query: String) = - GET("$baseUrl/index.php/search?key=$query", headers) - - override fun searchMangaNextPageSelector(): String? = null +class Haoman8 : MCCMS("好漫8", "https://www.haoman8.com") { + override val lazyLoadImageAttr = "data-echo" } diff --git a/multisrc/overrides/mccms/haomanwu/src/Haomanwu.kt b/multisrc/overrides/mccms/haomanwu/src/Haomanwu.kt index 57050d900..ce3d6c189 100644 --- a/multisrc/overrides/mccms/haomanwu/src/Haomanwu.kt +++ b/multisrc/overrides/mccms/haomanwu/src/Haomanwu.kt @@ -1,32 +1,15 @@ package eu.kanade.tachiyomi.extension.zh.haomanwu import eu.kanade.tachiyomi.multisrc.mccms.MCCMS -import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SManga -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element +import okhttp3.Response -class Haomanwu : MCCMS("好漫屋", "https://app2.haoman6.com") { - - // Search - - override fun searchMangaNextPageSelector() = "li:nth-child(30) > a" // 有30项则可能有下一页 - override fun searchMangaSelector() = "li > a" - override fun searchMangaFromElement(element: Element) = SManga.create().apply { - title = element.text() - setUrlWithoutDomain(element.attr("abs:href")) - } - - override fun pageListParse(document: Document): List { - val pages = super.pageListParse(document) +class Haomanwu : MCCMS("好漫屋", "https://app2.haoman6.com", hasCategoryPage = false) { + override fun pageListParse(response: Response): List { + val pages = super.pageListParse(response) if (pages.any { it.imageUrl!!.endsWith("tianjia.jpg") }) { throw Exception("该章节有图片尚未添加") } return pages } - - // 分类页面缺失 - override fun fetchCategories() = Unit - override fun getFilterList() = FilterList(emptyList()) } diff --git a/multisrc/overrides/mccms/haomanwu_www/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mccms/haomanwu_www/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9d81923528833c68153f29ffb4666ddf7ce033f8 GIT binary patch literal 2168 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 AApigX literal 0 HcmV?d00001 diff --git a/multisrc/overrides/mccms/haomanwu_www/res/web_hi_res_512.png b/multisrc/overrides/mccms/haomanwu_www/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5e89e1aad0871a102ca68bd597a984f333e700 GIT binary patch literal 14970 zcmeHtX*iVs-}W^_k`h9SEKwn$EXg`5OOn0pOsQ-WDmyXr`xQl@EXgkWE?EYHQHbpO zWEo@E%owr`GiK(wx?erVaX&Af7ytWt^}P5V=DLo$P0H6!527r$MJ2-g3p$m@x=!^f+$^Y*7e{ARf`*r-sujPNA{J)Oy zKYmYtkMQ4C{ZGI6e{fI#>2us~I*R&?P23_dvl(G#Hh0CufmS^}pzU(B8Y^)s#NbH? zc33^{oKT6cbR^rIWC@ohPv?Q@qc!7>cYN^_e38yTl_d0v!Cm zym;VRjP_=)`g0dsqEpGSa*O1aq$%V(X))D(pYZq2Q)d;mEV%T$I&-UTBwe+~4hX60?sd=(@fC$94GxNa4Eok22!Kuky zWImB$X?)w$H0ej)sluJ5xU6LgL>Kti<#(f2Gr@;_(CUD3)l92II=5((Tx~)ic&5aN zpW4@2=Lev(LT!V}cE}d&UHdCnRbr&Yjzr{WA#}ZE)tToL`mX7ED!`?aGCL+S4qr#U ze;`o7l$?J@WDM5~J%o2$>+?R==3Ffj+7U7GyKk~ASIgI1fagmP!*#BE;Oqo9*`KoU zb!XC}=`6E)r%}bZB3M*;gxT~G2ogZKvG)C0p^4k`Ma~}|EShEhT+=Ye>y*V&cyP}T zxA@U}$c@98_I_&R7a{|^EY6F74U+HYdF%z%u{yo3t78fNns#WFaZ@gSP`mxR#o!^7=O!PrF(wvG_ zjA`Vu|{ui@lwcq0VnOivfE#|UJi+gNA{@1Bp_9Gp4 zAToWpvCdcONe+f1@z+=UFjX!W(IU;i1jsVYCu4vnb(srGn~UC}PW{UPxgH6t29@I$ zVK2tg$NLbz$9g9Fs&4kq3O>ZBH>$F?x@D8ppuc~H1*nuHKR!iD4Sf7rrJy$IG_2y| z^M!KE3BYOK$w6ze6Jc^iC}BqmeG2zzI-c$Ef0vKS>_@w6f$TWXQIE-g(^{ zz#TIf$->hl1^0bK4eR1;BhuIOqMK4H0vX&{UAy`9ykAi-eM+Cr($_Nlq4yj~@xc*P zrMm=CS@@|SL{E^rT@~v7L}k!UUig&uk1N8uK$FX(Knhg^vMt~<6RiP#Q`+N`DlOey z2mB6U?s-(kV!ybK+?M>H`Sj8m$eXlvf)cTr$|lnk0a#ll`&?;K zp>RIr&YlTI`Z%)$FjbFsqJilU+A{~XA`Jt|4qb`8m3-pM1?)Jvnq8*$@^G@XDI|uN zhn?bVy&R1_;2WiiS1rEj6CM=PiMu}Go=D{m<8)uiG7@{Azu94U0%fb9e7(bFn@xZ z-HGj#+&$fA<(!^f!T_J{T}W%Lbhr=@(zKk~X~aGlzlk_5n>{~(?NN3;yu&E}*c(QR z_)LCa092VWLj74H!jM_!YZ6lmaOR82&M(<#Soiq01K5xD)={`F=9FGJ}d%u6hvE-#uvzjVOiLgwT$tWroikjD6pib2c2QI2r!M`L#0h zY5w<-z*>$${v@D%a>Qp;ShuSdJU9GU?$b3xET68~Ml$SzCHs4>d3xyN;p}4-$2+KM zc)_2mU}8p$pp(ZJ~R#2q9yhm-vg_TlByB-2M9${_Wn z8{$9l^l~Z{!_(S+`T1+p+wvY}Nigr;if8Y60Zg|zrU_}~a_LB`Z821GeZX`!B;JnI zGH@b$?T`hwE=Ui!-W*=Zhl={l@Hg`&bCc)}@^*X7fBlVGAF~hYvGZE8qv+x>^f(}> z47+`4r?={?7r!^*9!vD5hQOm~p)Gj|- zro>$mHm~BCty?jhmI4k}B5PEGxU=~yvs6(bR-Wt`8yH|PK{Mz@x*;H6{H3oHcz5YY z7g7K79y3=SyRC6~augt*ciDNphhgsQ_a#GiMPZ`R>x$Sb_XSkZ2*6~aibN>k{_6%F zsB4do9FwBYh*hq^ptH|R)x%n>E3mF{qE3CI2<}!Nah7`s4WsI-Rv9c$3WjE8fqB5J zTBfU~pnM4D<)NKWZhdImx2u_1_#+>Ob($g6RB)6-el0OH!L-xMl7i~8^U5|f!|S)H z@&$g!^%;{SQHUOK@AV1DyGN8vt%Rw=jD04Ud62vCoeoz7`=A5?dv*=kED0q443h-d zTa!cgRx-ZllOv3A)3M1F#cgC0B*EiJdA;>=Sy8|M;wp@6--j4cfTK+V;<7vg*APeo zPw>Iil>geFsBAjW>n@SVudqZ!T8BpL_^qRZ}IDl{i6*Jom-o*6F6nr+Ff__ zdgRXJF_Ru|di#>F?%ed!q?(*#!xd{xXe>n)WjYR~=tw<)$U&!D8yhy){*nv1Pp6k!ZR!%%A~KQ@StU< z(K+{w-#;pMRZLFXlLN$c`s{Z}a z^}Wm`9lrp}+V{5}o1sz@-^5xT7P$4){OSy=PsviGjrh(PfW+K+Bk)COqHeHSH0ego0K zs}qo#Sni${EV^po&Y7Q@&9F-Zc;^q601G&Vf+Kip7vhGq>-*iQ;zr6VuacYFbwC{F z{W}$qH?ao|il(Z|c1uUQ%OFSwLq3=_?5{-Mxc;zg&WF1d(Tv4q!XAt(qD__RTfut#`@ZFz<-7-jr++`#sn=9?U%z`;6$VAg}&q`59Vih26Sx zveww1@wg-MG5h6m#pp{W-mEJ&VC*8VE2>I^?)lD9=TTKLuGl%eF_dGIhM8~SFeegwMy~PP zFXLZV{%5R1grQFCfURF!9E0E1kwW3zaI#yh1O58WgXQB{oOIP_^bqk6HE(o07aw|R z-0a;&=o`$sIGQs%f$ae=s%S(!mGC6o9(h)MuiPwCV~OVV!%zD-8wm8V&0z*Bj6U+m z#KvX(E$6(EBk*N^B^IS2eacHyE?coO zZW>$_3h=CuK@V&#(rtd#Fz0L24u~Ch0FLHHRsbK0ch7~dy1HIn_n9Ej*7an1Ek7LQ zXxZ}?)MkvmZn2WRaY`$Os`SsY+W3())A?%a=Dq{A>VF;Qu3+2 zIYUqozFe6X6tY(a?MC{>X0!%eXdbRmn0N)$-!PKjv@2v;1~j5&^!-EI z#=Cb@2=Fr^e7Xp;Un1k}t639GBbDnuLs5y1E=PTR(m^m=0M~@Ou*aL zw&PxIeC3c}pC$VSF*tS2qt(K5yIVLi2Zm>aqQp z24_4gL?2lAOyPmf3Q7ge_LS_06*_Ad&yT^=*SvmDq^sg!v`KG)DO6~#ci@u>$fp*p zQw-8~IK<0AC<8+j4ID!)1$ z`T0qA`qFjr(g$6Y1H086e|}6?HFDgK0dh!S*4T4`%*=1~0u-iHVW?trT$fdi|82W5 z&jXX{{_mE)O2`9DNZDXhVv@R?Q!v%pblq~LQndNpeL>XZOxUzGLjjiAGDb$n-T+(= z#{lgU+g=`(&CGnGjN2}slT}essZ>LtDaY;WbBDMrug0hcYE(tXdeQ*4-gkxlzvhq&+_thg764;FyByTL&K^XC{B2#xeW#rQUFS2%kyp>%%`ziTL*CgC zVAGu0vcxe)@`b>Xn~2^NJAky=WWwVM{Vf2$JV zMEVL=N61xh&~}G`Z)Abxn-#w^9?1u}GF-+&rB?hsWr~U_?Y<1 zn&ev2$cl5y$KIurDa&FH+ho#PK27;vL$AE?c-?b*GEerA#drVE zsdCngdF^i$Kwtc-uHMikyY3@&`rKFXu(i7!BsF38Kc}&0@3HGQa$L@zau75pHj*4& z(H!Q=(BJQ9O@w+qHt<6m%nh5FX14V0;+iY!uqPE9H|$)nzqSMQavOQRYghDC;$ZW8 zm@CN8z#TVM@DX+u|GALL7VKzZ*OQv76UPN0D&5pd8xm}lGy4+Y9fq_zqA~V(+}m_1 z;p(QeDZNIjFmY`zyMm9vdpIucB!Iw%Z%x|ph*vf+zw~*l`B>dR?oJ~--Zw7Fn{CxLKE1hf zXEt5Xd5bwb`l|7Mh6lOtXz9;tj_KZodDsBlO;par=s0F`dulkJg{|BDt+Xz_DU7PX z^wAy0fg4^ch1xV5BSkLKI(G8&IU!FLyY|(>y-vdByKqfKXLsF@D&}^>mGP)FAaSZD zcrpWF-)+Kg{*0x%PP+u5%{_0HLVe73#-6z=qGbSFNKu`dzQ(k)x_AHo@U#UjD2eDAXy$dXa8_N z8c=$0My0&;w8f544cD!_Fs_yGV>B0~iQew=%;&U;K%J|bhu9_Z_E}&`KSDe2)6mFj z>kKzW4L9bD%R=3~YZk;+pqEu=7hcwqt`|~IN8}^`LA~_Qx4?}PKw%T|E}yQ^k$(+< z$j@>mHUy*|Fpd@9UT5@&1slKzyR&RG6D#&1P^v^sc@7QqZzTc|aikL1m{MVYEIHHsGvLNhstu(G( zaSdH(7?R)obfd7y;ZR&4lv<&p}Aqn@>?!|v5OX)C4AT5w~5T*FI>a?=^9P;&O`mrTc!RnNF zgynpSUBg({3Lk(y6$x^d6+%dgMp&{#%_}P+$R|CWD^Z0${f%2M3B=mre9AYHy(HPx zS2SJ7qBbuDZ_G|qMHrRVmV8N|cDnO$ z-z8-BBr^8m*2hn)wol#8XDuo)ep-P%q6}#u%-WS(F9g|e{xMNWz?7Xg9;axS zBFm)@v}gT7uk;AdetnQt>iYEIL%wU^^5Ex?0&XIAvuvmY0hH5>5|b(x-A&6*3y*m6 z2sSOgyZx}p*Cw)d%J@u|hQaXlXMCvPGtc_r|LV{)OBMPg``iNgN8VQU64P+y9>$N7 zC+hKI6HPHCi$}=q6$N^>9sTnR81K!n>wk#S2oN&egs{y+qQ9ydYt|@Wz zB;-!OAKJ}WAd|Urbsg?8!K1UYt0Em}uN?+Q0Fy5bKitu66th-vf7H2dJBX_1)XhGG zLS{8|Z&P#@mA`*s#_Y!cp23Xb`XI)T9^lH+O5yucD+yrmP0wP1;j{WcLR&0w>?Vtv zVne__QPAXZ4SaE7X5exNv*;$`onwvB?sxP`+c03Eaf<3^p3bgIgfG`##lG;WcLaX> z`Xhgai1}O$oc-j_aitXXbU`baId~?iV?Nq$x>yo$vBQI_5 z64Y&0uygHDO>FSyyNQa%@T=18NbkVQ$-%7mQYh(xgL{w|Z@j&eXk7ZGr5E3cG`nla zd>x(I-4)S|Z%6ex3jCI^I&Xn%7CMK@R4D`H0Sm<*W|{jY^JC3?-pA8lBXVf13);FMYBVaSC0~7R{Dtqp9a_?l=N|cA!dV z8V5yzffz&!3xyfa838+VBgzog8X{8(QJKV0NkmL9-Npcj@eHzz21s}UcF66Zaf{X# z1JoRjJ1B>^v$X2^Ys|7rx5m3FcV11A;YP>bsy7Bk#XFasi%eQOB$=M7DuLB;$W(WG zlzzn_b4C#wyPOy#BCT4#j#U*M)ltkOX4i9~8Yg|;W>#11BHgZ1{+x#N3V$gh!lc^?y(+K;lg z>a7B{q&h{`Z}NDJ#U%~ALrqC?0d-=BQtZ@|g?E*AP{9Gcv@jb6Ew_RkcTxDwgs`rb z8GSSKhtH`Y-M>pH$r0*yX@NqJ-zjCmJZ)Vo`NdBB2TgDrVz!AUFCf>L)9s}lKD|{Z zruMTIq-H^4*s>!HUBZQONJicXVgyJBt7<_1koU|u39vFwT~SBM7(+2Fzrc9Ze4eS9 z;(i`qea(F(=h+2d{*-#5Beu53b;5W3%=4v%Co@E}jadnalmHgHrHxG8hHwl&MtE#{ z+MBzzrYa!brU)bjRJ4^iVnF)`3lZO^3!~m-`|mFegJ|B#?2{o}D+*FT0ngV*2{5V_ z$Q{`1=quC0K+;!x_RhQM87b0t?hn8I^}oJ&-BkYWYqeh~8cj2$s@D#U+IGTbT9CGU zsB8P}x$BB1q`M)>_C9ylYGdi^bsl>Fw5_v569xkFdq$|UxOVkUhZBUzBx)f=8Umt=BbpUXZoBd?5&jJGmn@( z^?HCy{v&c{EVEL={KuFh4dSZ4rP};kWvXZMl+=5;SzI z=0iCaWJ+oSJUqXbhN@Js>!vhoC4QvsSC%Y7&3=nE)#FnQj@o?%F4t z(lli76Y@`x!9$YX?NY>}`bPW+AmoP|xXc zQ5-P}w}s-n&K@h@&`h`>Qv1M+6P4_p@$rfR0szaM1w}I_Ejf*l{`9s* zM`=hsHEya2xm1L&=J&{bx;*@;i!PVpLbF~ew@&u%2TxngWb{T-CISOjc18P;VRcWJ zE$3F_B7BpNCi}P}XZW;Nwt}muCb;r6GvkzF{xhCt!N{TMnxS@m;1xQY^v-zDnxhhXF=OwOtb zzqtYEDJ^U%cH9o9@IzZP_>()u(KqL6v1{Evz1(ugpAuIc=zmnCt2L==BvDQQNV^fR zsCKwngIRFCJu74<&`^=NfzzwS)`UK=Ie#khTEq_!Q5BC6fA-(^=pFrsJ?2btW63N5u zDJI^e?OYNz%g?SzY(rQ#$HfmfAPpM8L^?qs6K`q!b=gbWy&0?0V3mPYSY3Ja>&*D? zFC5tl)3Yi^J#Rn%tWkdvxp)`krgF{SZ7*Cs0ST%ps)L`7WFADw{8Qb}%-EPL5;ud$ z_?TLRBu7$~F_b>pz+S}S`kE@V=*i6K1T))>e`Wi2L0tWHX7;bFvNy z!XI*-%P{*%C8#N5l#uV{%r%I+K0NEKV)M~I+#Fr;L2~Ln zzD3O&%3I3W+TI27*JXG1Ljnaw$k5A5aZO}gA9W%Eo_;xfK+P67*jBTnR3SwqmvrgS_J96n} zcV}HW&HYLqh}`Q9DrTs4#+GrBU#?UjI(Tn{FVX|~3dw-j!Y zI-Dnf3D9B?v?6efJkmLf%~h_OyF&4_Fxl&iiF_riC5=0xIS- zvRM7zPNY;CmW2P~cB$r|#$FRT`x;Cc`b$hTX%JUcnKwp*(w`$XqeBvE{(2mo1&!Hd z4)Z~Z(1q|gE^*AW?FTV)T)G=^Sp4?E6|mc2Coi@)HITx7KPT%?1fUlaKsPma!d~c%>6jmu&8hU_#01FgV zC4tA>L3`JpP+_u#Cp*sLRDYDBwuKZkNDNBOKi&;tnGT@E&cI6Cvu6;1%b|Lo6x{Lb zrE3ys>MeOlHVy{mRi%xrfW%lewb6rQVaQ$$c#udX zpO}HI&_azRWEld01aAGPoxv)t!$R)9#=YM8RHMnGwZt%t1F!otS8LGjHXo{p7hkYk znbg*QNcJY;%=lT6GmvXXbaSPE^RtCrHM);jf!QMjoHXEGP$$J5~lG)vufx+enD~0J>k9yRK8+dG~?E+oSnu z&5Mja&e^f!{!eT1+GNW^dhC~n4(awXC-8@J@d8(yv3q3km=i#yGtyBKc-As|6YQn% zz^Bx%?}zpH`7`aYvP|#da%onF%~@Exv{}-(d!Rr!?>GEKIUy%G2YVu$hiWJbEZ{-D z@L!ix4QVmPtI(-nwyNZgJVja#IHHqiahaDn`EylW3SNj$i>7x z&iyhf$d)|{Ts<1Pt4KwW{}$7+`%=UAcn|=&m z!wv$JwU?0wz=9qRF95G*MU8yEOAm@Zri37jDBDQ_Hc=5C&6%6b0{)XH|4JXT-kXuX6hyrsL`T58 zUk=wzKuL=%aOtmtfj_ftNLR(&5r*F1zq6#|06UKPUbt(AIsV}~^OxEO<`0**1=tDf z5FbjWjjFMeEQP9@k;yUe-zfMJLVsi5E03uO<9T?Kz%b;d zvoCG@pk+VF6X$F?`PH$s2d$Ub(IZa(ac_p;`Xmt$sAP~-*L`B~qqxOW zADYQruC4D1d-26twCEj3y)-W|`Vhpi*wx+UXBq9hsEu<#ej8TLY(Hp^9#D{%{EAW= zMQ}=~mi#5$O8l{i)K~_2iN;)K-jOw(_io#-NASvb3Gg-NY*?v{W&U(g8--)`c&Q1g zD@)@g0IFJUCpIUj)K?h^O zJ@mAPgYx$?6UPwjy!VhSQxJG$#{Fz?$>BhL_R?lCvV%C~*sho;(&W zl$x;5KljL~2E&6`p_ay3$yJD0!Y^G+P6xSzu!E$3lKjJpdBlE>&`U$97F4R@`Z{Cn z#zW?JrHK#RhfOoX@AZUj2dBGTVZVRrsP5;Y{T!Tb0HR+uyRG}1WRwrqEb9bLQ=bVfUrjR8WVfz=t|`<8FnJH z_MzkvRK;6Ls)gX6b4e|a1MGT0*($8zK#<>Wm!ZAPcxTz+>9TmJra&);SS!{LW)4~% z#w&2G>*vAGb&z$Bsy2MS%mH=6c@z4=p4+Al`E=Ww_jt2v&JGM!(g~vXx-3KP?OPG# znvD$;YljZO#zu3hn?`Iihq4&=edapJ7E%8^00YBHCsi#;m*`~AS49^882U&Dp!o@{|G1>jjfwuag0*VOa;ZwsHKYL}vJ7wCYxfXW-4N5O*H2 zV6ek)Ts~I)82RyZ=qJs+{CLN6*m1cFjLq2c$Pk(oE@8EQul$U364O^UPI^EX>~QTD zXB6yBWzBJ-x>$arGfN0H*|!G+=#^$p6lN_mh{1mkcsHHd_TeP42h;`1BBCE&d6ChQ zW>?*J!a<;tB^-TJe6R+YIZC&SKF<3xTngpwKjDfbr$lVoJjd|JHXAS5`7U|nLkTE{ z7vxns=8BbI-g2TAD3+@m8XYS&zPfZg>ry&n2w~wG(5VAzBOc?&c|n4a!jETUne(A+ zcXm=o0*Q3=z{vTD@+tSLGtV3jjV6LSugmQ7Iz_8y9rRC*$7VXqA@3M>iEareuslrv z`mJ)UNJIPvNmiPB76Nh}zW# zV=byjGuTADna1{)qYErpAq;-V9RY}p zYW@lB(6);1Wd63s)QyiC_2jyJ``~*Gw7JXrqtvf?^$a9GHsXoJI(6)6s@yogG!288>dvmBArIsX_v&}S2TIF}}VCi-8~uyt2z<+i8chBP8A;r=~c z%3rlE>0rp`-#zC1tB>!wir!-Jbsrbi&Vvn8lMF*sg6D6=JdIFB0jTkQi(FL{>=X(G z&y!H#=U{Es?p+@w%@~{8A#I``Qozo(fFgTq@1c`Fe=>yjvpm(uzDNRK&t~hLY;1GS zK>Dxvi;hhvpX)tms9CtVFgc6Q=QDyk@qs59i?p;7P=#4$7=C4`g(L242W**vz;>(A z!PCUfr;t2cGxM}0%&4}4EGR(X6ssnDchK5-YrBPsi&;l;y8ba!7%zoXCIe(rU$ z5Kl&eH|H~YMKsd3jY`@}D>z^Y;|Cq8nb!z3xfjp3=vA z>g|A$`ybOG`?j9qn8^iXhmVt2to31=iDtIr(AG6Ld+SQ#CRsfHp@XMd)14)qQp0bU z0D1+^hmTT_8?bM}UyU4yr=2;6urlB4EnR?3a=9r?5~K0QQMW{qAXo$Q$#r|hH;kWd z$lj(}t4wvw*%quyaWyHm{AH!@XWEkreAUrPHUoeYfZl&S5>@{k2Q^bq(U5AK4=S74 zPzs1^v0knigx`vxnRHzG!_c>BV3sV5uGt^Gfk5wXtTkKj-C2vD942kb@3X>0H|=cn z%YzostD&KZnH?55x1HzeB5QU%6~vYSFRdxDB<4>(}UP za@CqTa?Xqn89gVB^C!~wD+eB54U;gHcr#1|;iqfh>Q_lRon zt@zsYxltv+4$elB==s{BuSSI)R*i<@`S*p`Z+Q_Vm@U(_x=xL41I)(Vo1 zyNI=fo1|#@`IyvH&fiSApK~bhe}12^xGj@%s1gOJL=W?wd`{QGWXL{>~{ zEZM>>>Zs>whijaKIk-4&PcQZUph)H+j8ge@lhfeR)yq!k%y44e^OYC=%*jP6d%{5s5*+#Gwg znYTAvbPiGj)*mq2iJ;|;Mv#*xdKP2PR?*8m*)Qj7mdUs^H78uQJ_KCQh-`Gf8GPuL zk-}XLYuBrkF673&jq!{kA)f`&hsz+Qb?h!Rks(xQ~4 zf>?Q!0*!^1B9AI6s1Q)JsRc@*g|?J!%Xar~{(I&o-APNg3$)wKJ;_OSXYSmc|8LGc z_uQH67=|`&+O%oY=I?foVHoZF#Z5hT3XIV%KR^E=o6R<=y1F`{wzf90Eju+(3pJUr zZp-e?$;o-NuCDGNfN}s1v~?2=<+^CUSy#dszxVU(w zzXPI1YSn-=APq_03SyIt0n_~pYSz60FGn=WBZ72oNwI=R969uB7n$V;=8`|?Cfi6 zfUgz+;g186y@AY)))qinF))235Yiop83_EczpVla7dR2#0_xQSpl-eb2tbVuxN;sS z`A>Y`W(5dXJ56mDFE5q+LqHKt0Rm7}p^gR4pOgLwD558@^;7r0nV)x3^xo-kf zUlNZSY69vFOc<=Ti+`O6+^Fyr5RkPQcz+lW{~|Eu1t5AL5Y|IHcCc)l^1QV9^?;88 zI-U(o3Q|zSBdu=cn>Fzg6$%g|;Z}gQuLZ&al`A+vsPgXO+;=q71T@0O0G&Awtb7+( z90|;S2Z$b^zyR+(2P}>dXJYu!p`hW<9xruqs1t~zz5{m)Tp={J9p6{L z@H3YjanDM=VMJvlOWz6*BaE}y@%=!|AYgPCaVGB*2U`jdfU704?jn?lPs>$P2{>gQ zP;d&E^_pD0%}b=HvjXA*mg}Y&ubLpEr7$c!15AHKB8NkSTM#_DwONff6-jvLRZc!ZMn>(Et-Q){{&1P z0>lmi4s8bx?@}|A0J543P^c>Y6d+~p`5`Y|`k~m1|H|4<4KV_;nhVg&l5?U4xEG2J zhd^)XSqwEdfY0K9C1a%?VK}SdlakOdpoNVAve>oDQYX2l|C;6klKkTntND|MB-haD z14_P4KpZwF^Q6{k4xrJ#2B^L@3s8?+1G3)k@C49@3Q&Jv1{5gX7$8pRYT?;jK%w0P z?(XEK0LenyR{^<1GzEy$_s(^m0s=OEG~=z8)A_yz$b4#Xtwg+` zqKvgjWtmj7bl#)(=&6rW`nziO-OwW?7NxxX!G76}w?OoRL;Yk`1JZyrAPqKBC a&He|0+yfTS@%h~V0000ZD2K(snU)oRiumY&*&>qpfIiKfw-{<-Fea_2g`g$#( zThl3uTHyVS2aBBRKc^{;RBr#=M-*jDXYLR1B<=r(Kp^9GlLlerl&A93B3+FEp!vmj$vX9;~$_=!>F?-$f$lbRKgScD9=Dy8h%Q}r4*DVLy&}$<0wwR#dutdLm?51!tYQ(#2}xD#)W9) zMdDl-&V(W-1gC?M%|Z5I@Yu*YgsdQB2IBhwWCS3cg>*lp5lo~VKq?cdr1~Ps3&%Z? zup9C2h;v8m4#Y4JvmMdf5VZxzHX~vajymJ$Mucxb_}4f>tVbB(1g;~v4hSXI;ag%Y zLhKQ;2El|KIK)?A6RW{qg~Nm`4iPpANuZKEuyqp4*Pk+?%`%xYci#N@X66>lRP0g*68i?Ngpx~n75!pS%3s@y`%{Y>m+3?~Ly7BV zx4${oGtWMnTUeHB9H?~Nchm2Ru*OMtlWQg4_kvdhc~Eoq1t021 zk+ZP1F?K2C+Ee$67HOuV4Vybvw$9e{%r*@@mzQ<&A}__#cB1*Zq`7L8 zvBF|{D*3$;cjc#5=KS;NW`+Bb=6BpT59;>crMPYuIq1C5N~SuYZ!?6C^B#?s3J!2& z1G^L>?W?4n_l~ocsgs+%Y)1yaY<63O{?W4^eI!@wI_SRVkCf!7+@juks(7?%#hp8D ziF8?S@om0vKhul}tJ@3emQCu+Q2V5Kdx{6#)ps6Z0Tk! z$~9$^ou#UB=P^mtwP5e~ttP?=O3pu1B)6xnh~2522xm|QmuHP}t*iEM!{!*S4)k$Y zLrwXyRPeT@%r2*?0^Zh*hONmv5;FV*R?LIHQl&wGAx~bc)OJUtR(Fo|bZMkJI;%CT pwdvI2Mt$Jvw@PtSRp#AKRKD>i^%s>Z`JX=rZ%<#3+Fji2e*jg1cTE5Q literal 0 HcmV?d00001 diff --git a/multisrc/overrides/mccms/manhuaorg/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mccms/manhuaorg/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9619d059ce61f0e4850bdd075330774ccc0dc579 GIT binary patch literal 2064 zcmb8wc{J4P9|!R7WJ;8!Ns$&Mk#b40bTv^?sjd_nB|@8$R0fqW(!G|O?OL-na)lUM zWofu$Ev;l3LYBhNpxZ(*c>lhg&iVcMJLmT~ujlhT&v`zd|32qD!4~Gbq$Cw334)L^ z+ih}?+#PXYt*NOY3$(Sh|68W6u1=mA z493{lm{2I>@pu^-8Pn6#KdC>Cb7p2{a&oe-uMa5CqyCut>uNMqqP_yJcz9Wkmt}at#q&paR*I*^s4GTIA*%CHm4~WaRFXKT z$N`U(jeoLGo(b+IoUCpX~)Ne9PC8{wo4rwwq_f`cX;e!(%42JA`eVZRP`>tRP`bsQzFg)K=9M@XtT zvId7qDzG7~-Z`I-mXeAcw5(`W^O0+^0X>#J`RQ`A7x*lwX*?7m=_9*mXfHLr{ZOh! znnk9pvl%CJ;*67G0^g!mA}pZ!sb)`1ek1iFVw-e>zf^ zdb2txCP(JUR!@y6zAq~?L_E7HVRMmBhYs~*^tw}lCzXcdX-dX9Hl{WMsmiA&D0ej0 zYkYAyJhOt8Y0;Wj;6^xdoOo|a_aoATHCL9RTtTO-E!w|zLT>&zVZqI!UHwB)#OJZ= zlIpCbIoXa6ybFjGBdk1kR!vw;l@*1Zn-)^w=FXBY4!YK4*C=bI;C&$C;P!zXyDK)# zC~Z4`WKPbU!w(n44{3e%>#wd5Tdbnz+`v$ipT~;R7d&AR{FMn*vN10{8Q*s=5 z`?S$%<(0fO^28^G%9V17a1FgV2Zuchbk26II9j%5(>dxKU(j zQb>3&ot;`3rur@9F6V%P{n^xn_dZLE*mbfG^Ry-IczPW-_n6#uqtB32(H=W>lqL#w zE#*JIeYwJgn;lTg?zL9=Wp}HT&BHut%E3U*APdp!`zl>Ij{Ja6nyU)FO>{0ZbZ^_% zJZ|St#BlG`7;073WGrmR*UNZ0%p-2@E6kc*nlwvLwbcnqf>y27?&X@eqiI zrWnbTP1ovrHXDC5AX;Ut;Gk+WT5!)l%75{Z4~>esGlh%f40Z`T-TS8Hn8ovwi`G(o zQxc2M`^8F>G`uqBcK;TzxoE?X_-=||(m>b1t#Hp3ie>Gf@zfTZ$N5IQvaUVKJ24vg5PQA-rK4@E zsdV}Ed@-H`FUlcId2z@^1&_#Re!y$X4biuY-nLxGW_x^iuu&M2vSjdBkjx>cp&gEk z+$-9c>z4ZT{v3K^YP<})JpbJFQU`VFiK>k?YV`M-64g^QFVztRmbz`jVYT!!rbbcjzAtgfejD$rt7T80jIvo26C6*=?wm-Y ztLY|w68o%w<|4OKXv3lFCu=WXt1)GAIM!Oz*hMQ*chxu}R(ZCmYcQ1=DeAi>r=5nW?!+?skXk{{bbGN?rf} literal 0 HcmV?d00001 diff --git a/multisrc/overrides/mccms/manhuaorg/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mccms/manhuaorg/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0aee255661ed9d529a62d4d0f23ddd2843f44f82 GIT binary patch literal 3983 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 literal 0 HcmV?d00001 diff --git a/multisrc/overrides/mccms/manhuaorg/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mccms/manhuaorg/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..181f9cbbd45c664866f24d39bbacf250c51422b8 GIT binary patch literal 5217 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 literal 0 HcmV?d00001 diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMS.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMS.kt index d70bdd7b6..513608b1f 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMS.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMS.kt @@ -2,166 +2,148 @@ package eu.kanade.tachiyomi.multisrc.mccms import android.util.Log import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost 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.ParsedHttpSource +import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element +import rx.Observable +import rx.Single +import uy.kohesive.injekt.injectLazy import kotlin.concurrent.thread /** * 漫城CMS http://mccms.cn/ */ -abstract class MCCMS( +open class MCCMS( override val name: String, override val baseUrl: String, override val lang: String = "zh", -) : ParsedHttpSource() { - override val supportsLatest: Boolean = true + hasCategoryPage: Boolean = true +) : HttpSource() { + override val supportsLatest = true - protected open fun transformTitle(title: String) = title + private val json: Json by injectLazy() - // Popular - - override fun popularMangaRequest(page: Int) = GET("$baseUrl/custom/hot", headers) - override fun popularMangaNextPageSelector(): String? = null - override fun popularMangaSelector() = ".top-list__box-item" - override fun popularMangaFromElement(element: Element) = SManga.create().apply { - val titleElement = element.select("p.comic__title > a") - title = transformTitle(titleElement.text().trim()) - setUrlWithoutDomain(titleElement.attr("abs:href")) - thumbnail_url = element.select("img").attr("abs:data-original") + override val client by lazy { + network.client.newBuilder() + .rateLimitHost(baseUrl.toHttpUrl(), 2) + .build() } - // Latest + private val pcHeaders by lazy { super.headersBuilder().build() } - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/custom/update", headers) - override fun latestUpdatesNextPageSelector(): String? = null - override fun latestUpdatesSelector() = "div.common-comic-item" - override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) + override fun headersBuilder() = Headers.Builder() + .add("User-Agent", System.getProperty("http.agent")!!) + .add("Referer", baseUrl) - // Search + protected open fun SManga.cleanup(): SManga = this - protected open fun textSearchRequest(page: Int, query: String) = - GET("$baseUrl/search/$query/$page", headers) + override fun popularMangaRequest(page: Int): Request = + GET("$baseUrl/api/data/comic?page=$page&size=$PAGE_SIZE&order=hits", headers) - override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = - if (query.isNotBlank()) { - textSearchRequest(page, query) - } else { - val categories = filters.filterIsInstance() - .map { it.toUriPart() }.filter { it.isNotEmpty() }.joinToString("/") - GET("$baseUrl/category/$categories/page/$page", headers) + override fun popularMangaParse(response: Response): MangasPage { + val list: List = response.parseAs() + return MangasPage(list.map { it.toSManga().cleanup() }, list.size >= PAGE_SIZE) + } + + override fun latestUpdatesRequest(page: Int): Request = + GET("$baseUrl/api/data/comic?page=$page&size=$PAGE_SIZE&order=addtime", headers) + + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val queries = buildList { + add("page=$page") + add("size=$PAGE_SIZE") + val isTextSearch = query.isNotBlank() + if (isTextSearch) add("key=$query") + for (filter in filters) if (filter is MCCMSFilter) { + if (isTextSearch && filter.isTypeQuery) continue + val part = filter.query + if (part.isNotEmpty()) add(part) + } } - - override fun searchMangaNextPageSelector(): String? = "" // empty string means default pagination - override fun searchMangaSelector() = latestUpdatesSelector() - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - - override fun searchMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - val isTextSearch = document.location().contains("search") - val mangas = if (isTextSearch) { - document.select(searchMangaSelector()).map { searchMangaFromElement(it) } - } else { - document.select(latestUpdatesSelector()).map { popularMangaFromElement(it) } + val url = buildString { + append(baseUrl).append("/api/data/comic?") + queries.joinTo(this, separator = "&") } - val hasNextPage = if (isTextSearch && searchMangaNextPageSelector() != "") { - searchMangaNextPageSelector()?.let { document.selectFirst(it) } != null - } else { // default pagination - val buttons = document.select("#Pagination a") - val count = buttons.size - // Next page != Last page - buttons[count - 1].attr("href") != buttons[count - 2].attr("href") - } - return MangasPage(mangas, hasNextPage) + return GET(url, headers) } - // Details + override fun searchMangaParse(response: Response) = popularMangaParse(response) - override fun mangaDetailsParse(document: Document) = SManga.create().apply { - title = transformTitle(document.select("div.de-info__box > p.comic-title").text().trim()) - thumbnail_url = document.select("div.de-info__cover > img").attr("abs:src") - author = document.select("div.comic-author > span.name > a").text() - artist = author - genre = document.select("div.comic-status > span.text:nth-child(1) a").eachText().joinToString(", ") - description = document.select("div.comic-intro > p.intro-total").text() - } + // preserve mangaDetailsRequest for WebView + override fun fetchMangaDetails(manga: SManga): Observable = + client.newCall(GET("$baseUrl/api/data/comic?key=${manga.title}", headers)) + .asObservableSuccess().map { response -> + val list: List = response.parseAs() + list.find { it.url == manga.url }!!.toSManga().cleanup() + } - // Chapters + override fun mangaDetailsParse(response: Response) = throw UnsupportedOperationException("Not used.") - override fun chapterListSelector() = "ul.chapter__list-box > li" - override fun chapterFromElement(element: Element) = SChapter.create().apply { - setUrlWithoutDomain(element.select("a").attr("abs:href")) - name = element.select("a").text() - } + override fun fetchChapterList(manga: SManga): Observable> = Single.create> { subscriber -> + val id = manga.url.substringAfterLast('/') + val dataResponse = client.newCall(GET("$baseUrl/api/data/chapter?mid=$id", headers)).execute() + val dataList: List = dataResponse.parseAs() // unordered + val dateMap = HashMap(dataList.size * 2) + dataList.forEach { dateMap[it.id.toInt()] = it.date } + val response = client.newCall(GET("$baseUrl/api/comic/chapter?mid=$id", headers)).execute() + val list: List = response.parseAs() + val result = list.map { it.toSChapter(date = dateMap[it.id.toInt()] ?: 0) }.asReversed() + subscriber.onSuccess(result) + }.toObservable() - override fun chapterListParse(response: Response) = super.chapterListParse(response).reversed() + override fun chapterListParse(response: Response) = throw UnsupportedOperationException("Not used.") - // Pages + override fun pageListRequest(chapter: SChapter): Request = + GET(baseUrl + chapter.url, pcHeaders) protected open val lazyLoadImageAttr = "data-original" - override fun pageListParse(document: Document) = document.select("div.rd-article__pic > img") - .mapIndexed { i, el -> Page(i, "", el.attr("abs:$lazyLoadImageAttr")) } - - override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("Not used.") - - protected class UriPartFilter(name: String, values: Array, private val uriParts: Array) : - Filter.Select(name, values) { - fun toUriPart(): String = uriParts[state] + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + return document.select("img[$lazyLoadImageAttr]").mapIndexed { i, element -> + Page(i, imageUrl = element.attr(lazyLoadImageAttr)) + } } - protected data class Category(val name: String, val values: Array, val uriParts: Array) { - fun toUriPartFilter() = UriPartFilter(name, values, uriParts) + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("Not used.") + + private inline fun Response.parseAs(): T = use { + @Suppress("OPT_IN_USAGE") + json.decodeFromStream>(it.body!!.byteStream()).data } - private val sortCategory = Category("排序", arrayOf("热门人气", "更新时间"), arrayOf("order/hits", "order/addtime")) - private lateinit var categories: List - private var isFetchingCategories = false + private val genreData = GenreData(hasCategoryPage) - private fun tryFetchCategories() { - if (isFetchingCategories) return - isFetchingCategories = true + private fun fetchGenres() { + if (genreData.status != GenreData.NOT_FETCHED) return + genreData.status = GenreData.FETCHING thread { try { - fetchCategories() + val response = client.newCall(GET("$baseUrl/category/", pcHeaders)).execute() + parseGenres(response.asJsoup(), genreData) } catch (e: Exception) { - Log.e("MCCMS/$name", "Failed to fetch categories ($e)") - } finally { - isFetchingCategories = false + genreData.status = GenreData.NOT_FETCHED + Log.e("MCCMS/$name", "failed to fetch genres", e) } } } - protected open fun fetchCategories() { - val document = client.newCall(GET("$baseUrl/category/", headers)).execute().asJsoup() - categories = document.select("div.cate-col").map { element -> - val name = element.select("p.cate-title").text().removeSuffix(":") - val tags = element.select("li.cate-item > a") - val values = tags.map { it.text() }.toTypedArray() - val uriParts = tags.map { it.attr("href").removePrefix("/category/") }.toTypedArray() - Category(name, values, uriParts) - } - } - override fun getFilterList(): FilterList { - val result = mutableListOf( - Filter.Header("如果使用文本搜索,将会忽略分类筛选"), - sortCategory.toUriPartFilter(), - ) - if (::categories.isInitialized) { - categories.forEach { result.add(it.toUriPartFilter()) } - } else { - tryFetchCategories() - result.add(Filter.Header("其他分类正在获取,请返回上一页后重试")) - } - return FilterList(result) + fetchGenres() + return getFilters(genreData) } } diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSDto.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSDto.kt new file mode 100644 index 000000000..ac7da6577 --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSDto.kt @@ -0,0 +1,65 @@ +package eu.kanade.tachiyomi.multisrc.mccms + +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.Serializable +import java.text.SimpleDateFormat +import java.util.Locale + +internal const val PAGE_SIZE = 30 + +@Serializable +class MangaDto( + private val name: String, + private val pic: String, + private val serialize: String, + private val author: String, + private val content: String, + private val addtime: String, + val url: String, + private val tags: List, +) { + fun toSManga() = SManga.create().apply { + url = this@MangaDto.url + title = name + author = this@MangaDto.author + description = content + genre = tags.joinToString() + val date = dateFormat.parse(addtime)?.time ?: 0 + val isUpdating = System.currentTimeMillis() - date <= 30L * 24 * 3600 * 1000 // a month + status = when { + serialize.startsWith('连') || isUpdating -> SManga.ONGOING + serialize.startsWith('完') -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + thumbnail_url = pic + initialized = true + } + + companion object { + private val dateFormat by lazy { getDateFormat() } + } +} + +@Serializable +class ChapterDto(val id: String, private val name: String, private val link: String) { + fun toSChapter(date: Long) = SChapter.create().apply { + url = link + name = this@ChapterDto.name + date_upload = date + } +} + +@Serializable +class ChapterDataDto(val id: String, private val addtime: String) { + val date get() = dateFormat.parse(addtime)?.time ?: 0 + + companion object { + private val dateFormat by lazy { getDateFormat() } + } +} + +@Serializable +class ResultDto(val data: T) + +fun getDateFormat() = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH) diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSFilters.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSFilters.kt new file mode 100644 index 000000000..b27c52a42 --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSFilters.kt @@ -0,0 +1,75 @@ +package eu.kanade.tachiyomi.multisrc.mccms + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import org.jsoup.nodes.Document + +open class MCCMSFilter( + name: String, + values: Array, + private val queries: Array, + val isTypeQuery: Boolean = false, +) : Filter.Select(name, values) { + val query get() = queries[state] +} + +class SortFilter : MCCMSFilter("排序", SORT_NAMES, SORT_QUERIES) + +private val SORT_NAMES = arrayOf("热门人气", "更新时间", "评分") +private val SORT_QUERIES = arrayOf("order=hits", "order=addtime", "order=score") + +class StatusFilter : MCCMSFilter("进度", STATUS_NAMES, STATUS_QUERIES) + +private val STATUS_NAMES = arrayOf("全部", "连载(有缺漏)", "完结(有缺漏)") +private val STATUS_QUERIES = arrayOf("", "serialize=连载", "serialize=完结") + +class GenreFilter(private val values: Array, private val queries: Array) { + val filter get() = MCCMSFilter("标签(搜索文本时无效)", values, queries, isTypeQuery = true) +} + +class GenreData(hasCategoryPage: Boolean) { + var status = if (hasCategoryPage) NOT_FETCHED else NO_DATA + lateinit var genreFilter: GenreFilter + + companion object { + const val NOT_FETCHED = 0 + const val FETCHING = 1 + const val FETCHED = 2 + const val NO_DATA = 3 + } +} + +internal fun parseGenres(document: Document, genreData: GenreData) { + val genres = document.select("a[href^=/category/tags/]") + if (genres.isEmpty()) { + genreData.status = GenreData.NO_DATA + return + } + val result = buildList(genres.size + 1) { + add(Pair("全部", "")) + genres.mapTo(this) { + val tagId = it.attr("href").substringAfterLast('/') + Pair(it.text(), "type[tags]=$tagId") + } + } + genreData.genreFilter = GenreFilter( + values = result.map { it.first }.toTypedArray(), + queries = result.map { it.second }.toTypedArray(), + ) + genreData.status = GenreData.FETCHED +} + +internal fun getFilters(genreData: GenreData): FilterList { + val list = buildList(4) { + add(StatusFilter()) + add(SortFilter()) + if (genreData.status == GenreData.NO_DATA) return@buildList + add(Filter.Separator()) + if (genreData.status == GenreData.FETCHED) { + add(genreData.genreFilter.filter) + } else { + add(Filter.Header("点击“重置”尝试刷新标签分类")) + } + } + return FilterList(list) +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSGenerator.kt index 288ac803a..e09c802b5 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mccms/MCCMSGenerator.kt @@ -6,13 +6,13 @@ import generator.ThemeSourceGenerator class MCCMSGenerator : ThemeSourceGenerator { override val themeClass = "MCCMS" override val themePkg = "mccms" - override val baseVersionCode = 2 + override val baseVersionCode = 3 override val sources = listOf( SingleLang( name = "Haoman6", baseUrl = "https://www.haoman6.com", lang = "zh", className = "Haoman6", sourceName = "好漫6", overrideVersionCode = 2 ), - SingleLang( + SingleLang( // 与 app2.haomanwu.com 相同 name = "Haomanwu", baseUrl = "https://app2.haoman6.com", lang = "zh", className = "Haomanwu", sourceName = "好漫屋", overrideVersionCode = 3 ), @@ -20,10 +20,18 @@ class MCCMSGenerator : ThemeSourceGenerator { name = "Haoman6 (g-lens)", baseUrl = "https://www.g-lens.com", lang = "zh", className = "Haoman6_glens", sourceName = "好漫6 (g-lens)", overrideVersionCode = 0 ), - SingleLang( - name = "Haoman8", baseUrl = "https://caiji.haoman8.com", lang = "zh", + SingleLang( // 与 caiji.haoman8.com 相同 + name = "Haoman8", baseUrl = "https://www.haoman8.com", lang = "zh", className = "Haoman8", sourceName = "好漫8", overrideVersionCode = 0 ), + SingleLang( + name = "Haomanwu (www)", baseUrl = "https://www.haomanwu.com", lang = "zh", + className = "Haomanwu_www", sourceName = "好漫屋 (网页)", overrideVersionCode = 0 + ), + SingleLang( // 与 app.manhuaorg.com 相同(部分渠道记为“好漫2”) + name = "Pupu Manhua", baseUrl = "https://www.manhuaorg.com", lang = "zh", + className = "Manhuaorg", sourceName = "朴朴漫画", overrideVersionCode = 0 + ), ) companion object {