l;Q48!^BFpx%XxAz~+NIe>0ig41|IRcz*Yi4HeGQwdc7A%4l$ypNwY>
zlM|{5T{~ZJ(s#R0IC@Y)8*s7gtAVxJNx<~$amsddZUmWGqZG90x%0I3Y;Aim#5iO4
z;NH4U2-)I$JzS5f*)p5E+T;!poa|*{!hY58l%;>R=ExpEj-LB61;j4w57H9APMEVL
z_G%_p3uSJ(GC>e-?q*!p8ur7ql^cA%mP0v%A8!>OA^+0TOYAUnX#lURu%J01liV!k
zvsBdbO^q+WfZqPr&bJHF8WT^7(-Ci;iifcAb0Wf=ii{%=jnB*XC4n>lwe%j~LANM0
zo`@Z2Ds$$SH6=R!o&Di_Hl^PcO)Kd9IR|`AP!cdGH<7pC*!+~3@(JQrL5L<(%D0Yl
zg?!0X=<(4e7${%8gQ%d6dM&o@w3apm8VC&L$ZZ>!s_$?dW{l(XzriUD8w?HoK7RVG8FeO&_PeifG8RU#3~v?Fh~E+`Xwr1w{l=U!aF+kw3wqc7$Ib_>
z7ggrjaLpkNBNiJ&oeGjIc~Xp?N`tqDD1Zd)aITv7T_E%AZ-vmvk3ys`Uy$wx=|V2Y
zq_gUHD*AA^%t**-*_gb&kyA7-*9XP7`clyNqY5F*^wirKd%KU{si}KeWmC;m)1tFP
z+Qy*&5ziRAfzti&(1(j|qn-afdne|KH(gTRL^LA4%gcN?OVggGJfyvUj1^FGEVefh
zn36og(DW!ToOlkaJq>
zDcgz3!?m=t63V~|?Omi29i?xo6P^4II|bD2K<2U=8_i@f9WAOgg`*j)*}&*uXLv1_b97rdG=a*}!^rT~2h
zU}HI?#E#p*2KCN>L!N;BlMk&oIlmrlOAeR*-tD~h){9SjCVJ1SnMibslfO?lf!Msv
z`oS3A_9EwGz#4H|u;8q3w;$tL0G$4@Io=p>9(r2e5k}|O4|#SpMyk;|nswtZE+j7%
z$cn^oEUTL*TK2X+ERY^)X!KGwgKA@}(`IdK)UowWwPnVQbN79G_8H$*#q;M)ecBM*
z$kB)SJ9O{&!Nb1$nWAPw#xti37g9xzU$sRw2ykts@yGj?GB>&==vyr}Q*JI8JQp8I
zUouzAnZ{A$Gx=<1+m*Gy(1=WDFN68^jJMLeBoFH+B}8
zEE9b^8fmX2#i~)(u>Q&+qhTAjmFM7;q{QGgV-Pppi7=&a!MuxoI5u=tw^+#8)9RYR
zKOnYw-{tKMYsg|2om0ze+FDkmNJMU&G^FjcR32#vfDmj_g!#|>@8AYZoRA3j2l3H7+M*dX?yT#FHZWwlx-s1%iB&QgG64V
z=V@QeMk+|XH%)YX_xivZspK1otyh%qeKhgq;O=;cKT5Q1Z1LWqeyQO1ac$`X3icw#
z0QGnk>?3j;Q}|I&pi(#rHQ3kVyOF{KkPuOS?=zIdS#(_-`@{V5eVddd=R2b|xnW$7
z_JAZxXTu&Ljo@utQO
zn&p<}JBHo2yS7bciEGxr+sl+Ur9$Ye5w+UwVc~B{15aUa%dVNL@N-rF+q5PgLX8xf
zEe=@WaD%Yr{$gY0yj@Aer1y-8C)OU7&;4zZ^;cn*B|3#xpiv~Dk|r*Be7>u&p-b2-
zel{qi;DZm49{#b76fv*yp(joK1ta7r8J|d!a9hk0T(ja0c9%ZoJgxVH{qZ1srMa0m
zO;e^GGWBZNV2S*T8=n|6)f7vu2b5z^v*%d=7flyQNS!nc+&ZBbrmZ1GWrO#hNIe>-
zj2J1lYP9lmD6|m|WVzo#cVOd0wkL)8os@l~t@VFKtS?)8ewT6d_D1TAp?2luR(*wT>92VRZptv8G{Ma>FpV|z*fQ;?#QhMXsyq6+;3JWCDVSp=XA2akr!1%$XSDA`=aJZ1^T&jLZI?V)rK1ayrztY2&}+#-F^Ispf~yWMy`gJk&4m4f}0%YUg#y;DqQk<&c7V
zoxgARRiHC+=`p_-ck^JrqVe(Jz!bBBvkz@hE4a349E)dZSH4VUiJ}|5n_}$x;AUG{
zhJ1-l6%AhvB%mZ~4YuIBH{@TRW=^Su`vMVfSyhWOs=lQLmD)0h999*F@Z-e)3fuH+
zVJV{KFWbAC;oU}W$z-QY6FXx)4ZU*$?Mr>{dXw1{K?k+#<`x@nboKo)dFY{f>&5DJ
zBrP~s_%-jT%-C4$%cdi5s+Rgh;ykwz{R;?d23rBw$m>}o40{RU^78>l2gWCfBWIoA
z$saYPfl6MR2F5WMU0XA;(BB_)dArX~rW5!UR*p$(R=AB*0yRSy4cOlA!7a_LyIe
z;|D0KRXlQIOy3p3Q;S76{&iS#OpQLLE1t1%l
z>xTVG5F9cOLdp~hRwfj`E)T>)GHe>pqxc
zNcZMvDDfJH3_7Ao_(@ivgn-|m>lqNBO9O%L{Z1>&M37!ohtwLPW4T8|+VbMz`K7OH*@UO4xN#chkxI0
zOesnu16S88_vLj~6Vck50$e;_^)}A{zQnJPR&k;I>Xar){rY+Qt|0mhHKSX4RNs)N
z1fvhDU~B4DWt4h<-Y*5UddZ1m{w9QKlSPc6VaidBaL}WkZA8p{L!QbTJn!!$fS6w7
zxRJ~V>6E`)n2(6ANsd}8mZ$nyt_w@ojA#54{{yW>N0&~gYyz|BQO~0?YJs50k)uKm
z_4K0s?YyqP>^M3q;(Rtm(mTf3Wun{F_ywC(zjGzA$ih1b>IzQ7XiT$bYwk_|T)8gt
z#8;d5?k#{zaQ*MDZDpj&+1zjTn2;_Y^=Iqn_I&?scW9`EFITi2tBz%R@-eyeOuU^<
zHgfz{y)c>g>nA)(8hFcD(`XjaD!X)Qs~N}ldiYPtX6d?}g&hx$=Wt|wxaN#F6315!
zalM2_x{L-RmA7KMk`cEpKOyJ4PTij${>dg1|D_dK)?RN=6InV#|F$Z493R+cg6=5#lGnmgi1XKOh`KLR)({;B(sZ%8W
z$SHEpR7GIeZPk##)J5GWwxW4o93!JaYKAv?Q!68c8gkx4iotta+6BO#WD>q1h&|IE
zlYMJF(r)^L6;O<|Ibj*gYbccK+56|{mRH;&tYQ?9@=-1)F}YMwyRwvYuN9ZBoQcb_
z6&UuVk=h$>$DA}xhSqCcgh$7XT=1POMRQDRB*z0#K?$KtkvE`RnpC@TAn|=Xi8c#6ZO{*Ab*)cc!YX}bp1*6q2#!ip
zsK3Cg2&Ej^O1Q3`P?zYO(2&`)d&WxA?8W@eG*O|
z0e*`*QvPc0aLFFwZSyK7ORv~g;ygtVJe0O>o%IR-az9l}AER)Q&!wB1!-*4`5T3pL
z881-Lg5At{?mOun`^^Uz6o0j<~L@P4r9vi2pMF_~ZOLr>diva;f_s
zem|_JM^A}(Eh$kmLEB0%T+8xOoF6iobgRvjBCp?)%6k9^$8ZOW{?|f;jPN~kN~=d*
zhqrujGAptGGfO`8@<7ZS{A9T2PNtFGT{EngM7E?-q*nv|@3eR=lBXQ-(SSnw*>aU7
zw&nN+n%~MbCJ_e&s*b+{2mnsSF0fmmJ9@{Du_+@kfSCc9*o`@b;i@=#@M4)92y%zvs84UqYDGZiTdh0OAb4FA1FlHY(#;5MB*c@xkacAtbG)!K8%xwOL;KdV2Yf70U
z7IPV)t`;$%Q1d2hOreCmc+J;0fK5hHh~tMt-JFt%x11pV_;l7H)B0m3DLxcO<0-(@
zsvs|_1UpeG2M^~8ax
zFZ*_lr3Hm-*Zz7XGN-Tvd%TDBIpxu&jV$lBg;cpC_Ie2}@Hq90Ub(^#44vcD;~qt)
zCo>^>Ii6~%f3TtSgY`+Yp)!t)6lj+*Lr7g>>oJzOmaJBpce4uxBfrBWTyafsjSFwS
zNIa%P-y0AphH8g4#xv+DQA%qwQd~9IyxQ$fXuH8odiXkN^9hKK_O;h5@0Z)CoESry
zNAOKNfTG8UQ}IWW>X4GUj;Xfvzc~)OJWu>F;lozs(#v3oO{H0F3L-`79NM>9yO$c3xTaSuT?Qm?8#dk}P@nx&8mg-G{<3BDD9VwiNKW)}ba)L>LJqr(a1((_4=`%W4
zouhmZAlYq#^Z>M3R%;wFh}!>krDsOcWC0yD$81SfJc9p+Qrjn@EfS`kfx$@busMII
zye7Q)ET2EeLhWlgDbW4Kh0k)K|MO4#!FQ_swQb~xl9vEw&QIe!3lq+4
z|4c7LjioY)DoKXOj56~Hq|#yh0Z@aFD)OR!o;YCv|AwGV8BJMj(ASwdCsBInv2yZHs-=(EHY2L<^(4e4sIu%HgW-D{WnFt0A-b&Nxs$p
z+NAaM^yOR!sezs%g%sQQ!N@_Tq>7N}X)8TdI>4*&(^!ElDwUy1xTEOiHQLzF=)s^W
zK&HdxLK9W?lFpBAnOw*)ik=WN9*E`U;5MW8;j{SW@Lzq*k$qnUPP_Vz&*5%QMch39L`&gI+N#rTWwRIp
z;4&3YXl>Yebe$*EUO6$XOOG(uIVmiLp3aoohmV?e$NfqQ?iyjb%MQdJrQiaGTq#LX
zKpUmMzNhC!^6NxHPI>2Vu`#@K%bZtFJsB6R&-H7{aH`5=&H$61KUlDojXO;+0t+ey
zMIp20^j
zGnG^q1zb6IxA92ldt2zNp)c2kxb>?{1|sDBt=OxX9CixDu1~~%ry2S!T^WG`OaN$b
zfDh2hC;(u)hsJidGp)(3xzHu@pvyNJkZ(f!5h>kHAOSyYVEBH5+7|dg3=AJ+fyUoq
zVawt0MehY}OELK3U`KFL4t_Q+KxrkzRFX6l@co|q31!Qj+%6}Z)!)?+D)llA+6zVEJok#z}RGUtV+}VISp~kqB>Q$}VT)f*mcr&4rqx5X(jInkSAQadmG6bt|X(
z^_|a|=r~d3NW?I+!4RezB{;y)TZ(yFQ2xrA;T)gkhv+P$tN;$knq)k-yFw-Jk=m1)
zus?>GR!4*1GW0y|qgDtmr9xLGE}wSB;WwOqIr0UqNSxVDU40!l2B1z+$nyAQ#%y0~
zrwZsQ!t3f3Fx=`?G##8H`~LL6wB1DGon2O@G2L_brTN{JorAkpnJ@4Cjn4rHY#!07
zor|dl3Mlm@xGL_<>HHdiX!>PFSB4+xIB*Lf%UbVLdMi5LZeBIu0|OJ~@%TZ@?Aai*
z`-KG@R-lNl>mqsD{>Bd=BXhSua5}49Q)ayM5nP+!Loy@ZVOJRCfmROgY{N
zih2%5z=q6giLSyoFYpVEKX#A+=8e9+WJAZ^rLJi?u#B2SHjK$yI-Q&M;csJ{ATmKPbLj<
zWX&rd4L*R8#7}6Fn~nV|&KsLbql}$^Vgu^(DsV-6W-O?pzLS=iI?e+?48(Rs^{-@)
z%A{3gO$@{etO_M|>(}6u13K!2
F`hSF&3xEIs
literal 0
HcmV?d00001
diff --git a/src/pt/openanimes/src/eu/kanade/tachiyomi/animeextension/pt/openanimes/OpenAnimes.kt b/src/pt/openanimes/src/eu/kanade/tachiyomi/animeextension/pt/openanimes/OpenAnimes.kt
new file mode 100644
index 000000000..3c21fe081
--- /dev/null
+++ b/src/pt/openanimes/src/eu/kanade/tachiyomi/animeextension/pt/openanimes/OpenAnimes.kt
@@ -0,0 +1,304 @@
+package eu.kanade.tachiyomi.animeextension.pt.openanimes
+
+import android.app.Application
+import android.content.SharedPreferences
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.animeextension.pt.openanimes.OpenAnimesFilters.FilterSearchParams
+import eu.kanade.tachiyomi.animeextension.pt.openanimes.dto.SearchResultDto
+import eu.kanade.tachiyomi.animeextension.pt.openanimes.extractors.BloggerExtractor
+import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
+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.ParsedAnimeHttpSource
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.asObservableSuccess
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import okhttp3.FormBody
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+import okhttp3.Response
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import rx.Observable
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import uy.kohesive.injekt.injectLazy
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class OpenAnimes : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
+
+ override val name = "Open Animes"
+
+ override val baseUrl = "https://openanimes.com"
+
+ override val lang = "pt-BR"
+
+ override val supportsLatest = true
+
+ override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl)
+
+ private val json: Json by injectLazy()
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ // ============================== Popular ===============================
+ override fun popularAnimeFromElement(element: Element): SAnime {
+ throw UnsupportedOperationException("Not used.")
+ }
+
+ override fun popularAnimeNextPageSelector(): String? {
+ throw UnsupportedOperationException("Not used.")
+ }
+
+ override fun popularAnimeRequest(page: Int) = searchAnimeRequest(page, "", FilterSearchParams())
+
+ override fun popularAnimeParse(response: Response) = searchAnimeParse(response)
+
+ override fun popularAnimeSelector(): String {
+ throw UnsupportedOperationException("Not used.")
+ }
+
+ // ============================== Episodes ==============================
+ override fun episodeListParse(response: Response) =
+ super.episodeListParse(response).reversed()
+
+ override fun episodeFromElement(element: Element): SEpisode {
+ return SEpisode.create().apply {
+ setUrlWithoutDomain(element.attr("href"))
+ val title = element.selectFirst("div.tituloEP > h3")!!.text().trim()
+ name = title
+ date_upload = element.selectFirst("span.data")?.text().toDate()
+ episode_number = title.substringAfterLast(" ").toFloatOrNull() ?: 0F
+ }
+ }
+
+ override fun episodeListSelector() = "div.listaEp div.episodioItem > a"
+
+ // =========================== Anime Details ============================
+ override fun animeDetailsParse(document: Document): SAnime {
+ val doc = getRealDoc(document)
+ return SAnime.create().apply {
+ setUrlWithoutDomain(doc.location())
+ artist = doc.getInfo("Estúdio")
+ author = doc.getInfo("Autor") ?: doc.getInfo("Diretor")
+ description = doc.selectFirst("div.sinopseEP > p")?.text()
+ genre = doc.select("div.info span.cat > a").eachText().joinToString()
+ title = doc.selectFirst("div.tituloPrincipal > h1")!!.text()
+ .removePrefix("Assistir ")
+ .removeSuffix(" Temporada Online")
+ thumbnail_url = doc.selectFirst("div.thumb > img")!!.attr("data-lazy-src")
+
+ val statusStr = doc.selectFirst("li:contains(Status) > span[data]")?.text()
+ status = when (statusStr) {
+ "Completo" -> SAnime.COMPLETED
+ "Lançamento" -> SAnime.ONGOING
+ else -> SAnime.UNKNOWN
+ }
+ }
+ }
+
+ // ============================ Video Links =============================
+ override fun videoListParse(response: Response): List