From 2d293145eca309878331573c00a05fc4487ccfaf Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Mon, 25 Dec 2023 18:14:37 +0100 Subject: [PATCH] New source: Filma24 (SQ) --- anime/source_generator.dart | 4 +- anime/src/sq/filma24/filma24.dart | 290 ++++++++++++++++++++++++++++++ anime/src/sq/filma24/icon.png | Bin 0 -> 8984 bytes anime/src/sq/filma24/source.dart | 16 ++ 4 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 anime/src/sq/filma24/filma24.dart create mode 100644 anime/src/sq/filma24/icon.png create mode 100644 anime/src/sq/filma24/source.dart diff --git a/anime/source_generator.dart b/anime/source_generator.dart index 8ef1722a..f1c9c4d8 100644 --- a/anime/source_generator.dart +++ b/anime/source_generator.dart @@ -17,6 +17,7 @@ import 'src/id/nimegami/source.dart'; import 'src/id/oploverz/source.dart'; import 'src/id/otakudesu/source.dart'; import 'src/it/animesaturn/source.dart'; +import 'src/sq/filma24/source.dart'; void main() { List _sourcesList = [ @@ -34,7 +35,8 @@ void main() { ...dopeflixSourcesList, animesaturn, uhdmoviesSource, - ...datalifeengineSourcesList + ...datalifeengineSourcesList, + filma24 ]; final List> jsonList = _sourcesList.map((source) => source.toJson()).toList(); diff --git a/anime/src/sq/filma24/filma24.dart b/anime/src/sq/filma24/filma24.dart new file mode 100644 index 00000000..256dda4a --- /dev/null +++ b/anime/src/sq/filma24/filma24.dart @@ -0,0 +1,290 @@ +import 'package:mangayomi/bridge_lib.dart'; +import 'dart:convert'; + +class Filma24 extends MProvider { + Filma24(); + @override + Future getPopular(MSource source, int page) async { + String pageNu = page == 1 ? "" : "/page/$page/"; + final data = {"url": "${preferenceBaseUrl(source.id)}$pageNu"}; + final res = await http('GET', json.encode(data)); + return animeFromRes(res); + } + + @override + Future getLatestUpdates(MSource source, int page) async { + String pageNu = page == 1 ? "" : "page/$page/"; + final data = {"url": "${preferenceBaseUrl(source.id)}/$pageNu?sort=trendy"}; + final res = await http('GET', json.encode(data)); + return animeFromRes(res); + } + + @override + Future search( + MSource source, String query, int page, FilterList filterList) async { + final filters = filterList.filters; + String url = ""; + String pageNu = page == 1 ? "" : "page/$page/"; + if (query.isNotEmpty) { + url += "${preferenceBaseUrl(source.id)}/search/$query/"; + } else { + for (var filter in filters) { + if (filter.type == "ReleaseFilter") { + final year = filter.values[filter.state].value; + if (year.isNotEmpty) { + url = "/released-year/?release=$year/"; + } + } else if (filter.type == "GenreFilter") { + final genre = filter.values[filter.state].value; + if (genre.isNotEmpty) { + url = genre; + } + } + } + url = "${preferenceBaseUrl(source.id)}$url"; + } + + url += pageNu; + + final data = {"url": url}; + final res = await http('GET', json.encode(data)); + return animeFromRes(res); + } + + @override + Future getDetail(MSource source, String url) async { + List? episodesList = []; + if (!url.contains("seriale")) { + MChapter episode = MChapter(); + episode.name = "Filma"; + episode.url = url; + episodesList.add(episode); + } else { + final data = {"url": url}; + final res = await http('GET', json.encode(data)); + final document = parseHtml(res); + final resultElements = document.select("div.row"); + + for (var result in resultElements) { + final elements = result?.select("div.movie-thumb") ?? []; + + for (var i = 0; i < elements.length; i++) { + MChapter ep = MChapter(); + ep.name = elements[i].selectFirst("div > span").text; + ep.url = elements[i].selectFirst("a").getHref; + episodesList.add(ep); + } + } + } + + MManga anime = MManga(); + anime.chapters = episodesList; + return anime; + } + + @override + Future> getVideoList(MSource source, String url) async { + final data = {"url": url}; + final res = await http('GET', json.encode(data)); + List videos = []; + final serverUrls = xpath(res, '//*[@class="player"]/div[1]/a/@href'); + for (var serverUrl in serverUrls) { + List a = []; + final serVdata = {"url": "$url/$serverUrl"}; + final serVres = await http('GET', json.encode(serVdata)); + List iframe = xpath(serVres, '//*[@id="plx"]/p/iframe/@src'); + if (iframe.isNotEmpty) { + String i = iframe.first; + if (i.startsWith("//")) { + i = "https:$i"; + } + if (i.contains("vidmoly")) { + a = await vidmolyExtractor(i); + } else if (i.contains("dood")) { + a = await doodExtractor(i, "DoodStream"); + } else if (i.contains("oneupload")) { + a = await oneuploadExtractor(i); + } else if (i.contains("uqload")) { + a = await uqloadExtractor(i); + } else if (i.contains("voe.sx")) { + a = await voeExtractor(i, "Voe"); + } + videos.addAll(a); + } + } + return videos; + } + + @override + List getSourcePreferences(MSource source) { + return [ + EditTextPreference( + key: "pref_domain", + title: "Domeni i përdorur aktualisht", + summary: "", + value: "https://www.filma24.pl", + dialogTitle: "Domeni i përdorur aktualisht", + dialogMessage: "", + text: "https://www.filma24.pl"), + ]; + } + + String preferenceBaseUrl(int sourceId) { + return getPreferenceValue(sourceId, "pref_domain"); + } + + @override + List getFilterList(MSource source) { + return [ + SelectFilter("ReleaseFilter", "Viti", 0, [ + SelectFilterOption("", ""), + SelectFilterOption("SË SHPEJTI", "/se-shpejti/"), + SelectFilterOption("Aksion", "/aksion/"), + SelectFilterOption("Animuar", "/animuar/"), + SelectFilterOption("Aventurë", "/aventure/"), + SelectFilterOption("Aziatik", "/aziatik/"), + SelectFilterOption("Biografi", "/biografi/"), + SelectFilterOption("Nordik", "/nordik/"), + SelectFilterOption("Dokumentar", "/dokumentar/"), + SelectFilterOption("Dramë", "/drame/"), + SelectFilterOption("Erotik +18", "/erotik/"), + SelectFilterOption("Familjar", "/familjar/"), + SelectFilterOption("Fantashkencë", "/fantashkence/"), + SelectFilterOption("Fantazi", "/fantazi/"), + SelectFilterOption("Francez", "/francez/"), + SelectFilterOption("Gjerman", "/gjerman/"), + SelectFilterOption("Hindi", "/hindi/"), + SelectFilterOption("Histori", "/histori/"), + SelectFilterOption("Horror", "/horror/"), + SelectFilterOption("Italian", "/italian/"), + SelectFilterOption("Komedi", "/komedi/"), + SelectFilterOption("Krim", "/krim/"), + SelectFilterOption("Luftë", "/lufte/"), + SelectFilterOption("Mister", "/mister/"), + SelectFilterOption("Muzikë", "/muzik/"), + SelectFilterOption("NETFLIX", "/netflix/"), + SelectFilterOption("Romancë", "/romance/"), + SelectFilterOption("Rus", "/rus/"), + SelectFilterOption("Shqiptar", "/shqiptar/"), + SelectFilterOption("Spanjoll", "/spanjoll/"), + SelectFilterOption("Sport", "/sport/"), + SelectFilterOption("Thriller", "/thriller/"), + SelectFilterOption("Turk", "/turk/"), + SelectFilterOption("Western", "/western/"), + ]), + ]; + } + + Future> vidmolyExtractor(String url) async { + final headers = { + 'Referer': 'https://vidmoly.to', + }; + List videos = []; + final playListUrlResponse = await http('GET', json.encode({"url": url})); + final playlistUrl = + RegExp(r'file:"(\S+?)"').firstMatch(playListUrlResponse)?.group(1) ?? + ""; + final masterPlaylistRes = await http( + 'GET', json.encode({"url": playlistUrl, "headers": headers})); + if (masterPlaylistRes != "error") { + for (var it in substringAfter(masterPlaylistRes, "#EXT-X-STREAM-INF:") + .split("#EXT-X-STREAM-INF:")) { + final quality = + "${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p"; + + String videoUrl = substringBefore(substringAfter(it, "\n"), "\n"); + + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = "Vidmoly $quality" + ..headers = headers; + videos.add(video); + } + } + + return videos; + } + + Future> oneuploadExtractor(String url) async { + List videos = []; + final playListUrlResponse = await http('GET', json.encode({"url": url})); + final playlistUrl = + RegExp(r'file:"(\S+?)"').firstMatch(playListUrlResponse)?.group(1) ?? + ""; + final masterPlaylistRes = + await http('GET', json.encode({"url": playlistUrl})); + for (var it in substringAfter(masterPlaylistRes, "#EXT-X-STREAM-INF:") + .split("#EXT-X-STREAM-INF:")) { + final quality = + "${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p"; + + String videoUrl = substringBefore(substringAfter(it, "\n"), "\n"); + + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = "OneUploader $quality"; + videos.add(video); + } + return videos; + } + + Future> uqloadExtractor(String url) async { + final res = await http('GET', json.encode({"url": url})); + final js = xpath(res, '//script[contains(text(), "sources:")]/text()'); + if (js.isEmpty) { + return []; + } + + final videoUrl = + substringBefore(substringAfter(js.first, "sources: [\""), '"'); + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = "Uqload" + ..headers = {"Referer": "${Uri.parse(url).origin}/"}; + return [video]; + } + + MPages animeFromRes(String res) { + final document = parseHtml(res); + final result = document.selectFirst("div.row"); + final elements = result?.select("div.movie-thumb") ?? []; + List mangaList = []; + + for (var i = 0; i < elements.length; i++) { + MManga manga = MManga(); + manga.name = elements[i].selectFirst("div > a > h4").text; + manga.imageUrl = elements[i].selectFirst("a").getSrc; + manga.link = elements[i].selectFirst("a").getHref; + mangaList.add(manga); + } + + return MPages(mangaList, + document.selectFirst("div > a.nextpostslink")?.attr("href") != null); + } +} + +Filma24 main() { + return Filma24(); +} diff --git a/anime/src/sq/filma24/icon.png b/anime/src/sq/filma24/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..159bf41efa5f3be3eb0dd5b3b2af886a58725702 GIT binary patch literal 8984 zcmZvCcQ_kd_%^S%w6!|4)U38vsnn<~+FDh+R@F#rr*c+R=*b3JEX=RD_J_kALb476D$K%OCLJAYrg*({hX7) z`}4v#VAGerCLUlfeMjFn4sU$loR`tj1>UiD1A7^Hf<1hF?kHIW-g$pV>7m4(fb$eC z@xMq~O5y*DrKF_)ugCxK{}0>1AH<22($U>{tfTS7^t~<72Asf;4A`3WG$g+L-ISPc z<;#`Z^b1$&JLKf(Vc$QN!oF{s>hTKvRJdpM)0ApavU~SzSA?yty<)a@baC(KQ_(Sb3Sc13| zq2?LTmqYlFK!}ni3nM2B%W?#~Q-j8{())b1>}58jhdkwA+QM;Y34GL~`zdTAk#Y8O z5NvdQ16v%sJJwO}#-Azqsq!j!_Skphf}!Zf#zwBY!9hVo{Y`VYKhV~j*TfIg&~_nc zGtQ$_h9la8&P{YZEQMv296#v50+%(4x?ILD^pqCC?@Hvdb<@PP5p2tX_AXu^b_ z($fifRBFKS(>t}QpmtAj7$^CbRgzRE2g@DSW+iQ#lv53GbWkY)dMu|%bm;$34GCMI zNh)FupQMzDu%6JoG5hZtbAsjis&a*yrZjDH`}S>1wo5;<${GxL4WERChzAWhQ_8|U z8;8l29m}0&_>z$r+EjZ`CK2%iF=X)KlXPh);X^*_uN7SlrjY?d`!v;|9veh}o3WB^ zPB{G7vFei$$aywMlyU!1NP^(x?2P1fe?1nx;Vj*sNp0c-G476~p~9CXf+YiL8W#cE zR3)Mr^P0p*Mea&H^a|Vtz#bK+0Pc+{yqw!62cPb9voOe{N^+Fh8>@0wZ|aDph(S*q zjB5EO9$C6Da+8n*C*WvPjxGQEF8J3pI}+@7V-xE5a!6rsWFYBJ8zr5-Jl+;?Ay~Q0 zZcN$C!1}vQ$-;AI>3taC2R&T&S<>1(L{s}q!cJ`CY=}bD8p-*0ePsT-vXa=6YFG7J zpcFL`br;FTPcy~OduJQ6FqRN;MA#Bt?mzG1{1gVE5|7s>!BrxTs^9c zI`EZu-tVVRZRc7OzfTnWF}4CGob;Fu`ikM7Jw72A>ZjHZHaEn;>dkAKQ}NTYW14Na zAjb_$b3BtH>{A@N*4ZX$B#z@Nb>Lyg=gFKQiHZ#!oyAv5gKaITaatmKQ_XFRBTKZY zPZ_610Y;<1hWm=&u(_B^eyh&7il>s(NrbT=3GAXF2D@h^hTZ6Zv`?H)x;vd*9(3US z21u5;O?V*v)s2ERY^$*AKd6lR&o{6W z5H0D^*CxSvGVS5wv2bF>0P$^||4rSOyHhXjsQx%cguFR0d;Bf&Hzv%s~0mwZ2d6l=Lz@d)C_uw=Sf{^F|+&c!c= z32iKuh$|A>&j#CU)rRCTU={}|xvJAGy2os202^^YufmA43A$8^e`+iW2ZB zEYQq@PE>@o7WM4KO{Z3C7c=-(&@+5n-4yZgW^9iI`aorMb2Em*F|`m_?U$zO1+2-7 z?@Sgp^kQCMSU*3MyWpBNk@v$ydfJvbmaz zq;ZrI6WydV@dnf&RX7~(_a-S6%(O5A2_gDuHUOpmTYZoVgpQbKA)uc=(I(-)hGCNu zeSY1ImL;dC?@`14d4_;r%7=V=1`Bhl)?$$7w5~GmFk3P2aSVM>WRA4_jjyJt_c%|9 zA7{l3hQRxarKbDrK!IjepAzwG-WhJu*Cn@0nNq)H|R?u~&~#G!%IS zdhaKS0xU7|xI%%&YY@6q zcPiQUJK8lH+9qhYB(svhK!#c^nS12V)KM^m3CJ~##^lXmCCE*Fg=p)PV zyPufL-B#(AdlMvQkRIInRg7QjcB9@i{YWen77ixb=qr}i{g51)oE zG85E%kEnmJp14E36Qh+IDEMYdS?HzA*8Vn;Q1M&{bE1$0HToAiVEkb7FImFFx`Gy6@fq%!&OZOgL@6R_VJvYG#N8*ue>jH z-xWP}P*zdyJT;8b+%)^p)f~OUl(w0E(xY(M7K_1ps5GrZvcch8wL42-^2*gL>4+!Z ziau8x=T3`w+r4!$SVesU&Nt+}PGP41wy@0*X<||Mwm}^loJ6Li5cLNjYuZU0K^b7C z3*t$4IaGrdxAHkkH5koVS))2mZ7I&01q+0SN{SESVq^N?T@7ytkdbMO5QgP=(eUo| zq=nwdtFob8pUqI3hVm(x(C^>0e$I@T^xKNMSs}EnA*WChQPof@)?K^Tc+a{7Pso&y z5ZHoi4U9%2e+axzNjPd#a7Idd?=QIw@E5pj3U07?9sQB?l>5%d#Fw`yLwpCL-)vTrgw)I3D&El!(VAC2HK*^^D8p!mIkfnPBr zGgq2zCI3Ya4MuabzVM%WU)TWK2zc8*y5!WvQt?vhHV}$>w=k2^X=g{Pg|_|db5tr; z>pJMj^pDIFf-ht%19m5TNN(F9>AX|-gwxzpr#0wvxRgLK?4DQex=LOzDD{h4`{46q z&rkO#f|I=DmtFBLvaf?|2U`oUD{}tnpCy??+!PMvK`OXoPGmE6K^ycjBQEG@2;VRB} zYVRG;lML~m)#Q-*`j={crx zb#xK65XVM@G}@=0-b2yDtlc0^EFVm-2<`b`Zrf04gCI!`nM$_f_E?KZzRU^r5~rKG z)E1RVya*7s_h_Nz5lPok@#82VR@bn@ofG!pU8U_W(53W5yw70aTUFiNJ0xt8c2~80 z4o9apIB-u4!Rq+iJ!1_1iY12k%5Ry)(XEUeL8)rmi_6s_f79|#BbQyANUt$*;CRRw zNV`!&@+|Aut%NP^QdGi6ij(YpL+FGWv$Wz;aKB44-5aOBl~ zKC5dXoDWEY^~7SDU_!Vy=(I36x(Yn_Tro56mOXUfJG+-m=8V{~#>znQs!BoK*SYt}6V{eDR~>S=?=i^a?>DS7b~koDm#qxCQFz@PF`*w8V;I{~UY$W^;7rJDFI)_t z3;NyQ)v0KE{_a%T)Se57ozxR)WwoS%Au-FjLEF=X?0o6tbHTGiF13d1SZBJsh#|%G zl`oz0#UtRf7`~gWCL#`VW9{7UvK%e5M!ko@1)CbQOOze-x2#Xrr^UsCexrn7GBVIH zJc;_^@uvtd(?8!Whhhjla@@vP7WTeBMOkEZIwv*(H6dFlkrf>LtwI~N+`3(v;}r-} z5#53xN^$3z-p)N5Cfc3!|9v*q4#=Gr*$Vcp;O*OQ7(BEg*Y^QbgIi-zpGiN#q;@nv zr{R{e1~mCESm33i>}}vK#kC8`^RwX9&SnR;3vr4@>lAwP!iefY;}=#Un@{Jp`YRVR z)$rneYR!NmLuVZu5V{_>0#kwNB;Ca%GenIAT%x+6Llhbpu8Hxe{5IUz=S%7dY%A5y zdR3)9Fb+k|uRa-(|FDNt1DXJ}DF(k<^alLLe%K=fQ*)HABo&xc0Sg!W^7rBiV|`l% zycfn9YUmvW4yRBIGw#PMu`OE$6mi8P`rM-(KD(1BM+m3~kc$Uw6(`Nr^8*_`O@Ja$ zVSO0qE{otpW>P+{#PPA6@NpNBqN~BEghM3Sl>6}S`;K=N&-v6e>{!>I6clSARq-c3 zxiZqDASH_Ba+SI1Y9-5;UL_4q&@|Cw-clNTtVBg^*V@Dz(_)B`zW&$c6E@opa1-sH z>H-n>E<5q8g7*$@(sEc{CxP8sZ&DmGL9+6xn31?+PzR%b{&(`vL#m`X4Omk-4JV&aIH0~ z;1|lna_GQDNBky_fo1@~Km>@;Af)9g_gnfF&FA5VSV46YJBTC3RDo^>qid-{)SwIPPq%~_CSvf#>o z`r>#i<*squdWZmg<@ZAM;EI+a?jhCzvOmziGk?wdKw$2UXUU;m)I>6f+EK93o@j3z zms=s5P6JYenI@u09eXaGwi3a6VB^f}RO-v5>{mhFZu;iJz+ZiF6%Dm*!d6O*n9( zl7N)**9iMp^sQDRM}_6-o77Z+oZs)=2bjcFOJIp24IwIkRC_IIfq!JSm0WKoFV?0- z=*v>*J65Nz9%8us0UnM-K9>^NY3KG_o8A;r(3D(!*VO~I0pf8&MNAVBBLvQ2y>Stx zTPB*Y=2b^TC+zt z(u8}ii1O$;1ErnX#45NA&e%jRoe&PKy|t(YM;8ck-$G%;yq+$TBTyt{_wUl-r^C?$ z{zMT3-zmx6wtk8_anZ}o*BVCFZbrKH7-%W#%-{GWF4_K76pSYb_+Kez#6~BYr9~O9 z%f7d=Z}MzR-vZ@LHkNS|2c{XXm~NZ;<=)~{zk39}seB*Pgr^2f%|}1PsNOa>Q1^eS zcfca@eku{40N^Z+?EC(Clk%>QSyd#-TI%83=YS$S2i_^b!V+UET1O9%SCA188{w4#abk}AzLaPukF zValwI&AbyYPXsHa`45jS zO1kGL?nJ$(9aL~E;IANd`ZtW7b-Mq4{Nh5mC-PW=K{ErANys_LovGW&4JHRK3mZOd_RM;i)*l55_Y(3vzy4! z7d;=5|AQ4)=Ge$b8 zuDWp)q0#;Tuk*l_Fio#mqZxnB16>gN3wfs4?}P)~_wSJKw{x?GQIGmEZ>_$5Z*^9M z-zqj8&AsuWXi|b*3yUE46J@W=hltSUrrYSlt$)H+s*1Dxx#?Rv5T>W;UzXFz%FSJR z^-ZSRJc0T^OjL^aaN9tLN^nQi7d>T3cpv}iIAb-c40_HebtbHPUsdPbh%^Rr-Stzo zsffGOo3Tifk`(lR^1OlfMO?KdCA#0HaxGp@FZ#&ku4gDP&p8t@c-+5dRMoGrSZIC=lT zy*<0D6|kWEv!TrvA#xz_rJ|v6Ck|B?$y&NInDZAA3R)<9bg8VPdKz#Gam%8H00Dim z$tgsyO@7t;kUlEfPK69!O-XW%*FwFdJ8=Pw%4d-G`U!fM8yTvT`2}j|XN)@dl#iRt zSk(lby!0V;Ds2?syJbNlJ;F%D$ttJaHZxNhQba?SzouspB;iwnjD;vd+r4HL zT|`ds0q1to39C-Fqv!Xh)$h9+^jW(5KBMpX*}QN2;@Tdc5JU=$kB~PM3a$qLYCx(2 zh~@}1!KQx4`;zeX7vooRf9hekVyD*+Uo}d!k$M*wG+$W=me*Px9>7-Kc(1OKG)}6y z$lBW7eWCb+N;qGv)!{D6MM9hBl5le3Feg zX)m)I+gQ8SVg%!wao!f^6ZW0*H;ssj`J_&!k6%2fm6KP zimQdr_PznMT)#)Dl}lDAAv#4-D}<=>n^d1C7h8TWr6PG*v_=e;Fa^DTHczUcEVK}6y4E%B4b+kN%^a^25`@W zX|}*7Tr0*fSLaZ75hLScCtvn=G=%*L=@R?K_>WMsA#c%1fOk>gPcBREs&wn>xCxh4 zw~_}@yDi@y-FBkIG@vT~w`;51B>DuOSHQ$#R%?Lvcr612NjLLSaY`pC(|e7CqYF5Z zzd5f~=qBpbVp%zESbe87YeRe*kDI$ZtWF(twTK|fCN+j&i+8^95IZRyG*5T0qczAw zCqymNm}?q)p9RAAH>+W-$ zwj&`G-d1QdOKU5yK^z(6+$oA>2ka-u_KKe`&~hcd>TUg^&JVGXpR@k+Fl5BE+-!8e z;{sua2(7%oP4NyG)s8XCFD@)+4 zyBmGsTO8kR_r=vj1&#;>;E>T`0@FzLV-+r`T1 znF6AGg@(uFTsb=!eZp;Q+TFamdjUZBN=QCwn6-vPvQ-^5rY#v32?ozb33{s{9oHAV zJJ7jsoh$I?xysicBSJh?v zyNh<{y`v>Q%~{~(4T9cT6W{&{O5T$rbE5o{-P5=y7Z8BPvk0iwTrzr}ZM1MPVcql< zP=U=Mq5Tp!uTxRi7cp{RmXxwl0Uw@HsPPnN7&@gO=`L1qG?2cU3H&?OLuGVoR06UF zR{clLXExq&3Y&rrAHe=g1%$OW45M&Eb) ztbscmSOiZMjN6PY4*kQZa4JjrZIMb(*)W+aO6wN&EOMvpRu1wP-#Ff^{X*Z$?})>C z8Ust6r16jv$lv*0E5CnP=)2~v@aE%pYft=K{P~=YGD#`495>^+SB;-C&@+sr2mNMB za!G5dMmOBp&ZRy)M9|)!x*v-SlYr+cRkGq~Q?S&saQ3H1JHJ;-v*u&*jQgI_#K*H%TUKhfADk-jP_Fy<ZAZZR|?Gi?dFP zkZI|C4G__Go&xWM8|s#DPQ7O60Qe%Gp&1$V^hQwWuV|Ftcu(g+%f;BPuPm+B6tBC% ziFhT6H+|S!#hzbbi9FW1eQpI8FZX@C+8-mEr!B^(sr~D|{d08}#9&+ z`B>sGMlWEq(a5)JH?rdLC(4FvMGU@Vy5#av(O~t8rE%AUL)CAt1C7Rbhr90m=fWk^ zI=Q}Ah^ZRwaV>`Le&&59j1$@94iKa`%tq4j0{YM$(P4Xp>(`~~t9XawaC$*@&y_tE`m zTrwXLWK#I0q^%qYa|)kv!uNkzEZvY|+Q+*o26ZglN%vKXU2 zB=SAzcw=)IU5yZ}M=75!i?jdW{n+o;{zy8VVC{lU3>zsqgq?hjLt|}A<2)?`^A;~% zSozBGcWRdtH%KS2EK8{h#}^%l)%Oz7Lm3k8ro*VhJR9wsTBTYG!$H*d4mdJ-I%<)p z-+Z->^@9O+k4F{n5VG;5yQ%fcW>k*@D3CbRM%G`vLkTH~uK=Sh0MTUVVX`OV3e=$6 zrDr7n;!|uVHpf%(T|)H-h+L-T24|CvuPJz1Lk3>hv7v~|Z)qi5%RFV}%z@EMjn2}zm+sO}lQmZphw9y7Cncd~yyw+hY+h{MAQ7e|^EQk*s#Y8ZCJA)< z0kTWIvoGVv&*jjB8@UeQL8&LzkRX$fcv1iI0AAXF;F3$Otm5$VfC2^%4AaoffXywt z=1zZy7b&RE6|KV;PwLtttI3yVCFKGgVYNr3M~O65%NnlveOlzls~H0#z~oEdii=<2S(!w1*yMpjbj!p4bRRPbXUTX7b1b?f zL+?U18(3`T;!SBF9R=nF9mjUErS)A0jlUEH!iI06`<86#SGjG@Z2Jb78gLCK>uVA8 zn6{M6b0Jq_${fM9DCuB2*WYp-XIQzMOKe&at_gOv9=PYfcFvMlrPSc!Q!oqm$^%6+ z{qFZb3I3ewo!E-EGxwspXC?1eF_#|>z$}{6T~b?}I-7(G_{7eqL5SYf46voP90nHw X>PpmV7_0yLqoSi}pi%zx^~e7KiGZC# literal 0 HcmV?d00001 diff --git a/anime/src/sq/filma24/source.dart b/anime/src/sq/filma24/source.dart new file mode 100644 index 00000000..1aeb44ca --- /dev/null +++ b/anime/src/sq/filma24/source.dart @@ -0,0 +1,16 @@ +import '../../../../model/source.dart'; + +Source get filma24 => _filma24; +const _filma24Version = "0.0.1"; +const _filma24CodeUrl = + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/sq/filma24/filma24.dart"; +Source _filma24 = Source( + name: "Filma24", + baseUrl: "https://www.filma24.pl", + lang: "sq", + typeSource: "single", + iconUrl: + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/sq/filma24/icon.png", + sourceCodeUrl: _filma24CodeUrl, + version: _filma24Version, + isManga: false);