diff --git a/Src/API/animeworld.py b/Src/API/animeworld.py index e94b598..eeb96e3 100644 --- a/Src/API/animeworld.py +++ b/Src/API/animeworld.py @@ -151,7 +151,7 @@ async def animeworld(id,client): async def test_animeworld(): async with AsyncSession() as client: # Replace with actual id, for example 'anime_id:episode' format - test_id = "kitsu:508:2" # This is an example ID format + test_id = "kitsu:46474:1" # This is an example ID format results = await animeworld(test_id, client) print(results) diff --git a/Src/API/cool.py b/Src/API/cool.py index e6e866c..6276454 100644 --- a/Src/API/cool.py +++ b/Src/API/cool.py @@ -1,8 +1,9 @@ import json from Src.Utilities.info import get_info_tmdb,is_movie from Src.Utilities.convert import get_TMDb_id_from_IMDb_id -from Src.Utilities.loadenv import load_env +from Src.Utilities.loadenv import load_env env_vars = load_env() +ForwardProxy = env_vars.get('ALTERNATIVE_LINK') MYSTERIUS_KEY = env_vars.get('MYSTERIUS_KEY') async def get_links(slug,season,episode,ismovie,client): @@ -16,7 +17,7 @@ async def get_links(slug,season,episode,ismovie,client): ap_session = Auths.get('auth') cookies = {'ap_session': ap_session} - + print(cookies) headers = { 'accept': 'application/json, text/plain, */*', 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7', @@ -140,7 +141,7 @@ async def cool(imdb,client): except Exception as e: print("Cool Error",e) return None -''' + async def test_animeworld(): from curl_cffi.requests import AsyncSession async with AsyncSession() as client: @@ -151,4 +152,3 @@ async def test_animeworld(): if __name__ == "__main__": import asyncio asyncio.run(test_animeworld()) -''' \ No newline at end of file diff --git a/Src/API/ddlstream.py b/Src/API/ddlstream.py index b58433a..30d6004 100644 --- a/Src/API/ddlstream.py +++ b/Src/API/ddlstream.py @@ -4,7 +4,7 @@ from bs4 import BeautifulSoup, SoupStrainer from Src.Utilities.info import get_info_imdb, is_movie, get_info_tmdb import urllib.parse import Src.Utilities.config as config -import urllib.parse + DDL_DOMAIN = config.DDL_DOMAIN ips4_device_key = config.ips4_device_key ips4_login_key = config.ips4_login_key @@ -14,12 +14,12 @@ cookies = { 'ips4_device_key': ips4_device_key, 'ips4_IPSSessionFront': ips4_IPSSessionFront, 'ips4_member_id': ips4_member_id, - 'ips4_login_key': ips4_login_key, + 'ips4_login_key': ips4_login_key } async def search_series(client,id,season,episode,showname): showname = showname.replace(" ", "%20").replace("–", "+").replace("—","+") - response = await client.get(f"{DDL_DOMAIN}/search/?&q={showname}%20{season}%20Streaming&type=videobox_video&quick=1&nodes=11,36&search_and_or=and&search_in=titles&sortby=relevancy") + response = await client.get(f"{DDL_DOMAIN}/search/?&q={showname}%20{season}%20Streaming&type=videobox_video&quick=1&nodes=11,36&search_and_or=and&search_in=titles&sortby=relevancy", cookies = cookies) soup = BeautifulSoup(response.text, 'lxml',parse_only=SoupStrainer('a')) a_tags = soup.find_all('a', {'data-linktype': 'link'}) for a in a_tags: @@ -55,7 +55,6 @@ async def get_episode(client,link,episode): 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1', 'Connection': 'keep-alive', - # 'Cookie': 'ips4_device_key=b6f084be79c28bb53ecfc556fd7a2a70; ips4_IPSSessionFront=f2b9db91793e084cf2003a07c563e6aa; ips4_ipsTimezone=Europe/Rome; ips4_hasJS=true; ips4_noCache=1; ips4_announcement_3=true; ips4_member_id=4029711; ips4_login_key=41b6a70b16cce2fd39482f5b21a9c35f; ips4_loggedIn=1725985598', 'Priority': 'u=1', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', @@ -65,8 +64,7 @@ async def get_episode(client,link,episode): } - response = await client.get(link, cookies = cookies, headers = headers, params = params, impersonate="chrome120") - + response = await client.get(link, cookies = cookies, headers = headers, params = params, impersonate="chrome124") pattern = rf']*>\s*Part {episode}\s*' match = re.search(pattern, response.text) mp4_link = match.group(1) @@ -98,7 +96,7 @@ async def search_movie(client,showname,id): async def get_mp4(client,link): - response = await client.get(link, cookies = cookies) + response = await client.get(link, cookies = cookies) soup = BeautifulSoup(response.text,'lxml',parse_only=SoupStrainer('source')) source_tag = soup.find('source') final_url = source_tag['src'] @@ -149,7 +147,7 @@ async def ddlstream(imdb,client): async def test_animeworld(): from curl_cffi.requests import AsyncSession async with AsyncSession() as client: - test_id = "tt14948432" # This is an example ID format + test_id = "tt3148266:3:4" # This is an example ID format results = await ddlstream(test_id, client) print(results) diff --git a/Src/API/eurostreaming.py b/Src/API/eurostreaming.py new file mode 100644 index 0000000..b5dc3d0 --- /dev/null +++ b/Src/API/eurostreaming.py @@ -0,0 +1,284 @@ +from Src.Utilities.info import get_info_tmdb, is_movie, get_info_imdb +import Src.Utilities.config as config +from fake_headers import Headers +from urllib.parse import quote +from Src.Utilities.loadenv import load_env +import re +from bs4 import BeautifulSoup,SoupStrainer +env_vars = load_env() +from fake_headers import Headers +random_headers = Headers() +import pytesseract +from PIL import Image +import base64 +from io import BytesIO +import time +from Src.Utilities.eval import eval_solver +import os +import json + +import random +ES_DOMAIN = config.ES_DOMAIN + +ES_PROXY = config.ES_PROXY +proxies = {} +if ES_PROXY == "1": + PROXY_CREDENTIALS = env_vars.get('PROXY_CREDENTIALS') + proxy_list = json.loads(PROXY_CREDENTIALS) + proxy = random.choice(proxy_list) + if proxy == "": + proxies = {} + else: + proxies = { + "http": proxy, + "https": proxy + } +ES_ForwardProxy = config.ES_ForwardProxy +if ES_ForwardProxy == "1": + ForwardProxy = env_vars.get('ForwardProxy') +else: + ForwardProxy = "" + + + + +''' +OK MaxStream – DeltaBit – Turbovid +pattern = r'href="([^"]+)"' +match = re.search(pattern, text) + href_value = match.group(1) +''' +async def mixdrop(url,MFP,client): + """Extract Mixdrop URL.""" + if "club" in url: + url = url.replace("club", "cv").split("/2")[0] + if "cfd" in url: + url = url.replace("cfd", "cv").replace("emb","e").split("/2")[0] + if MFP == "1": + return url,"" + headers = {"accept-language": "en-US,en;q=0.5"} + final_url = f"https:{await eval_solver(url, proxies , ForwardProxy, client)}" + return final_url,"" + +async def deltabit(page_url,client): + """Extract Deltabit URL.""" + i = 0 + #Set up some headers + headers = random_headers.generate() + headers2 = random_headers.generate() + + #Get the redirected link, so the actual deltabit link. + page_url_response = await client.get(ForwardProxy + page_url,headers={**headers, 'Range': 'bytes=0-0'}, proxies=proxies) + page_url = page_url_response.url + print("Page_URl is",page_url) + + #Change the referer and user agent of the generated headers + headers2['referer'] = 'https://safego.cc/' + headers2['user-agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36' + + #Request to the deltabit link + response = await client.get(ForwardProxy + page_url, headers = headers2, allow_redirects = True, proxies = proxies) + page_url = response.url + + #Often deltabit redirects to another deltabit link. We need the redirected link to put it in the headers. + headers['origin'] = f'https://{page_url.split('/')[2]}' + headers['referer'] = page_url + headers['user-agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36' + + #We check the page for the data such as hash and fname. + soup = BeautifulSoup(response.text, 'lxml', parse_only=SoupStrainer('input')) + data = {} + for input in soup: + name = input.get('name') + value = input.get('value') + data[name] = value + data['imhuman'] = '' + data['referer']= page_url + + #We need to wait 2.5 seconds or the request will fail + time.sleep(2.5) + + + + fname = data['fname'] + #Request to the deltabit link + response = await client.post(ForwardProxy + page_url, data = data, headers = headers, proxies = proxies) + link = re.findall(r'sources:\s*\["([^"]+)"', response.text, re.DOTALL) + print(link) + if not link: + if not i >= 3: + link,fname = await deltabit(page_url,client) + i +=1 + else: + link = link[0] + + + return link,fname + + +def convert_numbers(base64_data): + image_data = base64.b64decode(base64_data) + image = Image.open(BytesIO(image_data)) + custom_config = r'--oem 3 --psm 6 outputbase digits' + number_string = pytesseract.image_to_string(image, config=custom_config) + return number_string.strip() + + +async def get_numbers(safego_url,client): + headers = random_headers.generate() + headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0' + response = await client.get(ForwardProxy + safego_url,headers = headers, proxies = proxies) + cookies = (response.cookies.get_dict()) + soup = BeautifulSoup(response.text,'lxml',parse_only=SoupStrainer('img')) + numbers = soup.img['src'].split(',')[1] + return numbers,cookies + +async def real_page(safego_url,client): + try: + current_directory = os.path.dirname(os.path.abspath(__file__)) + file_path = os.path.join(current_directory, 'cookie.txt') + headers = random_headers.generate() + headers['Origin'] = 'https://safego.cc' + headers['Referer'] = safego_url + headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0' + with open(file_path, 'r') as file: + cookies = file.read() + cookies = json.loads(cookies.replace("'", '"')) + response = await client.post(ForwardProxy + safego_url,headers=headers, cookies = cookies, proxies = proxies) + soup = BeautifulSoup(response.text,'lxml', parse_only=SoupStrainer('a')) + if len(soup)>= 1: + return soup.a['href'] + else: + print("Getting numbers") + numbers,cookies = await get_numbers(safego_url,client) + numbers = convert_numbers(numbers) + data = {'captch4': numbers} + response = await client.post(ForwardProxy + safego_url,headers=headers, data=data, cookies = cookies, proxies = proxies) + cap4 = response.headers.get('set-cookie').split(';')[0] + cookies[cap4.split('=')[0]] = cap4.split('=')[1] + with open(file_path, 'w') as file: + file.write(str(cookies)) + soup = BeautifulSoup(response.text,'lxml', parse_only=SoupStrainer('a')) + return soup.a['href'] + except Exception as e: + print(e) +async def get_host_link(pattern,atag,client): + match = re.search(pattern, atag) + headers = random_headers.generate() + if match: + href_value = match.group(1) + response = await client.head(ForwardProxy + href_value, headers={**headers, 'Range': 'bytes=0-0'}, proxies = proxies) + href_value = response.url + href = await real_page(href_value,client) + return href +async def scraping_links(atag,MFP,client): + #Check which hosts are avaiable and extract the links from one of them. Turbovid uses Cloudflare therefore is not avaiable. Maxstream has a captcha. + if "MixDrop" and "DeltaBit" in atag: + pattern = r']*rel="noopener"[^>]*>DeltaBit' + href = await get_host_link(pattern,atag,client) + try: + full_url,name = await deltabit(href,client) + except Exception as e: + pattern = r']*rel="noopener"[^>]*>MixDrop' + href = await get_host_link(pattern,atag,client) + full_url,name = await mixdrop(href,MFP,client) + return full_url,name + if "MixDrop" in atag and "DeltaBit" not in atag: + pattern = r']*rel="noopener"[^>]*>MixDrop' + href = await get_host_link(pattern,atag,client) + full_url,name = await mixdrop(href,MFP,client) + return full_url,name + if 'DeltaBit' in atag and "MixDrop" not in atag: + pattern = r']*rel="noopener"[^>]*>DeltaBit' + href = await get_host_link(pattern,atag,client) + full_url,name = await deltabit(href,client) + return full_url,name + if 'DeltaBit' not in atag and 'MixDrop' not in atag: + print("Just give up") + return None,"" + + +async def search(showname,date,season,episode,MFP,client): + headers = random_headers.generate() + + response = await client.get(ForwardProxy + f'{ES_DOMAIN}/wp-json/wp/v2/search?search={showname}&_fields=id', proxies = proxies, headers = headers) + results = response.json() + for i in results: + response = await client.get(ForwardProxy + f'{ES_DOMAIN}/wp-json/wp/v2/posts/{i['id']}?_fields=content', proxies = proxies, headers = headers) + if f'ID articolo non valido' in response.text: + continue + description = response.json() + description = description['content']['rendered'] + year_pattern = re.compile(r'(?]*>Continua a leggere' + match = re.search(pattern, description) + if match: + href_value = match.group(1) + response_2 = await client.get(ForwardProxy + href_value, proxies = proxies, headers = headers) + match = year_pattern.search(response_2.text) + if match: + year = match.group(0) + if year == str(date): + episode = episode.zfill(2) + pattern = rf'{season}×{episode}\s*(.*?)(?=)' + match = re.findall(pattern, description) + urls= {} + if match: + for episode_details in match: + if "href" in episode_details: + full_url,name = await scraping_links(episode_details.split(' – ', 1)[1],MFP,client) + if full_url: + urls[full_url] = name + return urls + + + + +async def eurostreaming(id,client,MFP): + try: + general = await is_movie(id) + ismovie = general[0] + clean_id = general[1] + type = "Eurostreaming" + if ismovie == 0 : + season = str(general[2]) + episode = str(general[3]) + elif ismovie == 1: + return None + if "tmdb" in id: + showname,date = get_info_tmdb(clean_id,ismovie,type) + else: + showname,date = await get_info_imdb(clean_id,ismovie,type,client) + print(showname) + showname = quote(showname) + urls = await search(showname,date, season,episode,MFP,client) + return urls + except Exception as e: + print(e) + + + + +async def test_euro(): + from curl_cffi.requests import AsyncSession + async with AsyncSession() as client: + results = await eurostreaming("tt6156584:4:5",client,0) + print(results) + +async def test_deltabit(): + from curl_cffi.requests import AsyncSession + async with AsyncSession() as client: + results = await deltabit("https://deltabit.co/fgeki2456ab1",client) + print(results) + +if __name__ == "__main__": + import asyncio + asyncio.run(test_euro()) + #python3 -m Src.API.eurostreaming + +'''tt11950864''' \ No newline at end of file diff --git a/Src/API/lordchannel.py b/Src/API/lordchannel.py index bd50749..dcd199f 100644 --- a/Src/API/lordchannel.py +++ b/Src/API/lordchannel.py @@ -12,7 +12,7 @@ async def search(showname,date,season,episode,ismovie,client): } headers = { - 'authority': f'lordchannel.{LC_DOMAIN}', + 'authority': f'{LC_DOMAIN}', 'accept': '*/*', 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7', # 'cookie': 'csrftoken=7lvc502CZe8Zbx7iSX1xkZOBA1NbDxJZ', @@ -31,7 +31,7 @@ async def search(showname,date,season,episode,ismovie,client): 'media': showname, '_': '1724421723999', } - response = await client.get(f'{LC_DOMAIN}/live_search/', params=params, cookies=cookies, headers=headers, allow_redirects=True, impersonate = "chrome120") + response = await client.get(f'{LC_DOMAIN}/live_search/', params=params, cookies=cookies, headers=headers, allow_redirects=True, impersonate = "chrome124") data = json.loads(response.text) for entry in data['data']: if entry is not None: # check if the a_tag exists @@ -98,7 +98,6 @@ async def lordchannel(imdb,client): print("MammaMia: Lordchannel Failed",e) return None,None -''' async def test_animeworld(): from curl_cffi.requests import AsyncSession async with AsyncSession() as client: @@ -109,4 +108,3 @@ if __name__ == "__main__": import asyncio asyncio.run(test_animeworld()) #python3 -m Src.API.lordchannel -''' \ No newline at end of file diff --git a/Src/API/streamingcommunity.py b/Src/API/streamingcommunity.py index dbb5444..b03c891 100644 --- a/Src/API/streamingcommunity.py +++ b/Src/API/streamingcommunity.py @@ -114,7 +114,6 @@ async def search(query,date,ismovie, client,SC_FAST_SEARCH,movie_id): print(movie_id) #Here we need to convert because the IMDB ID is often bugged tmdb_id = str(data['props']['title']['tmdb_id']) - print(tmdb_id) if tmdb_id == movie_id: return tid,slug,version elif SC_FAST_SEARCH == "1": diff --git a/Src/API/tantifilm.py b/Src/API/tantifilm.py index 1bf2826..16b30f2 100644 --- a/Src/API/tantifilm.py +++ b/Src/API/tantifilm.py @@ -288,7 +288,7 @@ async def test_animeworld(): from curl_cffi.requests import AsyncSession async with AsyncSession() as client: # Replace with actual id, for example 'anime_id:episode' format - test_id = "tt1839578:1:1" # This is an example ID format + test_id = "tt3148266:1:1" # This is an example ID format results = await tantifilm(test_id, client,"0") print(results) diff --git a/Src/Utilities/config.py b/Src/Utilities/config.py index 1dbca25..af2130e 100644 --- a/Src/Utilities/config.py +++ b/Src/Utilities/config.py @@ -21,6 +21,7 @@ DLHD_DOMAIN = SITE['DaddyLiveHD']['url'] GS_DOMAIN = SITE['Guardaserie']['url'] GHD_DOMAIN = SITE['GuardaHD']['url'] OST_DOMAIN = SITE['Onlineserietv']['domain'] +ES_DOMAIN = SITE['Eurostreaming']['url'] SC = SITE['StreamingCommunity']['enabled'] FT = SITE['Filmpertutti']['enabled'] TF = SITE['Tantifilm']['enabled'] @@ -34,6 +35,7 @@ MYSTERIUS = SITE['Mysterius']['enabled'] GS = SITE['Guardaserie']['enabled'] GHD = SITE['GuardaHD']['enabled'] OST = SITE['Onlineserietv']['enabled'] +ES= SITE['Eurostreaming']['enabled'] DLHD = SITE['DaddyLiveHD']['enabled'] TF_ForwardProxy = SITE['Tantifilm']["TF_ForwardProxy"] SC_ForwardProxy = SITE['StreamingCommunity']["SC_ForwardProxy"] @@ -44,6 +46,7 @@ AW_ForwardProxy = SITE['AnimeWorld']["AW_ForwardProxy"] MX_ForwardProxy = SITE['CB01']["MX_ForwardProxy"] CB_ForwardProxy = SITE['CB01']["CB_ForwardProxy"] OST_ForwardProxy = SITE['Onlineserietv']["OST_ForwardProxy"] +ES_ForwardProxy = SITE['Eurostreaming']['ES_ForwardProxy'] GS_PROXY = SITE['Guardaserie']["GS_PROXY"] GH_PROXY = SITE['GuardaHD']["GH_PROXY"] TF_PROXY = SITE['Tantifilm']["TF_PROXY"] @@ -53,6 +56,7 @@ VX_PROXY = SITE['StreamingCommunity']["VX_PROXY"] AW_PROXY = SITE['AnimeWorld']["AW_PROXY"] MX_PROXY = SITE['CB01']["MX_PROXY"] OST_PROXY = SITE['Onlineserietv']["OST_PROXY"] +ES_PROXY = SITE['Eurostreaming']['ES_PROXY'] ips4_device_key = SITE['DDLStream']['cookies']["ips4_device_key"] ips4_IPSSessionFront = SITE['DDLStream']['cookies']["ips4_IPSSessionFront"] ips4_member_id = SITE['DDLStream']['cookies']["ips4_member_id"] diff --git a/Src/Utilities/convert.py b/Src/Utilities/convert.py index 1ffa5ba..1ee5626 100644 --- a/Src/Utilities/convert.py +++ b/Src/Utilities/convert.py @@ -13,8 +13,10 @@ async def get_TMDb_id_from_IMDb_id(imdb_id,client): else: return None async def get_IMDB_id_from_TMDb_id(tmdb_id,client): + print(tmdb_id) url = f"https://api.themoviedb.org/3/movie/{tmdb_id}?api_key={TMDB_KEY}" response = await client.get(url) + print(response.text) if response.status_code == 200: data = response.json() imdb_id = data.get('imdb_id') diff --git a/Src/Utilities/dictionaries.py b/Src/Utilities/dictionaries.py index db731b8..df957c9 100644 --- a/Src/Utilities/dictionaries.py +++ b/Src/Utilities/dictionaries.py @@ -206,301 +206,6 @@ STREAM = { "poster": "https://static.sky.it/static_clientlibs/skycielo/clientlibs/clientlib-site/resources/images/facebook.jpg", "url": "https://hlslive-web-gcdn-skycdn-it.akamaized.net/TACT/11219/cieloweb/master.m3u8?hdnea=st=1701861650~exp=1765449000~acl=/*~hmac=84c9f3f71e57b13c3a67afa8b29a8591ea9ed84bf786524399545d94be1ec04d" }, - { - "id": "sky-cinema-action", - "title": "Sky Cinema Action", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-cinema-action_c.png" - }, - { - "id": "sky-arte", - "title": "Sky Arte", - "name": "", - "genres": ["Sky"], - "poster": "https://www.davinciface.com/wp-content/uploads/2022/07/sky_arte_logo-270x270.jpg" - }, - { - "id": "sky-atlantic", - "title": "Sky Atlantic", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-atlantic_c.png" - }, - { - "id": "sky-cinema-collection", - "title": "Sky Cinema Collection", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-cinema-collection_c.png" - }, - { - "id": "sky-cinema-comedy", - "title": "Sky Cinema Comedy", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-cinema-comedy_c.png" - }, - { - "id": "sky-cinema-drama", - "title": "Sky Cinema Drama", - "name": "", - "genres": ["Sky"], - "poster":"https://i.imgur.com/Z8hr5aR.png" - }, - { - "id": "sky-cinema-due", - "title": "Sky Cinema Due", - "name": "", - "genres": ["Sky"], - "poster": "https://i.imgur.com/xfbZiXs.png" - }, - { - "id": "sky-cinema-family", - "title": "Sky Cinema Family", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-cinema-family_c.png" - }, - { - "id": "sky-cinema-romance", - "title": "Sky Cinema Romance", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-cinema-romance_c.png" - }, - { - "id": "sky-cinema-suspence", - "title": "Sky Cinema Suspence", - "name": "", - "genres": ["Sky"], - "poster": "https://i.imgur.com/vS97bNg.png" - }, - { - "id": "sky-cinema-uno", - "title": "Sky Cinema Uno", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-cinema-1_c.png" - }, - { - "id": "sky-crime", - "title": "Sky Crime", - "name": "", - "genres": ["Sky"], - "poster": "https://i.imgur.com/j2JdQaH.png" - }, - { - "id": "sky-documentaries", - "title": "Sky Documentaries", - "name": "", - "genres": ["Sky"], - "poster": "https://artworks.thetvdb.com/banners/posters/117551-3.jpg" - }, - { - "id": "sky-investigation", - "title": "Sky Investigation", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-investigation_c.png" - }, - { - "id": "sky-nature", - "title": "Sky Nature", - "name": "", - "genres": ["Sky"], - "poster":"https://search.bus-hit.me/image_proxy?url=https%3A%2F%2Fstatic.wikia.nocookie.net%2Flogosfake%2Fimages%2Fa%2Fad%2FSky_Nature_Generic_ID_2020.png%2Frevision%2Flatest%2Fscale-to-width-down%2F1200%3Fcb%3D20200725184630&h=71ab69ffa3abfe2ce6c20912b44f862adff4f10b9d4d761c18d292b7ffa3e9a9" - }, - { - "id": "sky-serie", - "title": "Sky Serie", - "name": "", - "genres": ["Sky"], - "poster": "https://i.imgur.com/FYvSq5T.png" - }, - { - "id": "sky-uno", - "title": "Sky Uno", - "name": "", - "genres": ["Sky"], - "poster": "https://www.miotvonline.com/wp-content/uploads/2020/09/sky-uno-straming-live-miotv.jpg" - }, - { - "id": "sky-sport-24", - "title": "Sky Sport 24", - "name": "", - "genres": ["Sky"], - "poster": "https://img2.sport-tv-guide.live/images/tv-station-sky-sport24-it-356.png" - - }, - { - "id": "sky-sport-golf", - "title": "Sky Sport Golf", - "name": "", - "genres": ["Sky"], - "poster": "https://search.bus-hit.me/image_proxy?url=https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcRQoDZOK798-OYz0E_NAahzde_JW-hLcHK-PjLm0rCXyVVcj_Y%26s&h=4b1b7a276442b52778daf26f745d06f57ff6c0cf401f4d7f3e371a566247f3ef" - }, - { - "id": "sky-sport-251", - "title": "Sky Sport 251", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-252", - "title": "Sky Sport 252", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-253", - "title": "Sky Sport 253", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-254", - "title": "Sky Sport 254", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-255", - "title": "Sky Sport 255", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-256", - "title": "Sky Sport 256", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-257", - "title": "Sky Sport 257", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-258", - "title": "Sky Sport 258", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-259", - "title": "Sky Sport 259", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-260", - "title": "Sky Sport 260", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-261", - "title": "Sky Sport 261", - "name": "", - "genres": ["Sky"], - "poster": "https://logodownload.org/wp-content/uploads/2020/06/sky-sports-logo-0-1.png" - }, - { - "id": "sky-sport-max", - "title": "Sky Sport Max", - "name": "", - "genres": ["Sky"], - "poster": "https://i.imgur.com/TWl58VI.png" - }, - { - "id": "sky-sport-uno", - "title": "Sky Sport Uno", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-sport-1_c.png" - }, - { - "id": "sky-sport-f1", - "title": "Sky Sport F1", - "name": "", - "genres": ["Sky"], - "poster": "https://i1.wp.com/cache.pressmailing.net/thumbnail/story_hires/395b1e2f-a1c6-4cf6-9869-02155da4021f/Sky_F1_Logo.jpg.jpg" - }, - { - "id": "sky-sport-motogp", - "title": "Sky Sport MotoGP", - "name": "", - "genres": ["Sky"], - "poster": "https://img2.sport-tv-guide.live/images/tv-station-sky-sport-motogp-360.png" - }, - { - "id": "sky-sport-calcio", - "title": "Sky Sport Calcio", - "name": "", - "genres": ["Sky"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/sky-sport-2_c.png" - }, - { - "id": "sky-sport-arena", - "title": "Sky Sport Arena", - "name": "", - "genres": ["Sky"], - "poster": "https://img2.sport-tv-guide.live/images/tv-station-sky-sport-arena-354.png" - }, - { - "id": "sky-sport-tennis", - "title": "Sky Sport Tennis", - "name": "", - "genres": ["Sky"], - "poster": "https://pbs.twimg.com/profile_images/1752313472325431296/jr-YrkR6_400x400.png" - }, - { - "id": "sky-sport-nba", - "title": "Sky Sport NBA", - "name": "", - "genres": ["Sky"], - "poster": "https://www.nbareligion.com/wp-content/uploads/2019/09/sky-sport-nba.jpg" - }, - { - "id": "dazn-zona-a", - "title": "DAZN Zona A", - "name": "", - "genres": ["DAZN"], - "poster": "https://i.ytimg.com/vi/0cEfGLq-tz4/maxresdefault.jpg" - }, - { - "id": "dazn-1", - "title": "DAZN 1", - "name": "", - "genres": ["DAZN"], - "poster": "https://i.ytimg.com/vi/0cEfGLq-tz4/maxresdefault.jpg" - }, - { - "id": "eurosport-1", - "title": "Eurosport 1", - "name": "", - "genres": ["Warner Bros"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/eurosport-1_c.png" - }, - { - "id": "eurosport-2", - "title": "Eurosport 2", - "name": "", - "genres": ["Warner Bros"], - "poster": "https://www.sorrisi.com/guidatv/bundles/tvscnewsite/css/images/loghi/eurosport-2_c.png" - }, { "id": "dmax", "title": "DMAX", @@ -914,4 +619,5 @@ provider_map = { "GS": "GUARDASERIE", "GHD": "GUARDAHD", "OST": "ONLINESERIETV", + "ES": "EUROSTREAMING" } \ No newline at end of file diff --git a/Src/Utilities/eval.py b/Src/Utilities/eval.py index af92eef..eeeab06 100644 --- a/Src/Utilities/eval.py +++ b/Src/Utilities/eval.py @@ -139,8 +139,8 @@ random_headers = Headers() async def eval_solver(stream_link,proxies, ForwardProxy, client): try: headers = random_headers.generate() - headers["user-agent"] = "Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.71 Mobile Safari/537.36" - headers["User-Agent"] = "Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.71 Mobile Safari/537.36" + headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36" + headers["accept-language"] = 'en-US,en;q=0.5' response = await client.get( ForwardProxy + stream_link, allow_redirects=True, timeout=30, headers = headers, proxies = proxies, impersonate = "chrome124") print("Eval:",response.status_code) soup = BeautifulSoup(response.text, "lxml",parse_only=SoupStrainer("script")) @@ -148,10 +148,28 @@ async def eval_solver(stream_link,proxies, ForwardProxy, client): for i in script_all: if detect(i.text): unpacked_code = unpack(i.text) - match = re.search( r'file:"(.*?)"', unpacked_code) + if "mixdrop" in stream_link: + pattern = r'MDCore.wurl ?= ?"(.*?)"' + + else: + pattern = r'file:"(.*?)"' + match = re.search(pattern, unpacked_code) if match: m3u8_url = match.group(1) return m3u8_url except Exception as e: print("Eval solver error\n",e) - raise Exception("Error in eval_solver") \ No newline at end of file + raise Exception("Error in eval_solver") + + +#Testing +async def test_animeworld(): + from curl_cffi.requests import AsyncSession + async with AsyncSession() as client: + results = await eval_solver("https://mixdrop.cv/e/l6kqxrm4t4l4or",{},"",client) + print("https:"+results) + +if __name__ == "__main__": + import asyncio + asyncio.run(test_animeworld()) + #python3 -m Src.Utilities.eval diff --git a/Src/Utilities/info.py b/Src/Utilities/info.py index 2f841bd..415e9c9 100644 --- a/Src/Utilities/info.py +++ b/Src/Utilities/info.py @@ -53,6 +53,10 @@ def get_info_tmdb(tmbda,ismovie,type): date = show.first_air_date date = date.split("-")[0] return showname,date + elif type == "Eurostreaming": + date = show.first_air_date + date = date.split("-")[0] + return showname,date elif ismovie == 1: movie = Movie() @@ -133,6 +137,10 @@ async def get_info_imdb(imdb_id, ismovie, type,client): date = data['tv_results'][0]['first_air_date'] date = date.split("-")[0] return showname,date + elif type == "Eurostreaming": + date = data['tv_results'][0]['first_air_date'] + date = date.split("-")[0] + return showname,date elif ismovie == 1: showname= data['movie_results'][0]['title'] diff --git a/config.json b/config.json index 3965ea1..18a6356 100644 --- a/config.json +++ b/config.json @@ -1,7 +1,7 @@ { "Siti": { "StreamingCommunity": { - "url": "https://streamingcommunity.paris", + "url": "https://vixsrc.to", "SC_ForwardProxy": "0", "SC_PROXY": "0", "VX_ForwardProxy": "0", @@ -10,20 +10,20 @@ }, "Filmpertutti": { "url": "https://filmpertutti.motorcycles", - "enabled": "1" + "enabled": "0" }, "Tantifilm":{ "url": "https://www.tanti.bond", - "TF_ForwardProxy": "0", + "TF_ForwardProxy": "1", "TF_PROXY": "0", - "enabled": "1" + "enabled": "0" }, "Mysterius":{ "enabled": "0" }, "LordChannel":{ "url":"https://lordchannel.net", - "enabled":"1" + "enabled":"0" }, "StreamingWatch":{ "url":"https://www.streamingwatch.org", @@ -45,10 +45,10 @@ "ips4_member_id": null, "ips4_login_key": null }, - "enabled":"1" + "enabled":"0" }, "Guardaserie":{ - "url":"https://guardaserietv.mom", + "url":"https://guardaserietv.cc", "enabled":"1", "GS_ForwardProxy":"0", "GS_PROXY":"0" @@ -61,10 +61,16 @@ }, "Onlineserietv":{ "domain":"com", - "enabled":"1", + "enabled":"0", "OST_ForwardProxy":"0", "OST_PROXY":"0" }, + "Eurostreaming":{ + "url": "https://eurostreaming.garden", + "enabled": "1", + "ES_ForwardProxy": "0", + "ES_PROXY": "0" + }, "AnimeWorld":{ "url":"https://www.animeworld.so", "enabled":"1", @@ -83,12 +89,11 @@ "General":{ "load_env": "0", "HOST": "0.0.0.0", - "PORT": "8080", + "PORT": 8080, "Name": "MammaMia", "Icon": "🍕️", "Public_Instance": "0", - "Remote_Instance": "1", + "Remote_Instance": "0", "Global_Proxy": "0" } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/run.py b/run.py index 5af57a3..356c33b 100644 --- a/run.py +++ b/run.py @@ -17,6 +17,7 @@ from Src.Utilities.dictionaries import okru,STREAM,extra_sources,webru_vary,webr from Src.API.epg import tivu, tivu_get,epg_guide,convert_bho_1,convert_bho_2,convert_bho_3 from Src.API.webru import webru,get_skystreaming from Src.API.onlineserietv import onlineserietv +from Src.API.eurostreaming import eurostreaming from curl_cffi.requests import AsyncSession from slowapi import Limiter from slowapi.util import get_remote_address @@ -53,6 +54,7 @@ DDL = config.DDL GS = config.GS GHD = config.GHD OST = config.OST +ES = config.ES HOST = config.HOST PORT = int(config.PORT) Icon = config.Icon @@ -68,7 +70,7 @@ app.include_router(m3u8_clone) limiter = Limiter(key_func=get_remote_address) app.state.limiter = limiter app.add_middleware(SlowAPIMiddleware) -User_Agent= "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0" +User_Agent= "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36" MANIFEST = { "id": "org.stremio.mammamia", "version": "1.5.0", @@ -111,10 +113,9 @@ async def transform_mfp(mfp_stream_url,client): for i in data['request_headers']: url += f"&h_{i}={urllib.parse.quote(data['request_headers'][i])}" - return url except Exception as e: - print("Transforing MFP failed",e) + print("Converting MFP failed",e) return None @app.get('/config') def config(): @@ -404,7 +405,30 @@ async def addon_stream(request: Request,config, type, id,): if url_onlineserietv: print(f"OnlineSerieTV Found Results for {id}") streams['streams'].append({'name': f"{Name}",'title': f'{Icon}OnlineSerieTV\n{name}', 'url': url_onlineserietv, 'behaviorHints': {'proxyHeaders': {'request': {"User-Agent": 'Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.71 Mobile Safari/537.36', "Referer": "https://flexy.stream/"}}, 'bingeGroup': 'onlineserietv', 'notWebReady': True}}) - + if provider_maps['EUROSTREAMING'] == "1" and ES == "1": + urls_eurostreaming = await eurostreaming(id,client,MFP) + if urls_eurostreaming: + i = 0 + for url_eurostreaming,name_es in urls_eurostreaming.items(): + if len(urls_eurostreaming) == 1: + language = "ITA/SUB ITA" + elif len(urls_eurostreaming)>1: + if i == 0: + language = "ITA" + else: + language = "SUB ITA" + if "cdn.net" in url_eurostreaming: + streams['streams'].append({'name': f"{Name}\n{language}",'title': f'{Icon}Eurostreaming\nDeltabit\n{name_es}', 'url': url_eurostreaming, 'behaviorHints': {'bingeGroup': 'eurostreaming'}}) + elif "delivery" in url_eurostreaming: + streams['streams'].append({'name': f"{Name}\n{language}",'title': f'{Icon}Eurostreaming\nMixDrop\n{name_es}', 'url': url_eurostreaming, 'behaviorHints': {'proxyHeaders': {"request": {"User-Agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36'}}, 'notWebReady': True, 'bingeGroup': 'eurostreaming'}}) + elif "mixdrop" in url_eurostreaming: + if MFP == "1": + url_eurostreaming = f'{MFP_url}/extractor/video?api_password={MFP_password}&d={url_eurostreaming}&host=Mixdrop&redirect_stream=false' + url_eurostreaming = await transform_mfp(url_eurostreaming,client) + if url_eurostreaming: + streams['streams'].append({'name': f"{Name}\n{language}",'title': f'{Icon}Eurostreaming\nMixDrop\n{name_es}', 'url': url_eurostreaming, 'behaviorHints':{'bingeGroup': 'eurostreaming'}}) + i+=1 + if not streams['streams']: raise HTTPException(status_code=404) @@ -414,4 +438,4 @@ async def addon_stream(request: Request,config, type, id,): if __name__ == '__main__': import uvicorn uvicorn.run("run:app", host=HOST, port=PORT, log_level="info") - \ No newline at end of file +