From ed2006b83f42c84769bc6e93446e02e40e3a23af Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Sun, 18 Aug 2024 19:25:45 -0600 Subject: [PATCH 1/2] fix(src): Multiple updates Closes #93 Closes #1 Closes #133 Closes #142 (Yeah, this extension had a bug but someone closed it before fixing it.) --- .../lib/voeextractor/VoeExtractor.kt | 12 +- src/all/chineseanime/build.gradle | 2 +- src/all/javguru/build.gradle | 2 +- src/all/lmanime/build.gradle | 2 +- src/all/supjav/build.gradle | 2 +- src/ar/anime4up/build.gradle | 2 +- src/ar/animerco/build.gradle | 2 +- src/ar/arabseed/build.gradle | 2 +- src/ar/asia2tv/build.gradle | 2 +- src/ar/egydead/build.gradle | 2 +- src/ar/okanime/build.gradle | 2 +- src/de/animebase/build.gradle | 2 +- src/de/animeloads/build.gradle | 2 +- src/de/animetoast/build.gradle | 2 +- src/de/aniworld/build.gradle | 2 +- src/de/cineclix/build.gradle | 2 +- src/de/cinemathek/build.gradle | 2 +- src/de/einfach/build.gradle | 2 +- src/de/filmpalast/build.gradle | 2 +- src/de/kinoking/build.gradle | 2 +- src/de/kool/build.gradle | 2 +- src/de/moflixstream/build.gradle | 2 +- src/de/movie4k/build.gradle | 2 +- src/de/serienstream/build.gradle | 2 +- src/en/allanimechi/build.gradle | 2 +- src/en/animegg/build.gradle | 7 + .../animegg/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 893 bytes .../animegg/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 586 bytes .../animegg/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1057 bytes .../animegg/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1550 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 2119 bytes .../animeextension/en/animegg/AnimeGG.kt | 279 ++++++++++++++++++ src/en/animekhor/build.gradle | 2 +- src/en/animenosub/build.gradle | 2 +- src/en/asiaflix/build.gradle | 2 +- src/en/asianload/build.gradle | 2 +- src/en/dramacool/build.gradle | 2 +- src/en/gogoanime/build.gradle | 2 +- src/en/multimovies/build.gradle | 2 +- src/es/animefenix/build.gradle | 2 +- src/es/animeflv/build.gradle | 2 +- src/es/animeid/build.gradle | 1 + .../animeextension/es/animeid/AnimeID.kt | 21 +- src/es/animelatinohd/build.gradle | 2 +- src/es/animemovil/build.gradle | 2 +- src/es/asialiveaction/build.gradle | 2 +- src/es/cine24h/build.gradle | 14 + .../cine24h/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5366 bytes .../cine24h/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2510 bytes .../cine24h/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7849 bytes .../cine24h/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 15918 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 26476 bytes .../animeextension/es/cine24h/Cine24h.kt | 272 +++++++++++++++++ src/es/cinecalidad/build.gradle | 2 +- src/es/cineplus123/build.gradle | 2 +- src/es/cuevana/build.gradle | 2 +- src/es/doramasflix/build.gradle | 2 +- src/es/ennovelas/build.gradle | 2 +- src/es/gnula/build.gradle | 2 +- src/es/hackstore/build.gradle | 2 +- src/es/hentaila/build.gradle | 2 +- src/es/hentaitk/build.gradle | 2 +- src/es/jkanime/build.gradle | 2 +- src/es/lacartoons/build.gradle | 2 +- src/es/legionanime/build.gradle | 2 +- src/es/metroseries/build.gradle | 2 +- src/es/mundodonghua/build.gradle | 2 +- src/es/pelisforte/build.gradle | 2 +- src/es/pelisplushd/build.gradle | 2 +- src/es/tioanimeh/build.gradle | 2 +- src/es/tiodonghua/build.gradle | 2 +- src/es/veranimes/build.gradle | 2 +- src/fr/anisama/build.gradle | 2 +- src/fr/empirestreaming/build.gradle | 2 +- src/fr/otakufr/build.gradle | 2 +- src/fr/wiflix/build.gradle | 2 +- src/id/otakudesu/build.gradle | 2 +- src/it/toonitalia/build.gradle | 2 +- src/pt/animesgratis/build.gradle | 2 +- src/pt/pobreflix/build.gradle | 2 +- src/tr/animeler/build.gradle | 2 +- src/tr/anizm/build.gradle | 2 +- src/tr/tranimeizle/build.gradle | 2 +- src/tr/turkanime/build.gradle | 2 +- 84 files changed, 665 insertions(+), 75 deletions(-) create mode 100644 src/en/animegg/build.gradle create mode 100644 src/en/animegg/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/animegg/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/animegg/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/animegg/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/animegg/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/animegg/src/eu/kanade/tachiyomi/animeextension/en/animegg/AnimeGG.kt create mode 100644 src/es/cine24h/build.gradle create mode 100644 src/es/cine24h/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/es/cine24h/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/es/cine24h/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/es/cine24h/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/es/cine24h/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/es/cine24h/src/eu/kanade/tachiyomi/animeextension/es/cine24h/Cine24h.kt diff --git a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt index 40878ebc..1e30fb57 100644 --- a/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt +++ b/lib/voe-extractor/src/main/java/eu/kanade/tachiyomi/lib/voeextractor/VoeExtractor.kt @@ -22,6 +22,8 @@ class VoeExtractor(private val client: OkHttpClient) { private val base64Regex = Regex("'.*'") + private val scriptBase64Regex = "(let|var)\\s+\\w+\\s*=\\s*'(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)';".toRegex() + @Serializable data class VideoLinkDTO(val file: String) @@ -36,8 +38,9 @@ class VoeExtractor(private val client: OkHttpClient) { document = clientDdos.newCall(GET(originalUrl)).execute().asJsoup() } - val script = document.selectFirst("script:containsData(const sources), script:containsData(var sources), script:containsData(wc0)") - ?.data() + val alternativeScript = document.select("script").find { scriptBase64Regex.containsMatchIn(it.data()) }?.data() + val script = document.selectFirst("script:containsData(const sources), script:containsData(var sources), script:containsData(wc0)")?.data() + ?: alternativeScript ?: return emptyList() val playlistUrl = when { // Layout 1 @@ -46,10 +49,11 @@ class VoeExtractor(private val client: OkHttpClient) { if (linkRegex.matches(link)) link else String(Base64.decode(link, Base64.DEFAULT)) } // Layout 2 - script.contains("wc0") -> { + script.contains("wc0") || alternativeScript != null -> { val base64 = base64Regex.find(script)!!.value val decoded = Base64.decode(base64, Base64.DEFAULT).let(::String) - json.decodeFromString(decoded).file + + json.decodeFromString(if (alternativeScript != null) decoded.reversed() else decoded).file } else -> return emptyList() } diff --git a/src/all/chineseanime/build.gradle b/src/all/chineseanime/build.gradle index 70141c43..0ef78665 100644 --- a/src/all/chineseanime/build.gradle +++ b/src/all/chineseanime/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.ChineseAnime' themePkg = 'animestream' baseUrl = 'https://www.chineseanime.vip' - overrideVersionCode = 8 + overrideVersionCode = 9 } apply from: "$rootDir/common.gradle" diff --git a/src/all/javguru/build.gradle b/src/all/javguru/build.gradle index 4d328596..7da90918 100644 --- a/src/all/javguru/build.gradle +++ b/src/all/javguru/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Jav Guru' extClass = '.JavGuru' - extVersionCode = 15 + extVersionCode = 16 isNsfw = true } diff --git a/src/all/lmanime/build.gradle b/src/all/lmanime/build.gradle index 4710fec1..bafe69d0 100644 --- a/src/all/lmanime/build.gradle +++ b/src/all/lmanime/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.LMAnime' themePkg = 'animestream' baseUrl = 'https://lmanime.com' - overrideVersionCode = 6 + overrideVersionCode = 7 } apply from: "$rootDir/common.gradle" diff --git a/src/all/supjav/build.gradle b/src/all/supjav/build.gradle index b3bad3c1..beb008ea 100644 --- a/src/all/supjav/build.gradle +++ b/src/all/supjav/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'SupJav' extClass = '.SupJavFactory' - extVersionCode = 9 + extVersionCode = 10 isNsfw = true } diff --git a/src/ar/anime4up/build.gradle b/src/ar/anime4up/build.gradle index 54b07aca..c78aef15 100644 --- a/src/ar/anime4up/build.gradle +++ b/src/ar/anime4up/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Anime4up' extClass = '.Anime4Up' - extVersionCode = 57 + extVersionCode = 58 } apply from: "$rootDir/common.gradle" diff --git a/src/ar/animerco/build.gradle b/src/ar/animerco/build.gradle index dad3de1c..7676a28e 100644 --- a/src/ar/animerco/build.gradle +++ b/src/ar/animerco/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Animerco' extClass = '.Animerco' - extVersionCode = 37 + extVersionCode = 38 } apply from: "$rootDir/common.gradle" diff --git a/src/ar/arabseed/build.gradle b/src/ar/arabseed/build.gradle index 7f6ac620..cc4d4962 100644 --- a/src/ar/arabseed/build.gradle +++ b/src/ar/arabseed/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Arab Seed' extClass = '.ArabSeed' - extVersionCode = 13 + extVersionCode = 14 } apply from: "$rootDir/common.gradle" diff --git a/src/ar/asia2tv/build.gradle b/src/ar/asia2tv/build.gradle index 14987244..eea0e809 100644 --- a/src/ar/asia2tv/build.gradle +++ b/src/ar/asia2tv/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'asia2tv' extClass = '.Asia2TV' - extVersionCode = 18 + extVersionCode = 19 } apply from: "$rootDir/common.gradle" diff --git a/src/ar/egydead/build.gradle b/src/ar/egydead/build.gradle index f55a495f..2ad2e37e 100644 --- a/src/ar/egydead/build.gradle +++ b/src/ar/egydead/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Egy Dead' extClass = '.EgyDead' - extVersionCode = 12 + extVersionCode = 13 } apply from: "$rootDir/common.gradle" diff --git a/src/ar/okanime/build.gradle b/src/ar/okanime/build.gradle index 6fa1f114..a574966d 100644 --- a/src/ar/okanime/build.gradle +++ b/src/ar/okanime/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Okanime' extClass = '.Okanime' - extVersionCode = 10 + extVersionCode = 11 } apply from: "$rootDir/common.gradle" diff --git a/src/de/animebase/build.gradle b/src/de/animebase/build.gradle index 5feedbe2..2a1a3e80 100644 --- a/src/de/animebase/build.gradle +++ b/src/de/animebase/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Anime-Base' extClass = '.AnimeBase' - extVersionCode = 24 + extVersionCode = 25 isNsfw = true } diff --git a/src/de/animeloads/build.gradle b/src/de/animeloads/build.gradle index 69a8bb45..443c1111 100644 --- a/src/de/animeloads/build.gradle +++ b/src/de/animeloads/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Anime-Loads' extClass = '.AnimeLoads' - extVersionCode = 15 + extVersionCode = 16 isNsfw = true } diff --git a/src/de/animetoast/build.gradle b/src/de/animetoast/build.gradle index e3f402e4..b753c5ca 100644 --- a/src/de/animetoast/build.gradle +++ b/src/de/animetoast/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AnimeToast' extClass = '.AnimeToast' - extVersionCode = 14 + extVersionCode = 15 } apply from: "$rootDir/common.gradle" diff --git a/src/de/aniworld/build.gradle b/src/de/aniworld/build.gradle index 6734fb8a..c7486c8e 100644 --- a/src/de/aniworld/build.gradle +++ b/src/de/aniworld/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AniWorld' extClass = '.AniWorld' - extVersionCode = 23 + extVersionCode = 24 } apply from: "$rootDir/common.gradle" diff --git a/src/de/cineclix/build.gradle b/src/de/cineclix/build.gradle index 2854333f..069ad729 100644 --- a/src/de/cineclix/build.gradle +++ b/src/de/cineclix/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'CineClix' extClass = '.CineClix' - extVersionCode = 14 + extVersionCode = 15 } apply from: "$rootDir/common.gradle" diff --git a/src/de/cinemathek/build.gradle b/src/de/cinemathek/build.gradle index 31a467a6..84230da7 100644 --- a/src/de/cinemathek/build.gradle +++ b/src/de/cinemathek/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.Cinemathek' themePkg = 'dooplay' baseUrl = 'https://cinemathek.net' - overrideVersionCode = 20 + overrideVersionCode = 21 isNsfw = true } diff --git a/src/de/einfach/build.gradle b/src/de/einfach/build.gradle index 1ad2b145..868eeabd 100644 --- a/src/de/einfach/build.gradle +++ b/src/de/einfach/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Einfach' extClass = '.Einfach' - extVersionCode = 10 + extVersionCode = 11 } apply from: "$rootDir/common.gradle" diff --git a/src/de/filmpalast/build.gradle b/src/de/filmpalast/build.gradle index 58ba652a..1b8b6531 100644 --- a/src/de/filmpalast/build.gradle +++ b/src/de/filmpalast/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'FilmPalast' extClass = '.FilmPalast' - extVersionCode = 17 + extVersionCode = 18 } apply from: "$rootDir/common.gradle" diff --git a/src/de/kinoking/build.gradle b/src/de/kinoking/build.gradle index 12567fbb..be32a930 100644 --- a/src/de/kinoking/build.gradle +++ b/src/de/kinoking/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.Kinoking' themePkg = 'dooplay' baseUrl = 'https://kinoking.cc' - overrideVersionCode = 21 + overrideVersionCode = 22 } apply from: "$rootDir/common.gradle" diff --git a/src/de/kool/build.gradle b/src/de/kool/build.gradle index 2fd2a972..c8735707 100644 --- a/src/de/kool/build.gradle +++ b/src/de/kool/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Kool' extClass = '.Kool' - extVersionCode = 11 + extVersionCode = 12 } apply from: "$rootDir/common.gradle" diff --git a/src/de/moflixstream/build.gradle b/src/de/moflixstream/build.gradle index 50b1262d..4d8ddf91 100644 --- a/src/de/moflixstream/build.gradle +++ b/src/de/moflixstream/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Moflix-Stream' extClass = '.MoflixStream' - extVersionCode = 8 + extVersionCode = 9 } apply from: "$rootDir/common.gradle" diff --git a/src/de/movie4k/build.gradle b/src/de/movie4k/build.gradle index 46b5a639..f77bcc76 100644 --- a/src/de/movie4k/build.gradle +++ b/src/de/movie4k/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Movie4k' extClass = '.Movie4k' - extVersionCode = 10 + extVersionCode = 11 } apply from: "$rootDir/common.gradle" diff --git a/src/de/serienstream/build.gradle b/src/de/serienstream/build.gradle index 2cdfacc9..dc4557e5 100644 --- a/src/de/serienstream/build.gradle +++ b/src/de/serienstream/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Serienstream' extClass = '.Serienstream' - extVersionCode = 18 + extVersionCode = 19 } apply from: "$rootDir/common.gradle" diff --git a/src/en/allanimechi/build.gradle b/src/en/allanimechi/build.gradle index de36a8a8..9880bacb 100644 --- a/src/en/allanimechi/build.gradle +++ b/src/en/allanimechi/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AllAnimeChi' extClass = '.AllAnimeChi' - extVersionCode = 7 + extVersionCode = 8 } apply from: "$rootDir/common.gradle" diff --git a/src/en/animegg/build.gradle b/src/en/animegg/build.gradle new file mode 100644 index 00000000..e86f9ede --- /dev/null +++ b/src/en/animegg/build.gradle @@ -0,0 +1,7 @@ +ext { + extName = 'AnimeGG' + extClass = '.AnimeGG' + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/animegg/res/mipmap-hdpi/ic_launcher.png b/src/en/animegg/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c11322d30785103a8310819258bc8b72507d0729 GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V0Q6zaSW-5dpqN__MSkQ_P@Fs zUZ>hxizHJV6BErgZI&rB6S{dKRWUVFQ=5C|o17EJ4k>U?FVfy_|M~(z zvOcZmeDHavd*^S@T<)`e`!Y45P8X$#_J^N8PrtS4jbcqrjm7Cr?FSl7Z#q9XFzbzC zL4xl$0gDZ4)f_SrlWke})|`}MV!xKc-^iRzj8>C%6O)j<1+A^E@0mYcP<+OI>;C=nw{PDT`F8a7_D+>N@!xaHmMte5ozL={*xKsu z=ij=B`RC!k))}#}bERcuc*+V34a?V`JbAK-|L(<$ir4=?J8{CJl;u->*7N7j-#vPy zbmI2y+jsU#WF#j$uls-Y^l5L)=pc}jj?8D;yKmpAQbnT+*RD;A`D~xc-`FgWyg;ap z<*RE}10{Thxj`~!u(0YaUU%zg(wzfWPX>1%E zwxGSez3I1%oZP=&hmzFPrE46n*sC0Ka9y*@;a~m6ix&f@`z`N&_5Zw<=!)&z!^=uC zGFI$jn)=$m@zlmgOqGALyNd3!SMJ`u8|eFqw{PAo%+1aH^gCeotXX$ny;?O#KLi-* z9A96(It2{Pla0=6*029xx9#KoXnlSCyxQ8>b)2PHS+9Oy)juz;1xy(#AD=xt#>>yY z``o#634e{x+`2XE&S`t5AK%aH**D`~?T^o&H{a3j1SX~lS8~i=_x1NT+uGWe_V@P} z&Hw$oy1b}J>ALu3`}B`?p1`mmFJTc%rpn-S{^}`r^OYMau{@nMz--0f>FVdQ&MBb@ E0Pvi%LI3~& literal 0 HcmV?d00001 diff --git a/src/en/animegg/res/mipmap-mdpi/ic_launcher.png b/src/en/animegg/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..973ed6b926ee64fadac40c397020a64bf94d0b6c GIT binary patch literal 586 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FbR6PIEGZjy`5&b`eUNRvGeH@ zgQhqo8k|sB?a0-flpr`chi$UaPlHVn9&Fq}lUi$fpZ6A(o-4KQ|NM>bTLHoIWkLKRY+y1DJ z`(5vbjK?*0vz-P*iyo3~xN?{)>xi|@Z5 zojrD%?Mczj-;Vq5=O22wVe-d{n(v=~{)zv2_+h}EqJw({#d2-fQZ`3^OnYpoFxRhp zdp*d#w<>Nko=v-a(!^Swl>xO&YygL=Fb|vcRN6ijCx2e f5x3{h`Jc?~i}svT=3<)V1D80;uum9_jZ=GerljZ+h4Ki z91~XruJ+(q8(kta-DPD0SF4|TiPgeO9d6!>f-?jPZT}scr=zZBe15zCzMHRacb=U2 z-E&^v-05HUo#?E!vT6}<;!p$`slcE;5z1_WLT`P=ATBO`^x3m# z@iYIWh07}Z?M?U7zWn{r_2;MRVkIVIUuFFE{rlOUVREvvp>hwNJUKEa|LMJZ^D1lC zfx=^FR>Ly9beQaeFJHFIm_OhA+t;r%=geWeWG$Vh&d$#6d#>KnLA$-Z-Pi9N!&;!< z%`K%Kn43B*lUktpyEM^ZT`KdMHEU|@9M&gIWlT#;JM-H1__1R?ez*B1$jN_7+@Wqf zX)W7{lls+5Zf;|~lDeAl)h1mwkLeGNzB1UW>-)dQTY1XgFK)j3MPF7Lzn`oPHu9yi z=IPU?pEU^vKLlF5f1lg0^Qz}vfMIT0-gyG(TY-;1f9{+yXO7AAGo{(tulxUe;VI9{ zJ2&TaX=&-#&+P5rJHV>Ge*50g-@>vou}>dAUVKtF)9u;MRrl`Roq5M<;L|uFTS4+7hvL4@`Sx$F-fcNh R4k`c`JYD@<);T3K0RZ%>4Q~Jd literal 0 HcmV?d00001 diff --git a/src/en/animegg/res/mipmap-xxhdpi/ic_launcher.png b/src/en/animegg/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..68181b55da80077c01a0a5c40311001ff4b62bd7 GIT binary patch literal 1550 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 literal 0 HcmV?d00001 diff --git a/src/en/animegg/src/eu/kanade/tachiyomi/animeextension/en/animegg/AnimeGG.kt b/src/en/animegg/src/eu/kanade/tachiyomi/animeextension/en/animegg/AnimeGG.kt new file mode 100644 index 00000000..463c226c --- /dev/null +++ b/src/en/animegg/src/eu/kanade/tachiyomi/animeextension/en/animegg/AnimeGG.kt @@ -0,0 +1,279 @@ +package eu.kanade.tachiyomi.animeextension.en.animegg + +import android.annotation.SuppressLint +import android.app.Application +import android.content.SharedPreferences +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource +import eu.kanade.tachiyomi.animesource.model.AnimeFilter +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage +import eu.kanade.tachiyomi.animesource.model.SAnime +import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Element +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy +import java.util.Locale + +class AnimeGG : ConfigurableAnimeSource, AnimeHttpSource() { + + override val name = "AnimeGG" + + override val baseUrl = "https://www.animegg.org" + + override val lang = "en" + + override val supportsLatest = true + + private val json: Json by injectLazy() + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + companion object { + private const val PREF_LANGUAGE_KEY = "preferred_language" + private const val PREF_LANGUAGE_DEFAULT = "[SUBBED]" + private val LANGUAGE_LIST = arrayOf("[SUBBED]", "[DUBBED]", "[RAW]") + + private const val PREF_QUALITY_KEY = "preferred_quality" + private const val PREF_QUALITY_DEFAULT = "1080" + private val QUALITY_LIST = arrayOf("1080", "720", "480", "360") + + private const val PREF_SERVER_KEY = "preferred_server" + private const val PREF_SERVER_DEFAULT = "AnimeGG" + private val SERVER_LIST = arrayOf("AnimeGG") + } + + override fun animeDetailsParse(response: Response): SAnime { + val document = response.asJsoup() + val animeDetails = SAnime.create().apply { + title = document.selectFirst(".media-body h1")?.text()?.trim() ?: "" + status = if (document.location().contains("/series/")) SAnime.UNKNOWN else SAnime.COMPLETED + description = document.selectFirst(".ptext")?.text() + genre = document.select(".tagscat a").joinToString { it.text() } + thumbnail_url = document.selectFirst(".media .media-object")?.attr("abs:src") + document.select(".infoami span").map { it.text() }.map { textContent -> + when { + "Status" in textContent -> status = parseStatus(textContent) + } + } + } + return animeDetails + } + + private fun parseStatus(span: String): Int { + val status = span.substringAfter("Status:").trim() + return when { + "Completed" in status -> SAnime.COMPLETED + "Ongoing" in status -> SAnime.ONGOING + else -> SAnime.UNKNOWN + } + } + + override fun popularAnimeRequest(page: Int) = GET("$baseUrl/popular-series?sortBy=hits&sortDirection=DESC&ongoing&limit=50&start=0", headers) + + override fun popularAnimeParse(response: Response): AnimesPage { + val document = response.asJsoup() + val elements = document.select(".fea") + val animeList = elements.map { element -> + SAnime.create().apply { + title = element.selectFirst(".rightpop a")?.text()?.trim() ?: "" + thumbnail_url = element.selectFirst("img")?.attr("abs:src") + setUrlWithoutDomain(element.select(".rightpop a").attr("abs:href")) + } + } + return AnimesPage(animeList, false) + } + + override fun latestUpdatesParse(response: Response) = popularAnimeParse(response) + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/popular-series?sortBy=createdAt&sortDirection=DESC&ongoing&limit=50&start=0", headers) + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val filterList = if (filters.isEmpty()) getFilterList() else filters + val genreFilter = filterList.find { it is GenreFilter } as GenreFilter + + return when { + query.isNotBlank() -> GET("$baseUrl/search/?q=$query", headers) + genreFilter.state != 0 -> GET("$baseUrl/${genreFilter.toUriPart()}/page/$page", headers) + else -> popularAnimeRequest(page) + } + } + + override fun searchAnimeParse(response: Response): AnimesPage { + val document = response.asJsoup() + val elements = document.select(".mse") + val animeList = elements.map { element -> + SAnime.create().apply { + title = element.selectFirst(".first h2")?.text()?.trim() ?: "" + thumbnail_url = element.selectFirst("img")?.attr("abs:src") + setUrlWithoutDomain(element.attr("abs:href")) + } + } + return AnimesPage(animeList, false) + } + + override fun episodeListParse(response: Response): List { + val document = response.asJsoup() + return document.select(".newmanga li div").mapIndexed { idx, episode -> + val episodeNumber = episode.selectFirst(".anm_det_pop strong")?.getEpNumber() ?: (idx + 1F) + val title = episode.select(".anititle").text() + SEpisode.create().apply { + episode_number = episodeNumber + name = when { + episodeNumber.formatEp() in title -> episode.select(".anititle").text() + else -> "Episode ${episodeNumber.formatEp()} - ${episode.select(".anititle").text()}" + } + scanlator = episode.select(".btn-xs").joinToString { it.text() } + setUrlWithoutDomain(episode.select(".anm_det_pop").attr("abs:href")) + } + } + } + + override fun videoListParse(response: Response): List