diff --git a/Src/API/animeworld.py b/Src/API/animeworld.py index 32c04a2..95e223a 100644 --- a/Src/API/animeworld.py +++ b/Src/API/animeworld.py @@ -44,16 +44,32 @@ showname_replace = { "Shippuuden": "Shippuden", " ": "+", } - +async def security_cookie (response): + if "SecurityAW-gl" in response.text: + match = re.search(r'SecurityAW-gl=([^;]+)', response.text) + characters = "gl" + elif "SecurityAW-Ec" in response.text: + match = re.search(r'SecurityAW-Ec=([^;]+)', response.text) + characters = "Ec" + if match: + Security_Cookie = match.group(1).strip() + cookies = { + f"SecurityAW-{characters}": Security_Cookie + } + return cookies async def get_mp4(anime_url,ismovie,episode,client): - response = await client.get(ForwardProxy + anime_url,allow_redirects=True, impersonate = "chrome124",proxies=proxies) + cookies = {} + response = await client.get(ForwardProxy + anime_url,allow_redirects=True, cookies = cookies,impersonate = "chrome124",proxies=proxies) soup = BeautifulSoup(response.text,'lxml') if ismovie == 0: episode_page = soup.find('a', {'data-episode-num':episode }) if episode_page is None: return None episode_page = f'https://animeworld.{AW_DOMAIN}{episode_page["href"]}' - response = await client.get(ForwardProxy + episode_page,allow_redirects=True, impersonate = "chrome124", proxies=proxies) + response = await client.get(ForwardProxy + episode_page,allow_redirects=True, cookies = cookies,impersonate = "chrome124", proxies=proxies) + if response.status_code == 202: + cookies = await security_cookie(response) + response = await client.get(ForwardProxy + episode_page,allow_redirects=True, cookies = cookies,impersonate = "chrome124", proxies=proxies) soup = BeautifulSoup(response.text,'lxml') a_tag = soup.find('a', {'id': 'alternativeDownloadLink', 'class': 'm-1 btn btn-sm btn-primary'}) @@ -66,6 +82,84 @@ async def get_mp4(anime_url,ismovie,episode,client): +async def search(showname,date,ismovie,episode,client): + search_year = date[:4] + headers = random_headers.generate() + link = f'https://www.animeworld.so/filter?year={search_year}&sort=2&keyword={showname}' + response = await client.get(ForwardProxy + link,allow_redirects=True, impersonate = "chrome124", headers = headers, proxies = proxies) + if response.status_code == 202: + cookies = await security_cookie(response) + response = await client.get(ForwardProxy + link,allow_redirects=True, impersonate = "chrome124", proxies = proxies, headers = headers, cookies = cookies) + else: + cookies = {} + soup = BeautifulSoup(response.text,'lxml') + anime_list = soup.find_all('a', class_=['poster', 'tooltipstered']) + final_urls = [] + for anime in anime_list: + anime_info_url = f'https://www.animeworld.{AW_DOMAIN}/{anime["data-tip"]}' + response = await client.get(ForwardProxy + anime_info_url,allow_redirects=True, impersonate = "chrome124", cookies = cookies, proxies = proxies) + if response.status_code == 202: + cookies = await security_cookie(response) + response = await client.get(ForwardProxy + anime_info_url,allow_redirects=True, impersonate = "chrome124", cookies = cookies, proxies = proxies) + pattern = r'\s*\s*(.*?)\s*' + match = re.search(pattern, response.text, re.S) + release_date = match.group(1).strip() + for ita, eng in months.items(): + release_date = release_date.replace(ita, eng) + release_date = datetime.datetime.strptime(release_date, "%d %B %Y") + date_object = datetime.datetime.strptime(date, "%Y-%m-%d") + release_date = release_date.strftime("%Y-%m-%d") + if (release_date == date or + release_date == date_object + datetime.timedelta(days=1) or + release_date == date_object - datetime.timedelta(days=1)): + anime_url = f'https://www.animeworld.{AW_DOMAIN}{anime["href"]}' + final_url = await get_mp4(anime_url,ismovie,episode,client) + if final_url: + final_urls.append(final_url) + + return final_urls + +async def animeworld(id,client): + try: + kitsu_id = id.split(":")[1] + ismovie = 1 if len(id.split(":")) == 2 else 0 + if ismovie == 1: + episode = None + else: + episode = id.split(":")[2] + showname,date = await get_info_kitsu(kitsu_id,client) + for key in showname_replace: + if key in showname: # Check if the key is a substring of showname + showname = showname.replace(key, showname_replace[key]) + if "Naruto:" in showname: + showname = showname.replace(":", "") + final_urls = await search(showname,date,ismovie,episode,client) + return final_urls + except: + print("Animeworld failed") + return None + +async def test_animeworld(): + async with AsyncSession() as client: + # Replace with actual id, for example 'anime_id:episode' format + test_id = "kitsu:11:3" # This is an example ID format + results = await animeworld(test_id, client) + print(results) + +if __name__ == "__main__": + from curl_cffi.requests import AsyncSession + import asyncio + asyncio.run(test_animeworld()) + + + + + + + + + + @@ -97,7 +191,7 @@ async def old_search(showname,date,ismovie,episode,client): 'keyword': showname, } - response = await client.post(f'https://www.animeworld.{AW_DOMAIN}/api/search/v2', params=params, cookies=cookies, headers=headers,allow_redirects=True, impersonate = "chrome120") + response = await client.post(f'https://www.animeworld.{AW_DOMAIN}/api/search/v2', params=params, cookies=cookies, headers=headers,allow_redirects=True, impersonate = "chrome124") data = json.loads(response.text) final_urls = [] @@ -133,63 +227,4 @@ async def old_search(showname,date,ismovie,episode,client): final_url = await get_mp4(anime_url,ismovie,episode,client) final_urls.append(final_url) break - return final_urls - -async def search(showname,date,ismovie,episode,client): - search_year = date[:4] - headers = random_headers.generate() - - response = await client.get(ForwardProxy + f'https://www.animeworld.so/filter?year={search_year}&sort=2&keyword={showname}',allow_redirects=True, impersonate = "chrome124", headers = headers, proxies = proxies) - soup = BeautifulSoup(response.text,'lxml') - anime_list = soup.find_all('a', class_=['poster', 'tooltipstered']) - final_urls = [] - for anime in anime_list: - anime_info_url = f'https://www.animeworld.{AW_DOMAIN}/{anime["data-tip"]}' - response = await client.get(ForwardProxy + anime_info_url,allow_redirects=True, impersonate = "chrome124", proxies = proxies) - pattern = r'\s*\s*(.*?)\s*' - match = re.search(pattern, response.text, re.S) - release_date = match.group(1).strip() - for ita, eng in months.items(): - release_date = release_date.replace(ita, eng) - release_date = datetime.datetime.strptime(release_date, "%d %B %Y") - release_date = release_date.strftime("%Y-%m-%d") - if release_date == date: - anime_url = f'https://www.animeworld.{AW_DOMAIN}{anime["href"]}' - final_url = await get_mp4(anime_url,ismovie,episode,client) - if final_url: - final_urls.append(final_url) - - return final_urls - -async def animeworld(id,client): - try: - print(id) - kitsu_id = id.split(":")[1] - ismovie = 1 if len(id.split(":")) == 2 else 0 - if ismovie == 1: - episode = None - else: - episode = id.split(":")[2] - showname,date = await get_info_kitsu(kitsu_id,client) - for key in showname_replace: - if key in showname: # Check if the key is a substring of showname - showname = showname.replace(key, showname_replace[key]) - if "Naruto:" in showname: - showname = showname.replace(":", "") - final_urls = await search(showname,date,ismovie,episode,client) - return final_urls - except: - print("Animeworld failed") - return None - -async def test_animeworld(): - async with AsyncSession() as client: - # Replace with actual id, for example 'anime_id:episode' format - test_id = "kitsu:11407" # This is an example ID format - results = await animeworld(test_id, client) - print(results) - -if __name__ == "__main__": - from curl_cffi.requests import AsyncSession - import asyncio - asyncio.run(test_animeworld()) \ No newline at end of file + return final_urls \ No newline at end of file