!yM+#G3GHj3;51pW(-=jrwA0U=c^u4Mr{W#P44gB)fqwv(_2w
zINpx3AUW<7&}`hqonjZsX|w_o;rX+Wa<>!JXOub!ZJia=fKeXbXyl5i)`1-5^H(h6CNi2N&AEmTKHTizE
zE%Y-5(YW29u3KO$nkOMotD!=Nv|~(FCzPIDyELvV?bxNuxeI`Zho@Py!P5*cCB<*@
zt$R$3$GX^KO*Na|Q{xpHNw*xP6fhD14UuX6W&whO)ePM<0oR(=c<4v*bamjvtE9Q(
z;ptG}nbm4&I0{e+Pe4df!|J3$@kP?CDhRGwN8oMOT>A1MSY2}-o{q>9_>OD#SaNg}
zM9>5oB?{W~8;bj;J8=#Nm6Zu#5i$TRa14!;71Vz~SP1&wT;Do7QbhV*4KizR^2(WW`nEtX;DaU(0;z-PBTJ>kakR)tgrr
zTf1(DGuF@CpSo|)-aB^x+^=8y)l2u!EY_b}YHC^bwXfN&KJVPI6&I;$$a}VAJzE}n
zw!$>^Z417STRv>bRORY==LVKqH{XihjNW$ST6gDL_hwu7X5?J!Gjjv)ocZ(bs(pVX
z7H93Ur|#O|n}drR58P|JSGU-F@S&%7$+O|R6#*K*RZ#c;q0igbK^}BC``!G5PJh3R
z|J)`(UUMsq42AH}*C7$!FNQ?d84>};6mA|Nq
zAN~i>$2P-1fJChK?;YpaPn}a0%c@rJ5CK9Ni7o^bkg*())Xok@}a#z_u(A-F**QI(5hofFLrjq2JwiY*E3L7kQWz`
z#KU9?>9VGMrC3thau!Ga0wP2cH{4p^w!E(^>+AYu-Mtrc2aZ4VotQfg0I;cj;lRfS
zKRlS(m}~FNwLUvH@b;NyamVfB|1$W=;JvN6oqaj6e{SHRr)7Ebp3L#j20tCVAIx>1
z%55IR+D*$Hh1$iw=X2ddxsG#l1HbjOJ&G1jW_D-V7n`4Y=-F3>7O(dO`dZ0@R%gG!
zKiKN;C;aC`fPBP+0N4gz5C#w@01oD%SedB&&Ch>`o>U$OwG}9fYLb<^7L#~zGu*iO
z+=EnwP(nP=R$<{aZX7voS&&>N@jwy-)_i#Y8@aIeime{AwZiN`X2>`)#zuU3SiSDRFVmCr9^5RmANdabw-6`l>`ZF(Yua2sIm}>>lI;b9Bq=a
zP^3~Exd`5iS<6+++aKv^5r)d-Z3TJTjETna!7mGvcgFGvw6VF1a|Wx^U%CuvJ0h!*
zF)^Hw#0i>=$cj?HvI5|UBQzOb&qFGp+Y3qh%1A6Zwcdp66fb~13V>L~+RU|4hECC>
zcI6nSH$R6?1W}G(mL&<0R>uHyiqoI)bO)RPMY_q@mBzW!4KE@nUrxrPm%xN$FqZ^U
z<2ju~gCr7W6vrBqM^w$0l4Bq_@H9bRLYVsr|lB900=j`m-H
zV&ipWTMaGw`p#^9=fnD4Yc<5TW#OkEzx3ftnZaCB-*xMfzvY(yrhnn7oPT@XzbotC
zm2u?!2lD>jtiSiVZN)}5G~{dAvNdhDM;2?^ep|D5We2I*@#nQh;%oaO;X#0U|Ba5H
zpIojF%n!ah_|cZdZO`7nx)_PB5V+xoENg_c_hH=7Z&|Kynm_jLu^VUSPriHdyA?Z(
z{%*}jYW(X--JZ;$%$~*OeGfhROJKSmj^K4q|I_5!A=1}QepP*_777pAo&Edy2Rjd0
z`uFgkcL`AS`5pnPKHtw{{%PmHX8sGSf1ri`qD6rGIz%@q-!xzyGd{s#RN45H0COb^
ze$S%m34IGF1J!1zgyIGY0bZCi3&>RkbJOg}gAvPLA=EnqIfQe`I?BDW4OB^BvhXMi
zyaOgtGzGwSsghh3kn=G;k$IE_N%+7dtboTR;ugv8thI=+u(zhN37`o0Z!`91q(dZV
zPtUv9t$^sLoRBF(6gW)B&|v}S0N626piAQU=TCLH%-(=i;7}-cm8ldwU6Zj`3f(5a
zfq)g3O(9N2RY2L|5@2JACNWaX`6)h58aJkKmnob)ct!x0lCQ{Mkjc{%QLwpy_zB=$
zp{bxp=VV9_=n0G%4&ry9VTd%_|4(+H3#O7
zT;KENNg!un-AVb@J=xYh`PO~e)_u8#{d2D6rcDd3y!b>`d?MGhd(ML+tFQ0Ox?2~X
z$?)0s?t69jgx|CuG$(=%&gyGbZ&oce`11|hvklwx4Nqhno>*!M)
z<8;u2-ad37heDbw6pAOM$r$E6q0p<7;h5e+k3e5~6eAHLjYpX8z#_TwhL`HBC7S%SGVN42C7TiXyLf&x32-0#@!U%
zq|62?IHM}?qW^5su1DKLD5{gfB8*W;()=S;AOs&)Y5^>l!H(lQUjQvs9kx={v
zF7KuQxOY9edTxPf*69&iD@>36tzaX4zY_&svWjmNxMR@`T)`fK7Jh~UPHlsB(>8)t
z3qdvC)Vo&GUb4V@RNrgA
zrlz{+b~vE4dl%bPClHNY^fc5ktBPL09NI062BmrNpr~E9(!`{WsPiERO1D~Dz^knAXefO6qzIl&NFD|5VExYGVFL|2to*h}wj)$I3
zXao0oYrd^J+t!_l=jsN)f!^SszxeLO8&`4-Kgl=j$TsY_eJt0oH{Z~cZRnXhvJ}{K
z>%h$e3m0;Mo%z7tY+!F@EEjn8K9>#jHe=t&sU`PYjQSA&VEJqtvE>a
umbpaU+mZElEDUG-Iq%aybN{#PtcC06{yN^EL+ZvNt(vn)>6{CX=9|R6UUBoa~;c$k&P09T8?BY~kcfP}5YO1Q?_{H;YtW7_nY5%6iQ3m!N0OQL
zOmeh+G?{JBs=i8mESYQ1F^xBOkB8N;wx_pGysCxuaO&q;ICV>J&!g1{r_q|`^S6xl
z$&f8+t>zb4w|2Q@=5Alay+C9^JyIOj*QYSW@^43Yy?Xk5%nZSW*FvPz3}$+3rp9Q
zaz{o9Py4b%Z#8)sXq>}8TSdV&+MBk{4Q__)jvnfv@pH3naXU2cu+R!^v>dcxYh0~_
zRkU4hpj|_oY-+YEXf-f;I&7j<#Z_t@31`r%g$`_cG_R@mf{8?j!zz_5lHBj&>3D
z`B-|yvkon7d{CVrbsqoh85ALt+AS?&L(OMHDs^e>nxQ__*7ZFsdtO7IHALIT;_*;x
z@Ykw0I$rBWG792oz`YGJu$QToc&n-KGG*DQyXMiN7Rr0d%1dG`J6pDB#&Y%EDcs#U
z>s`j1c-!OI@%@u{TIQnA+&Z(_EE~*D0Ayi2>@$|T2@j*dkHU^l
z!$$|z>95d1@2L<0j9}mO!7oe8omZ~b7u-|RoX&c@6Rk#_!o*whfp&Ym0`FARmDsoI
z-RPq}_kg1=96#bhZK4|G0YORm^vmKgEUl%Bhj0=e6=de30EcS1m2uhcJ&kInUe6gE
znY4qtdKvyw<-I5a`M?gjEpU(M9&KAzrr`m7rp)T#vzHRInLu1$3)0igRp|KA4zNPP&Lvyzpx_fLFG_Xhh
zSG%EgpEEUC-@e1N9gAs$N9ELRBdiW-HhqsV?PuBz?OiRb?N}dMT~INdpV6K{5B8}(
z_;qQit6YKsHel3MV!Q+HS!@{(y^#$bXwUZT^}ly*G_G7o&Ys17Jpl{0>s`Jj{n3Dd
zdsE6@c6M#5w+({5kzoykeHvzK=w01ILJ+j
zh3Dof;z?dD9`EDndF8@ZhxaIUo9*Ef~2@zrxggSr}{uF*5a6guhc@i!!Z2r7kC*|msDL6&cVEbZ+rfJ+Cs&PXRTZh<7FyX(kGXp-6@
zopl=kMQ?StMnp?@f(fIsoVu;<
zS2S&Je?EHhqq4bsBy0@zL$LnJGgLU89{jC@^+hf_H@%=6dOeYLc$STDJOZ1yD$?X2
ztK9?HH&XH8YMgE!lvJm^cc9PU42NPs`D_ozX|D_vhw)upzCtqC-@)<1tHz;V^g3s~){JXq>2Gzk**LgiIDW=x7G8CH(yNH&NAq+J
zdlPw-@}><`AX-4&5G^wy{3g_2&?L3>b@&PB-5l!c7HS40jIp7Ki$m1rA!OFrhq}0^
z?lE3~6x_AdU5+Z<(7L0ZUq5s1lNNqbp2zaX;7
z+0C4-h;N{ZC~3*`LyiE>w|Ws`G_pVoVpMFm>ILKK7$(k9p^$D+?HY>Q?)S*M#8v89
zqJl!Ipbda77aXsM)NBL~r2(pn4nrRTr(IVM@zol$eAL3b!CemHrcV1kHrOYaJ|nfS
zxu#(=5&~6Y4rddx-~Q6IU1M;7f+ufo)hT13EYbJ#s_!Rh*pI1R_x+FhL0nuBFJgA_
zV=5j+ksIV0k5lu9R4Dxaglg|nu@7=pBNZ+vG?329C|tR$In}5%A8*b!o>Esj=sa+c
zP0!(P;A875y;U}WtH1gOm?%=`)eA|0)a($V>e
zC91tDb5d;D6BvGA(};&lar!wLgIyA*U?i{?QY=yhlyVtErV=eAUJ?j_KF}dSZPEwe
zBxl#%gYX<8LGvq8+hs#YSCx3F5#TLz-3cv3d~0Yy9oUHY_`ZUO@9fxRPn~)~cV5GM
zQ=}lMPH7o^3B%0OL;Hrd1dPe%_CKHq93^y*?9PPsp)*zlN^?x@I3GLV)Dpg$QB4V5
zv|5e9-^(p2p
z;wjq1+M;@^(;&b_K~YM@bMZRWRKz5D9vI$_yu0k_TpOG$V)`nnB+?P3O-L;toe1d)
ztLl5qq2Nwo8y^M0tGz-7P(r8TcQDb1#mAVT_HwRH~$6mWE6(9s;-;t1SCL_+*O%vR28?+ux}v&REgfn
zuXs>75jk!f(}?$|Sf)a8IJu&DpNdr~9zIwoZ~Xv$f5bl{j&xb0A*iSIka!Cx_5OJs
z+Z9JEqXeAzRH!IehC8(pxv`R+De~pVmd0NI%Wql>*JTthjJ~NAU)b(Dih?{o@J@)a
zC+|0*zn-Pt^Xi+FqN?`nB_8* 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # Download title
- download_title(select_title)
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/1337xx/costant.py b/StreamingCommunity/Api/Site/1337xx/costant.py
deleted file mode 100644
index c4bd929..0000000
--- a/StreamingCommunity/Api/Site/1337xx/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 09.06.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/1337xx/site.py b/StreamingCommunity/Api/Site/1337xx/site.py
deleted file mode 100644
index 92f6fd4..0000000
--- a/StreamingCommunity/Api/Site/1337xx/site.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# 02.07.24
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(word_to_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: The number of titles found.
- """
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
-
- # Construct the full site URL and load the search page
- try:
- response = httpx.get(
- url=f"https://{SITE_NAME}.{domain_to_use}/search/{word_to_search}/1/",
- headers={'user-agent': get_headers()},
- follow_redirects=True,
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
-
- # Scrape div film in table on single page
- for tr in soup.find_all('tr'):
- try:
-
- title_info = {
- 'name': tr.find_all("a")[1].get_text(strip=True),
- 'url': tr.find_all("a")[1].get("href"),
- 'seader': tr.find_all("td")[-5].get_text(strip=True),
- 'leacher': tr.find_all("td")[-4].get_text(strip=True),
- 'date': tr.find_all("td")[-3].get_text(strip=True).replace("'", ""),
- 'size': tr.find_all("td")[-2].get_text(strip=True)
- }
-
- media_search_manager.add_media(title_info)
-
- except:
- continue
-
- # Return the number of titles found
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/1337xx/title.py b/StreamingCommunity/Api/Site/1337xx/title.py
deleted file mode 100644
index 1af2b8f..0000000
--- a/StreamingCommunity/Api/Site/1337xx/title.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# 02.07.24
-
-import os
-
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Lib.Downloader import TOR_downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Config
-from .costant import ROOT_PATH, DOMAIN_NOW, SITE_NAME, MOVIE_FOLDER
-
-
-def download_title(select_title: MediaItem):
- """
- Downloads a media item and saves it as an MP4 file.
-
- Parameters:
- - select_title (MediaItem): The media item to be downloaded. This should be an instance of the MediaItem class, containing attributes like `name` and `url`.
- """
-
- start_message()
- console.print(f"[yellow]Download: [red]{select_title.name} \n")
- print()
-
- # Define output path
- title_name = os_manager.get_sanitize_file(select_title.name)
- mp4_path = os_manager.get_sanitize_path(
- os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
- )
-
- # Create output folder
- os_manager.create_path(mp4_path)
-
- # Make request to page with magnet
- full_site_name = f"{SITE_NAME}.{DOMAIN_NOW}"
- response = httpx.get(
- url="https://" + full_site_name + select_title.url,
- headers={
- 'user-agent': get_headers()
- },
- follow_redirects=True
- )
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
- final_url = soup.find("a", class_="torrentdown1").get("href")
-
- # Tor manager
- manager = TOR_downloader()
- manager.add_magnet_link(final_url)
- manager.start_download()
- manager.move_downloaded_files(mp4_path)
diff --git a/StreamingCommunity/Api/Site/altadefinizione/__init__.py b/StreamingCommunity/Api/Site/altadefinizione/__init__.py
deleted file mode 100644
index a044fdb..0000000
--- a/StreamingCommunity/Api/Site/altadefinizione/__init__.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# 26.05.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .film import download_film
-
-
-# Variable
-indice = 2
-_useFor = "film"
-_deprecate = False
-_priority = 2
-_engineDownload = "hls"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # Download only film
- download_film(select_title)
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/altadefinizione/costant.py b/StreamingCommunity/Api/Site/altadefinizione/costant.py
deleted file mode 100644
index 5bac8f6..0000000
--- a/StreamingCommunity/Api/Site/altadefinizione/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 26.05.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/altadefinizione/film.py b/StreamingCommunity/Api/Site/altadefinizione/film.py
deleted file mode 100644
index 0cbf1aa..0000000
--- a/StreamingCommunity/Api/Site/altadefinizione/film.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# 26.05.24
-
-import os
-import time
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.call_stack import get_call_stack
-from StreamingCommunity.Lib.Downloader import HLS_Downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Util import execute_search
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Player
-from StreamingCommunity.Api.Player.supervideo import VideoSource
-
-
-# Config
-from .costant import ROOT_PATH, SITE_NAME, MOVIE_FOLDER
-
-
-def download_film(select_title: MediaItem):
- """
- Downloads a film using the provided film ID, title name, and domain.
-
- Parameters:
- - title_name (str): The name of the film title.
- - url (str): The url of the video
- """
-
- # Start message and display film information
- start_message()
- console.print(f"[yellow]Download: [red]{select_title.name} \n")
-
- # Set domain and media ID for the video source
- video_source = VideoSource(select_title.url)
-
- # Define output path
- title_name = os_manager.get_sanitize_file(select_title.name) + ".mp4"
- mp4_path = os_manager.get_sanitize_path(
- os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
- )
-
- # Get m3u8 master playlist
- master_playlist = video_source.get_playlist()
-
- # Download the film using the m3u8 playlist, and output filename
- r_proc = HLS_Downloader(
- m3u8_playlist=master_playlist,
- output_filename=os.path.join(mp4_path, title_name)
- ).start()
-
- if r_proc == 404:
- time.sleep(2)
-
- # Re call search function
- if msg.ask("[green]Do you want to continue [white]([red]y[white])[green] or return at home[white]([red]n[white]) ", choices=['y', 'n'], default='y', show_choices=True) == "n":
- frames = get_call_stack()
- execute_search(frames[-4])
-
- if r_proc != None:
- console.print("[green]Result: ")
- console.print(r_proc)
diff --git a/StreamingCommunity/Api/Site/altadefinizione/site.py b/StreamingCommunity/Api/Site/altadefinizione/site.py
deleted file mode 100644
index b06ee7b..0000000
--- a/StreamingCommunity/Api/Site/altadefinizione/site.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# 26.05.24
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME, DOMAIN_NOW
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(title_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- int: The number of titles found.
- """
- client = httpx.Client()
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- #domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
-
- # Send request to search for title
- try:
- response = client.get(
- url=f"https://{SITE_NAME}.{DOMAIN_NOW}/?story={title_search.replace(' ', '+')}&do=search&subaction=search&titleonly=3",
- headers={
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
- 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
- 'User-Agent': get_headers()
- },
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
- raise
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
- table_content = soup.find('div', id="dle-content")
-
- # Scrape div film in table on single page
- for film_div in table_content.find_all('div', class_='col-lg-3'):
- title = film_div.find('h2', class_='titleFilm').get_text(strip=True)
- link = film_div.find('h2', class_='titleFilm').find('a')['href']
- imdb_rating = film_div.find('div', class_='imdb-rate').get_text(strip=True).split(":")[-1]
-
- film_info = {
- 'name': title,
- 'url': link,
- 'score': imdb_rating
- }
-
- media_search_manager.add_media(film_info)
-
- # Return the number of titles found
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
diff --git a/StreamingCommunity/Api/Site/animeunity/__init__.py b/StreamingCommunity/Api/Site/animeunity/__init__.py
deleted file mode 100644
index 4ceb359..0000000
--- a/StreamingCommunity/Api/Site/animeunity/__init__.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# 21.05.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .film_serie import download_film, download_series
-
-
-# Variable
-indice = 1
-_useFor = "anime"
-_deprecate = False
-_priority = 2
-_engineDownload = "mp4"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
-
- if string_to_search is None:
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list (type: TV \ Movie \ OVA)
- select_title = run_get_select_title()
-
- if select_title.type == 'Movie' or select_title.type == 'OVA':
- download_film(select_title)
-
- else:
- download_series(select_title)
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/animeunity/costant.py b/StreamingCommunity/Api/Site/animeunity/costant.py
deleted file mode 100644
index 5bac8f6..0000000
--- a/StreamingCommunity/Api/Site/animeunity/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 26.05.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/animeunity/film_serie.py b/StreamingCommunity/Api/Site/animeunity/film_serie.py
deleted file mode 100644
index 64230db..0000000
--- a/StreamingCommunity/Api/Site/animeunity/film_serie.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# 11.03.24
-
-import os
-import sys
-import logging
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Lib.Downloader import MP4_downloader
-
-
-# Logic class
-from .util.ScrapeSerie import ScrapeSerieAnime
-from StreamingCommunity.Api.Template.Util import manage_selection
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Player
-from StreamingCommunity.Api.Player.vixcloud import VideoSourceAnime
-
-
-# Variable
-from .costant import ROOT_PATH, SITE_NAME, SERIES_FOLDER, MOVIE_FOLDER
-
-
-
-def download_episode(index_select: int, scrape_serie: ScrapeSerieAnime, video_source: VideoSourceAnime):
- """
- Downloads the selected episode.
-
- Parameters:
- - index_select (int): Index of the episode to download.
- """
-
- # Get information about the selected episode
- obj_episode = scrape_serie.get_info_episode(index_select)
-
- if obj_episode is not None:
-
- start_message()
- console.print(f"[yellow]Download: [red]EP_{obj_episode.number} \n")
-
- # Collect mp4 url
- video_source.get_embed(obj_episode.id)
-
- # Create output path
- title_name = f"{obj_episode.number}.mp4"
-
- if scrape_serie.is_series:
- mp4_path = os_manager.get_sanitize_path(
- os.path.join(ROOT_PATH, SITE_NAME, SERIES_FOLDER, scrape_serie.series_name)
- )
- else:
- mp4_path = os_manager.get_sanitize_path(
- os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, scrape_serie.series_name)
- )
-
- # Create output folder
- os_manager.create_path(mp4_path)
-
- # Start downloading
- r_proc = MP4_downloader(
- url = str(video_source.src_mp4).strip(),
- path = os.path.join(mp4_path, title_name)
- )
-
- if r_proc != None:
- console.print("[green]Result: ")
- console.print(r_proc)
-
- else:
- logging.error(f"Skip index: {index_select} cant find info with api.")
-
-
-def download_series(select_title: MediaItem):
- """
- Function to download episodes of a TV series.
-
- Parameters:
- - tv_id (int): The ID of the TV series.
- - tv_name (str): The name of the TV series.
- """
- scrape_serie = ScrapeSerieAnime(SITE_NAME)
- video_source = VideoSourceAnime(SITE_NAME)
-
- # Set up video source
- scrape_serie.setup(None, select_title.id, select_title.slug)
-
- # Get the count of episodes for the TV series
- episoded_count = scrape_serie.get_count_episodes()
- console.print(f"[cyan]Episodes find: [red]{episoded_count}")
-
- # Prompt user to select an episode index
- last_command = msg.ask("\n[cyan]Insert media [red]index [yellow]or [red](*) [cyan]to download all media [yellow]or [red][1-2] [cyan]or [red][3-*] [cyan]for a range of media")
-
- # Manage user selection
- list_episode_select = manage_selection(last_command, episoded_count)
-
- # Download selected episodes
- if len(list_episode_select) == 1 and last_command != "*":
- download_episode(list_episode_select[0]-1, scrape_serie, video_source)
-
- # Download all other episodes selecter
- else:
- for i_episode in list_episode_select:
- download_episode(i_episode-1, scrape_serie, video_source)
-
-
-def download_film(select_title: MediaItem):
- """
- Function to download a film.
-
- Parameters:
- - id_film (int): The ID of the film.
- - title_name (str): The title of the film.
- """
-
- # Init class
- scrape_serie = ScrapeSerieAnime(SITE_NAME)
- video_source = VideoSourceAnime(SITE_NAME)
-
- # Set up video source
- scrape_serie.setup(None, select_title.id, select_title.slug)
- scrape_serie.is_series = False
-
- # Start download
- download_episode(0, scrape_serie, video_source)
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/animeunity/site.py b/StreamingCommunity/Api/Site/animeunity/site.py
deleted file mode 100644
index 39b595b..0000000
--- a/StreamingCommunity/Api/Site/animeunity/site.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# 10.12.23
-
-import logging
-
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-
-def get_token(site_name: str, domain: str) -> dict:
- """
- Function to retrieve session tokens from a specified website.
-
- Parameters:
- - site_name (str): The name of the site.
- - domain (str): The domain of the site.
-
- Returns:
- - dict: A dictionary containing session tokens. The keys are 'XSRF_TOKEN', 'animeunity_session', and 'csrf_token'.
- """
-
- # Send a GET request to the specified URL composed of the site name and domain
- response = httpx.get(f"https://www.{site_name}.{domain}")
- response.raise_for_status()
-
- # Initialize variables to store CSRF token
- find_csrf_token = None
-
- # Parse the HTML response using BeautifulSoup
- soup = BeautifulSoup(response.text, "html.parser")
-
- # Loop through all meta tags in the HTML response
- for html_meta in soup.find_all("meta"):
-
- # Check if the meta tag has a 'name' attribute equal to "csrf-token"
- if html_meta.get('name') == "csrf-token":
-
- # If found, retrieve the content of the meta tag, which is the CSRF token
- find_csrf_token = html_meta.get('content')
-
- logging.info(f"Extract: ('animeunity_session': {response.cookies['animeunity_session']}, 'csrf_token': {find_csrf_token})")
- return {
- 'animeunity_session': response.cookies['animeunity_session'],
- 'csrf_token': find_csrf_token
- }
-
-
-def get_real_title(record):
- """
- Get the real title from a record.
-
- This function takes a record, which is assumed to be a dictionary representing a row of JSON data.
- It looks for a title in the record, prioritizing English over Italian titles if available.
-
- Parameters:
- - record (dict): A dictionary representing a row of JSON data.
-
- Returns:
- - str: The title found in the record. If no title is found, returns None.
- """
-
- if record['title'] is not None:
- return record['title']
-
- elif record['title_eng'] is not None:
- return record['title_eng']
-
- else:
- return record['title_it']
-
-
-def title_search(title: str) -> int:
- """
- Function to perform an anime search using a provided title.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: A number containing the length of media search manager.
- """
-
- # Get token and session value from configuration
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- domain_to_use, _ = search_domain(SITE_NAME, f"https://www.{SITE_NAME}")
-
- data = get_token(SITE_NAME, domain_to_use)
-
- # Prepare cookies to be used in the request
- cookies = {
- 'animeunity_session': data.get('animeunity_session')
- }
-
- # Prepare headers for the request
- headers = {
- 'accept': 'application/json, text/plain, */*',
- 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
- 'content-type': 'application/json;charset=UTF-8',
- 'x-csrf-token': data.get('csrf_token')
- }
-
- # Prepare JSON data to be sent in the request
- json_data = {
- 'title': title # Use the provided title for the search
- }
-
- # Send a POST request to the API endpoint for live search
- try:
- response = httpx.post(
- url=f'https://www.{SITE_NAME}.{domain_to_use}/livesearch',
- cookies=cookies,
- headers=headers,
- json=json_data,
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
-
- # Process each record returned in the response
- for dict_title in response.json()['records']:
-
- # Rename keys for consistency
- dict_title['name'] = get_real_title(dict_title)
-
- # Add the record to media search manager if the name is not None
- media_search_manager.add_media({
- 'id': dict_title.get('id'),
- 'slug': dict_title.get('slug'),
- 'name': dict_title.get('name'),
- 'type': dict_title.get('type'),
- 'score': dict_title.get('score'),
- 'episodes_count': dict_title.get('episodes_count')
- })
-
- # Return the length of media search manager
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py b/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py
deleted file mode 100644
index f4b411f..0000000
--- a/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# 01.03.24
-
-import logging
-
-
-# External libraries
-import httpx
-
-
-# Internal utilities
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Api.Player.Helper.Vixcloud.util import EpisodeManager, Episode
-
-
-# Variable
-max_timeout = config_manager.get_int("REQUESTS", "timeout")
-
-
-
-class ScrapeSerieAnime():
- def __init__(self, site_name: str):
- """
- Initialize the media scraper for a specific website.
-
- Args:
- site_name (str): Name of the streaming site to scrape
- """
- self.is_series = False
- self.headers = {'user-agent': get_headers()}
- self.base_name = site_name
- self.domain = config_manager.get_dict('SITE', self.base_name)['domain']
-
- def setup(self, version: str = None, media_id: int = None, series_name: str = None):
- self.version = version
- self.media_id = media_id
-
- if series_name is not None:
- self.is_series = True
- self.series_name = series_name
- self.obj_episode_manager: EpisodeManager = EpisodeManager()
-
- def get_count_episodes(self):
- """
- Retrieve total number of episodes for the selected media.
-
- Returns:
- int: Total episode count
- """
- try:
-
- response = httpx.get(
- url=f"https://www.{self.base_name}.{self.domain}/info_api/{self.media_id}/",
- headers=self.headers,
- timeout=max_timeout
- )
- response.raise_for_status()
-
- # Parse JSON response and return episode count
- return response.json()["episodes_count"]
-
- except Exception as e:
- logging.error(f"Error fetching episode count: {e}")
- return None
-
- def get_info_episode(self, index_ep: int) -> Episode:
- """
- Fetch detailed information for a specific episode.
-
- Args:
- index_ep (int): Zero-based index of the target episode
-
- Returns:
- Episode: Detailed episode information
- """
- try:
-
- params = {
- "start_range": index_ep,
- "end_range": index_ep + 1
- }
-
- response = httpx.get(
- url=f"https://www.{self.base_name}.{self.domain}/info_api/{self.media_id}/{index_ep}",
- headers=self.headers,
- params=params,
- timeout=max_timeout
- )
- response.raise_for_status()
-
- # Return information about the episode
- json_data = response.json()["episodes"][-1]
- return Episode(json_data)
-
- except Exception as e:
- logging.error(f"Error fetching episode information: {e}")
- return None
diff --git a/StreamingCommunity/Api/Site/bitsearch/__init__.py b/StreamingCommunity/Api/Site/bitsearch/__init__.py
deleted file mode 100644
index ec43294..0000000
--- a/StreamingCommunity/Api/Site/bitsearch/__init__.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# 01.07.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .title import download_title
-
-
-# Variable
-indice = 7
-_useFor = "film_serie"
-_deprecate = False
-_priority = 2
-_engineDownload = "tor"
-
-
-def search(string_to_search: str = None, get_onylDatabase:bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # Download title
- download_title(select_title)
-
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/bitsearch/costant.py b/StreamingCommunity/Api/Site/bitsearch/costant.py
deleted file mode 100644
index 1e55dba..0000000
--- a/StreamingCommunity/Api/Site/bitsearch/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 01.07.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
diff --git a/StreamingCommunity/Api/Site/bitsearch/site.py b/StreamingCommunity/Api/Site/bitsearch/site.py
deleted file mode 100644
index 797058f..0000000
--- a/StreamingCommunity/Api/Site/bitsearch/site.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# 01.07.24
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(word_to_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: The number of titles found.
- """
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
-
- # Construct the full site URL and load the search page
- try:
- response = httpx.get(
- url=f"https://{SITE_NAME}.{domain_to_use}/search?q={word_to_search}&category=1&subcat=2&page=1",
- headers={'user-agent': get_headers()},
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
-
- for title_div in soup.find_all("li", class_ = "card"):
- try:
- div_stats = title_div.find("div", class_ = "stats")
-
- title_info = {
- 'name': title_div.find("a").get_text(strip=True),
- 'url': title_div.find_all("a")[-1].get("href"),
- #'nDownload': div_stats.find_all("div")[0].get_text(strip=True),
- 'size': div_stats.find_all("div")[1].get_text(strip=True),
- 'seader': div_stats.find_all("div")[2].get_text(strip=True),
- 'leacher': div_stats.find_all("div")[3].get_text(strip=True),
- 'date': div_stats.find_all("div")[4].get_text(strip=True)
- }
-
- media_search_manager.add_media(title_info)
-
- except:
- pass
-
- # Return the number of titles found
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
diff --git a/StreamingCommunity/Api/Site/bitsearch/title.py b/StreamingCommunity/Api/Site/bitsearch/title.py
deleted file mode 100644
index af5556d..0000000
--- a/StreamingCommunity/Api/Site/bitsearch/title.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# 01.07.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Lib.Downloader import TOR_downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Config
-from .costant import ROOT_PATH, SITE_NAME, MOVIE_FOLDER
-
-
-def download_title(select_title: MediaItem):
- """
- Downloads a media item and saves it as an MP4 file.
-
- Parameters:
- - select_title (MediaItem): The media item to be downloaded. This should be an instance of the MediaItem class, containing attributes like `name` and `url`.
- """
-
- start_message()
-
- console.print(f"[yellow]Download: [red]{select_title.name} \n")
- print()
-
- # Define output path
- title_name = os_manager.get_sanitize_file(select_title.name.replace("-", "_") + ".mp4")
- mp4_path = os_manager.get_sanitize_path(
- os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
- )
-
- # Create output folder
- os_manager.create_path(mp4_path)
-
- # Tor manager
- manager = TOR_downloader()
- manager.add_magnet_link(select_title.url)
- manager.start_download()
- manager.move_downloaded_files(mp4_path)
diff --git a/StreamingCommunity/Api/Site/cb01new/__init__.py b/StreamingCommunity/Api/Site/cb01new/__init__.py
deleted file mode 100644
index d927778..0000000
--- a/StreamingCommunity/Api/Site/cb01new/__init__.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# 09.06.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .film import download_film
-
-
-# Variable
-indice = 9
-_useFor = "film"
-_deprecate = False
-_priority = 2
-_engineDownload = "mp4"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # !!! ADD TYPE DONT WORK FOR SERIE
- download_film(select_title)
-
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/cb01new/costant.py b/StreamingCommunity/Api/Site/cb01new/costant.py
deleted file mode 100644
index 6edd9ae..0000000
--- a/StreamingCommunity/Api/Site/cb01new/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 03.07.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
diff --git a/StreamingCommunity/Api/Site/cb01new/film.py b/StreamingCommunity/Api/Site/cb01new/film.py
deleted file mode 100644
index 08e3845..0000000
--- a/StreamingCommunity/Api/Site/cb01new/film.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# 03.07.24
-
-import os
-import time
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.call_stack import get_call_stack
-from StreamingCommunity.Lib.Downloader import HLS_Downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Util import execute_search
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Player
-from StreamingCommunity.Api.Player.maxstream import VideoSource
-
-
-# Config
-from .costant import ROOT_PATH, SITE_NAME, MOVIE_FOLDER
-
-
-def download_film(select_title: MediaItem):
- """
- Downloads a film using the provided obj.
-
- Parameters:
- - select_title (MediaItem): The media item to be downloaded. This should be an instance of the MediaItem class, containing attributes like `name` and `url`.
- """
-
- # Start message and display film information
- start_message()
- console.print(f"[yellow]Download: [red]{select_title.name} \n")
-
- # Setup api manger
- print(select_title.url)
- video_source = VideoSource(select_title.url)
-
- # Define output path
- title_name = os_manager.get_sanitize_file(select_title.name) +".mp4"
- mp4_path = os_manager.get_sanitize_path(
- os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
- )
-
- # Get m3u8 master playlist
- master_playlist = video_source.get_playlist()
-
- # Download the film using the m3u8 playlist, and output filename
- r_proc = HLS_Downloader(
- m3u8_playlist=master_playlist,
- output_filename=os.path.join(mp4_path, title_name)
- ).start()
-
- if r_proc == 404:
- time.sleep(2)
-
- # Re call search function
- if msg.ask("[green]Do you want to continue [white]([red]y[white])[green] or return at home[white]([red]n[white]) ", choices=['y', 'n'], default='y', show_choices=True) == "n":
- frames = get_call_stack()
- execute_search(frames[-4])
-
- if r_proc != None:
- console.print("[green]Result: ")
- console.print(r_proc)
diff --git a/StreamingCommunity/Api/Site/cb01new/site.py b/StreamingCommunity/Api/Site/cb01new/site.py
deleted file mode 100644
index 68842c2..0000000
--- a/StreamingCommunity/Api/Site/cb01new/site.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# 03.07.24
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(word_to_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: The number of titles found.
- """
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
-
- response = httpx.get(
- url=f"https://{SITE_NAME}.{domain_to_use}/?s={word_to_search}",
- headers={'user-agent': get_headers()},
- timeout=max_timeout
- )
- response.raise_for_status()
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
-
- # For all element in table
- for div in soup.find_all("div", class_ = "card-content"):
-
- url = div.find("h3").find("a").get("href")
- title = div.find("h3").find("a").get_text(strip=True)
- desc = div.find("p").find("strong").text
-
- title_info = {
- 'name': title,
- 'desc': desc,
- 'url': url
- }
-
- media_search_manager.add_media(title_info)
-
- # Return the number of titles found
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
diff --git a/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py b/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py
deleted file mode 100644
index 123371e..0000000
--- a/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# 09.06.24
-
-import logging
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .series import download_thread
-
-
-# Variable
-indice = 3
-_useFor = "serie"
-_deprecate = False
-_priority = 2
-_engineDownload = "mp4"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
-
- # Make request to site to get content that corrsisponde to that string
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # Download only film
- if "Serie TV" in str(select_title.type):
- download_thread(select_title)
-
- else:
- logging.error(f"Not supported: {select_title.type}")
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/ddlstreamitaly/costant.py b/StreamingCommunity/Api/Site/ddlstreamitaly/costant.py
deleted file mode 100644
index e2f7a5e..0000000
--- a/StreamingCommunity/Api/Site/ddlstreamitaly/costant.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# 09.06.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-COOKIE = config_manager.get_dict('SITE', SITE_NAME)['cookie']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
diff --git a/StreamingCommunity/Api/Site/ddlstreamitaly/series.py b/StreamingCommunity/Api/Site/ddlstreamitaly/series.py
deleted file mode 100644
index cb74083..0000000
--- a/StreamingCommunity/Api/Site/ddlstreamitaly/series.py
+++ /dev/null
@@ -1,141 +0,0 @@
-# 13.06.24
-
-import os
-import sys
-from urllib.parse import urlparse
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Util.table import TVShowManager
-from StreamingCommunity.Lib.Downloader import MP4_downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-from StreamingCommunity.Api.Template.Util import manage_selection, map_episode_title, validate_episode_selection
-
-
-# Player
-from .util.ScrapeSerie import GetSerieInfo
-from StreamingCommunity.Api.Player.ddl import VideoSource
-
-
-# Variable
-from .costant import ROOT_PATH, SITE_NAME, SERIES_FOLDER
-table_show_manager = TVShowManager()
-
-
-
-def download_video(index_episode_selected: int, scape_info_serie: GetSerieInfo, video_source: VideoSource) -> None:
- """
- Download a single episode video.
-
- Parameters:
- - tv_name (str): Name of the TV series.
- - index_episode_selected (int): Index of the selected episode.
- """
-
- start_message()
-
- # Get info about episode
- obj_episode = scape_info_serie.list_episodes[index_episode_selected - 1]
- console.print(f"[yellow]Download: [red]{obj_episode.get('name')}")
- print()
-
- # Define filename and path for the downloaded video
- title_name = os_manager.get_sanitize_file(
- f"{map_episode_title(scape_info_serie.tv_name, None, index_episode_selected, obj_episode.get('name'))}.mp4"
- )
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, SERIES_FOLDER, scape_info_serie.tv_name)
-
- # Create output folder
- os_manager.create_path(mp4_path)
-
- # Setup video source
- video_source.setup(obj_episode.get('url'))
-
- # Get m3u8 master playlist
- master_playlist = video_source.get_playlist()
-
- # Parse start page url
- parsed_url = urlparse(obj_episode.get('url'))
-
- # Start download
- r_proc = MP4_downloader(
- url = master_playlist,
- path = os.path.join(mp4_path, title_name),
- referer = f"{parsed_url.scheme}://{parsed_url.netloc}/",
- )
-
- if r_proc != None:
- console.print("[green]Result: ")
- console.print(r_proc)
-
-
-def download_thread(dict_serie: MediaItem):
- """
- Download all episode of a thread
- """
-
- # Start message and set up video source
- start_message()
-
- # Init class
- scape_info_serie = GetSerieInfo(dict_serie)
- video_source = VideoSource()
-
- # Collect information about thread
- list_dict_episode = scape_info_serie.get_episode_number()
- episodes_count = len(list_dict_episode)
-
- # Display episodes list and manage user selection
- last_command = display_episodes_list(scape_info_serie.list_episodes)
- list_episode_select = manage_selection(last_command, episodes_count)
-
- try:
- list_episode_select = validate_episode_selection(list_episode_select, episodes_count)
- except ValueError as e:
- console.print(f"[red]{str(e)}")
- return
-
- # Download selected episodes
- for i_episode in list_episode_select:
- download_video(i_episode, scape_info_serie, video_source)
-
-
-def display_episodes_list(obj_episode_manager) -> str:
- """
- Display episodes list and handle user input.
-
- Returns:
- last_command (str): Last command entered by the user.
- """
-
- # Set up table for displaying episodes
- table_show_manager.set_slice_end(10)
-
- # Add columns to the table
- column_info = {
- "Index": {'color': 'red'},
- "Name": {'color': 'magenta'},
- }
- table_show_manager.add_column(column_info)
-
- # Populate the table with episodes information
- for i, media in enumerate(obj_episode_manager):
- table_show_manager.add_tv_show({
- 'Index': str(i+1),
- 'Name': media.get('name'),
- })
-
- # Run the table and handle user input
- last_command = table_show_manager.run()
-
- if last_command == "q":
- console.print("\n[red]Quit [white]...")
- sys.exit(0)
-
- return last_command
diff --git a/StreamingCommunity/Api/Site/ddlstreamitaly/site.py b/StreamingCommunity/Api/Site/ddlstreamitaly/site.py
deleted file mode 100644
index 1fb38f5..0000000
--- a/StreamingCommunity/Api/Site/ddlstreamitaly/site.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# 09.06.24
-
-import logging
-
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(word_to_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: The number of titles found.
- """
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
-
- # Send request to search for titles
- try:
- response = httpx.get(
- url=f"https://{SITE_NAME}.{domain_to_use}/search/?&q={word_to_search}&quick=1&type=videobox_video&nodes=11",
- headers={'user-agent': get_headers()},
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
- table_content = soup.find('ol', class_="ipsStream")
-
- if table_content:
- for title_div in table_content.find_all('li', class_='ipsStreamItem'):
- try:
-
- title_type = title_div.find("p", class_="ipsType_reset").find_all("a")[-1].get_text(strip=True)
- name = title_div.find("span", class_="ipsContained").find("a").get_text(strip=True)
- link = title_div.find("span", class_="ipsContained").find("a").get("href")
-
- title_info = {
- 'name': name,
- 'url': link,
- 'type': title_type
- }
-
- media_search_manager.add_media(title_info)
-
- except Exception as e:
- logging.error(f"Error processing title div: {e}")
-
- return media_search_manager.get_length()
-
- else:
- logging.error("No table content found.")
- return -999
-
- return -9999
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py b/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py
deleted file mode 100644
index a3b4ad4..0000000
--- a/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# 13.06.24
-
-import sys
-import logging
-from typing import List, Dict
-
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Variable
-from ..costant import COOKIE
-max_timeout = config_manager.get_int("REQUESTS", "timeout")
-
-
-class GetSerieInfo:
- def __init__(self, dict_serie: MediaItem) -> None:
- """
- Initializes the GetSerieInfo object with default values.
-
- Parameters:
- - dict_serie (MediaItem): Dictionary containing series information (optional).
- """
- self.headers = {'user-agent': get_headers()}
- self.cookies = COOKIE
- self.url = dict_serie.url
- self.tv_name = None
- self.list_episodes = None
-
- def get_episode_number(self) -> List[Dict[str, str]]:
- """
- Retrieves the number of episodes for a specific season.
-
- Parameters:
- n_season (int): The season number.
-
- Returns:
- List[Dict[str, str]]: List of dictionaries containing episode information.
- """
-
- try:
- response = httpx.get(f"{self.url}?area=online", cookies=self.cookies, headers=self.headers, timeout=max_timeout)
- response.raise_for_status()
-
- except Exception as e:
- logging.error(f"Insert value for [ips4_device_key, ips4_member_id, ips4_login_key] in config.json file SITE \\ ddlstreamitaly \\ cookie. Use browser debug and cookie request with a valid account, filter by DOC. Error: {e}")
- sys.exit(0)
-
- # Parse HTML content of the page
- soup = BeautifulSoup(response.text, "html.parser")
-
- # Get tv name
- self.tv_name = soup.find("span", class_= "ipsType_break").get_text(strip=True)
-
- # Find the container of episodes for the specified season
- table_content = soup.find('div', class_='ipsMargin_bottom:half')
- list_dict_episode = []
-
- for episode_div in table_content.find_all('a', href=True):
-
- # Get text of episode
- part_name = episode_div.get_text(strip=True)
-
- if part_name:
- obj_episode = {
- 'name': part_name,
- 'url': episode_div['href']
- }
-
- list_dict_episode.append(obj_episode)
-
- self.list_episodes = list_dict_episode
- return list_dict_episode
-
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/guardaserie/__init__.py b/StreamingCommunity/Api/Site/guardaserie/__init__.py
deleted file mode 100644
index 059ccb6..0000000
--- a/StreamingCommunity/Api/Site/guardaserie/__init__.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# 09.06.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .series import download_series
-
-
-# Variable
-indice = 4
-_useFor = "serie"
-_deprecate = False
-_priority = 2
-_engineDownload = "hls"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
-
- # Make request to site to get content that corrsisponde to that string
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # Download only film
- download_series(select_title)
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/guardaserie/costant.py b/StreamingCommunity/Api/Site/guardaserie/costant.py
deleted file mode 100644
index c7012aa..0000000
--- a/StreamingCommunity/Api/Site/guardaserie/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 09.06.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
diff --git a/StreamingCommunity/Api/Site/guardaserie/series.py b/StreamingCommunity/Api/Site/guardaserie/series.py
deleted file mode 100644
index b57bae0..0000000
--- a/StreamingCommunity/Api/Site/guardaserie/series.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# 13.06.24
-
-import os
-import sys
-import time
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.call_stack import get_call_stack
-from StreamingCommunity.Util.table import TVShowManager
-from StreamingCommunity.Lib.Downloader import HLS_Downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Util import manage_selection, map_episode_title, validate_selection, validate_episode_selection, execute_search
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Player
-from .util.ScrapeSerie import GetSerieInfo
-from StreamingCommunity.Api.Player.supervideo import VideoSource
-
-
-# Variable
-from .costant import ROOT_PATH, SITE_NAME, SERIES_FOLDER
-table_show_manager = TVShowManager()
-
-
-
-def download_video(index_season_selected: int, index_episode_selected: int, scape_info_serie: GetSerieInfo) -> None:
- """
- Download a single episode video.
-
- Parameters:
- - tv_name (str): Name of the TV series.
- - index_season_selected (int): Index of the selected season.
- - index_episode_selected (int): Index of the selected episode.
- """
-
- start_message()
-
- # Get info about episode
- obj_episode = scape_info_serie.list_episodes[index_episode_selected - 1]
- console.print(f"[yellow]Download: [red]{index_season_selected}:{index_episode_selected} {obj_episode.get('name')}")
- print()
-
- # Define filename and path for the downloaded video
- mp4_name = f"{map_episode_title(scape_info_serie.tv_name, index_season_selected, index_episode_selected, obj_episode.get('name'))}.mp4"
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, SERIES_FOLDER, scape_info_serie.tv_name, f"S{index_season_selected}")
-
- # Setup video source
- video_source = VideoSource(obj_episode.get('url'))
-
- # Get m3u8 master playlist
- master_playlist = video_source.get_playlist()
-
- # Download the film using the m3u8 playlist, and output filename
- r_proc = HLS_Downloader(
- m3u8_playlist=master_playlist,
- output_filename=os.path.join(mp4_path, mp4_name)
- ).start()
-
- if r_proc == 404:
- time.sleep(2)
-
- # Re call search function
- if msg.ask("[green]Do you want to continue [white]([red]y[white])[green] or return at home[white]([red]n[white]) ", choices=['y', 'n'], default='y', show_choices=True) == "n":
- frames = get_call_stack()
- execute_search(frames[-4])
-
- if r_proc != None:
- console.print("[green]Result: ")
- console.print(r_proc)
-
-
-
-def download_episode(scape_info_serie: GetSerieInfo, index_season_selected: int, download_all: bool = False) -> None:
- """
- Download all episodes of a season.
-
- Parameters:
- - tv_name (str): Name of the TV series.
- - index_season_selected (int): Index of the selected season.
- - download_all (bool): Download all seasons episodes
- """
-
- # Start message and collect information about episodes
- start_message()
- list_dict_episode = scape_info_serie.get_episode_number(index_season_selected)
- episodes_count = len(list_dict_episode)
-
- if download_all:
-
- # Download all episodes without asking
- for i_episode in range(1, episodes_count + 1):
- download_video(index_season_selected, i_episode, scape_info_serie)
- console.print(f"\n[red]End downloaded [yellow]season: [red]{index_season_selected}.")
-
- else:
-
- # Display episodes list and manage user selection
- last_command = display_episodes_list(scape_info_serie.list_episodes)
- list_episode_select = manage_selection(last_command, episodes_count)
-
- try:
- list_episode_select = validate_episode_selection(list_episode_select, episodes_count)
- except ValueError as e:
- console.print(f"[red]{str(e)}")
- return
-
- # Download selected episodes
- for i_episode in list_episode_select:
- download_video(index_season_selected, i_episode, scape_info_serie)
-
-
-def download_series(dict_serie: MediaItem) -> None:
- """
- Download all episodes of a TV series.
-
- Parameters:
- - dict_serie (MediaItem): obj with url name type and score
- """
-
- # Start message and set up video source
- start_message()
-
- # Init class
- scape_info_serie = GetSerieInfo(dict_serie)
-
- # Collect information about seasons
- seasons_count = scape_info_serie.get_seasons_number()
-
- # Prompt user for season selection and download episodes
- console.print(f"\n[green]Seasons found: [red]{seasons_count}")
- index_season_selected = msg.ask(
- "\n[cyan]Insert season number [yellow](e.g., 1), [red]* [cyan]to download all seasons, "
- "[yellow](e.g., 1-2) [cyan]for a range of seasons, or [yellow](e.g., 3-*) [cyan]to download from a specific season to the end"
- )
-
- # Manage and validate the selection
- list_season_select = manage_selection(index_season_selected, seasons_count)
-
- try:
- list_season_select = validate_selection(list_season_select, seasons_count)
- except ValueError as e:
- console.print(f"[red]{str(e)}")
- return
-
- # Loop through the selected seasons and download episodes
- for i_season in list_season_select:
- if len(list_season_select) > 1 or index_season_selected == "*":
-
- # Download all episodes if multiple seasons are selected or if '*' is used
- download_episode(scape_info_serie, i_season, download_all=True)
- else:
-
- # Otherwise, let the user select specific episodes for the single season
- download_episode(scape_info_serie, i_season, download_all=False)
-
-
-def display_episodes_list(obj_episode_manager) -> str:
- """
- Display episodes list and handle user input.
-
- Returns:
- last_command (str): Last command entered by the user.
- """
-
- # Set up table for displaying episodes
- table_show_manager.set_slice_end(10)
-
- # Add columns to the table
- column_info = {
- "Index": {'color': 'red'},
- "Name": {'color': 'magenta'},
- }
- table_show_manager.add_column(column_info)
-
- # Populate the table with episodes information
- for media in obj_episode_manager:
- table_show_manager.add_tv_show({
- 'Index': str(media.get('number')),
- 'Name': media.get('name'),
- })
-
- # Run the table and handle user input
- last_command = table_show_manager.run()
-
- if last_command == "q":
- console.print("\n[red]Quit [white]...")
- sys.exit(0)
-
- return last_command
diff --git a/StreamingCommunity/Api/Site/guardaserie/site.py b/StreamingCommunity/Api/Site/guardaserie/site.py
deleted file mode 100644
index ee5da04..0000000
--- a/StreamingCommunity/Api/Site/guardaserie/site.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# 09.06.24
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Util import search_domain
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(word_to_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: The number of titles found.
- """
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
-
- # Send request to search for titles
- try:
- response = httpx.get(
- url=f"https://guardaserie.{domain_to_use}/?story={word_to_search}&do=search&subaction=search",
- headers={'user-agent': get_headers()},
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
- table_content = soup.find('div', class_="mlnew-list")
-
- for serie_div in table_content.find_all('div', class_='mlnew'):
-
- try:
- title = serie_div.find('div', class_='mlnh-2').find("h2").get_text(strip=True)
- link = serie_div.find('div', class_='mlnh-2').find('a')['href']
- imdb_rating = serie_div.find('span', class_='mlnh-imdb').get_text(strip=True)
-
- serie_info = {
- 'name': title,
- 'url': link,
- 'score': imdb_rating
- }
-
- media_search_manager.add_media(serie_info)
-
- except:
- pass
-
- # Return the number of titles found
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
diff --git a/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py b/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py
deleted file mode 100644
index f7b195f..0000000
--- a/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# 13.06.24
-
-import logging
-from typing import List, Dict
-
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.headers import get_headers
-
-
-# Logic class
-from StreamingCommunity.Api.Template .Class.SearchType import MediaItem
-
-
-class GetSerieInfo:
- def __init__(self, dict_serie: MediaItem) -> None:
- """
- Initializes the GetSerieInfo object with default values.
-
- Parameters:
- dict_serie (MediaItem): Dictionary containing series information (optional).
- """
- self.headers = {'user-agent': get_headers()}
- self.url = dict_serie.url
- self.tv_name = None
- self.list_episodes = None
-
- def get_seasons_number(self) -> int:
- """
- Retrieves the number of seasons of a TV series.
-
- Returns:
- int: Number of seasons of the TV series.
- """
- try:
-
- # Make an HTTP request to the series URL
- response = httpx.get(self.url, headers=self.headers, timeout=15)
- response.raise_for_status()
-
- # Parse HTML content of the page
- soup = BeautifulSoup(response.text, "html.parser")
-
- # Find the container of seasons
- table_content = soup.find('div', class_="tt_season")
-
- # Count the number of seasons
- seasons_number = len(table_content.find_all("li"))
-
- # Extract the name of the series
- self.tv_name = soup.find("h1", class_="front_title").get_text(strip=True)
-
- return seasons_number
-
- except Exception as e:
- logging.error(f"Error parsing HTML page: {e}")
-
- return -999
-
- def get_episode_number(self, n_season: int) -> List[Dict[str, str]]:
- """
- Retrieves the number of episodes for a specific season.
-
- Parameters:
- n_season (int): The season number.
-
- Returns:
- List[Dict[str, str]]: List of dictionaries containing episode information.
- """
- try:
-
- # Make an HTTP request to the series URL
- response = httpx.get(self.url, headers=self.headers, timeout=15)
- response.raise_for_status()
-
- # Parse HTML content of the page
- soup = BeautifulSoup(response.text, "html.parser")
-
- # Find the container of episodes for the specified season
- table_content = soup.find('div', class_="tab-pane", id=f"season-{n_season}")
-
- # Extract episode information
- episode_content = table_content.find_all("li")
- list_dict_episode = []
-
- for episode_div in episode_content:
- index = episode_div.find("a").get("data-num")
- link = episode_div.find("a").get("data-link")
- name = episode_div.find("a").get("data-title")
-
- obj_episode = {
- 'number': index,
- 'name': name,
- 'url': link
- }
-
- list_dict_episode.append(obj_episode)
-
- self.list_episodes = list_dict_episode
- return list_dict_episode
-
- except Exception as e:
- logging.error(f"Error parsing HTML page: {e}")
-
- return []
diff --git a/StreamingCommunity/Api/Site/mostraguarda/__init__.py b/StreamingCommunity/Api/Site/mostraguarda/__init__.py
deleted file mode 100644
index a2f87d9..0000000
--- a/StreamingCommunity/Api/Site/mostraguarda/__init__.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# 26.05.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from StreamingCommunity.Lib.TMBD import tmdb, Json_film
-from .film import download_film
-
-
-# Variable
-indice = 9
-_useFor = "film"
-_deprecate = False
-_priority = 2
-_engineDownload = "hls"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Not available for the moment
- if get_onylDatabase:
- return 0
-
- # Search on database
- movie_id = tmdb.search_movie(unidecode(string_to_search))
-
- if movie_id is not None:
- movie_details: Json_film = tmdb.get_movie_details(tmdb_id=movie_id)
-
- # Download only film
- download_film(movie_details)
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/mostraguarda/costant.py b/StreamingCommunity/Api/Site/mostraguarda/costant.py
deleted file mode 100644
index 5bac8f6..0000000
--- a/StreamingCommunity/Api/Site/mostraguarda/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 26.05.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/mostraguarda/film.py b/StreamingCommunity/Api/Site/mostraguarda/film.py
deleted file mode 100644
index 1615292..0000000
--- a/StreamingCommunity/Api/Site/mostraguarda/film.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# 17.09.24
-
-import os
-import sys
-import time
-import logging
-
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.call_stack import get_call_stack
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Lib.Downloader import HLS_Downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Util import execute_search
-
-
-# Player
-from StreamingCommunity.Api.Player.supervideo import VideoSource
-
-
-# TMBD
-from StreamingCommunity.Lib.TMBD import Json_film
-
-
-# Config
-from .costant import ROOT_PATH, SITE_NAME, DOMAIN_NOW, MOVIE_FOLDER
-
-
-def download_film(movie_details: Json_film):
- """
- Downloads a film using the provided tmbd id.
-
- Parameters:
- - movie_details (Json_film): Class with info about film title.
- """
-
- # Start message and display film information
- start_message()
- console.print(f"[yellow]Download: [red]{movie_details.title} \n")
-
- # Make request to main site
- try:
- url = f"https://{SITE_NAME}.{DOMAIN_NOW}/set-movie-a/{movie_details.imdb_id}"
- response = httpx.get(url, headers={'User-Agent': get_headers()})
- response.raise_for_status()
-
- except:
- logging.error(f"Not found in the server. Dict: {movie_details}")
- raise
-
- # Extract supervideo url
- soup = BeautifulSoup(response.text, "html.parser")
- player_links = soup.find("ul", class_ = "_player-mirrors").find_all("li")
- supervideo_url = "https:" + player_links[0].get("data-link")
-
-
- # Set domain and media ID for the video source
- video_source = VideoSource()
- video_source.setup(supervideo_url)
-
- # Define output path
- title_name = os_manager.get_sanitize_file(movie_details.title) + ".mp4"
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
-
- # Get m3u8 master playlist
- master_playlist = video_source.get_playlist()
-
- # Download the film using the m3u8 playlist, and output filename
- r_proc = HLS_Downloader(
- m3u8_playlist=master_playlist,
- output_filename=os.path.join(mp4_path, title_name)
- ).start()
-
- if r_proc == 404:
- time.sleep(2)
-
- # Re call search function
- if msg.ask("[green]Do you want to continue [white]([red]y[white])[green] or return at home[white]([red]n[white]) ", choices=['y', 'n'], default='y', show_choices=True) == "n":
- frames = get_call_stack()
- execute_search(frames[-4])
-
- if r_proc != None:
- console.print("[green]Result: ")
- console.print(r_proc)
diff --git a/StreamingCommunity/Api/Site/piratebays/__init__.py b/StreamingCommunity/Api/Site/piratebays/__init__.py
deleted file mode 100644
index b3631cb..0000000
--- a/StreamingCommunity/Api/Site/piratebays/__init__.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# 02.07.24
-
-from unidecode import unidecode
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console, msg
-
-
-# Logic class
-from .site import title_search, run_get_select_title, media_search_manager
-from .title import download_title
-
-
-# Variable
-indice = 8
-_useFor = "film_serie"
-_deprecate = False
-_priority = 2
-_engineDownload = "tor"
-
-
-def search(string_to_search: str = None, get_onylDatabase: bool = False):
- """
- Main function of the application for film and series.
- """
-
- if string_to_search is None:
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
-
- # Search on database
- len_database = title_search(unidecode(string_to_search))
-
- # Return list of elements
- if get_onylDatabase:
- return media_search_manager
-
- if len_database > 0:
-
- # Select title from list
- select_title = run_get_select_title()
-
- # Download title
- download_title(select_title)
-
- else:
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
-
- # Retry
- search()
diff --git a/StreamingCommunity/Api/Site/piratebays/costant.py b/StreamingCommunity/Api/Site/piratebays/costant.py
deleted file mode 100644
index c4bd929..0000000
--- a/StreamingCommunity/Api/Site/piratebays/costant.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# 09.06.24
-
-import os
-
-
-# Internal utilities
-from StreamingCommunity.Util._jsonConfig import config_manager
-
-
-SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
-ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
-DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
-
-SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
-MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/piratebays/site.py b/StreamingCommunity/Api/Site/piratebays/site.py
deleted file mode 100644
index c1779c7..0000000
--- a/StreamingCommunity/Api/Site/piratebays/site.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# 02.07.24
-
-# External libraries
-import httpx
-from bs4 import BeautifulSoup
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util._jsonConfig import config_manager
-from StreamingCommunity.Util.headers import get_headers
-from StreamingCommunity.Util.table import TVShowManager
-
-
-# Logic class
-from StreamingCommunity.Api.Template import get_select_title
-from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
-
-
-# Variable
-from .costant import SITE_NAME, DOMAIN_NOW
-media_search_manager = MediaManager()
-table_show_manager = TVShowManager()
-
-
-def title_search(word_to_search: str) -> int:
- """
- Search for titles based on a search query.
-
- Parameters:
- - title_search (str): The title to search for.
-
- Returns:
- - int: The number of titles found.
- """
-
- # Find new domain if prev dont work
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
-
- # Construct the full site URL and load the search page
- try:
- response = httpx.get(
- url=f"https://1.{SITE_NAME}.{DOMAIN_NOW}/s/?q={word_to_search}&video=on",
- headers={
- 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
- 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
- 'referer': 'https://wwv.thepiratebay3.co/',
- 'user-agent': get_headers()
- },
- follow_redirects=True,
- timeout=max_timeout
- )
- response.raise_for_status()
-
- except Exception as e:
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
-
- # Create soup and find table
- soup = BeautifulSoup(response.text, "html.parser")
- table = soup.find("tbody")
-
- # Scrape div film in table on single page
- for tr in table.find_all('tr'):
- try:
-
- title_info = {
- 'name': tr.find_all("a")[1].get_text(strip=True),
- 'url': tr.find_all("td")[3].find("a").get("href"),
- 'upload': tr.find_all("td")[2].get_text(strip=True),
- 'size': tr.find_all("td")[4].get_text(strip=True),
- 'seader': tr.find_all("td")[5].get_text(strip=True),
- 'leacher': tr.find_all("td")[6].get_text(strip=True),
- 'by': tr.find_all("td")[7].get_text(strip=True),
- }
-
- media_search_manager.add_media(title_info)
-
- except:
- continue
-
- # Return the number of titles found
- return media_search_manager.get_length()
-
-
-def run_get_select_title():
- """
- Display a selection of titles and prompt the user to choose one.
- """
- return get_select_title(table_show_manager, media_search_manager)
\ No newline at end of file
diff --git a/StreamingCommunity/Api/Site/piratebays/title.py b/StreamingCommunity/Api/Site/piratebays/title.py
deleted file mode 100644
index 94dd377..0000000
--- a/StreamingCommunity/Api/Site/piratebays/title.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# 02.07.24
-
-import os
-import sys
-
-
-# Internal utilities
-from StreamingCommunity.Util.console import console
-from StreamingCommunity.Util.message import start_message
-from StreamingCommunity.Util.os import os_manager
-from StreamingCommunity.Lib.Downloader import TOR_downloader
-
-
-# Logic class
-from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
-
-
-# Config
-from .costant import ROOT_PATH, DOMAIN_NOW, SITE_NAME, MOVIE_FOLDER
-
-
-def download_title(select_title: MediaItem):
- """
- Downloads a media item and saves it as an MP4 file.
-
- Parameters:
- - select_title (MediaItem): The media item to be downloaded. This should be an instance of the MediaItem class, containing attributes like `name` and `url`.
- """
-
- start_message()
- console.print(f"[yellow]Download: [red]{select_title.name} \n")
- print()
-
- # Define output path
- title_name = os_manager.get_sanitize_file(select_title.name.replace("-", "_") + ".mp4")
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
-
- # Create output folder
- os_manager.create_path(mp4_path)
-
- # Tor manager
- manager = TOR_downloader()
- manager.add_magnet_link(select_title.url)
- manager.start_download()
- manager.move_downloaded_files(mp4_path)
diff --git a/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-312.pyc b/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c023ad1cca7ec039e519b16c31237d0c04287bad
GIT binary patch
literal 1664
zcmZux-)kdP6uy(0OeT}0>9*ZAm}&+pYRcM&RViCV5ldC9QR%LW)0A;K_a>coeuO(W
zEh#DFK|vqHecOsGiuj=PAK3rFmvp0SxpZN{r+w?v6~QOZoo3nvy)gHl`<-*{Irn_$
z&ToZ+j$nLw?Stl>G(vxhO)_8~kJD{fZX=AaFL)wHQx(SzkBxSXRB9pEvWu-z?yaIf6B_h-GsWXU$7^1n0;Y&Xe(mf(u`y
z&54d)Ej|({R3)Bm2QDT~h)FfYGfo&pp+~svN6kl)uu%A9lQ3(W(8vt~%MP%GL*I4-
zo@Xxeh!qi=Ivad~wgXF8M#LiyvtlKm@CkP9p^fF+f!!n&q84zt6L_JGt%mFQ02I%G
zh)|bATo(#(gv}C{H@v9EM}RariG(W|VOpvmcb>27*+G(j&`tZcmm9tAd@VBK^#mBf%xM`D*R
zG)WdQK9%5`r9`?|ak`7XM|aMvAt6>yv`J3ll&ZS>mTtiK5cn4+
zTP@FZ>=I>PX6=ETB|9T|dpo@tt}Wyfa(YpymHx&ws=}}
zQ;P~JsU{}TDpb5$DoErC>$C_J3{gQPRRoxBK?gFfp5<0mso;tVYIt5`n7k9NCXd7;
zfrW?N2{unXjz|SJQ9Z->Cv+C-H{kYB{W^&lT&cboI&Gf>EULfjviI8S^%X{m?Stx_
z(D&idvd;fOZ@1j~3M5j8+nt#^=jN8>f}3T{wK`PrA5Vh*=qH$Z=tM_ash_DFm!JD#
z{=519%*TWBC-=)Y56d?P<4}P_uMWzu94e*W@~sz+$16W)`?CuJQt^kHuLN9A7b`QvD8#r;sJ8rfN&o%Q0EJ^52@w-C(Xa
zH~fvooSjjw#Qk$YwxBpBn=7I(V~Pc>;@=aK&Q&+Su0wdnYDZ)#q+GW!X;A_lO?cLV
zMhGd8z>5|Mnr=WAhkrCKL+QD)9)@0A;9n7aRs@@diED58A#Qu*O*#u(@w17RVLFi|
zN%~7glJU2Oq-$bwqybugfGQ8r%!!8dTu(jHCwrNr!dOo~$`^Xsqp_)8@v&NwF72ow0{9Gf3tA_
literal 0
HcmV?d00001
diff --git a/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-39.pyc b/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..100bb03390282f65da7200963e22b6fa31efcd71
GIT binary patch
literal 1257
zcmZvbPjA~c6u?Q5l5Iu)(=`pcU8bvd$gKlb4DE^r*@j`cWW6X31VyB6Eu^TDRDuNd
zF5W)HRvS$vA7;|~xUO|cuab;Wq87@r2NSE|}5
z!5xui@d0}a>JAp%=2u*sO4WH$vz#eeRJBWNWd+X-FLb$d`?{@jZ)v#TrOmrTw=X%X
zik(d^i@I2F4N-?oUDrYtET30Gf@1tpVYsfiaj`!DN7x)YvJ~b7?l&=3SM?&d>OSnm
zhg9{AI4W#$Q5aqZKC#`1;NR1J4b%JrVgo8oq7N%@J_cx
z4m;12+b`m?rqzw$=ik?GV$*A-S!xxS`9h@d)QX;06Q!d$x0vv0IVs(W5|(0brSAB3a!rr~ST%dev03Q@F$oGTWM$AIv{uFK-P$R@%im*-;I1^}
z?Z!E;7gf!Vb`Q=G$kx#dr9^k(j_Cv8b9DW$rDCn%FMJWrK8S=)=u@2FghJZeANdCd
CHe{~=
literal 0
HcmV?d00001
diff --git a/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/api.cpython-39.pyc b/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/api.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e11c638317e3c56a6be8cba03b37379e0109d1c9
GIT binary patch
literal 3680
zcmb7HOOG4J5$<_#I3$PMr`Fn)Ee({&5FIbqjuIu<$d+VDa1_`=qLmPsT7ej`XSuVQ
zA*r6Gq+JY8%E6ZaKI9O@D`4qUbjj}s0{9Q~)hGRcAi)L!@>S1>TFLSuGhj`3RX?h_
zs=h7;^?H@zS^4&Ny?-t+_8oPOJ|%Q6;g|jugfni$EMaYCP}_`+#B7_1)wXositV-y
zz8#kmr|oE7DJ~~&+f6F%itamcHL100x?PUFq~5OUwi`E+nf46YmG*2nht~|PWyY)f
z7O!#d4|aQAbLV&+oCco(X91i=;_}&jo6qri@Q!h7gEbePLtEA~l*>US)UxF)n2#
z^s5s?{6*FdysX5la6xTi?$pOl-{#)fiP*TTN7aj2?~PsFIHK!J=37jKeCgoW@)E8ngpHp0A>JbNTYVOEx}u
zoS6uMmEZ!7v+Cp7(0&M0e`_FoI97&z>5tN=-}8gMfBCo9{d++ga(~eG17EuieD3FN
zYgP3cmqjmK*DYG{sDJ&lsT9q1|JHU`OqK&bcRg*`noi2sJ374J47PlU$)rdcNvtyP
zAB;k=TWoz(hs}}QDU$C{Am72x@B1Kr=0|;b_wKrX*^eRhu_VU;gl8ZkSWZ?WK*{8&
z53Q1bWPWgOFp_%nt-%N;7l)JUyytF9IZW5r)|AoOYpeysXf3zv;)9Qr;U5}5IjoM-
zP^=|Ml)I8J@wA#2VE%1~7n;V=%mp(>G1
zkClb|7X*%~mIRMGg`sLz1W_7xaK4>X26B`NhsKnK0^U)zoCmcyRNsM$f}lXTaNv-Z
z5T~i@1jAw2=go@n&=qyf%eB`!DOZH)5cY+tN_IMHnOyTp1+Es2|DQ&CA1Ra|3a?
z2|aUJcPc|nw1&HijvP>ztCFr@r}P2{tJ$V$oHT92G+e{{uj6>8W6T>>bJ3_8i>3|9
ztZ^2!I(_e9pfrpgz~hoV!EKe9+}yVS
zn8uEoF+irp?Hnq1EMB^Aer1S10|@O2a$s1G9tnwLI27t|KfS=2%
zkj@vNS<$@(4VwGKx{J%KXhD~vb!^&Nnzk0Et+&u}GB>O6zVR@=Y@w1L_I@OzAfj<%iXF-x#sgq4BuG}x)@Y(}g~DHtS6&WB
zIU1=llntRR&@tCgm2`qCQ$AE)JU~IhH#B}JHylPOup(7Xf0Wz{1?riR(7@ev^8K#T
zE_zeF-!IYXpLz7
z;$z|&J#mpnX^8v)t+pl7p>lE~1tp*|LRBtw*Qk?|pOR>S3MaaOHh@-Ld5fUya|qI#
zAj~45AefjnJ;MVmc*ZQ~qOqdsS?eWCRB5DP{>$;^G0HYw0LzQlKXlv%IJPA|!>UbN
zo2csfDNPA8cFONNpw+0C61NZRG0x%bn%3O%H+<(
z04-~Zf@JIicDUa82XEHOMh#{*P9r;E=$;eTmdz}9UU#jT>O
z$*=t%9EA#s{zvGGUzD+``q2+9*dZIQ=>HkQ#mM&gH;lyP+oH?2_5I5i00vj1!l9UL
zpZh;2Q>7{B|B85*w6w6kzH)WSC<_IPKCL4TpaMeZEOsv>13rqwkLm2vB@iU4?b@J*
O2kP0jwRCR&SN{V)nzG#h
literal 0
HcmV?d00001
diff --git a/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/costant.cpython-312.pyc b/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/costant.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..445030acdc1fefd4c7a3784ed00ae9f1fab2513f
GIT binary patch
literal 791
zcmZ`$zi-n(6h1qNW2bhD7^sj+GB8Dm3=EY(2oyEW57ERZP6)EBo*erc9L09A8n?2Repp
zbdXPz1-Y1S?l-95dme#(gS?_~wbGDjqUyb|5lyJbw^4SJvL2>)RpKMVvE9y|=Qsn`
zCc|8l*u5O=V$a>XYVF5@Q8a$liEkSixrT#i(z5*}Fxq&@L3n8Q5QJ0+=fPUOD$`g8
z5h~Obr2(Jk8)cd*DAjzW25U--idE%BMTSLXzaZDCq{{V*tX`)Rum~^w>6(x9CPqHi
z8witNPrcxo0|&VT>m{3%2W|b|6aH7q_ibIZ3DR+Nu^C;gn;s^HOLF}oXds-(HX;;g$Jf8QSwzIZ(z^ms`9SJ<5*pw7#HxWs#Pieb+WXkhu#etu|qxaYp*BLXup4t`lBuoy#g
zTuHHEHR4#{nzqKD#@EqmmYYEkJd0d<*+A@kZvLUoZ0&`lNaQXD_XnbrO
zsm#|*w-j?G>MP0lPB8sES!vcx(4&s+VjXYr%NELa@e)c3&Ewu=btcwR+znv|$ZJ
z$P79kXc5h075y6@iK`sbe+zo@zR9z^m`KTyEo9D
zTG<|ci|VXg*;J~`snXVLIhECpQ=wIP!}RTLUH+frvr)8VWyUlu)ko~=BX(IyrLoYH
c?XwBaxg@)WUbxnR3M~X)=zf7A44n}E0Z7NHmH+?%
literal 0
HcmV?d00001
diff --git a/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/film.cpython-312.pyc b/StreamingCommunity/Api/Site/streamingcommunity/__pycache__/film.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a94d8c7012da49292476871d9741b9fd39d72be7
GIT binary patch
literal 2973
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