From f6a2eea19ed492586350cfa0482fc2e1c2191ba6 Mon Sep 17 00:00:00 2001 From: yoyzo <122361785+yoyzo@users.noreply.github.com> Date: Tue, 10 Jan 2023 14:42:08 +0300 Subject: [PATCH] Build a50fcc8cf5038799e5f991f179ea2e2c8c0344f0 --- .github/workflows/build.yml | 60 ++++ .gitignore | 12 + AkwamProvider.cs3 | Bin 0 -> 13712 bytes AkwamProvider/build.gradle.kts | 14 + AkwamProvider/src/main/AndroidManifest.xml | 2 + .../src/main/kotlin/com/akwam/AkwamPlugin.kt | 11 + .../main/kotlin/com/akwam/AkwamProvider.kt | 225 ++++++++++++ Anime4upPack.cs3 | Bin 0 -> 15388 bytes Anime4upPack/build.gradle.kts | 14 + Anime4upPack/src/main/AndroidManifest.xml | 2 + .../kotlin/com/anime4up/Anime4upPlugin.kt | 13 + .../kotlin/com/anime4up/Anime4upProvider.kt | 167 +++++++++ AnimeBlkomProvider.cs3 | Bin 0 -> 13332 bytes AnimeBlkomProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/animeblkom/AnimeBlkomPlugin.kt | 11 + .../com/animeblkom/AnimeBlkomProvider.kt | 164 +++++++++ AnimeiatProvider.cs3 | Bin 0 -> 20625 bytes AnimeiatProvider/build.gradle.kts | 14 + AnimeiatProvider/src/main/AndroidManifest.xml | 2 + .../kotlin/com/animeiat/AnimeiatPlugin.kt | 11 + .../kotlin/com/animeiat/AnimeiatProvider.kt | 172 +++++++++ ArabSeedProvider.cs3 | Bin 0 -> 17166 bytes ArabSeedProvider/build.gradle.kts | 14 + ArabSeedProvider/src/main/AndroidManifest.xml | 2 + .../kotlin/com/arabseed/ArabSeedPlugin.kt | 11 + .../kotlin/com/arabseed/ArabSeedProvider.kt | 217 ++++++++++++ CimaNowProvider.cs3 | Bin 0 -> 14704 bytes CimaNowProvider/build.gradle.kts | 14 + CimaNowProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/cimanow/CimaNowPlugin.kt | 11 + .../kotlin/com/cimanow/CimaNowProvider.kt | 164 +++++++++ EgyBestProvider/build.gradle.kts | 14 + EgyBestProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/egybest/EgyBestPlugin.kt | 11 + .../kotlin/com/egybest/EgyBestProvider.kt | 275 +++++++++++++++ EgyDeadProvider.cs3 | Bin 0 -> 18560 bytes EgyDeadProvider/build.gradle.kts | 14 + EgyDeadProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/egydead/EgyDeadPlugin.kt | 11 + .../kotlin/com/egydead/EgyDeadProvider.kt | 180 ++++++++++ FajerShowProvider.cs3 | Bin 0 -> 18254 bytes FajerShowProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/fajershow/FajerShowPlugin.kt | 11 + .../kotlin/com/fajershow/FajerShowProvider.kt | 247 +++++++++++++ FaselHDProvider.cs3 | Bin 0 -> 15953 bytes FaselHDProvider/build.gradle.kts | 14 + FaselHDProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/faselhd/FaselHDPlugin.kt | 11 + .../kotlin/com/faselhd/FaselHDProvider.kt | 203 +++++++++++ FushaarProvider.cs3 | Bin 0 -> 11561 bytes FushaarProvider/build.gradle.kts | 12 + FushaarProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/fushaar/FushaarPlugin.kt | 11 + .../kotlin/com/fushaar/FushaarProvider.kt | 137 ++++++++ GateAnimeProvider.cs3 | Bin 0 -> 11621 bytes GateAnimeProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/gateanime/GateAnimePlugin.kt | 11 + .../kotlin/com/gateanime/GateAnimeProvider.kt | 139 ++++++++ MovizlandProvider.cs3 | Bin 0 -> 24349 bytes MovizlandProvider/build.gradle.kts | 14 + .../src/main/AndroidManifest.xml | 2 + .../kotlin/com/movizland/MovizlandPlugin.kt | 11 + .../kotlin/com/movizland/MovizlandProvider.kt | 223 ++++++++++++ MyCimaProvider.cs3 | Bin 0 -> 20952 bytes MyCimaProvider/build.gradle.kts | 14 + MyCimaProvider/src/main/AndroidManifest.xml | 2 + .../main/kotlin/com/mycima/MyCimaPlugin.kt | 11 + .../main/kotlin/com/mycima/MyCimaProvider.kt | 327 ++++++++++++++++++ Shahid4uProvider.cs3 | Bin 0 -> 21973 bytes Shahid4uProvider/build.gradle.kts | 14 + Shahid4uProvider/src/main/AndroidManifest.xml | 2 + .../kotlin/com/shahid4u/JWPlayerExtractor.kt | 67 ++++ .../kotlin/com/shahid4u/Shahid4uPlugin.kt | 14 + .../kotlin/com/shahid4u/Shahid4uProvider.kt | 177 ++++++++++ build.gradle.kts | 87 +++++ gradle.properties | 19 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++ gradlew.bat | 84 +++++ plugins.json | 293 ++++++++++++++++ repo.json | 8 + settings.gradle.kts | 13 + 86 files changed, 4246 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 AkwamProvider.cs3 create mode 100644 AkwamProvider/build.gradle.kts create mode 100644 AkwamProvider/src/main/AndroidManifest.xml create mode 100644 AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt create mode 100644 AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt create mode 100644 Anime4upPack.cs3 create mode 100644 Anime4upPack/build.gradle.kts create mode 100644 Anime4upPack/src/main/AndroidManifest.xml create mode 100644 Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt create mode 100644 Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt create mode 100644 AnimeBlkomProvider.cs3 create mode 100644 AnimeBlkomProvider/build.gradle.kts create mode 100644 AnimeBlkomProvider/src/main/AndroidManifest.xml create mode 100644 AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt create mode 100644 AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt create mode 100644 AnimeiatProvider.cs3 create mode 100644 AnimeiatProvider/build.gradle.kts create mode 100644 AnimeiatProvider/src/main/AndroidManifest.xml create mode 100644 AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt create mode 100644 AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt create mode 100644 ArabSeedProvider.cs3 create mode 100644 ArabSeedProvider/build.gradle.kts create mode 100644 ArabSeedProvider/src/main/AndroidManifest.xml create mode 100644 ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt create mode 100644 ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt create mode 100644 CimaNowProvider.cs3 create mode 100644 CimaNowProvider/build.gradle.kts create mode 100644 CimaNowProvider/src/main/AndroidManifest.xml create mode 100644 CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt create mode 100644 CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt create mode 100644 EgyBestProvider/build.gradle.kts create mode 100644 EgyBestProvider/src/main/AndroidManifest.xml create mode 100644 EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt create mode 100644 EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt create mode 100644 EgyDeadProvider.cs3 create mode 100644 EgyDeadProvider/build.gradle.kts create mode 100644 EgyDeadProvider/src/main/AndroidManifest.xml create mode 100644 EgyDeadProvider/src/main/kotlin/com/egydead/EgyDeadPlugin.kt create mode 100644 EgyDeadProvider/src/main/kotlin/com/egydead/EgyDeadProvider.kt create mode 100644 FajerShowProvider.cs3 create mode 100644 FajerShowProvider/build.gradle.kts create mode 100644 FajerShowProvider/src/main/AndroidManifest.xml create mode 100644 FajerShowProvider/src/main/kotlin/com/fajershow/FajerShowPlugin.kt create mode 100644 FajerShowProvider/src/main/kotlin/com/fajershow/FajerShowProvider.kt create mode 100644 FaselHDProvider.cs3 create mode 100644 FaselHDProvider/build.gradle.kts create mode 100644 FaselHDProvider/src/main/AndroidManifest.xml create mode 100644 FaselHDProvider/src/main/kotlin/com/faselhd/FaselHDPlugin.kt create mode 100644 FaselHDProvider/src/main/kotlin/com/faselhd/FaselHDProvider.kt create mode 100644 FushaarProvider.cs3 create mode 100644 FushaarProvider/build.gradle.kts create mode 100644 FushaarProvider/src/main/AndroidManifest.xml create mode 100644 FushaarProvider/src/main/kotlin/com/fushaar/FushaarPlugin.kt create mode 100644 FushaarProvider/src/main/kotlin/com/fushaar/FushaarProvider.kt create mode 100644 GateAnimeProvider.cs3 create mode 100644 GateAnimeProvider/build.gradle.kts create mode 100644 GateAnimeProvider/src/main/AndroidManifest.xml create mode 100644 GateAnimeProvider/src/main/kotlin/com/gateanime/GateAnimePlugin.kt create mode 100644 GateAnimeProvider/src/main/kotlin/com/gateanime/GateAnimeProvider.kt create mode 100644 MovizlandProvider.cs3 create mode 100644 MovizlandProvider/build.gradle.kts create mode 100644 MovizlandProvider/src/main/AndroidManifest.xml create mode 100644 MovizlandProvider/src/main/kotlin/com/movizland/MovizlandPlugin.kt create mode 100644 MovizlandProvider/src/main/kotlin/com/movizland/MovizlandProvider.kt create mode 100644 MyCimaProvider.cs3 create mode 100644 MyCimaProvider/build.gradle.kts create mode 100644 MyCimaProvider/src/main/AndroidManifest.xml create mode 100644 MyCimaProvider/src/main/kotlin/com/mycima/MyCimaPlugin.kt create mode 100644 MyCimaProvider/src/main/kotlin/com/mycima/MyCimaProvider.kt create mode 100644 Shahid4uProvider.cs3 create mode 100644 Shahid4uProvider/build.gradle.kts create mode 100644 Shahid4uProvider/src/main/AndroidManifest.xml create mode 100644 Shahid4uProvider/src/main/kotlin/com/shahid4u/JWPlayerExtractor.kt create mode 100644 Shahid4uProvider/src/main/kotlin/com/shahid4u/Shahid4uPlugin.kt create mode 100644 Shahid4uProvider/src/main/kotlin/com/shahid4u/Shahid4uProvider.kt create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 plugins.json create mode 100644 repo.json create mode 100644 settings.gradle.kts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..38a09a3 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,60 @@ +name: Build + +# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency +concurrency: + group: "build" + cancel-in-progress: true + +on: + push: + branches: + # choose your default branch + - master + # - main + paths-ignore: + - '*.md' + - '*.html' + - '*.js' + - '*.css' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + with: + path: "src" + + - name: Checkout builds + uses: actions/checkout@master + with: + ref: "builds" + path: "builds" + + - name: Clean old builds + run: rm $GITHUB_WORKSPACE/builds/*.cs3 || true + + - name: Setup JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + + - name: Build Plugins + run: | + cd $GITHUB_WORKSPACE/src + chmod +x gradlew + ./gradlew make makePluginsJson + cp **/build/*.cs3 $GITHUB_WORKSPACE/builds + cp build/plugins.json $GITHUB_WORKSPACE/builds + - name: Push builds + run: | + cd $GITHUB_WORKSPACE/builds + git config --local user.email "actions@github.com" + git config --local user.name "GitHub Actions" + git add . + git commit --amend -m "Build $GITHUB_SHA" || exit 0 # do not error if nothing to commit + git push --force diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..41fd579 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +**/build +/captures +.externalNativeBuild +.cxx +local.properties +.vscode \ No newline at end of file diff --git a/AkwamProvider.cs3 b/AkwamProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..5e573a607949185800357326ad9e199e2e19e356 GIT binary patch literal 13712 zcmZ{LbyOX}vnKBD!5sntg1ZHW;O@cQ9WHW%yF&;TAh^531%kUfT-;qRy8L$ckN4i$ zojEPj-F51ls&CHenW<7yfQ3VWf(*5XJe-!kO;$Y%vV`<^$&T8xC zNtGQyg&9T zx^o9`tHh^y6(V;)4a6uk)O0h6Rk_+Dqqt3|;M)UZ`KkcRo>wT9|Av83Q|OZ}7Zg;7 zJroq`2L>~H6E`;tH&$~C?@oVYfc|{yL+iy+Cxb%Wm(gf@x~5&aNL>B2j#U>NoU9N& z7Xlmx^SmH?=Gq7r!K5sBMs&N+EQKrzz&sWUrz3BE@oZNtiP{an-|fLlPtfB)`J|s$<|fBUUCIeuYQ5H!|8(y^f}0wvK4uN ziQ6Gi6s^PS2(zx)=w>I-*Y&6M?})gIqub=ChY^$fcqG9~gFn^jIO}ckC8aTk+RTvw=qb0j9?j5F$_p$Oa_}_crD+L8ph%0Lu*Y0QvsFb;eFWsDgEbb3|~24nVy{$BKnw2r34$ z5LMg&O~5de$ZK!_9B;Ho(n||)CTJ9N5=00~2A2k72!g7CUBZlk3I~3sL^VJ#fM0`J zg9hL|3SCNlEVKi$0eOMlP%F~ZsEqIgJ-o|HL3s$c@JD%c0C3C0vVf=I4|LP0JcL+T(a;3TXuTn=IvatEAH4ap9I5XKAV zB^yXPs2X|`=0i34CGn*jSP=x2J40j&vi*a>huMO~2V($lfY|}-jd>{!<^*y6XF04W z)Elff>?1B44k1=X5CswpH;Cs4n=@PsObfC%)Q1l|z;s}IFgMr(tPRQpvh+2?jKd86}!wcgDO968ZD}o|~ zA%qOTf5f8RupT;vV&HE{{mwRq!Z(uf~|mWg6RVVfN{WI6JX;0BMN;1?+E|l z1Gp}zjt?Z>xL-Gaa+6*{H;Ta>!Ysf9gD`%ueT6X(vIBmg3BrVa_+T(}L1M+!A)`eGJxg4ZXi+ET*MrN9Oy16 zAygqmK;nZ7m>HxEJOIAK1JEA@E@3XwKOURrAVLTL>ILnQ?vfcS8f2U-T-6#Fj^|%V zc!hKf9{?><{>a;t3&moRCnDIbx5r5V0~qSYYfw6B!_h&|D1E_adN0}TlgGSKlrNGR zCRGKXK|b|A{OtaIb%OfX>EEQZ&w%py<#7~0Fw{00;)h~R&I%TVf2)iN%olr87-^CP zzK(VOF{d60Xlm75&e8-_89S7*-ke3{s=g>Bw0^s)E@>NkZwm@kKRVLzsOJwTbWm0n zH+BZlFkHt2a|Q!+Z5G${RJ=0lVj*Wyf$;9(Nj{oaYw7Qmk6&+JWUmy##-qb{yAMC# zz51(J5|&jd>zjiPe)$+)rQ_|^$Gdv88bdsL-gT}9wI>!joBmX`_q=OdJp{i;Zs#&h zy%)k{vsE@63_{8-x>a77hu&Mamvcxbc@87cNZaYM6Y#8vO^TIekMmc>$mA#Tc1izl z6_l=M+V(SwHddulK75F^S{;JUv|chINY}W^o)Vyb#F;Ac|Ed%US>`c|lB0_7ven%6 zW|n;!Xd9o8G<>tl)=EdR%Q}$moj=WbN(s_7jv8KqT9c#?VdPeia8k)txu|RyI%S3f ziROX<_H=&^)PJ736E~y)xDeWqMAI1s$_|_HU!kv_2=W6pZ|S6rwQe`@Uh}fzm~9LO zB))I-yE7HD%uIT&DWE}FM>bRT;-{oy2i0fU-jT$QGILP z<&@EAo7BHXw-pj!&+?O#R(vyzFpnj;UddepG^^3BZV=^y=f3>nQ87@9#gIS#BaxIg z)$&(FUjDeKU3`>%TXhO0Mj|s`h&q3NN_ZF3l`}M4|K1S50oWq?lh-1i|l*-L8>E+F^Fm-AdvcVckDIDreaZeG# z3L|oY*@O@tx9%rG_r4>}2`!bJieS>rhu+e2lV_Ghrj5G)+JF~`_$`&RFs+!>c60%E zQ96FB)$@Er{lv*WUZ_2lnxr+$^7BEb9nda+6R?%+x%}=-TO{Z_ZdN2xEk;uDli5%Gd+}CulYDjPPePREm584(ho+wYeFIN z95%RBO5^`jdh2weXxVDSs9OmAXM1fIAl%3!yTuVdSGprpu*S z_de2EF)Jr%rlrKzvZaHq>(I2JQ4!bsvoWWvzC^4zXHggJujx`J8M$N@P}nX=&4giK zrfFQ2a@34;hUxR)YH70MV|V=lH6D>^+uWVFAu_LnIF5fCP%XZ0{0p#(-^0Cbx=hHg z$Y2^h(NIN0CF#)Z$QyiEseN>q;hR-m>A(weRYYq+y8tkc>;$@FJ0E2M?gjOJ0g?6J0-XXR?|p8 z<%~MeTOf^UYrB24bmu~C$Eoa!O{DJ;asIJg`O|w~-ym0U`cLd{Kms0Qm z;IBunQ(qw{<1ati%C@4J9`g+#`La)@S2q5t(8e0QgyN6X|78*o#}+jus6LPGyuPDg zec*297yu*@sY|ISpqkBT4hY{I`hB+quf*$>o?~*(I=JRAGPzDawvG?)*1Xl=<|Sps zknX&kt9RyI(@VAeNd+TX`s=E^1sRQTw@#c4+|G2=m35CdSMnw=Sq`v+Ec&-Wdt*uG zJ^CQ^)IwMbNnGQMvwlci2(txOQ7?N&^o>W0q3aaw%bm=`1+@&>3C=ZQSM17je}hx| zb)AEo+}ypN@C)~unQ~|id2#Rf2tn-WQc29p^R%O}#>Rykqz4d?KE|fjv`F0@J$i(0 z?MHHtf(hU6n}}jOo)(=FpF8H=@JEEMr6XO)ck0SfSA-JM#}SC@L;B?es?qXW7zHO{ z`F>4q+I`3vv;fXYA-3NfkG?={>7sj~-CKoxq_d(xR(ruevHH%5o?39f)?u9YM% zJedTZD_7#?C7W>F4F|Do%dLn%;-0+M(2Rjxb(Q*T+aF7P^0dxJn%aHO>lC;e$v6`n{T?#L z{@5E8E{Qw2j?ld`bm?;4=r00G9&&O3oOrTM^6yhPq+#=Rlv zTFS;a%W3@=w&vwJl6SmgL!Vvs;pqe8%lXjrI&`+vTTLxeM^GG+Nu2S<+XsLFC30Xmb4Av)U6LSq} zjwYQzMpUG@gd2@2hHn$wT6IQa{e$0(n!A#3T1B0ub4d_h9A`vE>x7Mr4qY7iFFXi4 z0w|=X_T1Aa?*u9=tIgIuLP*)YuWolo|2DZ^l@rZWUmGxj;jy z_+cUL$ELMF?fav0U|}22q^1$Ug(P-H>sC((df~*2DO)O!dg;(#r>0UVml7TEb6~dd zj^TDORr)gX54u?BAC~$XYG|n1e;9PvyoT<769TI-ZVuq_@b%8YtIh{+3cz=kaBs z#gO#j=Sn^R6)^Mfv^ig6Us5tW*`2#Js;G}}`uVfD2_571^f!OD__TBbJ+_GoAw8po z$a&8kD+TYj_qZ22#cCQQJ1~UU?+vkW1zvBDdr*zVguq+Vj&4ma(%zxmz7no+cgfb% zuJh0k3z&eC8`4j1RqYlT1Dhq5<*$@g$%J<5`|^p4>F=D9cgG^wZ!DE`P&&6Kr`~gc zq+jQ=-jP7%@GXfVM%7OE-|&j;fMCD+7_NeEamuq+*K5T(7{X|MPtH~0dpCaGzcn>8 zvzZUKuGYR!zZjiUSjIP{b5X34kF9QmbBi%Ime`O4BCv?;8OU+&+8o+B|EVm3J{L7@ z>8ds=dJZ0-|9!?kFv>JMU+cFC>KyFs)ecTwoaL)C$Jfn8H)$e6_9|G+DYO{HGFAk+ z{(zr)iDK-NTGO=}QkN%_#$w5^XV&NTT1zus1N_zfMZ&w^dg59)h11&-;(8(GOGaky zFYtGD5?OjovxC1ed=%*M`88L zj5fWk{^)6{sX#{z>mbvh@PyjzWNlS0$;_z{#DklpcH4JaVy)PvZl6=Ex{q4K#RUGI z$L38>1TkA`0-9fDk>|0AAWOSrz-*tsoP8I(YC0k!oVy4&dWzjB;|BLo>>GpiJgFP* zQc+E31v^kz8x{k-b0A{bm^415eaf&DjmJP`?#|U;nj|?mJ&1J`bxL{msb8C{JppFM`OF7&{rw^8 zL>p)~Rd4iY_xnz{{%xpNu-!kHl!s*3fVAnj_V{+Hratc51P?JQih2nWqzdc236|@$ zsxVk$$2tz*x|E<8)_O{H78)HR3kS{m>oxIG z8B>-_xeL$dK~kT-i#{8ZTqY0RNHDV;_>xe(_hq*)QG0{^5R?PaxtS{ZyYrU=ijl@mEM%x(v=75HvS zc$TqQ3I)HY026)o9H?GNb_7duDwF;7!*r9$-Rbqi{RhKu2_*G$n7$Lqc5~V;Fk56d z{Bm}5=mfb87rLAMpZ`5MBAM;8RXs>s=wHxkBRAh!Wid@@AvcF|k9!&X+wxCuUwr*a zMo7~k(OSvyO{rmTKa-|;Z}&#F=M(MW=1*_fYVO2^vOXp&I?HT{XjAep!gVJcWh6W5 z672KQIavsj8}9Zo$3lvP^Qh1ClwZ}NeWVs1=~WmW?#EMh-0rf(PxHh#R-5GG2IbmMEsia}VUuUbIpYtm!RqCziUHm&6U1N1J-bsnd{zD%wqhErsDfw8T zT75UfKbrO|OrWJ_)Ni|IKYOb+QxnL~o(Ng%cL6`tI;GF%bYFU3EnN;>wp{AyRfmOi zp4X-Y&GmA-HKOU3*C1>^Mi_=GTgm`%XP5-{7LPstCH2J>dg#0_b;Cx8Juc==I2Wl) z4hj5-6;!A>Z?9okUSNW9w9DEGkBa_4R?Q}2Syy_h?cDM3?MI4wygy{r2= zyk4B7tjlMT$^xBs9Tx!!A-e)mj}=qyt6TiS(3qbFiU~g=Y(&@OU;Q3&D zl;5u+$)9Da->}O@LiUp$t~YiOn<#Oj?1gj~#<&q){A_fMAIPrzHZ7l23tz>wC&);{ zw~M)j<|zUh)*L_BSSIhJ_S^k3xI%F`qxyi+6&zkaH}+gXq_R=B@-K*}$+4Nd>23Py z*tPAD?Q(*S3UWSwA-F9_eQ~725%Oy8AbKT;|LjL8?qTKEGWd2LgxiU+vyiI4ldZFp zxnFUm=o;&kWCswdx>7QA6xdg{d%6C}-G%IRr_AcDZ5-x3R9UNK)f06r^|IBa=gn+9 zX0`BADP*0cT+e$8JIC)Q!R93}a>Vt(gSmWi(VYwF3VSVb&0RLHu1yW=D1GJTy(xRY z;Js1vzsE4jI|sKO1n@qrOumNsvmb35ysKra==f zDl2u@3GRSs`e}F*eu8g1GwJ43EUSBY%K6Q4j73m{>k~y$RDAYJ!{m}Qf6mUgWS`9* zTQ1g{mP&Qo6N3Un5#}{Hei38+_neA#$HlZO`^91d|5o)7$mg=AXjh>{hKvV)-Q1g| zk(~u><9Gmh062-~j&$*UN8Q!{Gh!+0<=`4}=62nkGcha_|$eNEFO+K}4VTGOVg%tUz;7vyd79!XFyCmvw1EO_i&4z8wE2fokqxH=( z_Z&knm=o`fH-6(}Qj}3!6s>T;m1^5q%NJ&~bvLWUN~>yaINWE^Tg6!~!~S;YtFBOa zj@C;cLC9(ts1i-Nco#&VThSh^3v$bCGW0tiA?|GXS@98^(LAE2@Lo(e_D5UBHCslZdlkHb z60MY_0#G)$Zj-8KSJrH*tnnZj+v2+Hs(+xS7r<~85_AqEd6!}fBOydCc4V=eCjaNm zSKi8-=6tg7dRQ;<;1B!ya-PcKTPlMTPjy=t7U4{scAma>YNOGyc}ZeXqsTswNi9ZztWG!;$aZU|)(!fFQdNCIaPm$yFnvVOYlS2+>(4l?;2?p%h0#2ta zLi9k-c4|+4o*8leU)={Pc`m~po~}s;4HQ+ae8Iqq#(a`6BWP~AFs*Vs;{`oTlL@}e zSd`C>#B0irHPmp?=eVzJ^kySs-*pX~iHfvp$gsUv?6j8dZI{PqwxbGt9~BepAIVi= z{bx4#uPVm}ye4-0+q@Rcy;azdoon-+38E(t2b>zuYDQ-iRJ$X_OSrjbr$}-n!vE?@ z!@A!3x=-0-6^0RP@8xUG;TP0wSc7mt5?|))uZkL_7V5s|>gqYAd|6Ykt|<72j)6#! z?pB)O_k!Yks$bD+cRO{_5Qj7wuPL-H)R<^npf*R76BYZXcBzEjHZ}o!!L!jik$Aj$ zS@QdD$5}Ii%v8%M1N((vjg~|IGDfE?;5sq87H+V26R^$4A}R6PyLXrF_I}=J)#^%P zAyjEUb63pzG<4^A%pJFBM=ap1U;S)KhNo_3<7kiy>#{C&6#nZG!4v#?xW8<#F;NSl z*j&hOoSQ1>P4FA36I-p`dtPkB zyisKn0_$#AZD(E?tS0tm+Yw%}j(@N7{BS31Cne4;$1nzQOp=Y!w zDkFT}gXbv22`t}tv zHFVH_cWlp3IhjlAln3~;ePM!8!tut6TTSpXZXEDyIsaOl(YLE?bn^<|Jn&+pOEuwX zLngGNQ&-IiPBc2`u6VbxTxdZPSt;3Seg68{-sAdtAO>UEh){0{t;%S@I`OQrr0s=F zPI0AHZ`ohuiGz|(x5{wXrTu&6&|82Uu4C@K*SLfKxO_l!e*5*4LuaP>__8O2gu3nrLRHbzS`0bfp?huS=iirZU3Jw@rOB*>e;{1xT7{4tflqU$rlAD0Ji=}} zdMLskGwLd6O)9;2W1U6&b2j7Z4CUsvA?nH71_}$#dYa1F_A=RS=xGl&nf@YV0;Fd} zlTh5enj$wfHq+Xq%GrQ@TXy9{5)H(=pTvJmG_~NmjIJ=|aq6;KJuMvMJfy~T$LsgU zqxexsa-3YUClM7SYWUFf5cM!uYK}5i7X!ACq1$yUT--p-aLWp-*s4m0L* zv-`H2t|=8_{gx^RYf&tji2m5z)RhKk#HlvjYy`JYWC1J-tfGRZ4nrpzK8CFwt;cP= z;Q(Rr;xDJMK6w>Rc|4;4W(OK==R61NcguJu{19y#r*V3R`bDp}l%vL3!BL0FGynbj zyM%)t41uh$$+b_nx@!n19gLSN@KPe$oqb35J}L$kXiSklRJ*?_&u&ulmjZ3iICR?$ z7OMCfThs^;&0SK}$YV4oHM@qIiFg*XY~3m+KP-YS;-y9NxS(dyw=`Ef_fG@x1=k3d z+-Xq8QXq%AoL%I1w!BqIi;Fu`s$!Al_VTVqRLnrFH;=eftQn_`pp~v!9s33m|F7>> zb*rxx?{+;2y- z_1#V9*vj?@)xl@2rw?5e)VQ0ezcQtOw9uxF2bkEP>?J!`Pk0z0XRRzs(-E{Tz_ z=&4YWh`O)z=9wRV&D8RG>P3cRQ1o*~h*|p>$$E$llgpbo4ATQl^aHe^d*{s;Xg66#6Y&u;;U1r$NohnHc)zcu`95CyQvY&k zR@I2X0P9h0#}DjlD|#7k=kWo14#7ka(bXK?w4~mwE0dF+h`Y^;wU7X|GFjC5ND=$X z>+a;0XzIl9YN}Y;Mgssd@HD(kJc<_`qep$posoZ-V=sOHbIEJzXJ8XV|`qAf-?{pl~z@Mq*-BVR(H0h?lA7f@Fm`{W>bgl^l^!?LjNz$%sAtW5T4jP+3LsXd|Tx&iM}F$ z&WY98yy&PfzU%fXz1j~lkX~)5w6!3~lqrHOr_|g11>rk`Og*QK5*-6(VuYG1SF>9p z^Q81}6nT_#?{|*;4staY_arNc{Vbb9J;hkh>!=dF>gou~f#Ns|`=rs3-lJQ*7g1#4 zs*+CIY&Uc66pP(m)e#|2i&WR@sNy0u2Kr)44!faNTfA|Gdb=S53w1k91i=Y@J6Zi; z*#j!qiY=(G3%72)3Cy%Ubj$4QZj2eW!dY~=*-CwfwUWQxM)r3NgwlvI_(N7ocWF;W zydJ<)PtoBIXG>yTZdOUSW|s>+yLnpoIJ&S`?w%<6p3|T?S{|R)-0Dr|^Ya^7v?LKe zF4>75hxV{V2NF<^4`(FROgORG%k%)n*~@efMfS_I6tQgzCVEc0+xmn*;e`%wjm5eT z3F}6a;|YQ*8af7gUKY0)5`~2Mwwbdtl0_?C$PoYEH`P+pdrS-m@)b5zmJHIAndk7o z1Fsswc*?Pb#YtwW803;sXmS;`uXsu7yc4i^!XATmC&gvzaJv|uPf7Q)Y3{e`<3H){ zEzweY)T8F#7MoP&U$#g43vZ&IKYtY+#Yk#}hZnghe&S>?Kk>G^C?4P(W(`Gs% zsGf}MN7cj|8F0*(?7cNG`wR15fWS_jzRuAX>H7A?GosVt!obiu0yxDR-Mtzjaz#t! zn#)g>V^S+m-aH%1EPZcXgZq4TbdM-u8O*Ng>*?gnF#saA&cOMUtl)vKW_IEjiuX4q{%%=0}lpU53trd%|{> z8-%!SsGZZW`1TlU&2!wD_@x;wj3_ zq9MecOs-gQ(1|LMCTp>aqoU>fo6pPEmKt06>RK?9|0}uj#kNtA^qv?VX}zBP$DxqzBQtQRS*(=<8x#l`b zzx%L^W{G_T!QH4+!M(piqE`5+c)Rwo$`6yn2{K1MpUP{vCoF$#l4i>l`<##t)SB>4 zFsx~NEMyA5nvkgZAca2uGMJBY(-qtvb_f1b@(JIjp;Z zjGJindzj4+HJ`%OB@$U}y{*70|9YpKDqFOam$7RdRv=Zo2Cjn-fsDnVM7lGH0G)+d z3kuHce}+n=$P8@5OSrU2yy?^tRtT(U zkFN+yDlpy<2{LSam zud_KVGmZEX>ft^PrwOQ%ztiJBw{j>IVoI?on#;@pL_h0vaHx6+9|RA53ZXQq{vxi= z#L3M`rg+7ffA~~7ogw#K^nBo@4jmV{-C9*#mA=P~Qag-$F+pD_BguSdX`0|9HqlH* zhBwetzN=VR+PK!!!LYfH`<-BGg&MK1(Nvpn(7~NMe6_b2X+qHbTZyp2V^)mC1W)FH zsBUml+-1+>mZbO|ztTnoM?@u&Ya@3#}1+!?L|H&|SvKsI8uXZGAaC{XD95#m|pw44@Caxn+BDe40#cUE3}k_JTp% zhT7nDx7XKelfa7Gfg;p@X$y& z^iVtESz71RWNWOPhcxB@b#_>1Q!MZGu-wq>&m*vla;qJVw6?H3KQ$0%d!+t_wD8wC z>Fmz&amshLzxGX>>5CboKsVn)Z^CWR{387_hUGKuYN}bA{**-w=Z(KgiMMCec&##C zc;28h=i)>X&t~SNMIa-_`C-D-GD%c2%d+&{{a#C#4(fB0%yqrNV8xf0De{vv1Ld3( zsaE2+Ducxv0*WM4R0B;idj~vY`yYugQ&q9(>#$U!+ViZTy@!H-ZK0n-H5X zgaPv#X2y-N!q+)xY35U1ChhlVdu-qwU2-~8QJZH~pYD!C^&MdMKBUote>-E$-Yo>P0 z%rs&!efq}jl@+u8;Ly5!R^WWIn3Q>IS~mBB$Qo{7AyGe16@Gx-}&SHH9M67XHA>MIU~@OR*{l#BLt z-M{;Wm5UOjf@LNv^wiyDt!FBgy$-ZH#%(SL+3u*Y)ab(`aU(@!0zV3(30z|>&!22k zKo})MpftykYKBsRiKrA){~PS{86nTTndQ6AwY9h6IWX(>U-RfhpVdk2E)f9dQwFhM zp6iVIpuJMzS=8wawO}&EW~1})P~MQc0RJcDTx+N7IQRV=)RnPaoxl1V4reoA3yJnj zz3Ym9AwbGh=bSR^++iivosO6+0)0cTlU<~8TUIW)6@w*CB?3u9L{y4@V$vMWhJP#D zJ-)a)Q@eEF^EOG8B1zJ7CQidS=~X5#%Z77(0mv8X#(tSsf=(M6kfA=l(mcU_UQiq* zB%OxrFzT0PunBxbyktkj#O<(tds>=f%*yhUvZ6b6gKfp@%VEjc+j|b-mz!|eH?m3O zlkG=L#yzw;r;9oG!NHvt&*QZfO?va=x&;7nb%t?cN~9)}P9mZ3@xhJsn4Q%?7O3$* zxL@xJUga_9uzRQ?BWbGKtjYPZd&7yR%j~5^O^DO_fU9&#(yDs>QxNmU(N`G&(`=lv zfj7CEQ$6Iq^}DAnyar2d-RE<CVwV@#`xSu6hnzr_xF! zheTQye(5j(sghDwl6_@S=aWjU;(TpxR8j`eTe|C^E-3>&c@~M~>pgHfb?o#zsUrA3 z-h(Y8w8;Rfg)hggO1bQWF|v=Aeh4JT!!C|t)H58aA2_j0AZivKJ~SR9kn=5z0{D$I zT@!Fk^OXORtcsJon>B_Bh+7RvsF2%(cDQDY#N$^xh1c$3u95;Dh&qnRXhMEEb-@(- z9qh>tFS^c-u)C7Y6|D~SDBmPbD$Bb1iC?WXV-~$eB}SnbaqrXDx|q`^iij8a-W+~s zkPa`LRM_wKk{rmRUDTeW9+qFlbXHjopo$zB(S&)VW?_S(M#LX zGhgQu{&`kL{AEm(Gb|dW&`@0D=NJS|hzLGaCk?aR{pvNDN zYd!*g8qV0QKc;e)&4wGUfKPX_&Xmn^zMO6hNu2NG3slB^0=ruK2^Xe{5K|86jZ?m+ z-)E(VHbzfc1&Q*WQt!+nckWp3h-!~^Lr80eXvY%Zmuyu- zbmQj**nNo@qQ1Y%JC+m%aAZXND^9*+UR~8YUVbQv5Fo3pUC23qYMzOGO4T;<@p;uX za{D9gm0!ucu^}85rt~lZtJc}sNfVi<^U|PprdC${`Xj%mv2X)@W&CV_})UEy4N?A9)ue?%vbA|B1l9<(9|Fm~v{DjnM)OB8{+;yAy z)v6PK-#q|;2+X8K_}%qe{$akn2dM+mfyuyEF3E<_1_V5~V7-ES{jHKGuSzZV6E<6n zSD6*lbt=-dkN=f|rl#2*sS9RN;SC@u<2eF54A-gV#{S;vYl+HY<&Ln59DS)tmn#`( zU>`6Na%PCXu1I3lvAYbh`&dm{ zx*XRm;gbQ+K~^wcdq0DcB z8`^>c(i+w4z#1a$U_K@R!bjk9TbyIjJ zIA7l?9AKkxI^`#C3VO#s%~q1P6?nqh(K#W9M})$Q5jhXeM~1?7l7FfX`tlD*vAwk? zX_@(0rxxdh%O%0V!UvHc;;}hUJG&h03E1HNIN`8W7fvMF5epD4l7*TJx3QUwEi6p! ztTbr|L;k2Wi6{v+MQi>=7#jU~5t%I88Nm^0Emo-`RNpfav`SDWf$;7s3JKiJMvHz3 zIog#Qv{R5e>QiX_$H+LXa{Z5^^LCfR6*>GwII9^Hs2vW^Pw6{|Qg9o(mw(%Dv3+zo zOt0!2h`Y!vs@_RG*Dkuv^lF59TnY9aFIoI9^=+=~-A)BhXE*dwxRS20TJo#$zdAq{ zCd8>BElp%O3Q*bl2VYd4JU&gBEI?T!r3;5{^j7-y8!p=0t+qjE+4H~bEs{2__gBNB z_pk}-_jQNfKp8)=7wV!&(KGyQ^Jc8cbKGq$u-P-$mGG3^YKV8eas(SXwNo=zyfNdy z8;~8Lse8X`$*Ycis5j3*H*RIS9=LcfEICfpkWs~TQvWtb4f~iq&pv zBRbP5rE99BvOuK?*GC^Z3%T%=rJ%_WGj3w#&PCHQX4yj1tlokumAB;DGibYvYSnLW zsp8cO?-Db1+4JkWIrRG(%$pTFK+3eq(I1)uelxoU!Yls%tL6;wmXQ5$nx~udx!A3n z<{IK-fhKVkx)(#JnWJ_2PAcRxw4bZ#?w@qHc(ePft7>Jeaon|hz#(T)QF}Ae*q8nrISB@^Ko6PZXZ0`JR5Z_ zls`wNlaa47*lVUe6B*g;lzZ{pwhz4AR7YYsdmsEcOBQwgzGaxx@XiBY{PB_=yV{+( zU-$te$2A}}|K+(hm!kRIvOjkK@;*L5lrQqG^kQ7@LaeZ|xBS;IKrPj+O?A0da=I|; zp8nw8Ds<$5aCgu8+{x>TXzwk6@cGLFZ^u%2YxhpSS>m(45&ig^FdMd3V0b>7N1taP z&uCVAAoOyJ9nM@p$BdC4ZNv6 zj$z^RMq>VssG + \ No newline at end of file diff --git a/AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt b/AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt new file mode 100644 index 0000000..4e8b42e --- /dev/null +++ b/AkwamProvider/src/main/kotlin/com/akwam/AkwamPlugin.kt @@ -0,0 +1,11 @@ +package com.akwam +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class AkwamPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Akwam()) + } +} \ No newline at end of file diff --git a/AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt b/AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt new file mode 100644 index 0000000..6c2b2a7 --- /dev/null +++ b/AkwamProvider/src/main/kotlin/com/akwam/AkwamProvider.kt @@ -0,0 +1,225 @@ +package com.akwam + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addActors +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import org.jsoup.nodes.Element + +class Akwam : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://akwam.to" + override var name = "Akwam" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie, TvType.Anime, TvType.Cartoon) + + private fun Element.toSearchResponse(): SearchResponse? { + val url = select("a.box").attr("href") ?: return null + if (url.contains("/games/") || url.contains("/programs/")) return null + val poster = select("picture > img") + val title = poster.attr("alt") + val posterUrl = poster.attr("data-src") + val year = select(".badge-secondary").text().toIntOrNull() + + // If you need to differentiate use the url. + return MovieSearchResponse( + title, + url, + this@Akwam.name, + TvType.TvSeries, + posterUrl, + year, + null, + ) + } + override val mainPage = mainPageOf( + "$mainUrl/movies?page=" to "Movies", + "$mainUrl/series?page=" to "Series", + "$mainUrl/shows?page=" to "Shows" + ) + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + val doc = app.get(request.data + page).document + val list = doc.select("div.col-lg-auto.col-md-4.col-6.mb-12").mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val url = "$mainUrl/search?q=$query" + val doc = app.get(url).document + return doc.select("div.col-lg-auto").mapNotNull { + it.toSearchResponse() + } + } + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toEpisode(): Episode { + val a = select("a.text-white") + val url = a.attr("href") + val title = a.text() + val thumbUrl = select("picture > img").attr("src") + val date = select("p.entry-date").text() + return newEpisode(url) { + name = title + episode = title.getIntFromText() + posterUrl = thumbUrl + addDate(date) + } + } + + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val mesEl = doc.select("#downloads > h2 > span").isNotEmpty() + val mesSt = if(mesEl) true else false + val isMovie = mesSt//url.contains("/movie/") + val title = doc.select("h1.entry-title").text() + val posterUrl = doc.select("picture > img").attr("src") + + val year = + doc.select("div.font-size-16.text-white.mt-2").firstOrNull { + it.text().contains("السنة") + }?.text()?.getIntFromText() + + // A bit iffy to parse twice like this, but it'll do. + val duration = + doc.select("div.font-size-16.text-white.mt-2").firstOrNull { + it.text().contains("مدة الفيلم") + }?.text()?.getIntFromText() + + val synopsis = doc.select("div.widget-body p:first-child").text() + + val rating = doc.select("span.mx-2").text().split("/").lastOrNull()?.toRatingInt() + + val tags = doc.select("div.font-size-16.d-flex.align-items-center.mt-3 > a").map { + it.text() + } + + val actors = doc.select("div.widget-body > div > div.entry-box > a").mapNotNull { + val name = it?.selectFirst("div > .entry-title")?.text() ?: return@mapNotNull null + val image = it.selectFirst("div > img")?.attr("src") ?: return@mapNotNull null + Actor(name, image) + } + + + + val recommendations = + doc.select("div > div.widget-body > div.row > div > div.entry-box").mapNotNull { + val recTitle = it?.selectFirst("div.entry-body > .entry-title > .text-white") + ?: return@mapNotNull null + val href = recTitle.attr("href") ?: return@mapNotNull null + val name = recTitle.text() ?: return@mapNotNull null + val poster = it.selectFirst(".entry-image > a > picture > img")?.attr("data-src") + ?: return@mapNotNull null + MovieSearchResponse(name, href, this.name, TvType.Movie, fixUrl(poster)) + } + + return if (isMovie) { + newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.year = year + this.plot = synopsis + this.rating = rating + this.tags = tags + this.duration = duration + this.recommendations = recommendations + addActors(actors) + } + } else { + val episodes = doc.select("div.bg-primary2.p-4.col-lg-4.col-md-6.col-12").map { + it.toEpisode() + }.let { + val isReversed = (it.lastOrNull()?.episode ?: 1) < (it.firstOrNull()?.episode ?: 0) + if (isReversed) + it.reversed() + else it + } + + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes) { + this.duration = duration + this.posterUrl = posterUrl + this.tags = tags.filterNotNull() + this.rating = rating + this.year = year + this.plot = synopsis + this.recommendations = recommendations + addActors(actors) + } + } + } + + +// // Maybe possible to not use the url shortener but cba investigating that. +// private suspend fun skipUrlShortener(url: String): AppResponse { +// return app.get(app.get(url).document.select("a.download-link").attr("href")) +// } + + private fun getQualityFromId(id: Int?): Qualities { + return when (id) { + 2 -> Qualities.P360 // Extrapolated + 3 -> Qualities.P480 + 4 -> Qualities.P720 + 5 -> Qualities.P1080 + else -> Qualities.Unknown + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + + val links = doc.select("div.tab-content.quality").map { element -> + val quality = getQualityFromId(element.attr("id").getIntFromText()) + element.select(".col-lg-6 > a:contains(تحميل)").map { linkElement -> + if (linkElement.attr("href").contains("/download/")) { + Pair( + linkElement.attr("href"), + quality, + ) + } else { + val url = "$mainUrl/download${ + linkElement.attr("href").split("/link")[1] + }${data.split("/movie|/episode|/shows|/show/episode".toRegex())[1]}" + Pair( + url, + quality, + ) + // just in case if they add the shorts urls again + } + } + }.flatten() + + links.map { + val linkDoc = app.get(it.first).document + val button = linkDoc.select("div.btn-loader > a") + val url = button.attr("href") + + callback.invoke( + ExtractorLink( + this.name, + this.name, + url, + this.mainUrl, + it.second.value + ) + ) + } + return true + } +} diff --git a/Anime4upPack.cs3 b/Anime4upPack.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..13a50c50a7d0d2ace904ee1b69f6d5b824412790 GIT binary patch literal 15388 zcmZ{L1yCG8yDd(FCb*M8a0~7dG`PFFyE}vs2oAyB-Q8K--EDUXE*lnK{PEvgx9Z(j z^=5j$p6ThH>OSXu(=$`^smLQDp~1nudj|&x_YDrQw`N55ZO`#-!~9Qf>SSwW>F&X5 z=kDwzJRyh{^7Vt%d{4K)yC0eY4TP?!5=1oVdBh{qTV45P-W}PvDc(0JmR93>GV&S=_Q{hw%oSQLQiQvSSM>8(bctcpGZ@;d41^`7D;lMe(W4$pcKUVGH6LePYK< zLg0q$p47Y-Z2DL4gP9Zy8Ks3gnR}0eTz+?}gQ*No&btYBYF;3pqOvF4VrBMuW$7ec5o*wDm?ZXOH#1xlvUm2E?Ir2jt9P*N65 z@51TAYVq=k%z)*&jx&%%QcfhaHV8nx7w@Ztbk6W*_A#UWt;Rj@Re2h0j41|x$b0F!`M z6d+s>dN<~pf8<06Nj_#f(Hhnnk{3KRfX{{81)-f7h6H7JtM3Gc2b+Rb!Bv1hI8g*6 z6eGl-_fG_G9bgqZ-9ZH~n~2Q8H6vDqa0B365TPHSfndjc4@6beukW@ngixOF(y?Up z(G1|X;Io6^}^kvG_0oKKfun0SsyIu3#*%KEOG2VcLeo1rCM*C4=&O^+$KW zB!j0w3WC$||9uk56dDgdi|`8X!#cbM7YJYn<3TZ?C}1F(p%|$PasrYFMgR$n}+WPo7+9|Qk}92_=+GF%-(Fw&5vq)|SO4N7MSkqcQnDhvyHE;jGAh8~Gn z7D9>eii`&l;|Ftqk>1821a$^>76c%5@Zr-Cqr5af>h zbSMX-aY1||8Qn$j4XP$UAb>D*G}IZ94XzHZ?+x513LkVBC)7LtlChA$1hbxE4gL)A zjcEiWgggWh^et>5gaC3MG#?ZgJk%Ua2p|C4hcq5DfEC@Ic`4JSu>%!oI z3YE#Xgu8sBlkO{m0cJLw2*TF;Ep(xGZ-PM)LKZ^pMtZ{WLG{5-CkUnZgc5+`g8}1# zQb8$0gweVXO2qJ0(3=tMLmb60zQe7;(S-_zK8CWv$0Hac<{}3nJ(0ne$=6W1 ze0Uv%YGfY7K)?s+H?Y+kJMMr%fOg1XNFH1r;yJ=Oe61mr#)Loxo*C&RG&*!L6z@ME zKxN-FLJUTIQ&turFQhHB57Ae`hVm<=4pKErXQ(1T3yk&&;S2=}kr$y2(HMyWJ{K+* zr5F8)2*v;TD*Lq4mGz07aymrKPY@c^NI6m+`ANdfwvAU6; zkYP;VwJ<(Z4fv~2J(KtK$n6-B2>u~RE=27V?a1wzFs^)4mR@VT8@O3S7xW)`8|Wq- zWv3y#fE&Pj@E`ya5DQQQOao*>;t}XV^+V#}DN&t}oe-T+Mc}vK18`tmE_84A0^&Cn zFuVb_4G;$Oyy@W?fCvZ!9FDKa3%w~Gh6A+(e|*D<9n92y2iJ=hfC&?TVuIg;^Fo{v zlo4Jr0?^;&Kmy}&A@M=+A$XH08PpK${~ynTd%=f&d?VBxOarzA(*cx2IRQ*>PWO}!FcKY0%>O3h?tk$3%mKtV#{h0y;|euRWd99@nL86 zC)X4wjVH?}(b5G7_+0y#TR!&IrIYX&yYgDI5;HrFIFX8_j*_NQrW5` zPwJswt}kIY81vX(<6)Xv_}pUriG|5g*Xp`N;$}ZYt}Bh$Qcxo}zQW@pOmV6`-SJW}n^WjA}m?5k9#_7vR&%l@ZoxoWi@aktw8rbOBv zSAk$yx3DCYSgTyDpL;R9fHeGwEMIFE7>Ysa$AjPXeA=Lx};9+ z>ORpmEzDY#tmj%~Zdz#y7>C5vE;v&;svq}#uBm7)qE>G$r(UGUB@{2QwistV8%uUP z`+5LOXq3p6^Zs$JcFavqEYh}EvEUH=XV$S5Fetq~Iv0`^?)qF_9OMVTRC$>(Lc_gR zEjLrS=KvL=WH*!wlHIi7A%2pRBE{=dRgXk4Q)Oc37W5`V4qP{CH z{*^1VAx+VWd2*BFDy*$0VVui&sNtqW^FM}_=1|S;e~gx!)0pOWyS=W(d+Eo^6ocM{ zw7TnkruzUI_CjO$n{Uqe6Zh;3vi;3rB85kEcs=q9(Z~J+ z34(}v7$U8q`4S7OFacz}!ikh}H_i()O0$RHZ%kh|gk%nPJUa@Xqk3zOUQIJxrTr=%%RMtA;C9U%4DSY;Y6xn}a(OODqDiYN%c_ni5N^u@N zF;kJ4DYzC~@}!{J(K;rS?hw*sjW1=g8{<#ORv-T#BR}4eoc%w>Ha6LviN7uBzs#ie z!+*w@G^zbOq3uR7)mXD&tcS-9Ga9~AODn9x&ynFC$Zv^Sk*!q!Q%u4wzag=y@uC@p zMc=7SWdD#}Ty^wb>Q#1rF=?ilFvZxdN2K|b#J5LMtzRH7sUi?6{`QX$gB~hG!yfGW? z&)o7o;Y&)!NGt>I9`Itvd>6&ilD@S~+?%Nt_0UwlrCc0M<%*;%l$pWyTr6yo)aJ0> z+9O`PK)Lxc8bdjd)-`dzKV6t8dX?ZQQyG5JjC3~(N}t-Yx>SwEmvlXww&I|Nm}0Gm z>S7)NWC2vpUAMUoAH_e-dJD*Mvs7qvqpm&asgtK9l|@X*=d)ll+enyF$4oc+j$V1m0RrTn2ASj_A6i0%n6r1)!Exb6gM5o=WFL%-Xx(M zPbPI9MdWMu7s?}#j%Qp)frV9t0~Mj`<=Iwpb_Up$r{Bf`ja|sN4=n07sDFmqH;nfl zhqyXUC%%5YJlDMENttyFs@NV2et!>AyT2v7*Ic9TtGOiSzs9ESgXX*Dq!m5YjMb^% z&yd~s$-H2toKGb7oe<3+GlFucUzPSmt1qwIk7Zsa89~(Mc(cm8#xXa+A0F9Lj1!82 zd&ay20PVMxmy?Z`*wmusmw|Gn*glHOph$`S^oc`ZykDySa;7eY$NE(F2^q=J-vkE` z9D5C$V4G0wBaJBSt9<$^dw*cG89J!<_&H8lx>vO72_rerbF979)UaMfTH82HI*UE@ zgMD1!bQgIAP$}nZa&nkvZ}sV+cSaMB*+V`@z=$NnPetnp4;zRzdk0|S-m`j`TeT^h zZsAd9Q|oELYFs7uyIZa;$v3I7KJ~CTURo6J-IB4Z(QtM(A6ctkaVSpAM>IEWo=&2f z6w#|yEOUFtNp6^T*iIOiP!tL#;3c&N244OfIA|v${ZY zMA#B*#)QnKUWG!idh%(_UK{KX=J?o}Tlip9wo<5DaAj7x^4P+?R3&I@3^8i%)1H*L ze>V~DGYDm?4OUs{OAN>q@=0KCyEF|KvP2ar(%$R8%)3%O-)24Oq093-_f$U*q&VpT z$@XCHB|aBF-(LvbM)oQfrTL~Mu+6^5EM-|YetZ%+Ve(KlRu#Fy@2aR9k_d#SyGc1n z6eX&AM*1zJJi{JY$?j4%3O-}^tYmMgVxLxyw|&n%9oSjC&Sy`uJ1p2YU6?@dE=XGA z^H-}(cB>}a+BG((U&exxANiZjPFSvskX0F*z6^bb!W$VfTdp8}7ma)eZjJL1jo0c5 zv}~pL`vmW{IdKL`x!>Kp)yA7iV!1hl5bDp<@(yHyAhUP=Xz0LVaU_I@nuN1WGAv4d zgCG*`VV{Ue=}8h?`P6v#fNC-0-F~6!4}l~b5u7c`a_L^Cl$u`4LKDu8jBJ2iR}+%% z)}?Iy?>GOLs2_bgrqi3C45vZY-{&;0TA77MXDFIjxvjzvi8%8}nuNHmq>kC$EBL+4 zIqM(?=^eILEc-<4BHy(5IGd(q-E(gL2+d|&^mTQrl{g*W%qFqO`Z)hxFHJioU()9a z^NY4ta~}6-M4f;f*&p97xNWpKW@|}r>xGpTA$zgSq87D@SOyE~Icq}hW=5_X2WBC2kkxGf>(x>(u7+xNR~yT2?u3HHSDj!rO>SqBh10Dyh08#(! zh7s1hcvtCoZB_tZ+N7%y-#*{$C?DGh9~<8+U)JgImV3+<8TZV+U3S%MCbf1r?QG(& zJ8qd1OZkawo|yh;zR~s@V4+@&EBQzpt$iHVQ~bfZTl)V7y*d<9SqwQTYbMv49}rlp zwfX`18L;Dk!!e`b%61NQgQ#aUC_BoXt7p|KV_HJgc@;X8F-ule1l^{(NdV`Lktck% zNP|X4Hp8qPVoec~;c0$t%~ZL~3%y{vx6cwMH3Ek>PPXuE`^^7vPHtEdx5VAhB$Pv| zL8-vOt01toRRU?$o;7KO$>C z>;;+?TpqynGD2K<`Yh32lHNZFig)avW9+X4Gjge7gQ$7$+`B2S(L3zr?`v+WMjWF{ z^7Qs{0<%vgekpAEw_JB>oe}GoV^dEAS;P9xKM$q_TQ#AHwye1XEhem3$h~GP+u1fy zS?;js_ALClU0JL&3@nt&%~E{vUVK`4|3tX(M3Yokl}#BQ1GB(RUBp=HLu5HGi?ut? z$RG_kFPH`Wy8nnBgvPNh5JbWe(6G9Rf++#^U2un4AM*>*I+~~6TaNJ!Y5{n6fl7b7 ztW)R%89<~1$DjXgvxgq4nhyvBlXBdyKXz{}JX!>m_IHa?ol{lZx%ue97w+Uh=^ttK z>rtgE7o68uABp+1^i1x4-YqW7uKjxKZX5I9_XKayYLgl02M{b00=0O$mo{0?rP81J ziti_B`iS@g*beGG@9Og8`GIdP@et1mEH~^ju>LaZl#RT5fF_WV(=jo6pN?BLi8R_(yNZF#JE z_I+&4D?GX>-4aM`y4GI}Ypfxw6=(F$@YZ=k#@C{}W-Fm}^QqB@`^a+5|4v4zJ9etjo--|`+XPZhiJ#81gj9rtlN`um9uO6td!=_1luBc`6 z!s+hvccVZZ0!Mb#>ZPGxS6iDHr?%Rx)fw8`d{g@m+W2b1jXz>{LUVQxU>n8QPiYPz z3rE%n{4IA#D1jpr?w|EEJ}4?wjT*M9w6aE!A65K6$4Y~Di< z5XH(SmIFkzq4pm^SqjcGxPaX3>j_S1>ZBI6jG8XHO`=^64g~2B_$O~#Df@`V@Xva4 z|4pai{S#CHcjFCUe+5bUiUhbe^o5Lmr1sip@Pl~LX^n4RV@?N6)iv ztWrZ)W-hP)_?(e-x5@TA{&?IYyKx1m`BNG-`PQZOU`^^Qb)a3WM@r!r%lmmUjURr- zg6XN~EC$(y=WWo!Dij~yl5NMeI+H7-Q5Az|i}ig4X3)glGu@-j2=C#%-#j|`KEk6n z=5AGqFku#rOrrEHNS4yb^1+3le~ZsJmq+;C0hFA3A2aCaQ~F%O5Qx{6DzYv2@)r^b zH=#VQE0Y+$^o+Tvp95WC8`PR%R+jSEqFYn9p3J!PrFgHMv66C-!H$)C#=7_~gE`B% zv?g<(AV(O=a-RmxNqc=&|jXI_GvjG;O!`xANz0i zN7pXHt(~!}`Il~0{*96Ek3OMzBdoc1eqe!>?JB9;m!O z_(1POH_$(fS>TF~ME8C-l%xJu6R>-MRXrS*1Q* zdpPBLfUUqk>mapc%`#%Z)Srz$=jC6)zlo6UI2`Hn_M|MuGqE&YGu5D#&x^IT0I!I} zlF;L%1DWn_Ok0L3@%a;}B$@(Mb#w60cwTH)7_ew#0VM(Vwi`HfS64{!_A{r)hg z>e#^M;SuXQ|9eSi`~7D~JE%oD=wuAS8ZrDtafaGWK{6@}2h;*f$;<7mYtOrcZcb}4 zw7It5nlIa$vHT;bXA<(o1N|$pd~w6}_lgRN*UN0W{P@^Ls62sP@f5Jvm0-;CIq&tx z{wO7=)0pL7&*L5DZ2i#6*M%A2yz8rrfd&#Ld$ zquBP)HL*u@tpL8nx;MWRQ3_v<6-iZh)$CY4+9jyO+92h}N?8x0^@;J-pym~HJsEOZ zzQkQWXZ00*H$Rvff2p~2#@0qWPc8m9?6?-(5w4tWZ;qdFhwO07i8H%@_PD;dwBe(i zb)oy+99ugfcM>^$QW5vS?N9ckq8n@4SVzo#xJI{EZ|3B*u6xIO``w~sds<$rb5KV1%Bak}7wzO=vBaQQbxv;Fm%*x9%{ExS1tef`gmrcv+R9tV*@MA;6 zi(*5=HkB>`$n)8;+@imL;6c;#FE_edPgbB~VBFRWK^eJrw|r+>Ww7BhQ-_3}=~-9f zo%pc&$Un^EHOJhL=c9e z?DA3rR@CQ9$M;FSH; zcpetmvn?cX6^Nv~K>$+NEVTa-n=5yvU3Q;+rONVWOi!+YeaZ3aK$pF5t7=Jfn?-`D^ z0)$G#J--g%atB^K=C9CpK31iuD)+EV<;ON1&Bd7Wwk$lS4LZSkz7_Cbb0hKwc; zUqK^s{WVbn!boWG3n4@k;<~-qYcnq-N7802ENFGDU~Ihd&D=~-^4>8UL=g4pfxY}& zU=|BW51W5jn|n6!F7X4QZ@CyV)C4O0Zk*yL7-jaR6Bf~WN*OOovUD};qTC#u^4wp( zRi__R=p9vvup2xXgSLIuC=$F~t!ugTCH|XPs}gYft5pA1TuY|C=!0f{EcvLo3Sc`+ zo8CdIL1I>>a3izsG(UU=p+{vyY&H4---uVysJI0K@arrdZ$-3kVZ&rq35V=yHYntEA2K|71^-P+lDf|!k#9R%(!ME)B2{- zmtbeY>Pr0gu-)=s#|@dfT-#-9gW|<5J;Ivh*~Z-|$U+?AFLJ|9Ksz9tr24QCt$Bix zrSjOxVhYEoN`F;%2n|<1LA6@pto}p`om7`i`qs0_>lA^fSDECHc>6gY=$n`On!LhL z>gzds>i78EIkIa=HM(hRvaDyNaY7K&PJefToVT>e-9~?{6aMd+LCI?RC~oq^3Q-rm z+Q>e!MTb>Zz~6Cs1bDX?Fbu+!4XMBP}h{aCQfJF7JNn`mBEp2+qap(3gHNNFJx}h#qAqQm%Q~2<{pzyud0@OQUa*W z>(7rZx`vQWh;=7+klkb4zpRq3DDIt`ojxxWm{6nghXn)9dB)S-&Rg4_t60KwhCV@9 z$9kES!-9cv1Ia=CG0$oAz`3?p{lY|3fCcL2W#{j!DVJ!e&PP*>zv65Cuk~(d?m+ws zUu|Y|7$J0vX=Do*i~sy3p#SQhR1KnmjNij?=btiAOL|bPE%R{GUtzs+L3XCnQ`V{X zIlkOS34@uulXmJ&pO=66hOdV#mP8V%JqnIWe)OgY2f8aYXSAJQs0 zo{}<&m0sp&52^2hNsW`1Nwp}Jz4zYVyA~lFCp}~&;U`%guZf$o>x6^9uxyKXbj?Y* zyvti*DJ*Yq@asmYc?A>NVhc}O6pK6@xm`p88+-n!EK5gp%2D$vp0chkM{h%q&ok#!-`CFyrvpT!}8(l<{;t8_W)UazM0 z;2JYW#&TZ<=Y9cO0Idy^|dDMgubGEFT3a1(HG%^uNoeQbV%MJCjoS{A#Wu9`h{uck5+v+GNa1-RK#% z@)?TB8Ht6GSY#O{?@>9W=?=u>P`pWD*hjP~`7|)O^Y5{_)UTA{5-v-4)J?Q~Egj3* zmT5~PazEy@oZf9jth=(QANxQpQ&({L@3ZcvrW}sVeNTXsliuxh!-6cg<@%s$p2n_T zovL}yv^{c54MQk_V4!jE!_>cn-sfd?b~e?h{*|GpwM>W%?nNh7PU`PEI>Lf z;1n-lb3I^P=y4-t)!z%4X&rYucA=QDn@4qsT+(QX{hNy_G+72V9J-N*BtPrm3M=WppJwBQ^wDX z+CNG2rkVNAYj1PbgMIAf*z^$yU$F*zRGKH;TdL}p^qsW7**G2=hJ2Ey__3hzx61TR zNe&Vv42%Lwr!fpI1_{-I?hVXnIvE*1?2)3ZqOiRL1)Bl{&XVgyXPhGM&WnpzlFh$$&pNSl#un!s53?$O8PjooeK&P5y{C}}$~)Xm~Xw9qju?X)2# zS8$?a=aJN2BX>*DBNB;$vs|n>TU2=BE8I1>yOX&C9jnb`sgQKA&?dcC_@~3jW6&f* zmN&J5qu7#YB<#%82MH;4LeuuX!-)A8UTFB+1<72M^Q({mfo$mEq{CudnMmbK3O_m zeP{l(IRFN$STN`kqWt+}_ED296W2Ba7i;==^Ng)+@^NIwh=0#sGpn9ZUUu}MjQ0u| zP&e#)YS`3kO{yWWf1ZXcnjJQN!inAO24NaC=65~#?c4u#FG8AKBCMgOYpm6WzQwye z3?X{gB~i+NN+3zESk8r?zlPYA@?-Goo*f4ivv>*|Wor zkBKAO5)?=^kdC{B*WpgplWz42(`t$Tc_$r~4*mA?Rm05T6ZeP&QF3R|JF5N-OABXZ zDg$pYSvyAU3`!%jxw&py%SE`RlB`?$x1=X4J6yBLlti1?HP*`#-$C;(GwSHO;_|Q4 zaxrnERP#ujIY}K9G4%Y}1{>Q=Clf$OR_9ok88Z)AC?Up(7t4VubwkpnR@}eXLAdV5 zniDstvLUB^NRzJvfHH9>_?wm?q*;^U=(tm7&`i~zr(81^Q-@k9H z#_RXw8A;O^dEflKJnpI?>z|u0F;M7o7{_h9aQ^%zmuo53o5jjp!KL{9McO=(WFOZ} z?h{tqJQ=a$z(giDe_C57PbPOb5!>wHbe+r;zjkj&xQSHC;Rmi;cu#d+0sAJG0<#-J z+7*}2EM1=pMtJmGjSBX3I4H<}dz{B&YikZmf4wS9oXVUDL{}=1aOC);Dv~mEq+|9e z)1l~I{hfl*m5%PGHV4w_sT|X(C7w)Ssn*PvQ*fvyu2kc}iSDvfbV>0qp2|exFjHU^ z*_xn1QLFL?a$?1CG2_8hap4OaDo>Xa1RdH!Zicf?yQLMT%*Z&5?4n-`Xw8d-3~12W z4pAN))hbMaXg;>umP1@njz-Q`d1jH-5pcC*yzXGf9$lO}si8+LPGp?E$p*WR(sIXM zXUzJR^wkVa3yQuK7HhYolX|OQyiI8i<{{23kGQ75SY8=FE{pffi>r=7Z^fg~ikjLP z7=4B*qGr;E*)t)Wus3fT)B$N_$WC`*7EqR_6&&P;v`FP3XpR0VvRcX#Z}!fnlOyHM zlc#6hMQ*htE+rP9S+{B0LVkZ`#iH9JMA4Uw>!{%!Wa@y7vlF^xW9BO~LLhXQovHCt zqNAhJLM~*AOm!ajJ$C%)t%b~B?ME)| z-;ni*9T$#q2`{XSoB5?Vo1fY@P2rs~^?x+vtPaPFDYrN4kbDv|G9)bI9ai5V$Rcdl z&ZMvqmTPw3$e#~wlz+7c^_qEj@R6W2aYc8y(Pys>j3n*&d);t*$IWz@HWdGIpWdqjUz&}N%`>TyvGq+~%n@a86;t-m z4i7#YG<`*r#HHRbRft1exH_4kOW%G6w7taI6_VO3p2C>*-ESj$T+4+5U%vBA;;EAZ zXPM@MM1DV9os>JzHv6j`q6|VA(}(${<7ihRaQ%HsQQRl2M@nL?_L9Fo3Qte%a}qu= z(yZz(4S%B-wCDUW2M@fp;*72TjM~?3?SUQfghE`8LpH(pP61VrN3ZFx38URR>vR8r zKb-uqcv`RJv$)a++yME{OfXverD+}@QjWws9BB(?&SIDH$kiC==US`fBfy%`l-Ix8 zz3$qb@ znjWnc9gT5aZS|To^F5_n88(`~Q#Zmf8F9(gf74nwC9cOLNjEO<6-Y47n?>=alj-CG zzqeH4-Hj;}$Qvqks(x3_O#ZG}F97{9@7^VjZJhDW}%EZlI|?9-n^k z)3qkGwq#w`Yzu$C{xrWRky>*py{NTYn&Mg2ZM~mVtiN5eQTfj#Bfv8(TK?as2;W?~ zhOlPxxz4Z~$k%@snm2}H6@~R|qta80ysn`9^BCq&+B(}x+tDw05vVAI<4qLu?HIRq z8kt{&$$p36{`Sa-ZzpTlVav-s+S$R=9UPgKUz`O*UQv^hQm)BR6^G-FDM)tR#umuQ z^QFioGzDLWZ1g4(<&y+$5Gcf=99|-(_RM$mzZ`*Ws7SI&Nr@@9!%m+YmQ=p>^d?b1 z`>-bbme4n&jC4{czlq-Zy7|{5E2^oEpzOS9W^7#R?$l<6-;LAzwA{_E;o7ks{bOa{ zhXRz$K#>CU54OeouORhbexSCfsoj!mNVlvWsqHlK=ySDxsI6xP$w_1pg3?bN#iqp@ z-D8x?Ol-VLstIQ_g}AMJkNAW@K)bv`YUn)d+iexBzq#2Fj=Qw5Sn4FiuW_twkTu8{ zFP4o&9^=n)d*FGTBr5nT)4;fmJN1`F3d%>=I6Q%8uL?GhERm=QMU9IEhqTTBpOm+Z zlG5tO^rTiY3CZTBC{7&aq|Dd*Y*V2`(;npYv}`u?f8i%mi8@IA*7F~J zvG6U4S!O2^ZTAsv$74revyza-QKy)J~!@~A>Ivz4$a9?Fkv3Jq*DruWk`A?pxt{U7^wXLJ~AuC zswa+f<-yn}ewUW>5w_7%$Arr;>c-@MqmovF)g2SiG$g`wD&r~PSZlscY8xm49bR5c zUC7qXDzPbum`L_XHOMg;*isFMmE>^k*ge>+{35`So zh+@Aa?E~Y?efF;*qsDX1UNdeHb9fvO-}jknWj!1JQQ4S;a79T@w?L!M!lG9DFGJ!2 zeIM@soX1MA3;y;@j{lxasr@fSk`OD2ppF_{l!Ug;Kx`^7QZW!l&33hpEvS5~bMmP} zL)KJ6Qp=6iML}fb}%N{*)f*r%`sjoB2Sf6OhawKNuir) zEZjNKS~1N>n#4I?Kt+2zAOPu1#5 z_4W^(g%u;+zJ^sl8Vg!Fz3PTI%tYg|sE-&+FznLANs#5Bl~+^BZ~!b5GfVdo$uhRubI1*SJ!T~vw;64;;x2tn;k6v3Thl&>pdqPCc0^!g>-c9e_ECEmwPl5Ig@ zPV=HQvvVv1W^Ivqr>T0b70*q2<#O5c2s?fDoIk^z7A}ART@)lZ-c-cpK`|g1x>a|f zIqRi*uOzhCK3-%wu1SGO*7AFzs(FOvg1o3vK6a8w(oP|@)i#8(iw7<6J)i>MRjhM& zGshxz_TipKrz#{3ag%eZt9WZNlswd#RAF1i#9$9O=p(GHdCIGNjkU7|BzA}J_dRA~ z4?NlycMAJKy6}$C2S4cNfA9qt6Kh&rA)0w(P6zr)o{WoBMIUMX#i<=^e&WaS;dd$_ z0nxVUOYJ744(;WvghU+TWM+#m>UG9^#zT8ZwUxdBs>>KZ^m&ivSn`qF;{N@m-}(z$bC>gx>Q$V zl=9a<5*feO6!7vZs=0VKt_z6IWK!Rd&8SS9OkSa61=PlDbv6NobbB zMpGU^LMgsYPr_~Rbo^c0TqY))9cR3+0Y+Z`D1!ISY@yRzizW*&y{6GSgGG~mNp+xb zMJ&gFqQp;5iT*N#Ho&}i`@3#?tx|W(f^aJ6_*{gPP2xM2gOj156I$iUKL^DdU!}4Q z!czmdWwNItq6nA96pI5Rztx=-xSGyEqJpH-8%oxh6W;SwTF^QiX!TILMDwpJ;NP?} z-;}Z7J;Z&5?EDZe9aQ>RTJN4uVI!(JHa;mZMa1 z-f{n)QpOt7P;wux> zg%;X|N|C(l=G_|1U157AL^~i6nq&1#ILFmldSiAfK|)`vpXK_a5@wVb{k7u9qj!PgKh3DFi{EY2i2F+(IKy#TK5? zqd*J%_A_Wm{ZNn}_1hF(Q-c!M%ExwYC=J&wL2acfQth;^G=BZqF-~IbM;%(4maQb; zgemL*gjAg$|HM6G{9nJ^0na>Yqs9h|7nr`2p-27sCg3%7sTT{)sr+2^fnYa_-6HN+ zwv3%8sEa$9j@g$kgLmhZ`&(o#hTf+;hp=Vu>TfWka(ob0uRc?N_evrya}a%@&|YxS z`f*nav2SqLT!r*Io+QIasv9XXs}zbzAPFP1XDMbxr?kx8jN7QTbosEW1>cV1{dNn`P1^-d$goNH?@wl`P;un}hw z?u@E`dw2dk=Pm}pJLxeEEfR+HVF@D}>Cp}4*nfXl1F>*nu;X8E!e|wnp%%7i+HZRd zuU3GC_u*;^Q#572%k3QUqJlkXK_sDZlNYyELw|#V2HjjoQ9c`y;QZaG$%F|XwXh$d zP{6-B3vyosNaBKs7KVDd!rwwoYtpEkH+}!Et0Rx@uD;5nfM3wX(@Htd#|66+k&Kk!Z=9*{66=IS%4JrGF$wpJ2n>Y( zyj_0bJrE2R_!iegA5+y=5J&1ux|`8m!+0*a1$#VT8^R>d4id6&>@ z|9Fgf+JB7U$hsr8Y_#+a^~QkxND4H~n~yU-n{3`)WvpW~JQs&*foOBF1=Fm|qRFas*NbXFko6iuGG?oWQk^67&QV324Pu^e+!&S4Qm0Nw!1 zD==Q^zV~50!TZP@rwd!H6}U2+N3^n2vvF7*^*K$=%^qhpEwovdoRdthoyb>ishelG z21x8*fpT8y7S7#zcBQwwMq@kgLX9|UA4GE*9*2BNb6-6`@VirVB8M;0d{avmm0WQ*;Ui`7~C6xx=|Cy&Um^H)j{3jQUAqkkjpkHu(>Fw_*;P6EI@svf=uZ*FGM$WlnL2#NZP1f&_zQ;Yq=*2J# zW?Dp9?OnPcD1V$&dp)D!XU))aN0G}Hca;KkoBI-osiiiabTlTmo13T;ts#1WUa#!wG{x}6PYbV~mc%Cvs>X5uLgDd{YG(Z7Ct7!#Diao zNU3AgrMEBi$^4l`22)t!z6-cY#y!DqSZI?~xJog8z5K+A$FCem)Vl9G2qN#*I5sY| zi73p;XCr41S`4YXZ*x5t9so(18PsVd2QS`YLA!hn;-JnGABBT|1}`QZB~nXwD9Xe> zRmG9q56Z*_^a9H_T4d+t@dEAD9{urOopl3VtoiL?3Vx46PSrii3e%W`wdqf0D+i1F z2J{V%cR~Bjd>EAAR*_umwfIf`WalC37szQF8pbR5e(Sd^;}2=_G6Z_kJZ`MG-db5$R=dWx4o0ecmQ44;=DX5UVGm2WK3Xka~ZY!K9W!xe0L zpF>IY5Ue5(kAR2x|BuOi3yJ-&r8x9I+5d{r{ePSOzoE4M-4G70IP@*H_Wus7Rgp(V S`Ois&x7Fhe literal 0 HcmV?d00001 diff --git a/Anime4upPack/build.gradle.kts b/Anime4upPack/build.gradle.kts new file mode 100644 index 0000000..c7425b6 --- /dev/null +++ b/Anime4upPack/build.gradle.kts @@ -0,0 +1,14 @@ +version = 1 + +cloudstream { + description = "This pack contains Anime4up and Witanime" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 1 + + tvTypes = listOf( "Anime", "AnimeMovie", "Others" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=anime4up.tv&sz=%size%" +} \ No newline at end of file diff --git a/Anime4upPack/src/main/AndroidManifest.xml b/Anime4upPack/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d2fc28b --- /dev/null +++ b/Anime4upPack/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt new file mode 100644 index 0000000..bad110a --- /dev/null +++ b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upPlugin.kt @@ -0,0 +1,13 @@ +package com.anime4up + +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class Anime4upPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Anime4up()) + registerMainAPI(WitAnime()) + } +} \ No newline at end of file diff --git a/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt new file mode 100644 index 0000000..1275417 --- /dev/null +++ b/Anime4upPack/src/main/kotlin/com/anime4up/Anime4upProvider.kt @@ -0,0 +1,167 @@ +package com.anime4up + +import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId +import com.lagradost.cloudstream3.utils.ExtractorLink +import okio.ByteString.Companion.decodeBase64 +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.net.URL + +private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() +} +class WitAnime : Anime4up() { + override var name = "WitAnime" + override var mainUrl = "https://witanime.com" +} +open class Anime4up : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://anime4up.tv" + override var name = "Anime4up" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = + setOf(TvType.Anime, TvType.AnimeMovie, TvType.OVA, TvType.Others ) + + + private fun Element.toSearchResponse(): SearchResponse { + val imgElement = select("div.hover > img") + val url = select("div.hover > a").attr("href") + .replace("-%d8%a7%d9%84%d8%ad%d9%84%d9%82%d8%a9-.*".toRegex(), "") + .replace("episode", "anime") + val title = imgElement.attr("alt") + val posterUrl = imgElement.attr("src") + val typeText = select("div.anime-card-type > a").text() + val type = + if (typeText.contains("TV|Special".toRegex())) TvType.Anime + else if(typeText.contains("OVA|ONA".toRegex())) TvType.OVA + else if(typeText.contains("Movie")) TvType.AnimeMovie + else TvType.Others + return newAnimeSearchResponse( + title, + url, + type, + ) { + this.posterUrl = posterUrl + } + } + + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { + val doc = app.get("$mainUrl/").document + val homeList = doc.select(".page-content-container") + .mapNotNull { + val title = it.select("div.main-didget-head h3").text() + val list = + it.select("div.anime-card-container, div.episodes-card-container").map { + anime -> anime.toSearchResponse() + }.distinct() + HomePageList(title, list, isHorizontalImages = title.contains("حلقات")) + } + return newHomePageResponse(homeList, hasNext = false) + } + + override suspend fun search(query: String): List { + return app.get("$mainUrl/?search_param=animes&s=$query").document + .select("div.row.display-flex > div").mapNotNull { + it.toSearchResponse() + } + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + + val title = doc.select("h1.anime-details-title").text() + val poster = doc.select("div.anime-thumbnail img").attr("src") + val description = doc.select("p.anime-story").text() + val year = doc.select("div.anime-info:contains(بداية العرض)").text().replace("بداية العرض: ", "").toIntOrNull() + + val typeText = doc.select(".anime-info:contains(النوع) a").text() + val type = + if (typeText.contains("TV|Special".toRegex())) TvType.Anime + else if(typeText.contains("OVA|ONA".toRegex())) TvType.OVA + else if(typeText.contains("Movie")) TvType.AnimeMovie + else TvType.Others + + val malId = doc.select("a.anime-mal").attr("href").replace(".*e\\/|\\/.*".toRegex(),"").toIntOrNull() + + val episodes = doc.select("div#DivEpisodesList > div").apmap { + val episodeElement = it.select("h3 a") + val episodeUrl = episodeElement.attr("href") + val episodeTitle = episodeElement.text() + val posterUrl = it.select(".hover img").attr("src") + Episode( + episodeUrl, + episodeTitle, + episode = episodeTitle.getIntFromText(), + posterUrl = posterUrl + ) + } + return newAnimeLoadResponse(title, url, type) { + this.apiName = this@Anime4up.name + addMalId(malId) + engName = title + posterUrl = poster + this.year = year + addEpisodes(if(title.contains("مدبلج")) DubStatus.Dubbed else DubStatus.Subbed, episodes) + plot = description + this.rating = rating + + } + } + data class sources ( + @JsonProperty("hd" ) var hd : Map? = null, + @JsonProperty("fhd" ) var fhd : Map? = null, + @JsonProperty("sd" ) var sd : Map? = null + ) + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + if(data.contains("anime4up")) { + val watchJSON = parseJson(doc.select("input[name=\"wl\"]").attr("value").decodeBase64()?.utf8() ?: "") + watchJSON.let { source -> + source.fhd?.apmap { + loadExtractor(it.value, data, subtitleCallback, callback) + } + source.hd?.apmap { + loadExtractor(it.value, data, subtitleCallback, callback) + } + source.sd?.apmap { + loadExtractor(it.value, data, subtitleCallback, callback) + } + } + val moshahdaID = doc.select("input[name=\"moshahda\"]").attr("value").decodeBase64()?.utf8() ?: "" + if(moshahdaID.isNotEmpty()) { + mapOf( + "Original" to "download_o", + "720" to "download_x", + "480" to "download_h", + "360" to "download_n", + "240" to "download_l" + ).apmap { (quality, qualityCode) -> + callback.invoke( + ExtractorLink( + this.name, + this.name + " Moshahda", + "https://moshahda.net/$moshahdaID.html?${qualityCode}", + "https://moshahda.net", + quality.toIntOrNull() ?: 1080 + ) + ) } + } + } else if(data.contains("witanime")) { // witanime + doc.select("ul#episode-servers li a").apmap { + loadExtractor(it.attr("data-ep-url"), data, subtitleCallback, callback) + } + } + return true + } +} diff --git a/AnimeBlkomProvider.cs3 b/AnimeBlkomProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..99ac72b2be9fe9b9f6973c674f4e26ea758f29fe GIT binary patch literal 13332 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 + \ No newline at end of file diff --git a/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt new file mode 100644 index 0000000..5278e84 --- /dev/null +++ b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomPlugin.kt @@ -0,0 +1,11 @@ +package com.animeblkom +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class AnimeBlkomPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(AnimeBlkom()) + } +} \ No newline at end of file diff --git a/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt new file mode 100644 index 0000000..2da8483 --- /dev/null +++ b/AnimeBlkomProvider/src/main/kotlin/com/animeblkom/AnimeBlkomProvider.kt @@ -0,0 +1,164 @@ +package com.animeblkom + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.nodes.Element + +class AnimeBlkom : MainAPI() { + override var mainUrl = "https://animeblkom.net" + override var name = "AnimeBlkom" + override var lang = "ar" + override val hasMainPage = true + + override val supportedTypes = setOf( + TvType.Anime, + TvType.AnimeMovie, + TvType.OVA, + ) + + private fun Element.toSearchResponse(): SearchResponse { + val url = select("div.poster a").attr("href") + val name = select("div.name a").text() + val poster = mainUrl + select("div.poster img").attr("data-original") + val year = select("div[title=\"سنة الانتاج\"]").text().toIntOrNull() + val episodesNumber = select("div[title=\"عدد الحلقات\"]").text().toIntOrNull() + val tvType = select("div[title=\"النوع\"]").text().let { if(it.contains("فيلم|خاصة".toRegex())) TvType.AnimeMovie else if(it.contains("أوفا|أونا".toRegex())) TvType.OVA else TvType.Anime } + return newAnimeSearchResponse( + name, + url, + tvType, + ) { + addDubStatus(false, episodesNumber) + this.year = year + this.posterUrl = poster + } + } + override val mainPage = mainPageOf( + "$mainUrl/anime-list?sort_by=rate&page=" to "Most rated", + "$mainUrl/anime-list?sort_by=created_at&page=" to "Recently added", + "$mainUrl/anime-list?states=finished&page=" to "Completed" + ) + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { + val doc = app.get(request.data + page).document + val list = doc.select("div.content-inner") + .mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val q = query.replace(" ","+") + return app.get("$mainUrl/search?query=$q").document.select("div.content.ratable").map { + it.toSearchResponse() + } + } + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + + val title = doc.select("span h1").text().replace("\\(.*".toRegex(),"") + val poster = mainUrl + doc.select("div.poster img").attr("data-original") + val description = doc.select(".story p").text() + val genre = doc.select("p.genres a").map { + it.text() + } + val year = doc.select(".info-table div:contains(تاريخ الانتاج) span.info").text().split("-")[0].toIntOrNull() + val status = doc.select(".info-table div:contains(حالة الأنمي) span.info").text().let { if(it.contains("مستمر")) ShowStatus.Ongoing else ShowStatus.Completed } + val nativeName = doc.select("span[title=\"الاسم باليابانية\"]").text().replace(".*:".toRegex(),"") + val type = doc.select("h1 small").text().let { + if (it.contains("movie")) TvType.AnimeMovie + if (it.contains("ova|ona".toRegex())) TvType.OVA + else TvType.Anime + } + + val malId = doc.select("a.blue.cta:contains(المزيد من المعلومات)").attr("href").replace(".*e\\/|\\/.*".toRegex(),"").toInt() + val episodes = arrayListOf() + val episodeElements = doc.select(".episode-link") + if(episodeElements.isEmpty()) { + episodes.add(Episode( + url, + "Watch", + )) + } else { + episodeElements.map { + val a = it.select("a") + episodes.add(Episode( + mainUrl + a.attr("href"), + a.text().replace(":"," "), + episode = a.select("span").not(".pull-left").last()?.text()?.toIntOrNull() + )) + } + } + return newAnimeLoadResponse(title, url, type) { + addMalId(malId) + japName = nativeName + engName = title + posterUrl = poster + this.year = year + addEpisodes(DubStatus.Subbed, episodes) // TODO CHECK + plot = description + tags = genre + + showStatus = status + } + } + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + doc.select("div.item a[data-src]").map { + it.attr("data-src").let { url -> + if(url.startsWith("https://animetitans.net/")) { + val iframe = app.get(url).document + callback.invoke( + ExtractorLink( + this.name, + "Animetitans " + it.text(), + iframe.select("script").last()?.data()?.substringAfter("source: \"")?.substringBefore("\"").toString(), + this.mainUrl, + Qualities.Unknown.value, + isM3u8 = true + ) + ) + } else if(it.text() == "Blkom") { + val iframe = app.get(url).document + iframe.select("source").forEach { source -> + callback.invoke( + ExtractorLink( + this.name, + it.text(), + source.attr("src"), + this.mainUrl, + source.attr("res").toInt() + ) + ) + } + } else { + var sourceUrl = url + if(it.text().contains("Google")) sourceUrl = "http://gdriveplayer.to/embed2.php?link=$url" + loadExtractor(sourceUrl, mainUrl, subtitleCallback, callback) + } + } + } + doc.select(".panel .panel-body a").apmap { + println(it.text()) + callback.invoke( + ExtractorLink( + this.name, + it.attr("title") + " " + it.select("small").text() + " Download Source", + it.attr("href"), + this.mainUrl, + it.text().replace("p.*| ".toRegex(),"").toInt(), + ) + ) + } + return true + } +} \ No newline at end of file diff --git a/AnimeiatProvider.cs3 b/AnimeiatProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..744fce776ebd69b846cf0439e350ac5b0a66fc29 GIT binary patch literal 20625 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 + \ No newline at end of file diff --git a/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt new file mode 100644 index 0000000..fa3c66f --- /dev/null +++ b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatPlugin.kt @@ -0,0 +1,11 @@ +package com.animeiat +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class AnimeiatPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(Animeiat()) + } +} \ No newline at end of file diff --git a/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt new file mode 100644 index 0000000..230bfa3 --- /dev/null +++ b/AnimeiatProvider/src/main/kotlin/com/animeiat/AnimeiatProvider.kt @@ -0,0 +1,172 @@ +package com.animeiat + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor +import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.nicehttp.Requests + +class Animeiat : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://api.animeiat.co/v1" + val pageUrl = "https://www.animeiat.tv" + override var name = "Animeiat" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = + setOf(TvType.Anime, TvType.AnimeMovie) + + data class Data ( + @JsonProperty("anime_name" ) var animeName : String? = null, + @JsonProperty("title" ) var title : String? = null, + @JsonProperty("slug" ) var slug : String? = null, + @JsonProperty("story" ) var story : String? = null, + @JsonProperty("other_names" ) var otherNames : String? = null, + @JsonProperty("total_episodes" ) var totalEpisodes : Int? = null, + @JsonProperty("number" ) var number : Int? = null, + @JsonProperty("age" ) var age : String? = null, + @JsonProperty("type" ) var type : String? = null, + @JsonProperty("status" ) var status : String? = null, + @JsonProperty("poster_path" ) var posterPath : String? = null, + ) + data class All ( + @JsonProperty("data" ) var data : ArrayList = arrayListOf(), + ) + + override val mainPage = mainPageOf( + "$mainUrl/home/sticky-episodes?page=" to "Episodes (H)", + "$mainUrl/anime?status=completed&page=" to "Completed", + "$mainUrl/anime?status=ongoing&page=" to "Ongoing", + ) + + override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { + val json = parseJson(app.get(request.data + page).text) + val list = json.data.map { + newAnimeSearchResponse( + it.animeName ?: it.title.toString(), + mainUrl + "/anime/" + it.slug.toString().replace("-episode.*".toRegex(),""), + if (it.type == "movie") TvType.AnimeMovie else if (it.type == "tv") TvType.Anime else TvType.OVA, + ) { + addDubStatus(false, it.totalEpisodes ?: it.number) + this.otherName = it.otherNames?.split("\n")?.last() + this.posterUrl = "https://api.animeiat.co/storage/" + it.posterPath + } + } + return if(request.name.contains("(H)")) HomePageResponse( + arrayListOf(HomePageList(request.name.replace(" (H)",""), list, request.name.contains("(H)"))) + ) else newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val json = parseJson(app.get("$mainUrl/anime?q=$query").text) + return json.data.map { + newAnimeSearchResponse( + it.animeName.toString(), + mainUrl + "/anime/" + it.slug.toString(), + if(it.type == "movie") TvType.AnimeMovie else if(it.type == "tv") TvType.Anime else TvType.OVA, + ) { + addDubStatus(false, it.totalEpisodes) + this.otherName = it.otherNames?.split("\n")?.last() + this.posterUrl = "https://api.animeiat.co/storage/" + it.posterPath + } + } + + } + + data class Year ( + @JsonProperty("name" ) var name : String? = null, + + ) + data class Genres ( + @JsonProperty("name" ) var name : String? = null, + ) + data class LoadData ( + @JsonProperty("anime_name" ) var animeName : String? = null, + @JsonProperty("slug" ) var slug : String? = null, + @JsonProperty("story" ) var story : String? = null, + @JsonProperty("other_names" ) var otherNames : String? = null, + @JsonProperty("age" ) var age : String? = null, + @JsonProperty("type" ) var type : String? = null, + @JsonProperty("status" ) var status : String? = null, + @JsonProperty("poster_path" ) var posterPath : String? = null, + @JsonProperty("year" ) var year : Year? = Year(), + @JsonProperty("genres" ) var genres : ArrayList = arrayListOf(), + + ) + data class Load ( + + @JsonProperty("data" ) var data : LoadData? = LoadData() + + ) + data class Meta ( + @JsonProperty("last_page" ) var lastPage : Int? = null, + ) + data class EpisodeData ( + @JsonProperty("title" ) var title : String? = null, + @JsonProperty("slug" ) var slug : String? = null, + @JsonProperty("number" ) var number : Int? = null, + @JsonProperty("video_id" ) var videoId : Int? = null, + @JsonProperty("poster_path" ) var posterPath : String? = null, + ) + data class Episodes ( + @JsonProperty("data" ) var data : ArrayList = arrayListOf(), + @JsonProperty("meta" ) var meta : Meta = Meta() + ) + override suspend fun load(url: String): LoadResponse { + val loadSession = Requests() + val request = loadSession.get(url.replace(pageUrl, mainUrl)).text + val json = parseJson(request) + val episodes = arrayListOf() + (1..parseJson(loadSession.get("$url/episodes").text).meta.lastPage!!).map { pageNumber -> + parseJson(loadSession.get("$url/episodes?page=$pageNumber").text).data.map { + episodes.add( + Episode( + "$pageUrl/watch/"+json.data?.slug, + it.title, + null, + it.number, + "https://api.animeiat.co/storage/" + it.posterPath, + + ) + ) + } + } + return newAnimeLoadResponse(json.data?.animeName.toString(), "$pageUrl/watch/"+json.data?.slug, if(json.data?.type == "movie") TvType.AnimeMovie else if(json.data?.type == "tv") TvType.Anime else TvType.OVA) { + japName = json.data?.otherNames?.replace("\\n.*".toRegex(), "") + engName = json.data?.animeName + posterUrl = "https://api.animeiat.co/storage/" + json.data?.posterPath + this.year = json.data?.year?.name?.toIntOrNull() + addEpisodes(DubStatus.Subbed, episodes) + plot = json.data?.story + tags = json.data?.genres?.map { it.name.toString() } + this.showStatus = if(json.data?.status == "completed") ShowStatus.Completed else ShowStatus.Ongoing + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val url = if(data.contains("-episode")) data else "$data-episode-1" + val doc = app.get(url).document + val script = doc.select("body > script").first()?.html() + val id = script?.replace(".*4\",slug:\"|\",duration:.*".toRegex(),"") + val player = app.get("$pageUrl/player/$id").document + player.select("source").map { + callback.invoke( + ExtractorLink( + this.name, + this.name, + it.attr("src"), + pageUrl, + it.attr("size").toInt(), + ) + ) + } + return true + } +} \ No newline at end of file diff --git a/ArabSeedProvider.cs3 b/ArabSeedProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..e481c29307150ce8d3b88fff105138ed6932fdbe GIT binary patch literal 17166 zcmY&;V{j%wmvx+plZib^Cbn(cwryJzYhpWjV%tw_+qUgw=lyoSt=b>=)UB?ruG{yV zQ`J>{6{Nu-U_n5B`~U#~5d;~bRNpfAmpT3mgnwacXlH3=>g+;i(1%y;5bgU8PzE75HtKUJYq{)C-T~^bmnsZ_*2u&i!ssa}`R0e|rHCn$(^Y7wd;iP&&fn|P?It`&z+NYa!v85HSuE~mMi2z#S1bq! z+`m$cZ48~AO`YjXOg)->;S91wo4(Vp*X?_JO&eBu*ktcl0F<(8jh<|AWWM|-B)&6t zaJCBVvTT#hqhynI`o9!l8$+TZ1HuC$JAHK^cd4kTz=(;xe0Pd}5K~c5sVlarD<*wk zPfYM70BFCiyCnU&k25))k0#QY&CR;6&jI{yGxIAz>pdR+CYQQ3_*&Re zen-RJX5?H!Euq`uEK(xSEzMAp-!%U8@eC?obiWRX*CJVVh}Oaz7vvu-i`XH<@8Z9T z(<~PK3Q&m(SSupD0(gO#0hoawtRv9XP<{|Hy3%O6;*Gc~(0HJHAR7=Hpgu@Hs>!uL zE+F_Ic;G)EN>>7W43IteZ%lWV1&||Yq20jM!P&vw!E!;np*}!fAaAw<91#^k6<`-Y zoCDbmP->w#2*W{Pc9?c>cD#1Xb`pVwK$x9W;C8^CtVlz^A+Sy0XDebW+zadt$BpdH zJMbRp4^{(i50Wz}k}QBa1LXo56|f#?|8HgM$E?{7Ij{nF9l#G_58@B?g?M03lmTS} zZ3kfodIiY`?E~Wh^TK+AbHjC`58MU`40Ht*G=O3tT!HAs#ez%#g6=c`mjlQH>_N9d z{Xlr&KHxpDU(o;Uhu-N4>;bh0KWYFIQmo1?AY6djK@dRcLBV>(BV9n* zLFGVwK~3=FQh@2e`XG8>jQC@E1fuNh0~3Mvfd%fu^ai*N$gTJ<#5cM-ssVJrG7w!r z&I9oUU^x&sV0}Pe*lwJ6Wb+K574d6-a6q4cD*(hT(?h z2I__#7>)88&_kkO6Jh+}UUQ@JODai8axhc8q^J4_5;;3p@*H zAn>;X(T(1YFz`5VIPe?952h0)iTH;+^bzQN;31I90GHv1&JP{XPNWx*8^)b^;3rT$ zko=#b^+D|&1h%6%5dQ><<)Lc8*noKjLO8%U;I%@vV!SXokUQ|-knW)D!0d?bm;Z%9dCO#;jegc=By;8WlQK)YX{co1|@)nL{CB*q8#uMGq*_B*sd31T@g<^Vne zb_UoB=xT^+$ZBXl_zf5zsF$BNST|@l;5(W-p8pOu6)0i=2$0M`U4V7N@<91udO*E! z{*#+Ja3ky$jJ+q{6{gyj@k|hP&_aWv;~w9+79{(n>UvU4}neM~{--7sp)d2HG%|lBAO9G|r8t$+x#v#eC zp`UxO9qCb+f3BW5+J=7n3m^phq?Zu3p`TGF${zZJ_SKmu7tjxClpFsBnHlk2dadI6 zhLzneI%N1PPnj=YH~Naj`$C-bmzl2#_NxJGkL81#Q>V);AIv=FZI_&?&0H@(#5SmQ z$mqxSPy6_!o`{pLH2&!+ z{yOtDmg&?@n`wH}Ptf0s64S=-=k1sWCv7C+Q?XfoqO6nMoyzwdtdnlFteXhwbh7l& zm$NQN7A=5j@a&RPe9n(T&WB#S4Bub6&kk~Y=lk;yw|KAY0dzADRe8Y~e#njb^V{I~ zGY=Jlp7!8FWJ3>hp&_)pIVNR;<(SjlMz|S7LqokTCZ&=iXDhz{fredL4g%uKqE#l_;nw-!3ivnx*B6$H)Io4?UZBa=V`_ z-yOWt<>E$I#-CZ!%b)Hkz_7F267&H})=@t5UxpqB3)G3>+0i%2+^@U3N8vSbXbD~Y z2p2BDZ-6rNOM7V`Uz7{0-!{poEz09~V^Xz1cZkK%GKN!ov3{9T30;e2Ri{~xCRI(; ziBr1VY}uakEZ6AqoDZGuRRL8t6(2iol8@cw@zQ?-!CAZy!Q}Dme}i6CuKK-anMR5? zYmfTE9-y7D%obwW9#3zjJ!c=*b=1pvFQ(0=h4v@HJEBa@EDZ+t9i}Z6VsuBNC9O7D9g}Zau0y#^r zkR9ThR^`jbf=O5}w|Ji6Q|-o2IN9CUtb#>o-qbIkfC>Epeh!k$AM|4{ZKrFLjO*9D z&s*aTZ|I(WQ5n*~zc;p%{IFz@++$$l0Q4|H$0O7cjX(omycnJ;m5W z&l~#*5*zNqH@3ZWI3;;jqLAYr(%$U)YPPeMT>hb!G`(ECs5Zq*#gkDdp=_x*BJG;=Pb+>?+{n+udQHx*?m;& zrW&TLRpUHYa3o9nsGSlQIZj6%aorI4`T5j|_2}G18riSn)n2c)@Hkuwlq3Ayvlf!D z)X$o+(mX0>-m_MVj4}@mal3QXhumjx@59X~*%-kA^w{{tSPYQ^P9qi`cu!`0Z}8#2 zYcVK_0j`Zf#G#nBcA{u8Se|)PiAjVD7?Ov0Tk1|zP@R|uYRvc&;dg!w(&;d# zt7xQfk#*a1Xy!?Gqw1RC3@fQzUoVrf{)`o?hLaUquWMd`pJJvd)rxjsm4GgI^Zm?PytE1IE>(5Yjs z96w@633eD5FQOeUqG-A!#W07%Md`WPbK3&Pi@_n&8X8UE>QL}$Ji~&-AI6__FS+As zQYg-mc;GppP^(o>4_p@)o>_nbJRUL+E8spzTy#HQ#TqB!?5_|4aWlD)Np1t`-0UCM z!*Bb}DXZKRvgBaUz(Z%K%RK6lLPqbmRA`D5>TzX~H~81Pv5&Z@uHF3y;uBX-J^gh1 zVjAx(pPhGh%_sbs-f~wy`>!ovQ*E_;tkul4F%CR7)~rxk0mLo_6nQH;dI}Iz7)mu{ zNm=nU%AN!|uojbdl?}B+{9V9N$4frSv@g9##TXo2& zyqV!?N-1(hneqgOcUrnmCAkUm_ReQi8Q3d^mF{_&%s4eM;MRi&$}XB=FnOeeql=dZ z1n3Q;U2>;9L{`c_K$Y~lOU?W3b98MdwxRK{1+N(=yAqLCFU5n*Ul_ zG(dngM#zX|Eyb~((cEA9#ZI%g@c7d0eBImDXz3#7bqzvQ-x7H7sVdjB4Z{_rHr5vK zOkT2b&tmd~T#`e`T9Qt<=oNkcfHgf5?MSM%_uv=3twh3JokCJQRcJuen2F*t#b$<` zIJoRI5g+NIBdS8nMs_e+*&j=jjajE%Ha0b|8~ik}Hp#P2r2vbFi`TT{aGA&SOvO2F z*Y~k{D)`;kacaidpmT7q;+au8@s6Z;Xj{;w%`c@N>A{1a<2_fmUbtt*kZX=RJRvkN zkDuu!>y-Z^CMbd)|z8#g)BAYAzL<4ZDq&=ZE& zPqerN@e{q=Y1KoaGU(zXmEPie)6qq~+&1>Vz!k3vrsZoBTyY7KJ?_5;SQ zS{Oz#d0NcNP$404BTa=9>@rXKm;8~U?_J52`@LA#B->6WPbiYY8 zxTL#y_87S*0$y@gJl3P}-ZN+c&Gz>k?-_AY?`*-r(mTOstj+o%X>s2D>it&)&lWGp zJcVOT0YO)Fz#q%^(U5c@Dsi)cX}lO56SP=Q7gX1Xl>-sLY$slPIDHu;#Y=mX;JBN} z;rp;dYizod-2^7Pzf3wbh1Fx5l7ex*aNgSK*MCayD5HG1_Z;0@{U6!(>s}--A29V)wcFY8Qgi*2Fkj|iaTMo zMiejvJ62#+%xGh0X-xd7(Vp}#=x*tj7ku`T2hk~h6@pk}xta6y(K)pN#uWLal-l9u zHl^Ben-k~miypFWePEm`C05i|dG|JH2CGPmK8u>`*EFO|V|{OSs4XZbS%~K|YvZi) zN20~*rxR|gjI}R$9vH;3S`c$w9@8%6cPgp-^9uDF zF{|`JTVMXM`wXN(O}Kn)WvoG6*KW4Raseg(QFc#sO;p752S*Ht7M@o%?PN@KI7aNU zsgEv|Hy2V)BSg+02`iQL&69J%hte^XG^}R zVmL>-kmhlW9UU(19BIt#JDql9zIF({c7u&J7T+H8(SnChg2$r1h4&ToD3wpEMlKwS zq+A~d&`YzhQVy3C0dv>!s_0f;UjS*s3LT8pvw0G6RbwL7@qIJx& zXY>~pC9(vp?2grMQQ{j)&g=1LX%jt->R9t}*B;HGaI)w@m5bpL3T9RDO>FmGY%ODPk7FKmB#G;cjh##s6V&|IuO2bhu{Ty0L`OCKdPXI) z!L54P`Y^WR(UEvnh{a7#MIz+Z_LOlc$Akm1HJ1)c4{&~K|hk_m^&aoAwPU}M5rQLn~ zKq#b$qtO@0=JP+jqaIVulE1448&2Ed|L9CT83dcPhJg)jUWICdefbI!t^P?)+1Baa zzq;hY8ChnEO&r~SNFf-f@`tgwrtAewzu{t1mF!7ftw~uFgIo=5LOhc-zrCX3D()&YlqViK9|}Qo4!C{wUFc7$@#6QBtEaHe(_2aLy;XN>lPKgN4T9;u`f{t}rkY`wDdutjU1eJlfn^o;q74r!$}gsO z;q-dM4mfJc4}SjVkGp)yDf++2929hiB|l45rJx55WAmFUK&%~m5!>Dxa*GDKZuD|@ zGy|}RV9TD+r&{RuyYegWj(MYM;KqxmqiB^@TAARz*(AQr^Avzki z`}T6jQRT1EGb{adLlQTy{Bd5S>#=ykf?N_6V8p(dGpUl^CFpdO%w|ExH*5@lA-Ari z^Z228v_-xghx7}o7M<~Wvs!5a`@yQw5nZ-HH`zy3B!mMG%_vh}<1)YRv{nT2NMJ?w z{c>@IaOtfLLmEC(E48SJP4EG-+swk+a0uIQ7>1aDlJwnJ*F9V~i=aL(<(L+wvJ;s8Ro*`<)md&634tE@V zcNPaNeFf8^b6fTlfu8&y*$~66_g*OFTBPcSgo-iwkB_3Hi#e)gjE4?&133~o$P!!d z9(+el(t~>G5jVnG_M2#QTEb&b9a1S2Z#r>#c5^Q++fqKGV(MKBUW`_VhWY)EvUy6b ztQAEJr->@JzHYYdU0qJKLlyH_zH(aFHB%$s*u}JYl53TmWT|^m*BUpj<#^s0+79*` z`nNwMRnb2qy82W@a>D8|b3-?MTp`;4sqqz1DQUea z6oq4nw6jS~5ZZ?O5Y#sv4sFM?WkpjGK725R-<@V3e%Mcxp?B&2YbasfU%WPs&llf?bm1H7eTwafv*o@c67UI0mW(B;AHHt$?EX!3x zmib(yO^aHm7_rI7IL=V~{Dl2m#Me82)3|4RtKT&k(iKfQ)sTK~tm1d7JJl*uI}f_c zT|0?8hC4Pv*YHc{IBwogK(}S?NTskc)49TIt1E?mwXhrhQog1}oSAY>MNV_uap_~Y zw^}4YNbMDdaSWB94*f`TmS*-{ROz8S*0fJ*3zj#9hmYQm_S9JYGQ8wD?o`8)qN@Y{ zAa_O4&Vpj^L31Yhr9!6T?Fe~0?Zf+)=W$iqj;S%ft=#$P2`}rOjML+!4ZrTvC#>$DNc|qb&Hl& z7+JT*yUf+sgr1^lnMR*`YY?e^xT^-{n2yESfonw5M%ZIqlgJ-l0CDBq{MebLtHv?l zv61Y=(=SlZgg`5v2EzK^#05b(fiN0zGKQaLl+o~MhGr_iT;7%oKv`^>i4Uj1uLa}uS^zOm%%UJYtWJw@5^c9lzg+Jw7^Lp6MSArhGm3<8~f=cVVwQ*e8JqV<$AT9gf&@aPidwTryo2 zR9GDT`%2AXwYhE?=L}5eGW~V)7eqxTr_cw8CGPX9e+Mus*cK=!{xd z$lgoJY>xUx%`F9A;+0fPlT2nlCkD^l#_mDFi_$<5>?P3BX)ia6qJrxZj zEl(;$Q;<_A|5E<39HBA99@0&PzvFh%RovfE++{d5oj2vm;9kx!l00;K6gH;d_aI&N zTXli!XKCH&T#K%bsX-rnZMl_>v!>$;`l<3v0X4$ZV<-mMoR$)pkz!fOlt|63(5NOe zdXB>Evsc+UwwkhAB<3YAC%grNVA~T@jkb^WXepX1Cr|xm$x!+FaVUk-qc$*#^J4@$ z8b%#)KGY@Ia#c#Q+PuL4Gjb2`em(SYX&;rI(&3iDpfNoxv;U{fc`D1p)F<{vlTI<+ zUWY=+Z~Wzbm?nWZ>xwWOJ7pcKiX9BSTy29Tht=&zi=|5wHaa>$(>R=GUSq?oz1x_k zl4aAC=l75<;8w2zwf|W3T&%J0A=$Be`3`%Rbw)>nZhW&>*z#d9Q%pRQ5uv`^RCkv# zh7eb0)whXryEU)x0S&9qx{Vg;+#uaqW}ngd%NX$b4|M_icFtexfJgKBooG8Vc@ zWK&Pyv$59FJ$EeLg?hXcQ?yaFXkT$dD&;3dEis6h@%yuwHQ2(It@`W%vJ&}Q0oxuW z1m*72eu@{_{U`tm`(W54=|Zew`%3FgDNZS{H88;#Ss^wEQPZF0cvyD$dh*p;)Uew$ z;_smbZUqfe>SQ*R)g2Y?YV+sfSgXTkh^-CGKFN)@F@VTszOHn#(Qp?VP=Rs8jGt}G z@Z`dl27ZS>jhlT4VE>WJfNyh$Nf$WTAL`h`VZc=_nCl-M-TC*RbB3GuEGx zdt64JQi$QsHzuWJ&dFHAX5935N3_0qb!AN|8j@|`{*y(SPcY3a!5{nq zeKOm+fTxa;H0uD3=eXNU?U!Sx4Tix@9?r$-FoVozI3y~N4$gdP$df)dw1GQ&3x8#4R%XS+HP9hUZ+~h;_gn0b4non5$NE{25a>QlXaN zywALb(0B|?D1(rAG3DMEn&AAO<09GJS-=gY@z%prTcl}R% z`ULzidu;X}if8P4!CPu5W*MfFjI`0)NV3POW<9r{j3fCbCAZ!T9@6k8;X*x~cj!*+ zw&TmTp0b3YPv(H<@gp7xIp?$Km$7e*Y92sLs{`Cc20eH%FA>9vdpa95RG234>3xv& z(aZrhYw4#Mk+^mR5Eh3JJ=mfYc~hJZ8rIwpdc^C8xAw=ke@x(p#DenZ+SHB z*dmREBbP~rO(!f!B;#&8G0;tjA^T>{U*-`C4G@>=IB5xhTbLEZ*?F3vv>>1Pudv=_ zyM|Vb*@;hAO{xhc6>bZ)Ei;UWJWMSN?P9fJ<&mcYB?#Lnb8S&IMyCAud4%iz*8?{U z&Zv@n_m+O?KMy~__4baq)brPM`rX=>nJSW}CzvEKaLZVoa4;qrsIM62KD&5Pu?GGC zf7J&Hx@mgabzgY?DwWZ_34*WL<0P@-87C`M8iS6Jw>&gU7d-77v97(V3Q+wU1E+8z z8Vff+QUA|2&O3=ycH@DZ>YV10s$k#3Ni830>8y)XEmYCHUWJW)Bl`O+*@z{F4_v-- zJq-hzM_Fey?rOi1_zbT$>~QFD;0PKgwmD@vJ)9IGs|>U>_X@dp!ozh(Yb2!e>2qe+gVVJ`K)brBOa9#QO{w5OVZ&9L7Ox* zEoQ$kC)yO~{F&7-i_s=oxuwCd`Spm<K&SLU zrvl<-_`pRPQPGCZHq`Mkm%!Z?smi~qR$l4j!=|1ShtNG4GZvF9QD0V5xg=vVSq8-> z&T=J|)TAGBm_o%i2yRH6(wqc1(C6j?efksl>$1Zr&Y^z!iZ=4~^bNPYv1_qCQ-%eq>I?c*`V(6kNp6L-C)8$;KYxGIT1 zIer)kwcxVrME=q+&S1}!CJ<4Dv;D@g<(_SxZp5I-t#)arVhl96?U0dXKYu6~#|YDZ za*JC3_|?L>s9}BdIlv$SLtnF)CW4pX9}MsuVVYboe?`joBtQQEw3)Oo1P!~jbh4eH z+?Ni%B%~i-v!0qc_pWbKZ{MR|7&@kacM7lqd+6@mYjoG=ZGYjtP!BfxC?>1h!NVJM zZ9v+6-Q0yKf7P%Qgm}q!lA8NZbR3&~IC076GIQOGn|@Shk}7}kdkS^KO&@};5skZB zVEd+j$hARZs?dE;Q}!@3Kze4g;IB9-Z5d?`yS{$kVikQ6B5oI!gAf0N`O=MUe$~s$ zJKQ;gWQFsoR5Sp)HsJ|c@ct;L&qnLDZ{L(tpz5Jdoc@S%eU++OMx>Pfym3XfDmrwv zT6gf2NiCVixPN%$(b)d$)H3n`I@zO?>Tbc?Jo?R<)YLR{nSleE~M~d zeupuxt8CCaTc>SOIj*qNV9a}O$XW0XKsjX<(%Kr+sc@_<%FaAUtLFvqIIZl1MhEQn z-l2OOIHb=~m|@2Zm5bNt$&51((#7r8yE-=YKaT7M%w8a+nda0QrxdDGGO67*C3|;` z-Je{_g^gp^5_T=07LuVOR&&8Q!3|F?pksqRc9$^6z^s%^pI8j>Q8 z2(21&Gn%X;D2|*Rud1mjt>((YWwJOWj)*C%wD{v?cp0IfT3=7|OnF)VX=HcK=2NC6 zsZHg%UPy|lNCNH_Lbba=(LxbUGpTai0ozH0N!M|;I1bM)G^rTFCbEDPRDu}?pCLPB zp{*Q(t@#vcm?TUYb-*J&V}raXMM*WKO;Fu>Eq^^eql9}`O4`wk)GT=nql8*s#Zl`Q z$YOb(5!NY7(V|32jn~7_U>xsn0#2G$t0ftj34td~ikyfA*6vof$uoiMs}mYJF)nRA zXz)ibnWM4k&>_wd>jh8Q)6UzyjAa!_t%tNmwl^Z1EfZS|sI{>bdBEhJknmA+%`G&S zi5;~Qw>oxaEO5Lg4d0g7}K!@eWzn4?D2GmAtf z-t6{EAz*K3v8D zIYQ~ViwqChMzbjaADZ-x1{0cgXJ?uveP))Qm)8;GPrt3TtTL<;e2s5sRb-iImnKMz zsSA9Aol|1q5eDBh9Gq;=g5c<|+;y4p@OAkUw0i6WFIDXCLP40DEQmSZP{vy-7H$cu}#B2zHUA;`wqk>TX(0GA>q-rB*)y zMM;|TG>_V8rY|M%@ob{S<#BTnzEM|FLVlZ+WAZquWEt^>y4fdj_|cE@YK7@$U8v3Z z9tomL<{nK~np?Vc3+)#FUKj1uYRnu=6a5VL3mf&)W754V9#BJdSXu5IDJQ94W2{zk zx+L6qmd0e_LrQgD#i(7T1fB|f3M5@wK9Op2GIXAhw@JBxM%PjUAu*HR{Bo(XalA+N(nkm5u0GhbW2v-uup$eepTh>O1i2Xv*9SL>AIL-j5+4$HrhNX5hwZ+~Z)_3W7-tNW!>1lKaBoLHNp9p-20 z7u_))RG^k68$0yOmQs1<6Q~Rmhl< z8bL3`T*M7~F$|n~%Au#%k9Tvcr^rs ziffair?v5K5#qKPFko!6rU_w0XfauxmzFkHo4dRCHyTo8tSr`YvWCWA6c}*1>r?S9 z%z%@h6a+bXW*Uz$S)VuG4ZDSF$t!;Vud-a*B)Wzp*H6*^Q=n3Cyov zj#y2&jx&h~GDUeKM9!nB3{-$XKZCb`PAX(a;efl(eG|y08rDFyqAP064NS+pC!IEk|82rBG=YqIYGg+rZ6~ z+qpSAAh9=dGtzw^MKpbSzk_F8wMc8i47|Rtf1TJ zNVu_kF`CZ`{p8rD{qtUrjR)u1c^d&A#eY7Mj5w_F7r=&ixsEPBv6)!VC$qHjW4erS ziY7hHQ_$b$xLfx?v)$Bn`VNkGovk_#IOltt?-xBU;IphlK=^ZfM58%lt^V9T&GwIH z0zA1`Umej3WjrjBxbj?@Ar>7E7sh$qv#4@i+kt*)jIs+nKMT}JdG zuSxZl<|HBSfmWBFv&rb2DYZl;QD8z&hS-HB z<`zkaeF-J+tjPC@L}w4tCH=+Pk9}Ph;ZV%zld0b_n+&J0+Y6#GB?gJs*0MaH+q;V# z_{xffcP^|`Dq9<(yYtB{S&BmA*kjt$3R_E}^YY5oY*Ml%&D*WEYuxdRPG@u_?3}u2 z8CiuaGgf=j)E`K&NK--aiv!DyC;}Cz~*wEuOGnk;9*i{f8$?7MXYtlUUEc z(~EPDa#Fna=qP!M<%jwG*j++zSFrGL-H%QSG)s)t>!%gpx0ur$3J6MAcg?y$^{~yw zt-0{eP1gG#RCrC3NAeXJnzCapRi?Nu2mQB5T=}rW*)AaCOA-U`M!{tZ7X4nxniVqK=$TJFzu6K>%oLS&h$XiO<*rZT5HI7d zEyKxvl2EpFS!u)vluK5QoEw$(#{0!ikuz7x{WdZl4=ot|E#8?p&OYo;TCh?qu)Q`K zDgG4mIGA!z2PPIyn$TI(pFqX#b{iiWv$9phCT;AhXgK9(fBK_94Xv}7GkqMY&^WX0 zK7y}NJwcoJ8F@Bac+QR!*F+{xcQ$`gfxLOoK;K5ij%K(iX;m2W(9Ec&xCqk8$y@B8 zjF{Z~vwJsNhn-_ojg@0G!emU+)5$Q6!swm|PbG{wG(kL>)Yy1d_za%e(#?JC7ZW!w zRy)~&wD2e?fP!4#P2&hkj*Cfl;uP?amE}6Cs5e`WeJ;*+eU7V>-|WjNHeL05S{Ie6 zy^M++d>zp3Yi!)<961nXtX(T;hI>jP{Dd4BlQtEMEB(Vbc40`0>WE7wvR#&V3*;%G6R9yZjD48UYb7$*pWxYL#!sCZ znT^r#V1g$5^}&FBEq$jl^P8Q+`KKA*SiX=A4GMlA9xp|9`>9NHn^YwM0sda{J-n*P z$Vlu7_AC3fbnMX2Pu|(x?9W*|<*c&{PqEl5W=ED>MKNc0wQHDc-0;480}R&@Tx@Mj z{PljpUp$olZaN%67KnT@zz!v+^iY;qt2WV0% zO8IY_W<9f%*ayNrND~vAe;?QyR>xR`7fwb#^@7_xd%RngX~2A9tMomo*b7`+iJR9} z!&ixIK17U-jtEn(*c*s33{qpBkU7)ZNK$wCgCxm>3)#BB6%CtcKXY5X7L!8rg#K#t zDwZhor6Y$7tlN>B(88#bg#b!3h<`jpk$y2;1WvIl6mImGi zFCN+X%(KkQwPW@`tDNnPh5WfAx#Z^NG8cmCbsTL#%Yu6l3?}}42B0ONCV140OdF?n zu1G>6b9s$&)a-zby?|K1@j$}Ta$LePJ2if8E$3gv_itv{I_ou0Hrr&{S~S$T=KP*L z>h!FCWozW9NzAk#6t!mSAz|-f<~Cpw`M58Hl5TF6vrh=MzBU0%Ikzwe11O8iWIW@Jw%+VKZ_qT$oz7RIILN z#b8ZR85QkE$b1hgGp+ldEG!j?fuoAV&j_K+2%^fK7RYh3>7zQ?3~h_^9M;MhaL*4# zRb@JB7GfDoBc1NPm4G4Pb{4lec4zEP-fL%MnjmGJsmKruRX?Dlf6FD-xw58ft3L;v zfX>bf$5#1-&2CX$t3CZ~Y9e=@Z28p{IrB`?QqG-rRh6EZz6BrQq<`W{dBBaSS$NIOvmw#SYkSnPtJXaMHNMCFV`ziJpELdVd72D`RNmzZbZdep z=65N_+A^ke&I1TdQG>jf#epg$b=Zq$rZRsPd*SD&iKzH1Q6V$eScfoEfw6&HZW zUy=-|nD`aRoNN;4$MnRkyji*kKC2z*kKF|c4>JB|+}KI@>u7}N=)peb{fJKzZwKFB zIXLjwBhy=EfSJ>XJB!U%7V0&59C2u2htWX_ z%Z3}0CutesXZymS2BGE|rz9wUQv~@ztU5od>*FwI1-&Tx=k2F+Dy6TH@u|7+Mc8i0 zF2!rB2WunTaG1MdKn>g2@FK+_p1&NTKIY9M+3Secqr>-zioVKvS!H{7nT zFft>WIJ*MgF0QN8M;nQ;H*s1c$6F0agMSgy*jWt6>RTCtCrhvI==huuHkLajcN8ZX zAy2SW&lxe)2s^U;gSi-xn$X`KD{;Pe0F9iUk7-a&hXxzJ_-D~Lo6TA+X}#BHBpjRl zYNzAi+aYyIVvJ9>I<<8%65>H`2pi?AU~bGSM|pN|jk;*!X-CT)7kg#x0Kp$hO2+=f zSsV4(!D3JaA z6cHyhq9N|I!oM+5kChR@`WL`s4VwU|7vz+z?HS~8xgSpgfq~ITH~Ruh6G{XbNO5U! zHdwNQVe|uS!;#~LH)A4kvHE&8SgPz^2?u?#0vX|1RB4JiQjeM$(H=i-NmE4=?*@Nx z=OkUfGvvo=i}65GTKY5W^StkstvIaV@4W$jM)0C3#rxAW6FajbiYkW}^xFuYy%AOd ze;a_|Q5y>%>?DWsC*I`eYZ$3p{f!LWyPrqNdm7-K)^*$qJdWjauSA@$ax_ALjm>>A z!k->|yODh4^W578Iy^e3N_7M$Rqn09n4wB8BO@F??S+GkIV6(ISDeJ9yoDJL z=BXfsFo?x|ZBv8npuP+r#aw1-o5?)OMiMS?K`zsxmvtzmK4ug2=&iPQ&ubSs* zdQto}#Kee*^!Y@`0Lzs6RqR#F%`4Dtlv=HCxaPqmm|I^r;N)_u`_wq@j`k=Y zV)c~WkLIy2PPykgk^dH-(BvZ0+4ZwC;-YTlM4^#>=uanUQ2QC}uW2karDqihgY*0? z1Ys&nn)ExNT}4XwtoxOp2dbx1uTDwIT?GPHzk_nux>qFelNC5|!xOlWHGi!b{Enes>017b2iC*MRnQ;iDe z0j?@yTR8WDwW{1Jl_CkGa$-L9SM;jUq*P10X2w6-G;2FW zMqDTQvf{!SBzvD1^N#YE{SosqNx_bHkcX6Z*vI%zV)p*Gb(n^I&7WwkhpHQq%Ej`e z)=K`*l{25hyQB_bZs7&H$S2s@FTYtm z^0f|83+4BwJ(ESUr;FhH&61fVmr92$eP>d^!%SwXZ^NLm5ab7yldyc-{CDBt1TWZA zBw_cRd)${pGCTN7wF$Pgo{-A>fZR~1hV*Z$S3jJ{uM)jIP-(Kanma@-j-s78{K^>AOc?AAQD(`kDbU*x*wa?KFMFesu7ucFBEzpK3myIE8CaKLQE8d4$_)=7r zvWrs^bku}B9Z;DGGL|&rH}U&xqhmIu?%5m$xr+cM7 z)s-}cZ4&Xycdcc%PQ=!XIxl=FI z4`;IC6JaGZ3v8(uz?`l@FZdLlWR#?)n#yO^kB!9H^ndVEl(&WR^55Toal)EL<;k;bh9`o{1aNCD8k(=U} z`nG)-QTrl{49OWjrtDaJl`|Sqc5>RPLI1YUa;#DLpgdhBmsM0=R4}enID}-%_K-4i z*n?2B1~*-TGIt}ch|Ma;)ot5Ej*XS%+WS!j!;9<1a87GIb5~NY=wo~`uaw>4T!R11 zTebhWI<=Y}rcqnV(cB{%PF-`wcDSKtcZfvcOlP(Oq`uQq#9$ zV_f9S=H+ukKn<+R6CO=ezIQEgXtM#>y$$aeD%%5I61j}FMR(IDBT9SEXH^QQGb5xjwoC-g-U=5TmU7U0!PUL&X#w z3Icm7Hd-%g_hZBwcKAlk4{tbu&mM`Y4zj3iA^py@$Fd*pziCEbx~;V?gUGc-dZlIe z&UdXdM0&_@Cg)7UE)EthC@%@7eCf;>m9(QVF5P2YbN`f-S8u?ug zeAAuCM&4EccZNnI}oO6uS-CZoY(Kd)IPafiN$wOo(0dvcA(h?va?B@YjJ&m~s zXhq(}McwQE6ykyDY|Pa)#5U>1)1=#qym1$)$sxY!xO*`i)_;Oa+VBF}=u?-kWrn2C6MjBzjQWq;_}GIcNgN|Vm_y~^l=!SboyDAjCZ z348GFs`F03xkhR!SKHlq{4xx@PJu^Fmx+(3))KkPt8yxZrhkq|%C%AfHZVgP{W?cF zS(mPj#X6PRb#*+Iit{zB;j@&lat_dc_FY5IS9z8l;{sg^=h1WIc~D#aecrFhJ9qg) zFPs|?IF5E*_b)C}P1oPnOv__R=#^dl!XIiT-2Yfip$zuiO1MqXjpU<>C*c9;r}OP6 z^RK7#{S%a***PC_1;2$`T)z)Rko2luv|UvWY56jWIdv;7=S)wpYxG$I;|wjiTC(aC zkFnpp;a^JjOTYA>viY2|EF|uWJzJ~%4s@CG`Qon8+q(w24&TTd{Sb9id)9Zn#TTF9 z`J7Zft76FG${AZPOW&>{z2nMzs$O>#2YWP*dmMBQd%ScG8+^9wZ2oJ%b>{!SH|g<= zU+3Ok2dbHP^3#vqFa9mM9lhprq}=oUg+OI{`Zzy%ZMFHw*E1{m)%(y*HhIhc&G@x0 zd|LQ|r=nSvu2J_Yg`Z5#uKe?z%SgWHD@B4V4E3D{s#LdSl|Nohvp1bntwalHHx7;~;{CNLirf=m>KHhg- z?-;fI>Bsx->+R3gXGfe|ef`t3tV-Ufdxwut?f?8;Zd1OVvg!IC`7`gfZxa1gwbbwD zY=!qW>-Mc~S$})NvcA>-c;&+H&pq^WuGQTBFMl5Ysg;|NeSGRZbJ_6w`o%wXtnv?E z`RPFDsy%S#IeCqs<_v^YEUMc^NjZf`-ZQ|43WE#f2@Q|sR~8?Sk0{GT^r-iA%}?^S=*2Y53wi7?|n yg#vi`0~jo61W_nwQlM)^KQ#iPk%3`JV>ghAbcRHLH!B-Rk_iY)fOLx!hz9@!TnG>V literal 0 HcmV?d00001 diff --git a/ArabSeedProvider/build.gradle.kts b/ArabSeedProvider/build.gradle.kts new file mode 100644 index 0000000..2b9098c --- /dev/null +++ b/ArabSeedProvider/build.gradle.kts @@ -0,0 +1,14 @@ +version = 2 + +cloudstream { + description = "" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 1 + + tvTypes = listOf( "TvSeries" , "Movie" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=arabseed.ink&sz=%size%" +} diff --git a/ArabSeedProvider/src/main/AndroidManifest.xml b/ArabSeedProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2a12952 --- /dev/null +++ b/ArabSeedProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt new file mode 100644 index 0000000..1a2210d --- /dev/null +++ b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedPlugin.kt @@ -0,0 +1,11 @@ +package com.arabseed +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class ArabSeedPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(ArabSeed()) + } +} \ No newline at end of file diff --git a/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt new file mode 100644 index 0000000..40f16ab --- /dev/null +++ b/ArabSeedProvider/src/main/kotlin/com/arabseed/ArabSeedProvider.kt @@ -0,0 +1,217 @@ +package com.arabseed + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.nodes.Element + +class ArabSeed : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://m5.arabseed.ink" + override var name = "ArabSeed" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie) + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + + private fun Element.toSearchResponse(): SearchResponse? { + val title = select("h4").text() + val posterUrl = select("img.imgOptimzer").attr("data-image").ifEmpty { select("div.Poster img").attr("data-src") } + val tvType = if (select("span.category").text().contains("مسلسلات")) TvType.TvSeries else TvType.Movie + return MovieSearchResponse( + title, + select("a").attr("href"), + this@ArabSeed.name, + tvType, + posterUrl, + ) + } + + override val mainPage = mainPageOf( + "$mainUrl/movies/?offset=" to "Movies", + "$mainUrl/series/?offset=" to "Series", + ) + + override suspend fun getMainPage( + page: Int, + request: MainPageRequest + ): HomePageResponse { + val document = app.get(request.data + page, timeout = 120).document + val home = document.select("ul.Blocks-UL > div").mapNotNull { + it.toSearchResponse() + } + return newHomePageResponse(request.name, home) + } + + override suspend fun search(query: String): List { + val list = arrayListOf() + arrayListOf( + mainUrl to "series", + mainUrl to "movies" + ).apmap { (url, type) -> + val doc = app.post( + "$url/wp-content/themes/Elshaikh2021/Ajaxat/SearchingTwo.php", + data = mapOf("search" to query, "type" to type), + referer = mainUrl + ).document + doc.select("ul.Blocks-UL > div").mapNotNull { + it.toSearchResponse()?.let { it1 -> list.add(it1) } + } + } + return list + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url, timeout = 120).document + val title = doc.select("h1.Title").text().ifEmpty { doc.select("div.Title").text() } + val isMovie = title.contains("فيلم") + + val posterUrl = doc.select("div.Poster > img").let{ it.attr("data-src").ifEmpty { it.attr("src") } } + val rating = doc.select("div.RatingImdb em").text().getIntFromText() + val synopsis = doc.select("p.descrip").last()?.text() + val year = doc.select("li:contains(السنه) a").text().getIntFromText() + val tags = doc.select("li:contains(النوع) > a, li:contains(التصنيف) > a")?.map { it.text() } + + val actors = doc.select("div.WorkTeamIteM").mapNotNull { + val name = it.selectFirst("h4 > em")?.text() ?: return@mapNotNull null + val image = it.selectFirst("div.Icon img")?.attr("src") ?: return@mapNotNull null + val roleString = it.select("h4 > span").text() + val mainActor = Actor(name, image) + ActorData(actor = mainActor, roleString = roleString) + } + + val recommendations = doc.select("ul.Blocks-UL > div").mapNotNull { element -> + element.toSearchResponse() + } + + return if (isMovie) { + newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.recommendations = recommendations + this.plot = synopsis + this.tags = tags + this.actors = actors + this.rating = rating + this.year = year + } + } else { + val seasonList = doc.select("div.SeasonsListHolder ul > li") + val episodes = arrayListOf() + if(seasonList.isNotEmpty()) { + seasonList.apmap { season -> + app.post( + "$mainUrl/wp-content/themes/Elshaikh2021/Ajaxat/Single/Episodes.php", + data = mapOf("season" to season.attr("data-season"), "post_id" to season.attr("data-id")) + ).document.select("a").apmap { + episodes.add(Episode( + it.attr("href"), + it.text(), + season.attr("data-season")[0].toString().toIntOrNull(), + it.text().getIntFromText() + )) + } + } + } else { + doc.select("div.ContainerEpisodesList > a").apmap { + episodes.add(Episode( + it.attr("href"), + it.text(), + 0, + it.text().getIntFromText() + )) + } + } + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { + this.posterUrl = posterUrl + this.tags = tags + this.plot = synopsis + this.actors = actors + this.recommendations = recommendations + this.rating = rating + this.year = year + } + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val doc = app.get(data).document + val watchUrl = doc.select("a.watchBTn").attr("href") + val watchDoc = app.get(watchUrl, headers = mapOf("Referer" to mainUrl)).document + val indexOperators = arrayListOf() + val list: List = watchDoc.select("ul > li[data-link], ul > h3").mapIndexed { index, element -> + if(element.`is`("h3")) { + indexOperators.add(index) + element + } else element + } + var watchLinks: List>>; + if(indexOperators.isNotEmpty()) { + watchLinks = indexOperators.mapIndexed { index, it -> + var endIndex = list.size + if (index != indexOperators.size - 1) endIndex = (indexOperators[index + 1]) - 1 + list[it].text().getIntFromText() as Int to list.subList(it + 1, endIndex) as List + } + } else { + watchLinks = arrayListOf(0 to list) + } + watchLinks.apmap { (quality, links) -> + links.apmap { + val iframeUrl = it.attr("data-link") + println(iframeUrl) + if(it.text().contains("عرب سيد")) { + val sourceElement = app.get(iframeUrl).document.select("source") + callback.invoke( + ExtractorLink( + this.name, + "ArabSeed", + sourceElement.attr("src"), + data, + if(quality != 0) quality else it.text().replace(".*- ".toRegex(), "").replace("\\D".toRegex(),"").toInt(), + !sourceElement.attr("type").contains("mp4") + ) + ) + } else if (iframeUrl.contains("voe.sx")) { + val doc = app.get(iframeUrl).document + val script = doc.select("script").map { it.data() }.first { it.contains("sources") } + val m3u8 = script.substringAfter("'hls': '").substringBefore("'") + val mp4 = script.substringAfter("'mp4': '").substringBefore("'") + val voeSxquality = script.substringAfter("'video_height': ").substringBefore(",").toInt() + callback.invoke( + ExtractorLink( + this.name, + "Voe.sx m3u8", + m3u8, + data, + voeSxquality, + true + ) + ) + callback.invoke( + ExtractorLink( + this.name, + "Voe.sx mp4", + mp4, + data, + voeSxquality, + ) + ) + } else loadExtractor(iframeUrl, data, subtitleCallback, callback) + } + } + return true + } +} \ No newline at end of file diff --git a/CimaNowProvider.cs3 b/CimaNowProvider.cs3 new file mode 100644 index 0000000000000000000000000000000000000000..e336d59c01d1b9c371b2293f03aea6276e174ac3 GIT binary patch literal 14704 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 + \ No newline at end of file diff --git a/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt new file mode 100644 index 0000000..ddb39b4 --- /dev/null +++ b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowPlugin.kt @@ -0,0 +1,11 @@ +package com.cimanow +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class CimaNowPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(CimaNow()) + } +} \ No newline at end of file diff --git a/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt new file mode 100644 index 0000000..d9c45b7 --- /dev/null +++ b/CimaNowProvider/src/main/kotlin/com/cimanow/CimaNowProvider.kt @@ -0,0 +1,164 @@ +package com.cimanow + + +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities +import org.jsoup.nodes.Element + +class CimaNow : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://cimanow.cc" + override var name = "CimaNow" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie) + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toSearchResponse(): SearchResponse? { + val url = this.attr("href") + val posterUrl = select("img")?.attr("data-src") + var title = select("li[aria-label=\"title\"]").html().replace(" .*|\\\\n".toRegex(), "").replace(" ", "") + val year = select("li[aria-label=\"year\"]").text().toIntOrNull() + val tvType = if (url.contains("فيلم|مسرحية|حفلات".toRegex())) TvType.Movie else TvType.TvSeries + val quality = select("li[aria-label=\"ribbon\"]").first()?.text()?.replace(" |-|1080|720".toRegex(), "") + val dubEl = select("li[aria-label=\"ribbon\"]:nth-child(2)").isNotEmpty() + val dubStatus = if(dubEl) select("li[aria-label=\"ribbon\"]:nth-child(2)").text().contains("مدبلج") + else select("li[aria-label=\"ribbon\"]:nth-child(1)").text().contains("مدبلج") + if(dubStatus) title = "$title (مدبلج)" + return MovieSearchResponse( + "$title ${select("li[aria-label=\"ribbon\"]:contains(الموسم)").text()}", + url, + this@CimaNow.name, + tvType, + posterUrl, + year, + null, + quality = getQualityFromString(quality) + ) + } + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + + val doc = app.get("$mainUrl/home", headers = mapOf("user-agent" to "MONKE")).document + val pages = doc.select("section").not("section:contains(أختر وجهتك المفضلة)").not("section:contains(تم اضافته حديثاً)").apmap { + val name = it.select("span").html().replace(".*| { + val result = arrayListOf() + val doc = app.get("$mainUrl/page/1/?s=$query").document + val paginationElement = doc.select("ul[aria-label=\"pagination\"]") + doc.select("section article a").map { + val postUrl = it.attr("href") + if(it.select("li[aria-label=\"episode\"]").isNotEmpty()) return@map + if(postUrl.contains("$mainUrl/expired-download/|$mainUrl/افلام-اون-لاين/".toRegex())) return@map + result.add(it.toSearchResponse()!!) + } + if(paginationElement.isNotEmpty()) { + val max = paginationElement.select("li").not("li.active").last()?.text()?.toIntOrNull() + if (max != null) { + if(max > 5) return result.distinct().sortedBy { it.name } + (2..max!!).toList().apmap { + app.get("$mainUrl/page/$it/?s=$query\"").document.select("section article a").map { element -> + val postUrl = element.attr("href") + if(element.select("li[aria-label=\"episode\"]").isNotEmpty()) return@map + if(postUrl.contains("$mainUrl/expired-download/|$mainUrl/افلام-اون-لاين/".toRegex())) return@map + result.add(element.toSearchResponse()!!) + } + } + } + } + return result.distinct().sortedBy { it.name } + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val posterUrl = doc.select("body > script:nth-child(3)").html().replace(".*,\"image\":\"|\".*".toRegex(),"").ifEmpty { doc.select("meta[property=\"og:image\"]").attr("content") } + val year = doc.select("article ul:nth-child(1) li a").last()?.text()?.toIntOrNull() + val title = doc.select("title").text().split(" | ")[0] + val isMovie = title.contains("فيلم|حفلات|مسرحية".toRegex()) + val youtubeTrailer = doc.select("iframe")?.attr("src") + + val synopsis = doc.select("ul#details li:contains(لمحة) p").text() + + val tags = doc.select("article ul").first()?.select("li")?.map { it.text() } + + val recommendations = doc.select("ul#related li").map { element -> + MovieSearchResponse( + apiName = this@CimaNow.name, + url = element.select("a").attr("href"), + name = element.select("img:nth-child(2)").attr("alt"), + posterUrl = element.select("img:nth-child(2)").attr("src") + ) + } + + return if (isMovie) { + newMovieLoadResponse( + title, + url, + TvType.Movie, + "$url/watching" + ) { + this.posterUrl = posterUrl + this.year = year + this.recommendations = recommendations + this.plot = synopsis + this.tags = tags + addTrailer(youtubeTrailer) + } + } else { + val episodes = doc.select("ul#eps li").map { episode -> + Episode( + episode.select("a").attr("href")+"/watching", + episode.select("a img:nth-child(2)").attr("alt"), + doc.select("span[aria-label=\"season-title\"]").html().replace("

.*|\n".toRegex(), "").getIntFromText(), + episode.select("a em").text().toIntOrNull(), + episode.select("a img:nth-child(2)").attr("src") + ) + } + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { + this.posterUrl = posterUrl + this.tags = tags + this.year = year + this.plot = synopsis + this.recommendations = recommendations + addTrailer(youtubeTrailer) + } + } + } + + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + app.get("$data").document.select("ul#download [aria-label=\"quality\"]").forEach { + val name = if(it.select("span").text().contains("فائق السرعة")) "Fast Servers" else "Servers" + it.select("a").forEach { media -> + callback.invoke( + ExtractorLink( + source = this.name, + name = name, + url = media.attr("href"), + referer = this.mainUrl, + quality = media.text().getIntFromText() ?: Qualities.Unknown.value + ) + ) + } + } + return true + } +} \ No newline at end of file diff --git a/EgyBestProvider/build.gradle.kts b/EgyBestProvider/build.gradle.kts new file mode 100644 index 0000000..c702710 --- /dev/null +++ b/EgyBestProvider/build.gradle.kts @@ -0,0 +1,14 @@ +version = 7 + +cloudstream { + description = "Egybest is broken" + authors = listOf( "ImZaw" ) + + language = "ar" + + status = 0 + + tvTypes = listOf( "TvSeries" , "Movie" , "Anime" ) + + iconUrl = "https://www.google.com/s2/favicons?domain=www.egy.best&sz=%size%" +} diff --git a/EgyBestProvider/src/main/AndroidManifest.xml b/EgyBestProvider/src/main/AndroidManifest.xml new file mode 100644 index 0000000..09206f7 --- /dev/null +++ b/EgyBestProvider/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt new file mode 100644 index 0000000..f417ab6 --- /dev/null +++ b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestPlugin.kt @@ -0,0 +1,11 @@ +package com.egybest +import com.lagradost.cloudstream3.plugins.CloudstreamPlugin +import com.lagradost.cloudstream3.plugins.Plugin +import android.content.Context + +@CloudstreamPlugin +class EgyBestPlugin: Plugin() { + override fun load(context: Context) { + registerMainAPI(EgyBest()) + } +} \ No newline at end of file diff --git a/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt new file mode 100644 index 0000000..295e5c7 --- /dev/null +++ b/EgyBestProvider/src/main/kotlin/com/egybest/EgyBestProvider.kt @@ -0,0 +1,275 @@ +package com.egybest + + +import android.annotation.TargetApi +import android.os.Build +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.M3u8Helper +import com.lagradost.nicehttp.Requests +import com.lagradost.nicehttp.Session +import okhttp3.HttpUrl.Companion.toHttpUrl +import org.jsoup.nodes.Element +import java.util.Base64 +import org.mozilla.javascript.Context +import org.mozilla.javascript.Scriptable + +fun String.runJS(variableName: String): String { + val rhino = Context.enter() + rhino.initSafeStandardObjects() + rhino.optimizationLevel = -1 + val scope: Scriptable = rhino.initSafeStandardObjects() + val script = this + val result: String + try { + var js = "" + for (i in script.indices) { + js += script[i] + } + rhino.evaluateString(scope, js, "JavaScript", 1, null) + result = Context.toString(scope.get(variableName, scope)) + } finally { + Context.exit() + } + return result +} + +class EgyBest : MainAPI() { + override var lang = "ar" + override var mainUrl = "https://egybest.org" + override var name = "EgyBest" + var pssid = "" + override val usesWebView = false + override val hasMainPage = true + override val supportedTypes = setOf(TvType.TvSeries, TvType.Movie, TvType.Anime) + + private fun String.getIntFromText(): Int? { + return Regex("""\d+""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + private fun Element.toSearchResponse(): SearchResponse? { + val url = this.attr("href") ?: return null + val posterUrl = select("img")?.attr("src") + var title = select("span.title").text() + val year = title.getYearFromTitle() + val isMovie = Regex(".*/movie/.*|.*/masrahiya/.*").matches(url) + val tvType = if (isMovie) TvType.Movie else TvType.TvSeries + title = if (year !== null) title else title.split(" (")[0].trim() + val quality = select("span.ribbon span").text().replace("-", "") + // If you need to differentiate use the url. + return MovieSearchResponse( + title, + mainUrl + url, + this@EgyBest.name, + tvType, + posterUrl, + year, + null, + quality = getQualityFromString(quality) + ) + } + + override val mainPage = mainPageOf( + "$mainUrl/trending/?page=" to "الأفلام الأكثر مشاهدة", + "$mainUrl/movies/?page=" to "أفلام جديدة", + "$mainUrl/tv/?page=" to "مسلسلات جديدة ", + "$mainUrl/tv/korean?page=" to "الدراما الكورية ", + "$mainUrl/animes/popular?page=" to "مسلسلات الانمي", + "$mainUrl/wwe/?page=" to "عروض المصارعة ", + "$mainUrl/movies/latest-bluray-2020-2019?page=" to "أفلام جديدة BluRay", + "$mainUrl/masrahiyat/?page=" to "مسرحيات ", + "$mainUrl/movies/latest?page=" to "أحدث الاضافات", + "$mainUrl/movies/comedy?page=" to "أفلام كوميدية", + "$mainUrl/explore/?q=superhero/" to "أفلام سوبر هيرو", + "$mainUrl/movies/animation?page=" to "أفلام انمي و كرتون", + "$mainUrl/movies/romance?page=" to "أفلام رومانسية", + "$mainUrl/movies/drama?page=" to "أفلام دراما", + "$mainUrl/movies/horror?page=" to "أفلام رعب", + "$mainUrl/movies/documentary?page=" to "أفلام وثائقية", + "$mainUrl/World-War-Movies/?page=" to "أفلام عن الحرب العالمية ☢", + "$mainUrl/End-Of-The-World-Movies/?page=" to "أفلام عن نهاية العالم", + "$mainUrl/movies/arab?page=" to "أفلام عربية ", + ) + + override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { + val doc = app.get(request.data + page).document + val list = doc.select(".movie") + .mapNotNull { element -> + element.toSearchResponse() + } + return newHomePageResponse(request.name, list) + } + + override suspend fun search(query: String): List { + val result = arrayListOf() + listOf("$mainUrl/explore/?q=$query").apmap { url -> + val d = app.get(url).document + d.select("div.movies a").not("a.auto.load.btn.b").mapNotNull { + it.toSearchResponse()?.let { it1 -> result.add(it1) } + } + } + return result.distinct().sortedBy { it.name } + } + + private fun String.getYearFromTitle(): Int? { + return Regex("""\(\d{4}\)""").find(this)?.groupValues?.firstOrNull()?.toIntOrNull() + } + + override suspend fun load(url: String): LoadResponse { + val doc = app.get(url).document + val isMovie = Regex(".*/movie/.*|.*/masrahiya/.*").matches(url) + val posterUrl = doc.select("div.movie_img a img")?.attr("src") + val year = doc.select("div.movie_title h1 a")?.text()?.toIntOrNull() + val title = doc.select("div.movie_title h1 span").text() + val youtubeTrailer = doc.select("div.play")?.attr("url") + + val synopsis = doc.select("div.mbox").firstOrNull { + it.text().contains("القصة") + }?.text()?.replace("القصة ", "") + + val tags = doc.select("table.movieTable tbody tr").firstOrNull { + it.text().contains("النوع") + }?.select("a")?.map { it.text() } + + val actors = doc.select("div.cast_list .cast_item").mapNotNull { + val name = it.selectFirst("div > a > img")?.attr("alt") ?: return@mapNotNull null + val image = it.selectFirst("div > a > img")?.attr("src") ?: return@mapNotNull null + val roleString = it.selectFirst("div > span")!!.text() + val mainActor = Actor(name, image) + ActorData(actor = mainActor, roleString = roleString) + } + + return if (isMovie) { + val recommendations = doc.select(".movies_small .movie").mapNotNull { element -> + element.toSearchResponse() + } + + newMovieLoadResponse( + title, + url, + TvType.Movie, + url + ) { + this.posterUrl = posterUrl + this.year = year + this.recommendations = recommendations + this.plot = synopsis + this.tags = tags + this.actors = actors + addTrailer(youtubeTrailer) + } + } else { + val episodes = ArrayList() + doc.select("#mainLoad > div:nth-child(2) > div.h_scroll > div a").map { + it.attr("href") + }.apmap { + val d = app.get(it).document + val season = Regex("season-(.....)").find(it)?.groupValues?.getOrNull(1)?.getIntFromText() + if(d.select("tr.published").isNotEmpty()) { + d.select("tr.published").map { element -> + val ep = Regex("ep-(.....)").find(element.select(".ep_title a").attr("href"))?.groupValues?.getOrNull(1)?.getIntFromText() + episodes.add( + Episode( + mainUrl + element.select(".ep_title a").attr("href"), + name = element.select("td.ep_title").html().replace(".*|".toRegex(), ""), + season, + ep, + rating = element.select("td.tam:not(.date, .ep_len)").text().getIntFromText() + ) + ) + } + } else { + d.select("#mainLoad > div:nth-child(3) > div.movies_small a").map { eit -> + val ep = Regex("ep-(.....)").find(eit.attr("href"))?.groupValues?.getOrNull(1)?.getIntFromText() + episodes.add( + Episode( + mainUrl + eit.attr("href"), + eit.select("span.title").text(), + season, + ep, + ) + ) + } + } + } + newTvSeriesLoadResponse(title, url, TvType.TvSeries, episodes.distinct().sortedBy { it.episode }) { + this.posterUrl = posterUrl + this.tags = tags + this.year = year + this.plot = synopsis + this.actors = actors + addTrailer(youtubeTrailer) + } + } + } + + @TargetApi(Build.VERSION_CODES.O) + override suspend fun loadLinks( + data: String, + isCasting: Boolean, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ): Boolean { + val baseURL = data.split("/")[0] + "//" + data.split("/")[2] + val client = Requests().baseClient + val session = Session(client) + println(baseURL) + println(data) + val doc = session.get(data).document + + val vidstreamURL = baseURL + doc.select("iframe.auto-size").attr("src") + + val videoSoup = session.get(vidstreamURL, cookies = mapOf( + "PSSID" to this@EgyBest.pssid, + )).document + videoSoup.select("source").firstOrNull { it.hasAttr("src") }?.attr("src")?.let { + M3u8Helper.generateM3u8( + this.name, + it, + referer = mainUrl, + headers = mapOf("range" to "bytes=0-") + ).forEach(callback) + } ?: run { + var jsCode = videoSoup.select("script")[1].html() + val function = videoSoup.select("script")[2].attr("onload") + val verificationToken = Regex("\\{'[0-9a-zA-Z_]*':'ok'\\}").findAll(jsCode).first().value.replace("\\{'|':.*".toRegex(), "") + val encodedAdLinkVar = Regex("\\([0-9a-zA-Z_]{2,12}\\[Math").findAll(jsCode).first().value.replace("\\(|\\[M.*".toRegex(),"") + val encodingArraysRegEx = Regex(",[0-9a-zA-Z_]{2,12}=\\[]").findAll(jsCode).toList() + val firstEncodingArray = encodingArraysRegEx[1].value.replace(",|=.*".toRegex(),"") + val secondEncodingArray = encodingArraysRegEx[2].value.replace(",|=.*".toRegex(),"") + + jsCode = jsCode.replace("^